UNPKG

@gdjiami/cli

Version:

CLI for build front end project.

161 lines (160 loc) 7.49 kB
"use strict"; 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;