build-plugin-rax-app
Version:
The basic webpack configuration for rax project
175 lines • 7.14 kB
JavaScript
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
var getEnhancedWebpackConfig = require('@builder/user-config').getEnhancedWebpackConfig;
var getWebpackConfig = require('rax-webpack-config').default;
var getBabelConfig = require('rax-babel-config');
var ProgressPlugin = require('webpackbar');
var path = require('path');
var CopyWebpackPlugin = require('copy-webpack-plugin');
var fs = require('fs-extra');
var ExportsFieldWebpackPlugin = require('@builder/exports-field-webpack-plugin').default;
var isWebpack4 = require('@builder/compat-webpack4').isWebpack4;
var _a = require('./constants'), MINIAPP_PLATFORMS = _a.MINIAPP_PLATFORMS, SSR = _a.SSR, DOCUMENT = _a.DOCUMENT;
module.exports = function (api, _a) {
var target = _a.target, babelConfigOptions = _a.babelConfigOptions, _b = _a.progressOptions, progressOptions = _b === void 0 ? {} : _b;
var context = api.context, onGetWebpackConfig = api.onGetWebpackConfig;
var rootDir = context.rootDir, command = context.command, userConfig = context.userConfig;
var mpa = false;
// subPackages is miniapp config, mpa is web/weex/kraken config
// document and ssr need be the same as web
if (MINIAPP_PLATFORMS.includes(target)) {
mpa = (userConfig[target] || {}).subPackages;
}
else if ([SSR, DOCUMENT].includes(target)) {
mpa = (userConfig.web || {}).mpa;
}
else if (userConfig[target]) {
mpa = userConfig[target].mpa;
}
var mode = command === 'start' ? 'development' : 'production';
var babelConfig = getBabelConfig(babelConfigOptions);
var webpackConfig = getWebpackConfig({
rootDir: rootDir,
mode: mode,
babelConfig: babelConfig,
target: target,
webpackVersion: context.webpack.version,
});
var enhancedWebpackConfig = getEnhancedWebpackConfig(api, {
target: target,
webpackConfig: webpackConfig,
babelConfig: babelConfig,
});
// dynamic import script cross origin
enhancedWebpackConfig.output.crossOriginLoading('anonymous');
enhancedWebpackConfig.module
.rule('appJSON')
.type('javascript/auto')
.test(/(\/|\\)app\.json$/)
.use('swc-loader')
.loader(require.resolve('@builder/swc-loader'))
.options({
jsc: {
target: 'es5',
},
module: {
type: 'commonjs',
ignoreDynamic: true,
},
})
.end()
.use('route-loader')
.loader(require.resolve('./Loaders/RouteLoader'))
.options({
target: target,
mpa: mpa,
})
.end();
enhancedWebpackConfig
.plugin('ProgressPlugin')
.use(ProgressPlugin, [Object.assign({ color: '#F4AF3D' }, progressOptions)]);
// Copy public dir
if (fs.existsSync(path.resolve(rootDir, 'public'))) {
enhancedWebpackConfig.plugin('CopyWebpackPlugin').use(CopyWebpackPlugin, [[]]);
}
onGetWebpackConfig(target, function (config) {
// Set public url after developer has set public path
// Get public path
var publicUrl = config.output.get('publicPath');
// Developer will use process.env.PUBLIC_URL + '/logo.png', so it need remove last /
if (publicUrl && publicUrl.endsWith('/')) {
publicUrl = publicUrl.substring(0, publicUrl.length - 1);
}
config.plugin('DefinePlugin').tap(function (args) { return [
Object.assign.apply(Object, __spreadArray(__spreadArray([{}], args, false), [{
'process.env.PUBLIC_URL': JSON.stringify(publicUrl),
'process.env.WDS_SOCKET_PATH': '"/ws"',
}], false)),
]; });
var _a = userConfig.outputDir, outputDir = _a === void 0 ? 'build' : _a, swc = userConfig.swc;
// Copy public dir
if (config.plugins.has('CopyWebpackPlugin')) {
config.plugin('CopyWebpackPlugin').tap(function (_a) {
var copyList = _a[0];
return [
copyList.concat([
{
from: path.resolve(rootDir, 'public'),
to: path.resolve(rootDir, outputDir, target),
},
]),
];
});
}
// Add condition names
if (isWebpack4) {
config.plugin('ExportsFieldWebpackPlugin').use(ExportsFieldWebpackPlugin, [
{
// In webpack4, import, require, node for fallback
conditionNames: [target, 'import', 'require', 'node'],
},
]);
// Set dev server content base
config.devServer.contentBase(path.join(rootDir, outputDir));
// Reset config target
config.target('web');
}
else {
config.resolve.merge({
// Webpack5+ will dynamic return default value with ..., which depends on build task target
conditionNames: [target, '...'],
});
// Set dev server content base
config.devServer.merge({
static: {
directory: path.join(rootDir, outputDir),
},
});
}
// Set output path
config.output.path(path.resolve(rootDir, outputDir, target));
// Only save target code
var keepPlatform = ['ssr', 'document'].includes(target) ? 'node' : target;
['jsx', 'tsx'].forEach(function (ruleName) {
config.module
.rule(ruleName)
.use('platform-loader')
.loader(require.resolve('rax-platform-loader'))
.options({
platform: keepPlatform,
});
});
if (swc) {
['jsx', 'tsx'].forEach(function (suffix) {
config.module
.rule("swc-".concat(suffix))
.use('swc-loader')
.tap(function (options) {
return __assign(__assign({}, options), { keepPlatform: keepPlatform });
});
});
}
// TODO: hack for tslib wrong exports field https://github.com/microsoft/tslib/issues/161
config.resolve.alias.set('tslib', 'tslib/tslib.es6.js');
});
return enhancedWebpackConfig;
};
//# sourceMappingURL=base.js.map