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').BundleAnalyzerPlugin
const 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']
})
]
}