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;
|
|||
|
};
|