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