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

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: webpack拓展篇(六十七):webpack5 新特性解析

说明

玩转 webpack 学习笔记



webpack5 正式发布


webpack5 在 2020-10-10 正式发布

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


d17d6606fb684c2daf68bc29157daf6d.png


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

f3e56d765fd34364881d9ad52c92892a.png


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

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


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

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


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


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


c2109ebea73e4274869e2f067b8e5092.png


webpack4:里面利用 node-libs-browser 这个实现 polyfill 的。

cbe06a16f6e44093a07ed5609e1f3a36.png

webpack5

193ed9c085804e6c93c6f2fb2cb8978f.png



长期缓存:确定的模块 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。



例子:

image.png


webpack4:1,2,3... 递增的方式


1a3432fcf37d452a820964fc9e42fc23.png


webpack5:数字是确定的,比如多个 import 模块时,不会因为一个变化了而产生变化。

195e22a01f424168bc63c93227b9d55a.png


持久化缓存

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


webpack5缓存策略

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


aa2ad5fbff38497a9ed2df1faea28cf1.png


构建优化

Tree Shaking 优化 — 嵌套的 Tree shaking

例子:module.js 里使用了 inner.js,然后 user.js 里使用了 module.js 文件


08ecc041f995499da875074d0f59ab9b.png


webpack4:


86de71c6233846b0b99f10127f666d99.png

webpack5:

530c465291614832b6d1a50b67c65407.png

Tree Shaking 优化 — 内部模块 Tree shaking

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

6f5589382ba0483fa0d60c9f729fc30d.png



webpack4 会打包进去

7f0db75526ea488db3c7441d93cb543d.png


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


c3c5eee843af4a439e0420620195d3a1.png


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

webpack4 之前只生成 ES5 的代码。


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

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

比如:写 2015 也是可以的

2f6fe0f7d08e453cb1f5c948dca6d2f9.png


开创性的特性:模块联邦


发明者: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


3cddca69cf1341feb75527c33273300e.png


应用 remote:提供了 Button 组件

2457273d56c048a985c7ca2332104f31.png



浏览器的效果

app1 应用使用了 app2 的 Button 组件端口为 3001


f0ef4683c1a944bc9bcbab1a7b7c7e2e.png


app1 怎么找到 app2 的?

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


c994209d40874751a8bf55ed3b8f2e10.png


app2 提供了 button

7b3e0cea792142bca8b94b6ada893d9a.png


app1 使用 button

5d0fac0637d8489688996ee1f399fe19.png


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

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


b1df0cce9a7a4260aed55045c4269786.png






目录
相关文章
|
2月前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
46 3
|
2月前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
54 3
|
2月前
|
缓存 JavaScript 前端开发
Vue3与Vue2生命周期对比:新特性解析与差异探讨
Vue3与Vue2生命周期对比:新特性解析与差异探讨
145 2
|
1月前
|
编译器 C# 开发者
C# 9.0 新特性解析
C# 9.0 是微软在2020年11月随.NET 5.0发布的重大更新,带来了一系列新特性和改进,如记录类型、初始化器增强、顶级语句、模式匹配增强、目标类型的新表达式、属性模式和空值处理操作符等,旨在提升开发效率和代码可读性。本文将详细介绍这些新特性,并提供代码示例和常见问题解答。
43 7
C# 9.0 新特性解析
|
21天前
|
编译器 PHP 开发者
PHP 8新特性解析与实战应用####
随着PHP 8的发布,这一经典编程语言迎来了诸多令人瞩目的新特性和性能优化。本文将深入探讨PHP 8中的几个关键新功能,包括命名参数、JIT编译器、新的字符串处理函数以及错误处理改进等。通过实际代码示例,展示如何在现有项目中有效利用这些新特性来提升代码的可读性、维护性和执行效率。无论你是PHP新手还是经验丰富的开发者,本文都将为你提供实用的技术洞察和最佳实践指导。 ####
27 1
|
22天前
|
数据安全/隐私保护 iOS开发 开发者
iOS 14隐私保护新特性深度解析####
随着数字时代的到来,隐私保护已成为全球用户最为关注的问题之一。苹果在最新的iOS 14系统中引入了一系列创新功能,旨在增强用户的隐私和数据安全。本文将深入探讨iOS 14中的几大隐私保护新特性,包括App跟踪透明度、剪贴板访问通知和智能防追踪功能,分析这些功能如何提升用户隐私保护,并评估它们对开发者和用户体验的影响。 ####
|
1月前
|
PHP 开发者
PHP 7新特性深度解析
【10月更文挑战第40天】随着PHP 7的发布,这个广泛使用的语言带来了许多令人兴奋的新特性和性能改进。本文将深入探讨PHP 7的主要变化,包括类型声明、错误处理机制、性能优化等方面,帮助开发者更好地理解和应用这些新特性。
32 4
|
1月前
|
C# 开发者
C# 10.0 新特性解析
C# 10.0 在性能、可读性和开发效率方面进行了多项增强。本文介绍了文件范围的命名空间、记录结构体、只读结构体、局部函数的递归优化、改进的模式匹配和 lambda 表达式等新特性,并通过代码示例帮助理解这些特性。
36 2
|
1月前
|
PHP 开发者
PHP 7新特性深度解析及其最佳实践
【10月更文挑战第31天】本文将深入探讨PHP 7带来的革新,从性能提升到语法改进,再到错误处理机制的变革。我们将通过实际代码示例,展示如何高效利用这些新特性来编写更加健壮和高效的PHP应用。无论你是PHP新手还是资深开发者,这篇文章都将为你打开一扇窗,让你看到PHP 7的强大之处。
|
1月前
|
安全 编译器 PHP
PHP 8新特性解析与实践应用####
————探索PHP 8的创新功能及其在现代Web开发中的实际应用

推荐镜像

更多