Webpack优化问题

news/2024/9/27 23:30:42 标签: webpack, 前端, node.js

目录

    • 打包流程
    • swc
    • thread-loader
    • hash
    • 升级插件

打包流程

webpack 的打包流程大致可以分为以下几个步骤:

  1. 初始化:webpack 通过配置文件和 Shell 参数,初始化参数,确定入口文件、输出路径、加
    载器、插件等信息。接下来读取配置文件,并合并默认配置、CLI 参数等,生成最终的配置
    对象。
  2. 编译:从入口文件开始,递归解析模块依赖,找到所有需要打包的模块。之后使用 loader 对
    每个模块进行转换,转换成浏览器能够识别的 JS 代码。
  3. 构建模块依赖图:webpack 会为每个模块创建一个模块对象,并根据模块的依赖关系,生成
    一个模块依赖图(Dependency Graph)。
  4. 生成代码块(chunk):根据入口和依赖图,将所有模块分组,生成一个个包含多个模块的代
    码块(chunk),这些 chunk 会根据配置生成不同的输出文件。
  5. 输出:将生成的代码块输出到指定的文件夹,并根据配置生成对应的静态资源文件。
  6. 插件处理:在整个构建过程中,webpack 会在特定的生命周期钩子上执行插件,插件可以对
    打包的各个阶段进行干预和处理。
    正是因为了解 webpack 整体的打包流程,所以我发现了很多可以优化的地方,然后进一步着力于
    构建的优化,大幅度缩减了构建所花费的时间。

首先使用了一个插件叫 speed-measure-webpack-plugin 来查看构建时间,各个阶段的耗时吧。
分析结果来看的话,babel 编译 js 是比较耗时的,应该是还有一些 loader 处理也比较耗时。这里就有2个优化方案:

  • swc 替换 babel 进行编译。
  • thread-loader 来解决 loader 解析耗时问题
    还有一些其他的手段来处理。最终的话效果是比较好的,降到了20s左右。

swc

它是 rust 写的 js 的编译器,编译速度非常快,而且能够兼容 babel 插件的配置,这样迁移起来没有什么成本。就这一个替换就减少了一大半的时间,它是占大头的。
我记得去年年底,yyx 说要用 rust 重写 Vite。

thread-loader

它可以通过多线程的来处理 loader 的操作,这样就减少了主线程的负载。这样那些css,图片,vue等loader的总耗时时间也减少了。

剩下的话就是一些细枝末节了,不过也是有一些作用的。

webpack5 新特定是持久化缓存,就是把模块的编译结果,解析结果,还有插件的执行结果缓存起来。后续构建就可以重用了。(这个和 Vite 的依赖预构建很像)
这块提一下吧,之前 Webpack这里也没有做什么特殊处理,就是一些简单的初始配置。后来查阅资料时发现其实在 Webpack4 版本也是有一些优化项的,
比如 cache-loader,在一些开销比较大的 loader 前加是可以将上一个loader 的结果缓存下来,下一次再走这个流程时就会根据一些规则跳过后面 loader 的处理来提高效率。
比如 DllPlugin 和 DllReferencePlugin 搭配使用来,对一些不常用的依赖,单独生成动态链接库,来提高构建速度。

module.exports = {
    // ...
    cache: {
        // 将缓存类型设置为文件系统,默认是memory
        type: "filesystem",
        buildDependencies: {
            // 更改配置文件时,重新缓存
            config: [__filename],
        },
    },
    optimization: {
        // 值为"single"会创建一个在所有生成chunk之间共享的运行时文件
        runtimeChunk: "single",
        moduleIds: "deterministic",
    },
};

hash

还有一个小点,就是这个 hash 的问题。
Webpack下是有3种 hash 的,content-hashchunk-hashhash(整个项目),这个是为了在生产环境下利用浏览器缓存机制来优化资源获取的。
开发环境下就不需要哇,本来就会频繁的更改代码。所以就把这个计算 hash 所消耗的时间也给删掉了。

升级插件

最后一个的话,是一个插件的升级。因为本来就升级到 Webpack5 了嘛,对应的一些插件肯定也要去兼容一下,其中有一个 terser-webpack-plugin 的插件,它是用来做压缩的。然后就看到它的更新日志上,好像是从 5.x 版本也引入了 swc 压缩器,升级后发现速度又变快了。

整体来说,主要用到了5个技术:

其实看 CHANGE_LOG 有时是可以发现一些被修复的问题的,比如 element-ui 升级版本对 table 组件的问题。
依赖对 node 版本的需求。也可以说下查看 npm 依赖的 CHANGE_LOG

大概就是这样。


以上。
之后详细总结。


http://www.niftyadmin.cn/n/5679817.html

相关文章

React学习笔记(3.0)

classnames优化类名控制 classnames是一个简单的JS库&#xff0c;可以非常方便的通过条件动态控制class类名的显示。 安装classnames&#xff1a; npm i classnames 导入&#xff1a; import classNames from classnames <div className{classNames(box3,{box2:11})}&g…

0基础学前端 day2

大家好&#xff0c;欢迎来到无限大的频道。 今天继续带领大家开始0基础学前端。 一、CSS简介与基础 层叠样式表&#xff08;CSS&#xff0c;Cascading Style Sheets&#xff09;是用来进行网页样式和布局设计的语言。通过CSS&#xff0c;开发者可以控制网页中元素的颜色、字体…

栈及笔试题

目录 栈的实现 1、数组栈 2、链式栈 栈的创建 栈的打印 内存泄漏 栈溢出 练习 有效的括号 栈的实现 栈后入先出 1、数组栈 &#xff08;最佳实现&#xff0c;且访问数据的时候CPU告诉访存命中率比较高&#xff0c;因为地址连续存放&#xff0c;访问时CPU从cache里一…

三.python入门语法1

目录 1. 算数运算和关系运算 1.1. 算术运算符 1.2. 关系运算符 习题 2.赋值运算和逻辑运算 2.1. 赋值运算符 2.2. 逻辑运算符 3.位运算符 1&#xff09;位与运算&#xff08;A&B&#xff09; 2&#xff09;位或运算&#xff08;A|B&#xff09; 3&#xff09;异或位…

Apache技术深度解析与实战案例

Apache技术深度解析与实战案例 Apache HTTP Server,作为世界使用排名第一的Web服务器软件,凭借其强大的功能和灵活的配置,在Web服务领域占据了举足轻重的地位。本文将从Apache的工作模式、配置文件详解、实战案例等方面进行深入探讨,并通过一个具体的代码示例来展示Apach…

C++学习笔记(45)

322、循环队列、信号量、生产/消费者模型的源代码 一、demo1.cpp // demo1.cpp&#xff0c;本程序演示循环队列的使用。 #include "_public.h" int main() { using ElemTypeint; squeue<ElemType,5> QQ; ElemType ee; // 创建一个数据元素。 cout << &qu…

CS50

文章目录 0.1 关于CS50对进制的介绍——二进制、八进制、十六进制。0.2 计算机的组成结构——计算机由硬件和软件组成。0.3 计算机的运行原理0.4 计算机的编程语言0.5 计算机的操作系统0.6 计算机的网络0.7 编译&#xff08;complier&#xff09;:0.8虚拟机&#xff08;Virtual…

macOS与Ubuntu虚拟机使用SSH文件互传

1.ubuntu配置: 安装openssh服务: sudo apt-get install openssh-server -y 查看服务启动状态: systemctl status ssh 2.macOS使用scp连接ubuntu并发送文件 查看ubuntu IP : ifconfigmacOS终端连接ubuntu : sc