首先说明优化目的:css
一、加速打包时间html
二、减小打包后的体积vue
要加速打包时间,就须要先缩⼩⽂件搜索范围,通常影响总体打包的时间主要是loader和plugin两个的编译构建的过程。须要先压缩,再优化,能够减小不少打包时间。因此咱们要先减小搜索文件的过程,提早编译和缓存等几个方法实现node
一、优化loader查找文件范围react
能够使用test、include、exclude三个配置项来缩⼩loader的处理范围,推荐includejquery
//string
include: path.resolve(__dirname, "./src"),
//array
include: [
path.resolve(__dirname, 'app/styles'),
path.resolve(__dirname, 'vendor/styles')
]
复制代码
注:exclude 优先级要优于 include 和 test ,因此三个都配置时, exclude 会优先于其余两 个配置webpack
二、优化resolve.modules配置web
reslove.modules用于配置webpack打包后在哪一个目录下查找模块,默认是node_modules,能够配置:npm
module.exports={
resolve:{
modules: [path.resolve(__dirname, "./node_modules")]
}
}
复制代码
三、优化resolve.alias配置json
resolve.alias主要是配置别名,把原路径映射为一个新配置的路径,咱们能够直接指定文件路径,避免查找的耗时
alias: {
"@": path.join(__dirname, "./pages"),
react: path.resolve(
__dirname,
"./node_modules/react/umd/react.production.min.js"
),
"react-dom": path.resolve(
__dirname,
"./node_modules/react-dom/umd/react-dom.production.min.js"
)
},
resolve: {
alias: {
"@assets": path.resolve(__dirname, "../src/images/"),
},
}
//html-css中使⽤
.sprite3 {
background: url("~@assets/s3.png");
}
复制代码
四、优化resolve.extensions配置
resolve.extensions在导入语句没写入文件后缀时,webpack会自动带入后缀,并尝试查找文件是否存在
默认配置:extensions:['.js','.json','.jsx','.ts']
因此咱们在开发过程当中,尽可能带入后缀,减小查找文件的时间
五、使用cache缓存
webpack打包的核心是js文件的打包,js使用babel-loader。因此打包时间长主要是babel-loader执行太慢致使的,这时须要使用exclude和include来准确的肯定转换内容的范围,并减小重复文件的转换,形成打包后文件体积过大,也会增大编译速度。
使用cacheDirectory配置给babel编译时指定的目录,而且用于缓存加载的结果,可是默认是false,须要手动设置为true,默认的缓存目录是node_modules/.cache/babel-loader ,可是若是在任何根⽬录下都没有找到 node_modules ⽬录,就会降级回退到操做系统默认的临时⽂件⽬录。
rules: [
{
test: /\.js$/,
loader: 'babel-loader',
options: {
cacheDirectory: true
},
}
];
复制代码
除了构建以外,压缩打包后的体积也比较重要,除了上面提到的cache还能够使用terser-webpack-plugin的时候配置使用多线程和缓存实现。
题外话:在2017年的时候,刚会vue一年,由于项目中必须使用jq,打包后体积太大,成为当时一大难题,弄了一两天才解决,真的是各个方面都要考虑到,解决办法下面会提到
const TerserPlugin = require('terser-webpack-plugin');
module.exports = {
optimization: {
minimizer: [
new TerserPlugin({
cache: true, // 开启缓存
parallel: true // 多线程
})
]
}
};
复制代码
还能够使用cdn地址或者本身服务器的地址存放一些静态资源文件,这样在打包的时候就不须要打包一大堆东西了,能够很大程度的减小打包后的体积,好比:超大的背景图片,jq地址使用cdn,echarts图表类的等,
若是须要在使用的时候能够经过import的方法引入jq(import $ from 'jquery')或echarts而且不会对其打包,能够尝试配置externals
//webpack.config.js
module.exports = {
externals: {
//jquery经过script引⼊以后,全局中即有了 jQuery 变量
'jquery': 'jQuery'
}
}
复制代码
CSS的压缩
使用optimize-css-assets-webpack-plugin,是一个压缩css的插件,默认引擎是cssnano,css-loader已经集成了cssnano,能够使用optimize-css-assets-webpack-plugin来自定义规则
//安装命令
npm install cssnano -D
npm i optimize-css-assets-webpack-plugin -D
const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin");
new OptimizeCSSAssetsPlugin({
cssProcessor: require("cssnano"), // 能够指定引擎,默认是 cssnano
cssProcessorOptions: {
discardComments: { removeAll: true }
}
})
复制代码
HTML的压缩
//使用html-webpack-plugin
new htmlWebpackPlugin({
title: "京东商城",
template: "./index.html",
filename: "index.html",
minify: {
// 压缩HTML⽂件
removeComments: true, //删掉HTML里的注释
collapseWhitespace: true, // 删除空⽩符和换⾏符
minifyCSS: true // 压缩内联css
}
})
复制代码
JS的压缩
虽然webpack会自动压缩js,可是仍是推荐使用terser-webpack-plugin,也是webpack官方维护的插件。
const TerserPlugin = require('terser-webpack-plugin');
module.exports = {
optimization: {
minimizer: [new TerserPlugin(
parallel: true //使用并开启多线程减小压缩的耗时
)]
}
};
复制代码