const path = require('path');const webpack = require('webpack');const ExtractTextPlugin = require('extract-text-webpack-plugin');const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin');// const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPluginconst utils = require('./utils');const vueConfig = require('./vue-loader.config');const { ENV_CONFIG } = require('./definition.js');const isProd = process.env.NODE_ENV === 'production';module.exports = { cache: true, // https://www.cnblogs.com/jkr666666/p/11067189.html // eval // 如上打包后的代码,每一个打包后的模块后面都增加了包含sourceURL的注释,sourceURL的值是压缩前存放的代码的位置,这样就通过sourceURL关联了压缩前后的代码。并没有为每一个模块生成相对应的sourcemap。 //优点是:打包速度非常快,因为不需要生成sourcemap文件。 //缺点是:由于会映射到转换后的代码,而不是映射到原始代码,所以不能正确的显示行数 devtool: isProd ? false : 'eval', output: { path: path.resolve(__dirname, '../dist'), publicPath: '/dist/', filename: '[name].[chunkhash].js', // 将包导出为库。 output.library 就是库的名字 pathinfo: true }, resolve: { alias: { vue: 'vue/dist/vue.js', public: path.resolve(__dirname, '../public'), '@': path.resolve(__dirname, '../src'), '@views': path.resolve(__dirname, '../src/views'), '@components': path.resolve(__dirname, '../src/components'), '@util': path.resolve(__dirname, '../src/util'), '@mixins': path.resolve(__dirname, '../src/mixins'), '@config': path.resolve(__dirname, '../src/config') } }, module: { noParse: [/es6-promise\.js$/, /es6-shim\.js$/], // avoid webpack shimming process rules: [ { test: /\.vue$/, loader: 'vue-loader', options: vueConfig }, { test: /\.js$/, loader: 'babel-loader', exclude: /node_modules/, }, { test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, loader: 'url-loader', options: { limit: 10000, name: utils.assetsPath('img/[name].[ext]?[hash]') } }, { test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, loader: 'url-loader', options: { limit: 10000, name: utils.assetsPath('fonts/[name].[hash].[ext]') } } ] }, performance: { // 入口最大体积限制重置 maxEntrypointSize: 300000, // 创建超过250kb的资源,没有提示警告或错误显示 hints: isProd ? 'warning' : false }, plugins: isProd ? [ new webpack.DefinePlugin({ ...ENV_CONFIG, prd: true }), new webpack.optimize.UglifyJsPlugin({ //UglifyJS里的mangle选项可以设置boolean和object,直观的感觉是,mangle选项让你决定是否把代码里面的变量名进行优化,比如有些变量名很长的,它直接一个字母就替代了,极大的缩短了变量名长度带来的代码量问题,只要在同一个作用域里面,不被外部调用,这种替换非常安全。这一招直接让你的代码缩减巨大,即使你把compress选项设置为false,也能看到显著效果。它还提供更详细的设置选项,你可以选择是否替换toplevel的变量名(默认不替换),也可以有其他选项,具体可以看文档。 mangle: true, compress: { // 允许过滤uglify警告 warnings: false, //默认是 false. 如果你传入true,UglifyJS会假设对象属性的引用(例如foo.bar 或 foo["bar"])没有函数副作用 pure_getters: true, // 使用 "unsafe"转换 unsafe: true, 保留< 和 <=不被换成 > 和 >=。假如某些运算对象是用get或 valueOfobject得出的时候,转换可能会不安全,可能会引起运算对象的改变。此选项只有当 comparisons和unsafe_comps 都设为true时才会启用。 unsafe_comps: true, // 是否要支持IE6/7/8。UglifyJS默认不兼容IE。 screw_ie8: true }, output: { comments: false } }), // 这个没查到是干嘛的?更具侵略的合并? new webpack.optimize.AggressiveMergingPlugin(), // 这个插件的作用是按照chunk引用次数来安排出现顺序,因为这让经常引用的模块和chunk拥有更小的id。使ids可预测,减小文件大小,推荐使用 // 可是我看dist目录下的id长度都一样啊?难道是开发环境的原因? new webpack.optimize.OccurrenceOrderPlugin(), // 开启 ScopeHoisting new webpack.optimize.ModuleConcatenationPlugin(), // new BundleAnalyzerPlugin(), // 将css模块和js模块分开打包,换句话说把css代码从js文件中抽离出来,单独出一个模块。 new ExtractTextPlugin({ filename: utils.assetsPath('css/[name].[contenthash].css') }) // new webpack.NormalModuleReplacementPlugin(/element-ui[\/\\]lib[\/\\]locale[\/\\]lang[\/\\]zh-CN/, 'element-ui/lib/locale/lang/en'), ] : [ new FriendlyErrorsPlugin(), // new webpack.NormalModuleReplacementPlugin(/element-ui[\/\\]lib[\/\\]locale[\/\\]lang[\/\\]zh-CN/, 'element-ui/lib/locale/lang/en'), new webpack.DefinePlugin({ ...ENV_CONFIG, prd: false }) ]};
module.exports = { // // 会把vue中的样式文件提取出来 extractCSS: process.env.NODE_ENV === 'production', preserveWhitespace: false, postcss: [ require('autoprefixer')({ browsers: ['last 3 versions'] }) ]}