UzumakiItachi
首页
  • JavaSript
  • Vue

    • Vue2
    • Vue3
  • React

    • React_18
  • WebPack
  • 浏览器相关
  • 工程化相关
  • 工作中遇到的问题以及解决方案
  • Git
  • 面试
  • 学习
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
  • 个人产出
  • 实用工具
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

UzumakiItachi

起风了,唯有努力生存。
首页
  • JavaSript
  • Vue

    • Vue2
    • Vue3
  • React

    • React_18
  • WebPack
  • 浏览器相关
  • 工程化相关
  • 工作中遇到的问题以及解决方案
  • Git
  • 面试
  • 学习
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
  • 个人产出
  • 实用工具
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • WebPack

    • WebPack热更新原理
    • 实现一个通用的WebPack配置包
    • WebPack打包多页面应用
    • WebPack构建速度以及体积优化策略
    • 手写一个简易的WebPack
    • 实现一个简易的webpack-loader
    • 实现一个简易的Webpack-plugin
    • 深入WebPack code splitting
    • 实现一个合成雪碧图的loader
    • 实现一个压缩文件的plugin
    • webpack5都升级了哪些东西
      • 前言
      • 相较webpack4的改动
      • 总结
    • 实现一个自动收集路由信息的webpack插件
  • 浏览器相关

  • 工程化相关

  • 工作中遇到的问题以及解决方案

  • Git

  • Vite

  • 一些小工具

  • 算法

  • 服务器

  • HTTP

  • 技术
  • WebPack
hanhanbuku
2023-06-01
目录

webpack5都升级了哪些东西

# 前言

webpack5早在2020年就已经发布了,下面就一起来看看webpack5都有哪些升级吧

# 相较webpack4的改动

  • 不再为nodejs模块自动引用Polyfills

介绍

所谓Polyfills其实就是比如有一些代码在现代浏览器并不支持,那如果想要在现代浏览器去使用他就需要自己去实现这个功能模块。而Polyfills就是一种对代码进行兼容性处理的做法的统称。很多时候项目里如果用到了nodejs模块,但这些模块在浏览器中是不支持的。webpack为了能让项目完整运行 就会自动的去引入模块相对应的Polyfills,从而导致最终的bundle非常的大,而webpack5则废弃掉了这一特性。因为很多东西本来就不是在浏览器用的,你如果非要用其实npm上也会有相应的包来取代他。但如果还是坚持要使用的话 也是有办法的,我们可以根据错误提示,手动的去引入这个模块的Polyfills。

let path = require('path')

module.exports = {
  mode: 'development',
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist'),
    library: 'result'
  },
  resolve: {
    fallback: {
      "crypto": require.resolve("crypto-browserify"),
      "stream": require.resolve("stream-browserify")
    }
  },
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

具体的操作这里就不做多赘述,网上会有详细的教程。

  • 清除一些废弃语法
  • 长期缓存

提示

webpack在打包的时候会有一个moduleID和chunkID,原先在打包的时候会按顺序用一个数字作为id,一旦我们的代码发生了变化,代码重新打包就会导致这个id发生变化。id发生了变化就会导致文件名字改变,从而对缓存非常的不利。 在webpack5之后会提供多几种的id组合选择给到用户。从而可以更大程度上利用好浏览器缓存

  • 持久化缓存

提示

充分利用好浏览器缓存,是前端项目优化的一个重中之重。webpack在构建的时候也是一样,一些不发生变化的文件就没必要每次都去重新构建他了。在webpack5之前其实也是有提供cache-loader和babel-loader的cacheDirectory选项来配置缓存,webpack5之后就已经把这些内置进来了。使用者只需要配置cache对象就可以对缓存进行一些额外的定制效果 缓存默认是存在内存里的,我们可以配置存在磁盘中,缓存的淘汰策略一般是最大500mb,存两个星期。一旦超过时间或者超出大小就会将旧的淘汰掉

  • three shaking强化

提示

在webpack5中对three shaking是有了一个更好的支持,已经可以对嵌套的模块进行three shaking了,

  • 支持生成es6代码,新版可以在output中配置生成代码的es版本
  • 模块联邦

提示

模块联邦是webpack5新出的一个重要特性,他具体的作用简单描述就是,可以让多个项目代码更好的共享,在次之前要共享代码需要将被共享的打包发布到npm上然后让使用者下载安装才能共享。有了模块联邦之后可以通过一些配置就轻松做到共享代码。并且他也可以用来实现微前端。具体的实践会再出一篇文章,这里就不过多赘述

  • bundle和bundless

提示

这一点不是webpack5的提升而是目前多种打包工具之间的概念差异。现在非常火的vite采用的就是bundless的思路。两者的区别主要在于,bundle是所有代码构建后的一个合集,而bundless利用现在http2请求数量无限制,以及大部分浏览器都支持esm的特性。做到不整合资源,你用到啥就加载啥。这也就是为什么采用bundless的vite冷启动非常快。因为他跳过的打包阶段。这样做的好处就是本低开发效率非常的高,并且代码调试也很方便。当然也有他不好的地方,那就是请求数量会增多。所以 在开发环境下我们可以更多的去考虑bundless来提升开发效率,而生产环境最好还是保留bundle这种方式。毕竟请求数量变多了对服务器是一个不小的压力。

# 总结

  • 不再为nodejs自动引入Polyfills
  • 清除废弃语法
  • 长期缓存,主要体现在moduleid和chunkid的变化上,由以前的按顺序一位数变为了现在的三位数,优化缓存的利用
  • 长期缓存,以前需要通过额外的loader或者插件来进行构建期间代码的缓存,现在可以直接通过配置cache对象来自定义缓存策略
  • theeshaking的增强
  • 模块联邦
编辑 (opens new window)
上次更新: 2023/06/01, 21:23:58
实现一个压缩文件的plugin
实现一个自动收集路由信息的webpack插件

← 实现一个压缩文件的plugin 实现一个自动收集路由信息的webpack插件→

最近更新
01
前端检测更新,自动刷新网页
06-09
02
swiper渲染大量数据的优化方案
06-06
03
仿抖音短视频组件实现方案
02-28
更多文章>
Theme by Vdoing | Copyright © 2023-2025 UzumakiItachi | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式