var os = require('os') var path = require('path') var utils = require('./utils') var webpack = require('webpack') var config = require('../config') var merge = require('webpack-merge') var MyWebPackPluginForOne = require('./webpack_plugin') var baseWebpackConfig = require('./webpack.base.conf') var CopyWebpackPlugin = require('copy-webpack-plugin') var HtmlWebpackPlugin = require('html-webpack-plugin') var OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin') var ExtractTextPlugin = require('extract-text-webpack-plugin') var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin var HappyPackPlugin = require('happypack'); var happyThreadPool = HappyPackPlugin.ThreadPool({ size: os.cpus().length }); var VisualizerPlugin = require('webpack-visualizer-plugin'); var env = process.env.NODE_ENV === 'testing' ? require('../config/test.env') : config.build.env var webpackConfig = merge(baseWebpackConfig, { module: { rules: utils.styleLoaders({ sourceMap: config.build.productionSourceMap, extract: true }) }, devtool: config.build.productionSourceMap ? '#source-map' : false, output: { path: config.build.assetsRoot, filename: utils.assetsPath('js/[name].[chunkhash].js'), chunkFilename: utils.assetsPath('js/[id].[chunkhash].js') }, plugins: [ new HappyPackPlugin({ id: 'eslint', threadPool: happyThreadPool, loaders: ['eslint-loader'] }), new HappyPackPlugin({ id: 'js', threadPool: happyThreadPool, loaders: [{ loader: 'babel-loader', options: { cacheDirectory: true } }] }), new HappyPackPlugin({ id: 'css', threadPool: happyThreadPool, loaders: [ 'vue-loader', 'css-loader', 'less-loader', ] }), // new webpack.DllReferencePlugin({ // name: 'vendor_library', // context: __dirname, // manifest: require('../static/dll/vendor-mainfest.json') // }), // http://vuejs.github.io/vue-loader/en/workflow/production.html new webpack.DefinePlugin({ 'process.env': env }), new webpack.optimize.UglifyJsPlugin({ compress: { warnings: false, drop_debugger: true, drop_console: true }, exclude: /(node_modules)/,// 排除static文件夹 !!! (仅添加这一行代码即可,如果你也使用了UglifyJsPlugin) sourceMap: false }), // Ignore all locale files of moment.js new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/), // extract css into its own file new ExtractTextPlugin({ filename: utils.assetsPath('css/[name].[contenthash].css') }), // Compress extracted CSS. We are using this plugin so that possible // duplicated CSS from different components can be deduped. new OptimizeCSSPlugin({ cssProcessorOptions: { safe: true } }), // split vendor js into its own file new webpack.optimize.CommonsChunkPlugin({ name: 'vendor', minChunks: function (module, count) { // any required modules inside node_modules are extracted to vendor return ( module.resource && /\.js$/.test(module.resource) && module.resource.indexOf( path.join(__dirname, '../node_modules') ) === 0 ) } }), // extract webpack runtime and module manifest to its own file in order to // prevent vendor hash from being updated whenever app bundle is updated new webpack.optimize.CommonsChunkPlugin({ name: 'manifest', chunks: ['vendor'] }), // copy custom static assets new CopyWebpackPlugin([ { from: path.resolve(__dirname, '../static'), to: config.build.assetsSubDirectory, ignore: ['.*'] } ]), new MyWebPackPluginForOne(), ...utils.getHtmlWebpackPlugins(), // 分析打包大小 // new BundleAnalyzerPlugin(), // new VisualizerPlugin({ // filename: './statistics.html' // }) ] }) if (config.build.productionGzip) { var CompressionWebpackPlugin = require('compression-webpack-plugin') webpackConfig.plugins.push( new CompressionWebpackPlugin({ asset: '[path].gz[query]', algorithm: 'gzip', test: new RegExp( '\\.(' + config.build.productionGzipExtensions.join('|') + ')$' ), threshold: 10240, minRatio: 0.8 }) ) } if (config.build.bundleAnalyzerReport) { var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin webpackConfig.plugins.push(new BundleAnalyzerPlugin()) } module.exports = webpackConfig