热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

webpack5做了哪些优化(新特性)

文章目录一、构建速度优化二、包代码体积的优化1.代码分割splitchunk2.TreeShaking3.剔除npm包里面针对Node.js模块自动引用的Polyfills三、持久

文章目录

  • 一、构建速度优化
  • 二、包代码体积的优化
    • 1.代码分割splitchunk
    • 2.Tree Shaking
    • 3.剔除npm包里面针对Node.js模块自动引用的Polyfills
  • 三、持久化缓存的优化
  • 四、模板联邦

在使用webpack的时候,我们常常会做一些优化,比如:

  • 构建速度优化
  • 代码体积优化
  • 持久化缓存优化
  • Module Federation

webpack5做了哪些优化呢?

一、构建速度优化

在webpack4中,为了让我们的构建速度更快,我们通常需要借助一些插件或一些额外的配置来达到目的。

  1. cache-loader,针对一些耗时的工作进行缓存。比如缓存babel-loader的工作。
  2. terser-webpack-plugin 或 uglifyjs-webpack-plugin的cache以及parallel。(默认开启)

比如我们会借助 cache-loader 去对我们构建过程中消耗性能比较大的部分进行缓存,缓存会存放到硬盘中node_modules/.cache/cache-loader,缓存的读取和存储是会消耗性能的,所以只推荐用在性能开销大的地方。

// 对babel-loader的工作进行缓存
module.exports = {module: {rules: [{test: /\.js$/,use: ['cache-loader', 'babel-loader'],include: path.resolve('src'),},],},
};

erserPlugin继承自uglifyjsPlugin,我们可以开启插件的cache以及parallel特性来加快压缩。(terserPlugin是webpack推荐及内置的压缩插件,cache与parallel默认为开启状态)缓存路径在node_modules/.cache/terser-webpack-plugin

