We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
随着我们的项目涉及到页面越来越多,功能和业务代码也会随着越多,相应的 webpack 的构建时间也会越来越久
构建时间与我们日常开发效率密切相关,当我们本地开发启动devServer或者build的时候,如果时间过长,会大大降低我们的工作效率
devServer
build
常见的提升构建速度的手段有如下:
loader
resolve.extensions
resolve.modules
resolve.alias
DLLPlugin
cache-loader
terser
sourceMap
在使用loader时,可以通过配置include、exclude、test属性来匹配文件,接触include、exclude规定哪些匹配应用loader
include
exclude
test
如采用ES6的项目为例,在配置babel-loader时,可以这样:
ES6
babel-loader
module.exports = { module: { rules: [ { // 如果项目源码中只有 js 文件就不要写成 /\.jsx?$/,提升正则表达式性能 test: /\.js$/, // babel-loader 支持缓存转换出的结果,通过 cacheDirectory 选项开启 use: ['babel-loader?cacheDirectory'], // 只对项目根目录下的 src 目录中的文件采用 babel-loader include: path.resolve(__dirname, 'src'), }, ] }, };
在开发中我们会有各种各样的模块依赖,这些模块可能来自于自己编写的代码,也可能来自第三方库, resolve可以帮助webpack从每个require/import语句中,找到需要引入到合适的模块代码
resolve
webpack
require/import
通过resolve.extensions是解析到文件时自动添加拓展名,默认情况如下:
module.exports = { ... extensions:[".warm",".mjs",".js",".json"] }
当我们引入文件的时候,若没有文件后缀名,则会根据数组内的值依次查找
当我们配置的时候,则不要随便把所有后缀都写在里面,这会调用多次文件的查找,这样就会减慢打包速度
resolve.modules用于配置webpack去哪些目录下寻找第三方模块。默认值为['node_modules'],所以默认会从node_modules中查找文件 当安装的第三方模块都放在项目根目录下的./node_modules目录下时,所以可以指明存放第三方模块的绝对路径,以减少寻找,配置如下:
['node_modules']
node_modules
./node_modules
module.exports = { resolve: { // 使用绝对路径指明第三方模块存放的位置,以减少搜索步骤 // 其中 __dirname 表示当前工作目录,也就是项目根目录 modules: [path.resolve(__dirname, 'node_modules')] }, };
alias给一些常用的路径起一个别名,特别当我们的项目目录结构比较深的时候,一个文件的路径可能是./../../的形式
alias
./../../
通过配置alias以减少查找过程
module.exports = { ... resolve:{ alias:{ "@":path.resolve(__dirname,'./src') } } }
就是事先把常用但又构建时间长的代码提前打包好(例如react、react-dom),取个名字叫dll。后面再打包的时候就跳过原来的未打包代码,直接用dll。这样一来,构建时间就会缩短,提高 webpack打包速度。
react
react-dom
dll
所以在前端世界里,DLL就是个另类缓存。
DLL
但是,由于DLL打包速度慢、配置复杂,所以已经不推荐使用,现在推荐使用HardSourceWebpackPlugin用于为模块提供中间缓存步骤。为了查看结果,您需要使用此插件运行两次webpack:第一次构建将花费正常时间。第二个版本将明显更快。适合用在开发模式development和生产模式production下。速度提升的效果是原来的好几倍。
HardSourceWebpackPlugin
development
production
在一些性能开销较大的loader之前添加cache-loader,以将结果缓存到磁盘里,显著提升二次构建速度
保存和读取这些缓存文件会有一些时间开销,所以请只对性能开销较大的loader使用此loader
module.exports = { module: { rules: [ { test: /\.ext$/, use: ['cache-loader', ...loaders], include: path.resolve('src'), }, ], }, };
使用多进程并行运行来提高构建速度
module.exports = { optimization: { minimizer: [ new TerserPlugin({ parallel: true, }), ], }, };
打包生成 sourceMap的时候,如果信息越详细,打包速度就会越慢
The text was updated successfully, but these errors were encountered:
No branches or pull requests
一、背景
随着我们的项目涉及到页面越来越多,功能和业务代码也会随着越多,相应的 webpack 的构建时间也会越来越久
构建时间与我们日常开发效率密切相关,当我们本地开发启动
devServer
或者build
的时候,如果时间过长,会大大降低我们的工作效率二、如何优化
常见的提升构建速度的手段有如下:
loader
配置resolve.extensions
resolve.modules
resolve.alias
DLLPlugin
插件cache-loader
terser
启动多线程sourceMap
优化loader配置
在使用
loader
时,可以通过配置include
、exclude
、test
属性来匹配文件,接触include
、exclude
规定哪些匹配应用loader
如采用
ES6
的项目为例,在配置babel-loader
时,可以这样:合理使用 resolve.extensions
在开发中我们会有各种各样的模块依赖,这些模块可能来自于自己编写的代码,也可能来自第三方库,
resolve
可以帮助webpack
从每个require/import
语句中,找到需要引入到合适的模块代码通过
resolve.extensions
是解析到文件时自动添加拓展名,默认情况如下:当我们引入文件的时候,若没有文件后缀名,则会根据数组内的值依次查找
当我们配置的时候,则不要随便把所有后缀都写在里面,这会调用多次文件的查找,这样就会减慢打包速度
优化 resolve.modules
resolve.modules
用于配置webpack
去哪些目录下寻找第三方模块。默认值为['node_modules']
,所以默认会从node_modules
中查找文件 当安装的第三方模块都放在项目根目录下的./node_modules
目录下时,所以可以指明存放第三方模块的绝对路径,以减少寻找,配置如下:优化 resolve.alias
alias
给一些常用的路径起一个别名,特别当我们的项目目录结构比较深的时候,一个文件的路径可能是./../../
的形式通过配置
alias
以减少查找过程使用 DLLPlugin 插件或者HardSourceWebpackPlugin
就是事先把常用但又构建时间长的代码提前打包好(例如
react
、react-dom
),取个名字叫dll
。后面再打包的时候就跳过原来的未打包代码,直接用dll
。这样一来,构建时间就会缩短,提高webpack
打包速度。所以在前端世界里,
DLL
就是个另类缓存。但是,由于
DLL
打包速度慢、配置复杂,所以已经不推荐使用,现在推荐使用HardSourceWebpackPlugin
用于为模块提供中间缓存步骤。为了查看结果,您需要使用此插件运行两次webpack
:第一次构建将花费正常时间。第二个版本将明显更快。适合用在开发模式development
和生产模式production
下。速度提升的效果是原来的好几倍。使用 cache-loader
在一些性能开销较大的
loader
之前添加cache-loader
,以将结果缓存到磁盘里,显著提升二次构建速度保存和读取这些缓存文件会有一些时间开销,所以请只对性能开销较大的
loader
使用此loader
terser 启动多线程
使用多进程并行运行来提高构建速度
合理使用 sourceMap
打包生成
sourceMap
的时候,如果信息越详细,打包速度就会越慢参考文献
The text was updated successfully, but these errors were encountered: