当前位置: 首页 > news >正文

【性能优化】Webpack打包优化

查看依赖

分析依赖树,找出哪些模块占用了较多的资源。

webpack-bundle-analyzer

npm install --save-dev webpack-bundle-analyzer

webpack.config.js中添加插件配置:

const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');module.exports = {// 其他配置项plugins: [// 其他插件new BundleAnalyzerPlugin({analyzerMode: 'static', // 生成静态报告文件openAnalyzer: false, // 构建完成后不会自动打开报告reportFilename: 'bundle-report.html' // 报告文件的名称})]
};

打包完成后,dist文件中多出bundle-report.html文件,打开可以看到依赖占比。

一. 使用缓存

通过使用缓存,能够有效提升打包速度。

  • webpack5以下:cache-loader
  • webpack5:内置cache模块

内置cache模块

webpack5 内置了 cache 模块,缓存生成的 webpack 模块和 chunk,来改善构建速度。
在开发环境下,默认设置为 type: 'memory' 而在生产环境中被禁用。cache: { type: 'memory' }cache: true 作用一样,可以通过设置 cache: { type: 'filesystem' } 来开放更多配置项。

module.exports = {cache: {type: 'filesystem',},
};

会在 node_modules 目录下生成一个 .cache 目录缓存文件内容,二次打包速度显著提升。

cache-loader

安装

npm install cache-loader -D

在 webpack.config.js 对应的开销大的 loader 前加上 cache-loader。
注意:如果使用多线程加载器如 thread-loader 时,也需要确保 cache-loader 放在 thread-loader 之前。

module.exports = {module: {rules: [{test: /\.js$/,use: ['cache-loader','babel-loader']}]}
}

二、多进程构建

同时开启多个 nodejs 进程进行构建

thread-loader

yarn add thread-loader -D
module.exports = {module: {rules: [{test: /.js$/,include: path.resolve('src'),use: ["thread-loader",// 耗时的 loader (例如 babel-loader)],},],},
};

注意:使用时,需将此 loader 放置在其他 loader 之前,放置在此 loader 之后的 loader 会在一个独立的 worker 池中运行。
每个 worker 都是一个独立的 node.js 进程,开销大约为 600ms 左右。同时会限制跨进程的数据交换。所以请仅在耗时的操作中使用此 loader!(一般只在大型项目中的 ts、js 文件使用)

预编译资源模块

代替 cdn 分包,解决每个模块都得引用一个 script 的缺陷。

以 react 和 react-dom 为例,新建一个 webpack.dll.js 文件,用于预编译资源的打包,例如要对 react 和 react-dom 进行预编译,配置如下:

const path = require('path');
const webpack = require('webpack');module.exports = {mode: 'production',entry: {library: ['react', 'react-dom'],},output: {filename: 'react-library.dll.js',path: path.resolve(__dirname, './dll'),library: '[name]_[hash]', // 对应的包映射名},plugins: [new webpack.DllPlugin({context: __dirname,name: '[name]_[hash]', // 引用的包映射名path: path.join(__dirname, './dll/react-library.json'),}),],
};

package.json中新增命令

{// ..."scripts": {// ..."build:dll": "webpack --config ./webpack.dll.js"},// ...
}

执行 npm run build:dll后,webpack.config.js中:

const webpack = require('webpack');
const AddAssetHtmlPlugin = require('add-asset-html-webpack-plugin');module.exports = {plugins: [new webpack.DllReferencePlugin({context: __dirname,manifest: require('./dll/react-library.json'),}),// 打包后的 .dll.js 文件需要引入到 html中,可以通过 add-asset-html-webpack-plugin 插件自动引入new AddAssetHtmlPlugin({ filepath: require.resolve('./dll/react-library.dll.js'),publicPath: '',}),],
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Android Gradle开发与应用 (一) : Gradle基础
  • 不同专业方向如何在ChatGPT的帮助下完成选题
  • 【JavaEE初阶】懒汉模式与饿汉模式及指令重排序问题
  • Windows图形界面(GUI)-MFC-C/C++ - 列表框(ListBox) - CListBox
  • 分享一个基于微信小程序的旅游自助拼团系统(源码、调试、LW、开题、PPT)
  • C#MQTT协议应用
  • 解决idea debug/run 启动项目一闪而过的问题
  • Docker 设置代理
  • vscode+linux+opencv环境配置
  • 使用ollama取代openai的api进行graphRAG失败记录
  • 《Milvus Cloud向量数据库指南》—Milvus Cloud赋能Ivy.ai:解锁大数据潜力,加速AI创新
  • 低代码: 系统开发准备之确定一般开发流程,需求分析,复杂度分析,标准开发流程
  • C#初级——字典Dictionary
  • 【深度学习】什么是混合精度训练?缩放因子 S 的选择
  • 探索编程世界:大学新生的最佳入门路径与学习方法
  • 2019年如何成为全栈工程师?
  • avalon2.2的VM生成过程
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • IDEA常用插件整理
  • input的行数自动增减
  • Java的Interrupt与线程中断
  • Laravel 中的一个后期静态绑定
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • PHP的类修饰符与访问修饰符
  • vuex 学习笔记 01
  • 代理模式
  • 对象管理器(defineProperty)学习笔记
  • 利用jquery编写加法运算验证码
  • 聊聊directory traversal attack
  • 你真的知道 == 和 equals 的区别吗?
  • 前端相关框架总和
  • 新版博客前端前瞻
  • 学习HTTP相关知识笔记
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 移动端 h5开发相关内容总结(三)
  • 云大使推广中的常见热门问题
  • 在Unity中实现一个简单的消息管理器
  • 走向全栈之MongoDB的使用
  • FaaS 的简单实践
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • ​zookeeper集群配置与启动
  • # windows 安装 mysql 显示 no packages found 解决方法
  • #AngularJS#$sce.trustAsResourceUrl
  • #if #elif #endif
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (计算机网络)物理层
  • (十三)Maven插件解析运行机制
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转载)Linux网络编程入门
  • .NET连接MongoDB数据库实例教程
  • .NET命令行(CLI)常用命令
  • 。。。。。
  • @EnableConfigurationProperties注解使用
  • @EventListener注解使用说明
  • @RequestMapping 和 @GetMapping等子注解的区别及其用法