optimization: {minimizer: [new TerserPlugin({cache: true, // 开启该插件的缓存,默认缓存到node_modules/.cache中parallel: true, // 开启“多线程”,提高压缩效率exclude: /node_modules/})],
},

到了webpack5,可以通过cache 特性来将webpack工作缓存到硬盘中。存放的路径为node_modules/.cache/webpack

// webpack.config.js
module.exports = { cache: {// 1. 将缓存类型设置为文件系统type: 'filesystem', // 默认是memory// 2. 将缓存文件夹命名为 .temp_cache,// 默认路径是 node_modules/.cache/webpackcacheDirectory: path.resolve(__dirname, '.temp_cache')}
}

在这里插入图片描述

二、包代码体积的优化

1.代码分割splitchunk

为了让我们的打出来的包体积更加小,颗粒度更加明确。我们经常会用到webpack的代码分割splitchunk以及tree shaking。在webpack5中,这两者也得到了优化与加强。比如

splitChunks: {chunks: 'all',minSize: {Javascript: 30000,style: 50000,}
},
// 默认配置
module.exports = {//...// https://github.com/webpack/changelog-v5#changes-to-the-configuration// https://webpack.js.org/plugins/split-chunks-plugin/optimization: {splitChunks: {chunks: 'async', // 只对异步加载的模块进行处理minSize: {Javascript: 30000, // 模块要大于30kb才会进行提取style: 50000, // 模块要大于50kb才会进行提取},minRemainingSize: 0, // 代码分割后,文件size必须大于该值 (v5 新增)maxSize: 0,minChunks: 1, // 被提取的模块必须被引用1次maxAsyncRequests: 6, // 异步加载代码时同时进行的最大请求数不得超过6个maxInitialRequests: 4, // 入口文件加载时最大同时请求数不得超过4个automaticNameDelimiter: '~', // 模块文件名称前缀cacheGroups: {// 分组,可继承或覆盖外层配置// 将来自node_modules的模块提取到一个公共文件中 (又v4的vendors改名而来)defaultVendors: { test: /[\\/]node_modules[\\/]/,priority: -10},// 其他不是node_modules中的模块,如果有被引用不少于2次,那么也提取出来default: {minChunks: 2,priority: -20,reuseExistingChunk: true}}}}
};

2.Tree Shaking

tree shaking 的意思是,webpack 在打包的时候将会剔除掉被没有被使用到的代码达到减小报体积,缩短 http 请求时间,起到一定效果的页面优化。

Webpack 不能百分百安全地进行 tree-shaking,webpack4 有些场景是不能将无用代码剔除的。有些模块导入,只要被引入,就会对应用程序产生重要的影响。一个很好的例子就是全局样式表,或者设置全局配置的Javascript 文件。

Webpack 认为这样的文件有“副作用”。具有副作用的文件不应该做 tree-shaking,因为这将破坏整个应用程序。Webpack 的设计者清楚地认识到不知道哪些文件有副作用的情况下打包代码的风险,因此webpack4默认地将所有代码视为有副作用。这可以保护你免于删除必要的文件,但这意味着 Webpack 的默认行为实际上是不进行 tree-shaking。值得注意的是webpack5默认会进行 tree-shaking。

webpack4 曾经不进行对 CommonJs 导出和 require() 调用时的导出使用分析。webpack 5 增加了对一些 CommonJs 构造的支持,允许消除未使用的 CommonJs 导出,并从 require() 调用中跟踪引用的导出名称。

3.剔除npm包里面针对Node.js模块自动引用的Polyfills

v4编译引入npm包,有些npm包里面包含针对nodejs的polyfills,实际前端浏览器是不需要的
例如:

// index.js
import CryptoJS from 'crypto-js';
const md5Password = CryptoJS.MD5('123123');
console.log(md5Password);

v4 引入crypto-js模块会自动引入polyfill: crypto-browserify, 但部分代码是不需要的,v5 默认会自动剔除

v5编译中,会出现polyfill添加提示,如果不需要node polyfille,按照提示 alias 设置为 false 即可

// webpack.config.jsresolve: {// 1.不需要node polyfilssalias: {crypto: false},// 2.手动添加polyfills// fallback: {// "crypto": require.resolve('crypto-browserify')// }}

到了webpack5,我们需要清楚自己的项目需要引入哪些node polyfill。更加了配置的门槛,但是减少了代码的体积。

webpack5中将path、crypto、http、stream、zlib、vm的node polyfill取消后
在这里插入图片描述

三、持久化缓存的优化

以前v4是根据代码的结构生成chunkhash,现在v5根据完全内容生成chunkhash,比如改了内容的注释或者变量则不会引起chunkhash的变化,让浏览器继续使用缓存。

在webpack4 中,chunkId与moduleId都是自增id。也就是只要我们新增一个模块,那么代码中module的数量就会发生变化,从而导致moduleId发生变化,于是文件内容就发生了变化。chunkId也是如此,新增一个入口的时候,chunk数量的变化造成了chunkId的变化,导致了文件内容变化。

webpack4可以通过设置optimization.moduleIds = 'hashed’与optimization.namedChunks=true来解决这写问题,但都有性能损耗等副作用。

optimization: {moduleIds: 'hashed',namedChunks: true,// ...
}

而webpack5 在production模式下optimization.chunkIds和optimization.moduleIds默认会设为’deterministic’,webpack会采用新的算法来计算确定性的chunkI和moduleId。

在这里插入图片描述

在这里插入图片描述

四、模板联邦

模块联邦制,使 Javascript 应用得以从另一个 Javascript 应用中动态地加载代码 —— 同时共享依赖。项目分为Host(消费者),remote(被消费者)。功能实现主要依靠 ModuleFederationPlugin 插件。

new ModuleFederationPlugin({name: '', // 名称,唯一idlibrary: {}, // 以什么形式暴露,比如umd filename: '', // 输出的入口文件名称exposes: {}, // 要输出的组件或方法shared: [] // 要共享的依赖
})

例子:

module.exports = {// other webpack configs...plugins: [new ModuleFederationPlugin({// 1. name 当前应用名称,需要全局唯一name: "app_one_remote",// 2. remotes 可以将其他项目的 name 映射到当前项目中remotes: {app_two: "app_two_remote",app_three: "app_three_remote"},// 3. exposes 表示导出的模块,只有在此申明的模块才可以作为远程依赖被使用exposes: {AppContainer: "./src/App"},// 4. shared可以让远程加载的模块对应依赖改为使用本地项目的 React或ReactDOM。shared: ["react", "react-dom", "react-router-dom"]}),new HtmlWebpackPlugin({template: "./public/index.html",chunks: ["main"]})]
};

比如设置了remotes: { app_two: “app_two_remote” },在代码中就可以直接利用以下方式直接从对方应用调用模块

import { Search } from "app_two/Search";
app_two/Search来自于app_two 的配置:

// app_two的webpack 配置
export default {plugins: [new ModuleFederationPlugin({name: "app_two",library: { type: "var", name: "app_two" },filename: "remoteEntry.js",exposes: {Search: "./src/Search"},shared: ["react", "react-dom"]})]
};

正是因为 Search在exposes被导出,我们因此可以使用 [name]/[exposes_name] 这个模块,这个模块对于被引用应用来说是一个本地模块。

这个方案是直接将一个应用的 bundle,应用于另一个应用,动态分发 runtime 子模块给其他应用。

参考文章https://www.jianshu.com/p/eacdd98d25b0
参考文章https://github.com/HolyZheng/holyZheng-blog/issues/48

本文链接https://blog.csdn.net/qq_39903567/article/details/115335822


推荐阅读
  • 学习笔记(34):第三阶段4.2.6:SpringCloud Config配置中心的应用与原理第三阶段4.2.6SpringCloud Config配置中心的应用与原理
    立即学习:https:edu.csdn.netcourseplay29983432482?utm_sourceblogtoedu配置中心得核心逻辑springcloudconfi ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • uniapp开发H5解决跨域问题的两种代理方法
    本文介绍了uniapp开发H5解决跨域问题的两种代理方法,分别是在manifest.json文件和vue.config.js文件中设置代理。通过设置代理根域名和配置路径别名,可以实现H5页面的跨域访问。同时还介绍了如何开启内网穿透,让外网的人可以访问到本地调试的H5页面。 ... [详细]
  • node.jsrequire和ES6导入导出的区别原 ... [详细]
  • 本文介绍了5个基本Linux命令行工具的现代化替代品,包括du、top和ncdu。这些替代品在功能上进行了改进,提高了可用性,并且适用于现代化系统。其中,ncdu是du的替代品,它提供了与du类似的结果,但在一个基于curses的交互式界面中,重点关注占用磁盘空间较多的目录。 ... [详细]
  • 如何优化Webpack打包后的代码分割
    本文介绍了如何通过优化Webpack的代码分割来减小打包后的文件大小。主要包括拆分业务逻辑代码和引入第三方包的代码、配置Webpack插件、异步代码的处理、代码分割重命名、配置vendors和cacheGroups等方面的内容。通过合理配置和优化,可以有效减小打包后的文件大小,提高应用的加载速度。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
    一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • Firefox火狐浏览器关闭到http://detectportal.firefox.com的流量问题解决办法
    本文介绍了使用Firefox火狐浏览器时出现关闭到http://detectportal.firefox.com的流量问题,并提供了解决办法。问题的本质是因为火狐默认开启了Captive portal技术,当连接需要认证的WiFi时,火狐会跳出认证界面。通过修改about:config中的network.captive-portal-service.en的值为false,可以解决该问题。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了在Android Studio中使用命令行build gradle的方法,并解决了一些常见问题,包括手动配置gradle环境变量和解决External Native Build Issues的方法。同时提供了相关参考文章链接。 ... [详细]
author-avatar
湘颖宛光秀雅
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有