webpack拓展篇(六十七):webpack5 新特性解析

2023-10-22 14:20

本文主要是介绍webpack拓展篇(六十七):webpack5 新特性解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

说明

玩转 webpack 学习笔记

webpack5 正式发布

webpack5 在 2020-10-10 正式发布

官网:https://webpack.js.org/blog/2020-10-10-webpack-5-release/

在这里插入图片描述

webpack5 新特性

  • 功能清除

    • 不再为 Node.js 模块自动引用 Polyfills
    • require.include 语法已经被废弃
    • 移除 v4 版本的废气能力的代码
  • 长期缓存

    • 新增长期缓存算法,确定的 Chunk、模块 ID 和导出名称,在生产模式下默认启用。
    • 真正的内容 Hash
  • 开发支持

    • 命名代码块 ID:在开发模式下默认启用的新命名块 id 算法为块(和文件名)提供人类可读的名称。
    • 模块联邦:模块可以从指定的远程构建中导入,并以最小的限制使用。
  • 支持崭新的 web 平台特性

    • JSON 模块
      • 在使用非默认导出时发出警告
      • 使用默认导出,未使用的属性也会被 optimization.usedExports 优化丢弃,属性会被 optimization.mangleExports 优化打乱
    • 资源模块
      • 支持浏览器原生提供的写法:new URL("./image.png", import.meta.url)(新方式)
      • import url from "./image.png")(老方法)
    • 原生 Worker 支持
      • 支持 new Worker(new URL("./image.png", import.meta.url)) 浏览器默认支持的语法
    • URIs
      • 支持 data
      • 支持 file
      • 支持 http(s) :需要通过 new webpack.experiments.schemesHttp(s)UriPlugin() 选择加入
    • 异步模块
      • 异步的外部资源(async externals)
      • 新规范中的 WebAssembly 模块
      • 使用顶层 Await 的 ECMAScript 模块
  • 支持安全的 node.js 生态特性解析

    • 现在支持 package.json 中的 exports 和 imports 字段
    • 原生支持 Yarn PnP
  • 构建优化

    • 嵌套的 tree-shaking
    • 内部模块 tree-shaking
    • CommonJs Tree Shaking
    • 副作用分析
  • 性能优化

    • 持久缓存
    • 编译器闲置和关闭
    • 文件生成

下面选取一些分析一下。

最小 Node.js 版本:10.13.0

最低支持的 Node.js 版本从 6 增加到 10.13.0

在这里插入图片描述

功能清除:清理弃用的能力

所有在 webpack4 里面被废弃的能力都被清除,因此需要确保 webpack4 没有打印警告 。

requre.includes 语法已被废弃(作用:实现一个模块预加载)

  • 可以通过 Rule.parser.requirelnclude 将行为改为允许、废弃或禁用。

功能清除:不再为 Node.js 模块引入 polyfill

之前的版本是:如果某个模块依赖 Node.js 里面的核心模块,那么这个模块被引入的时候会把 Node.js 整个 polyfill 顺带引入。

在这里插入图片描述
webpack4:里面利用 node-libs-browser 这个实现 polyfill 的。

在这里插入图片描述
webpack5

在这里插入图片描述

长期缓存:确定的模块 ld、chunk 和导出名称

在生产模式下,默认的 chunklds: "deterministic", modulelds:“deterministic"。设置成 deterministic 时默认最小3位数字会被使用

chunklds
选项值描述
natural按使用顺序的数字 id。
named 对调试更友好的可读的 id。
deterministic在不同的编译中不变的短数字 id。 有益于长期缓存。在生产模式中会默认开启。
size专注于让初始下载包大小更小的数字 id。
total-size专注于让总下载包大小更小的数字 id。
modulelds
选项值描述
natural按使用顺序的数字 id。
named 对调试更友好的可读的 id。
deterministic在不同的编译中不变的短数字 id。 有益于长期缓存。在生产模式中会默认开启。
size专注于让初始下载包大小更小的数字 id。

例子:
在这里插入图片描述
webpack4:1,2,3... 递增的方式

在这里插入图片描述
webpack5:数字是确定的,比如多个 import 模块时,不会因为一个变化了而产生变化。

在这里插入图片描述

持久化缓存

在 webpack4 里面,可以使用 cache-loader 将编译结果写入硬盘缓存,还可以使用 babel-loader,设置 option.cacheDirectory 将 babel-loader 编译的结果写进磁盘。

webpack5缓存策略
  • 默认开启缓存,缓存默认是在内存里。可以对 cache 进行设置。
  • 缓存淘汰策略:文件缓存存储在 node_ modules/.cache/webpack,最大 500 MB, 缓存时常两个星期,旧的缓存先淘汰

在这里插入图片描述

构建优化

Tree Shaking 优化 — 嵌套的 Tree shaking

例子:module.js 里使用了 inner.js,然后 user.js 里使用了 module.js 文件
在这里插入图片描述
webpack4:

在这里插入图片描述

webpack5:

在这里插入图片描述

Tree Shaking 优化 — 内部模块 Tree shaking

例子:usingSomething 里使用了 something,test 里使用了 usingSomething,但是 test 未被使用。

在这里插入图片描述
webpack4 会打包进去

在这里插入图片描述

webpack5 里可以分析模块之间的关系(内部通过一个 innerGraph 算法去实现),上面不会打包

在这里插入图片描述

代码生成:支持生成 ES6 代码

webpack4 之前只生成 ES5 的代码。

webpack5 则现在既可以生成 ES5 又可以生成 ES6/ES2015 代码。

