128 lines
3.3 KiB
JavaScript
128 lines
3.3 KiB
JavaScript
/*
|
||
* @Author: liyxt
|
||
* @Date: 2019-07-02 10:02:16
|
||
* @LastEditors: liyxt
|
||
* @LastEditTime: 2020-04-14 14:31:30
|
||
* @Description: file content
|
||
*/
|
||
/**
|
||
* 生产环境配置
|
||
*/
|
||
const webpack = require('webpack');
|
||
const common = require('./webpack.common');
|
||
const path = require('path');
|
||
const merge = require('webpack-merge');
|
||
const configJSON = require('../config.json');
|
||
const buildEntry = require('./buildEntry');
|
||
const TerserPlugin = require('terser-webpack-plugin');
|
||
const OutputSourcePlugin = require('./OutputSourcePlugin');
|
||
const { name } = require('../package.json');
|
||
|
||
// const Visualizer = require('webpack-visualizer-plugin');
|
||
|
||
let { patch } = configJSON;
|
||
|
||
let { project, branch, provider } = patch || {};
|
||
|
||
module.exports = function(env, argv) {
|
||
let {
|
||
mode,
|
||
hash,
|
||
client,
|
||
fse,
|
||
buildPath,
|
||
outputPath,
|
||
srcDir = configJSON.srcDir || 'src',
|
||
patchList
|
||
} = env;
|
||
|
||
if (client === 'mobile') {
|
||
process.env.PROJECT_CLIENT = 'mobile';
|
||
}
|
||
|
||
let buildWithoutHTML = configJSON.buildWithoutHTML;
|
||
|
||
buildWithoutHTML && typeof buildWithoutHTML === 'string' && (buildWithoutHTML = [buildWithoutHTML]);
|
||
buildPath = buildPath || configJSON.buildEntryPath || `./${srcDir}/*/*/*/*/index.js`;
|
||
|
||
let prodConfig = {
|
||
mode: 'production',
|
||
entry: {},
|
||
output: {
|
||
path: path.resolve(__dirname, `../${outputPath || 'dist'}`),
|
||
publicPath: '../../../../',
|
||
library: '[name]',
|
||
libraryTarget: 'umd',
|
||
chunkFilename: '[name].js',
|
||
jsonpFunction: `webpackJsonp_${name}`,
|
||
globalObject: 'window',
|
||
},
|
||
devtool: false,
|
||
plugins: [
|
||
// new webpack.BannerPlugin({
|
||
// banner:
|
||
// '@ncctag ' +
|
||
// JSON.stringify({
|
||
// project,
|
||
// branch,
|
||
// provider,
|
||
// date: new Date().toLocaleString()
|
||
// }), // 其值为字符串,将作为注释存在
|
||
// raw: false, // 如果值为 true,将直出,不会被作为注释
|
||
// entryOnly: false // 如果值为 true,将只在入口 chunks 文件中添加
|
||
// }),
|
||
new webpack.DefinePlugin({
|
||
NODE_ENV: JSON.stringify(mode),
|
||
ISMA: configJSON.isMA,
|
||
LOGIN_INFO: JSON.stringify(configJSON.directConnectInfo),
|
||
MA_INFO: JSON.stringify(configJSON.maInfo)
|
||
}),
|
||
new OutputSourcePlugin({ output: '__SOURCE__CODE__' }),
|
||
// new Visualizer()
|
||
],
|
||
optimization: {
|
||
minimize: true, // 是否启用压缩
|
||
splitChunks: {
|
||
automaticNameDelimiter: '_'
|
||
},
|
||
minimizer: [
|
||
new TerserPlugin({
|
||
parallel: 4,
|
||
sourceMap: true,
|
||
extractComments: false,
|
||
terserOptions: {
|
||
// compress: {
|
||
// drop_console: true
|
||
// },
|
||
output: {
|
||
comments: /@ncctag/i
|
||
}
|
||
}
|
||
})
|
||
]
|
||
}
|
||
};
|
||
if (hash === 'false') {
|
||
hash = false;
|
||
} else if (hash === 'true') {
|
||
hash = true;
|
||
}
|
||
|
||
// test模式,加source-map调试
|
||
mode === 'test' && (prodConfig.devtool = 'source-map');
|
||
// 节点加hash,参照不加hash
|
||
prodConfig.output.filename = hash ? '[name].[contenthash:8].js' : '[name].js';
|
||
// 获取入口
|
||
let { entries, plugins, externals, rules } = buildEntry({ buildPath, buildWithoutHTML, hash, client, mode, fse, srcDir, patchList });
|
||
Object.assign(common.externals, externals);
|
||
//css隔离
|
||
if(rules.length){
|
||
Object.assign(common.module.rules, rules);
|
||
}
|
||
Object.assign(prodConfig.entry, entries);
|
||
prodConfig.plugins.push(...plugins);
|
||
|
||
prodConfig = merge(common, prodConfig);
|
||
return prodConfig;
|
||
};
|