您现在的位置是:亿华云 > 人工智能
说说提高Webpack的构建速度的手段有哪些?
亿华云2025-10-08 23:33:03【人工智能】2人已围观
简介本文转载自微信公众号「JS每日一题」,作者灰灰。转载本文请联系JS每日一题公众号。一、背景随着我们的项目涉及到页面越来越多,功能和业务代码也会随着越多,相应的 webpack 的构建时间也会越来越久构
本文转载自微信公众号「JS每日一题」,说说速度作者灰灰。提高转载本文请联系JS每日一题公众号。的的手段
一、构建背景
随着我们的说说速度项目涉及到页面越来越多,功能和业务代码也会随着越多,提高相应的的的手段 webpack 的构建时间也会越来越久
构建时间与我们日常开发效率密切相关,当我们本地开发启动 devServer 或者 build 的构建时候,如果时间过长,说说速度会大大降低我们的提高工作效率
所以,优化webpack 构建速度是的的手段十分重要的环节
二、如何优化
常见的构建提升构建速度的手段有如下:
优化 loader 配置 合理使用 resolve.extensions 优化 resolve.modules 优化 resolve.alias 使用 DLLPlugin 插件 使用 cache-loader terser 启动多线程 合理使用 sourceMap优化loader配置
在使用loader时,可以通过配置include、说说速度exclude、提高test属性来匹配文件,的的手段接触include、exclude规定哪些匹配应用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.extensions
在开发中我们会有各种各样的模块依赖,这些模块可能来自于自己编写的代码,也可能来自第三方库, resolve可以帮助webpack从每个 require/import 语句中,找到需要引入到合适的模块代码
通过resolve.extensions是解析到文件时自动添加拓展名,默认情况如下:
module.exports = { ... extensions:[".warm",".mjs",".js",".json"] }当我们引入文件的时候,若没有文件后缀名,则会根据数组内的值依次查找
当我们配置的时候,则不要随便把所有后缀都写在里面,这会调用多次文件的查找,这样就会减慢打包速度
优化 resolve.modules
resolve.modules 用于配置 webpack 去哪些目录下寻找第三方模块。默认值为[node_modules],所以默认会从node_modules中查找文件 当安装的第三方模块都放在项目根目录下的 ./node_modules目录下时,所以可以指明存放第三方模块的绝对路径,以减少寻找,云服务器配置如下:
module.exports = { resolve: { // 使用绝对路径指明第三方模块存放的位置,以减少搜索步骤 // 其中 __dirname 表示当前工作目录,也就是项目根目录 modules: [path.resolve(__dirname, node_modules)] }, };优化 resolve.alias
alias给一些常用的路径起一个别名,特别当我们的项目目录结构比较深的时候,一个文件的路径可能是./../../的形式
通过配置alias以减少查找过程
module.exports = { ... resolve:{ alias:{ "@":path.resolve(__dirname,./src) } } }使用 DLLPlugin 插件
DLL全称是 动态链接库,是为软件在winodw中实现共享函数库的一种实现方式,而Webpack也内置了DLL的功能,为的就是可以共享,不经常改变的代码,抽成一个共享的库。这个库在之后的编译过程中,会被引入到其他项目的代码中
使用步骤分成两部分:
打包一个 DLL 库 引入 DLL 库打包一个 DLL 库
webpack内置了一个DllPlugin可以帮助我们打包一个DLL的库文件
module.exports = { ... plugins:[ new webpack.DllPlugin({ name:dll_[name], path:path.resolve(__dirname,"./dll/[name].mainfest.json") }) ] }引入 DLL 库
使用 webpack 自带的 DllReferencePlugin 插件对 mainfest.json 映射文件进行分析,获取要使用的云服务器提供商DLL库
然后再通过AddAssetHtmlPlugin插件,将我们打包的DLL库引入到Html模块中
module.exports = { ... new webpack.DllReferencePlugin({ context:path.resolve(__dirname,"./dll/dll_react.js"), mainfest:path.resolve(__dirname,"./dll/react.mainfest.json") }), new AddAssetHtmlPlugin({ outputPath:"./auto", filepath:path.resolve(__dirname,"./dll/dll_react.js") }) }使用 cache-loader
在一些性能开销较大的 loader之前添加 cache-loader,以将结果缓存到磁盘里,显著提升二次构建速度
保存和读取这些缓存文件会有一些时间开销,所以请只对性能开销较大的 loader 使用此loader
module.exports = { module: { rules: [ { test: /\.ext$/, use: [cache-loader, ...loaders], include: path.resolve(src), }, ], }, };terser 启动多线程
使用多进程并行运行来提高构建速度
module.exports = { optimization: { minimizer: [ new TerserPlugin({ parallel: true, }), ], }, };合理使用 sourceMap
打包生成 sourceMap 的时候,如果信息越详细,打包速度就会越慢。对应属性取值如下所示:
三、总结
可以看到,优化webpack构建的方式有很多,主要可以从优化搜索时间、缩小文件搜索范围、减少不必要的编译等方面入手
参考文献
https://github.com/ly2011/blog/issues/44 https://xie.infoq.cn/article/541418eb82a674741a0ad8865 https://zhuanlan.zhihu.com/p/139498741 https://vue3js.cn/interview很赞哦!(97)
站长推荐
3、不明先知,根据相关征兆预测可能发生的事件,以便提前做好准备,赶紧注册相关域名。;不差钱域名;buchaqian抢先注册,就是这种敏感类型。预言是最敏感的状态。其次,你应该有眼力。所谓眼力,就是善于从社会上时不时出现的各种热点事件中获取与事件相关的域名资源。眼力的前提是对域名领域的熟悉和丰富的知识。
爬虫必备Requests的扩展包总结
Goscript:Rust 实现的 Go 语言规范
秒懂算法—动态规划的核心思想
评估域名涉及的行业规模与发展状况成正比。
消息队列堆积太多,下游处理不过来怎么办呢?
海量、多维数据让人抓狂?高效搜索方法看这里
运用Electron+Vue3.2+TypeScript+Vite开发桌面端