@gdjiami/cli
Version:
CLI for build front end project.
161 lines (160 loc) • 7.49 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
/**
* 生产环境配置
*/
var fs_1 = tslib_1.__importDefault(require("fs"));
var webpack_1 = tslib_1.__importDefault(require("webpack"));
var path_1 = tslib_1.__importDefault(require("path"));
var HtmlInjectedDllReferences_1 = tslib_1.__importDefault(require("./plugins/HtmlInjectedDllReferences"));
var utils_1 = require("../utils");
var terserPluginOptions_1 = tslib_1.__importDefault(require("./utils/terserPluginOptions"));
var optimizeCSSAssetsPlugin_1 = tslib_1.__importDefault(require("./utils/optimizeCSSAssetsPlugin"));
var DuplicatePackageCheckerPlugin = require('duplicate-package-checker-webpack-plugin');
var CircularDependencyPlugin = require('circular-dependency-plugin');
var MiniCssExtractPlugin = require('mini-css-extract-plugin');
var TerserPlugin = require('terser-webpack-plugin');
var UglifyJSPlugin = require('uglifyjs-webpack-plugin');
var OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
var configure = function (enviroments, pkg, paths, argv) {
function isSupportDll() {
if (enviroments.raw.DISABLE_DLL === 'true' || !argv.jmOptions.enableDllInProduction || argv.jmOptions.ie8) {
return false;
}
return fs_1.default.existsSync(paths.appDllHash);
}
var supportDll = isSupportDll();
if (supportDll) {
utils_1.message.info('DllReference Turned on in production');
}
var name = argv.name;
var filePrefix = name ? name + "_" : '';
var shouldUseSourceMap = enviroments.raw.SOURCE_MAP !== 'false';
var isElectron = argv.jmOptions.electron;
var isIE8 = argv.jmOptions.ie8;
return {
devtool: shouldUseSourceMap && 'source-map',
bail: true,
entry: {},
module: {
rules: [],
},
plugins: [
isIE8 &&
new UglifyJSPlugin({
uglifyOptions: {
ie8: true,
warnings: false,
},
}),
// 抽取CSS文件
new MiniCssExtractPlugin({
filename: "static/css/" + filePrefix + "[name].css?[contenthash:8]",
chunkFilename: "static/css/" + filePrefix + "[name].chunk.css?[contenthash:8]",
}),
// 检查是否存在多个版本的包
argv.jmOptions.enableDuplicatePackageCheck &&
new DuplicatePackageCheckerPlugin({
verbose: true,
showHelp: true,
}),
// 循环依赖检查
argv.jmOptions.enableCircularDependencyCheck &&
new CircularDependencyPlugin({
exclude: /a\.js|node_modules/,
failOnError: false,
}),
supportDll &&
new webpack_1.default.DllReferencePlugin({
context: paths.appSrc,
manifest: path_1.default.join(paths.appCache, 'dll.json'),
name: 'dll',
}),
supportDll && new HtmlInjectedDllReferences_1.default('dll'),
].filter(Boolean),
optimization: {
// 定义拆包规则
// 按照默认配置, webpack会自动拆分符合下列条件(AND)的chunks
// * 新的chunk可以被共享或者模块来自于node_modules(minChunks)
// * 新的chunk大于30kb(minSize)
// * 按需模块并行请求(即import数)的最大次数 <= 5(maxAsyncRequests)
// * 初始模块并行请求的最大次数 <= 5(maxInitialRequests)
// 详见 https://webpack.docschina.org/plugins/split-chunks-plugin/
splitChunks: isIE8
? undefined
: {
name: !isElectron,
// cacheGroups用于扩展或覆盖splitChunks.*. 即扩展默认规则
// 由于支持多页应用, 所以我们会对初始chunk进行命名, 以便可以在html-webpack-plugin中对这些chunk进行注入
cacheGroups: tslib_1.__assign({
// react: {
// chunks: 'initial',
// test: module => {
// return (
// /react/.test(module.context) ||
// /classnames/.test(module.context) ||
// /prop-types/.test(module.context) ||
// /react-dom/.test(module.context) ||
// /react-router/.test(module.context)
// )
// },
// name: 'react',
// priority: 1,
// reuseExistingChunk: true,
// },
// gzb: {
// chunks: 'initial',
// test: module => {
// return /gzbapp/.test(module.context) || /gdjiami/.test(module.context)
// },
// name: 'gzb',
// priority: 1,
// reuseExistingChunk: true,
// },
// 第三方共有包
vendor: {
test: /[\\/]node_modules[\\/]/,
reuseExistingChunk: false,
chunks: 'initial',
minChunks: 2,
// 一个可拆分的chunk可能属于多个分组, 这个用于设置优先级
priority: -10,
} }, (isElectron
? {}
: {
// 应用内共有包
commons: {
test: /src/,
chunks: 'initial',
reuseExistingChunk: true,
minChunks: 2,
priority: -20,
},
})),
},
// Keep the runtime chunk seperated to enable long term caching
runtimeChunk: isElectron || isIE8
? undefined
: {
name: 'runtime',
},
// 让webpack检查和删除已经在所有父模块存在的模块
removeAvailableModules: true,
// 删除空模块
removeEmptyChunks: true,
// 合并重复的模块
mergeDuplicateChunks: true,
minimize: true,
minimizer: [
!isIE8 && new TerserPlugin(terserPluginOptions_1.default(shouldUseSourceMap)),
new OptimizeCSSAssetsPlugin(optimizeCSSAssetsPlugin_1.default(shouldUseSourceMap)),
].filter(Boolean),
},
performance: {
hints: 'warning',
assetFilter: function (assetFilename) { return !/(\.map$)|(^(vendor\.|favicon\.))/.test(assetFilename); },
},
};
};
exports.default = configure;