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