两种设置方式:5 =< ecmaVersion <= 112009 =< ecmaVersion <= 2020

比如:写 2015 也是可以的
在这里插入图片描述

开创性的特性:模块联邦

发明者:Zack Jackson

模块联邦可以实现微前端。

基本解释:使一个 JavaScript 应用在运行过程中可以动态加载另一个应用的代码, 并支持共享依赖(CDN)。不再需要本地安装 Npm 包。

  • Remote:被依赖方,被 Host 消费的 Webpack 构建
  • Host:依赖方,消费其他 Remote 的 Webpack 构建

一个应用可以是 Host,也可以是 Remote,也可以同时是 Host 和 Remote。

ModuleFederationPlugin 介绍

Webpack 内部通过 ModuleFederationPlugin 插件将多个应用结合起来。

  • name:必须,唯一 ID, 作为输出的模块名,使用的时通过 ${name}/${expose} 的方式使用
  • library:必须,其中这里的 name 为作为 umd 的 name; .
  • remotes:可选,表示作为 Host 时,去消费哪些 Remote;
  • shared:可选,优先用 Host 的依赖,如果 Host 没有,再用自己的;
  • main.js:应用主文件
  • remoteEntry.js:作为 remote 时被引的文件
模块联邦使用案例

应用 host:要去消费 app2,端口号 3002

在这里插入图片描述
应用 remote:提供了 Button 组件
在这里插入图片描述
浏览器的效果

app1 应用使用了 app2 的 Button 组件端口为 3001
在这里插入图片描述
app2 应用端口为 3002
在这里插入图片描述

app1 怎么找到 app2 的?

通过 remoteEntry.js 找到生产者的模块。

在这里插入图片描述

在这里插入图片描述

app2 提供了 button

在这里插入图片描述

app1 使用 button

在这里插入图片描述

这样就达到了组件的共享。

打包构建之后,可以看到 remoteEntry.js 里面有 moduleMap,并且提供了get 方法。

在这里插入图片描述

这篇关于webpack拓展篇(六十七):webpack5 新特性解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/262011

相关文章

深度解析Python yfinance的核心功能和高级用法

《深度解析Pythonyfinance的核心功能和高级用法》yfinance是一个功能强大且易于使用的Python库,用于从YahooFinance获取金融数据,本教程将深入探讨yfinance的核... 目录yfinance 深度解析教程 (python)1. 简介与安装1.1 什么是 yfinance?

99%的人都选错了! 路由器WiFi双频合一还是分开好的专业解析与适用场景探讨

《99%的人都选错了!路由器WiFi双频合一还是分开好的专业解析与适用场景探讨》关于双频路由器的“双频合一”与“分开使用”两种模式,用户往往存在诸多疑问,本文将从多个维度深入探讨这两种模式的优缺点,... 在如今“没有WiFi就等于与世隔绝”的时代,越来越多家庭、办公室都开始配置双频无线路由器。但你有没有注

Python中的sort()和sorted()用法示例解析

《Python中的sort()和sorted()用法示例解析》本文给大家介绍Python中list.sort()和sorted()的使用区别,详细介绍其参数功能及Timsort排序算法特性,涵盖自适应... 目录一、list.sort()参数说明常用内置函数基本用法示例自定义函数示例lambda表达式示例o

SpringBoot加载profile全面解析

《SpringBoot加载profile全面解析》SpringBoot的Profile机制通过多配置文件和注解实现环境隔离,支持开发、测试、生产等不同环境的灵活配置切换,无需修改代码,关键点包括配置文... 目录题目详细答案什么是 Profile配置 Profile使用application-{profil

MySQL的触发器全解析(创建、查看触发器)

《MySQL的触发器全解析(创建、查看触发器)》MySQL触发器是与表关联的存储程序,当INSERT/UPDATE/DELETE事件发生时自动执行,用于维护数据一致性、日志记录和校验,优点包括自动执行... 目录触发器的概念:创建触www.chinasem.cn发器:查看触发器:查看当前数据库的所有触发器的定

Java中的volatile关键字多方面解析

《Java中的volatile关键字多方面解析》volatile用于保证多线程变量可见性与禁止重排序,适用于状态标志、单例模式等场景,但不保证原子性,相较synchronized更轻量,但需谨慎使用以... 目录1. volatile的作用1.1 保证可见性1.2 禁止指令重排序2. volatile的使用

Python lambda函数(匿名函数)、参数类型与递归全解析

《Pythonlambda函数(匿名函数)、参数类型与递归全解析》本文详解Python中lambda匿名函数、灵活参数类型和递归函数三大进阶特性,分别介绍其定义、应用场景及注意事项,助力编写简洁高效... 目录一、lambda 匿名函数:简洁的单行函数1. lambda 的定义与基本用法2. lambda

深入解析Java NIO在高并发场景下的性能优化实践指南

《深入解析JavaNIO在高并发场景下的性能优化实践指南》随着互联网业务不断演进,对高并发、低延时网络服务的需求日益增长,本文将深入解析JavaNIO在高并发场景下的性能优化方法,希望对大家有所帮助... 目录简介一、技术背景与应用场景二、核心原理深入分析2.1 Selector多路复用2.2 Buffer

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

全面解析Golang 中的 Gorilla CORS 中间件正确用法

《全面解析Golang中的GorillaCORS中间件正确用法》Golang中使用gorilla/mux路由器配合rs/cors中间件库可以优雅地解决这个问题,然而,很多人刚开始使用时会遇到配... 目录如何让 golang 中的 Gorilla CORS 中间件正确工作一、基础依赖二、错误用法(很多人一开