webpack相关

webpack.docschina.org_ (2).png

在 webpack < 4 的版本中,通常将 vendor 作为一个单独的入口起点添加到 entry 选项中,以将其编译为一个单独的文件(与 CommonsChunkPlugin 结合使用)。而在 webpack 4 中不鼓励这样做。而是使用 optimization.splitChunks 选项,将 vendor 和 app(应用程序) 模块分开,并为其创建一个单独的文件。不要 为 vendor 或其他不是执行起点创建 entry。

Loader

loader 从右到左(或从下到上)地取值(evaluate)/执行(execute)。

module.exports = {module: {rules: [{test: /.css$/,use: [{ loader: 'style-loader' },{loader: 'css-loader',options: {modules: true,},},{ loader: 'sass-loader' },],},],},
};

Q:sideEffects在webpack打包的时候有什么用?

在Webpack中,sideEffects是一个用于标记模块是否有副作用(side effect)的配置选项。副作用是指模块在导入时对全局状态进行修改或对环境造成其他影响,例如修改文件系统、发起网络请求等。对于没有副作用的模块,Webpack可以利用这个信息进行Tree Shaking(摇树优化),将未被使用的代码从最终的打包文件中删除,以减小打包文件的体积。

sideEffects的值可以是一个布尔值或一个数组。如果值为false,表示该模块没有副作用,可以进行Tree Shaking优化;如果值为true或者数组中包含"*",表示该模块具有副作用,不可进行Tree Shaking优化;如果值为一个数组,数组中包含的字符串表示该模块具有副作用的文件路径或通配符。

例如,如果你的项目中有一个模块app.js,它没有副作用,那么可以在它的代码中添加如下注释:

/*#__PURE__*/ // 声明该模块没有副作用
export function add(x, y) {return x + y;
}

然后在Webpack的配置文件中添加以下配置:

module.exports = {// ...module: {rules: [{test: /.js$/,exclude: /node_modules/,use: {loader: 'babel-loader',options: {presets: ['@babel/preset-env']}}}]},optimization: {usedExports: true},// ...// 声明哪些模块没有副作用sideEffects: ["./src/add.js"]
}

这样,在打包时,Webpack会根据sideEffects的配置信息,将没有副作用的模块进行Tree Shaking优化,提高打包性能和减小打包体积。

Q:css或者less文件可以被tree-shaking吗?

在Webpack中,对于纯CSS或Less文件(即没有包含JavaScript代码),无法进行Tree Shaking优化,因为它们不会产生导出的JavaScript代码。Tree Shaking优化是通过检测导出的JavaScript代码的使用情况来删除未使用的代码,因此只有包含导出的JavaScript代码的模块才能进行Tree Shaking优化。

但是,如果你在Less或CSS中使用了类似于PostCSS、Autoprefixer等预处理器,它们可能会将部分JavaScript代码添加到生成的CSS文件中,例如添加浏览器前缀或者自动转换代码。在这种情况下,生成的CSS文件包含了导出的JavaScript代码,因此可以进行Tree Shaking优化。

要使Webpack可以对包含JavaScript代码的CSS或Less文件进行Tree Shaking优化,可以使用mini-css-extract-plugin插件,将CSS或Less文件单独打包成一个JavaScript模块,然后再进行Tree Shaking优化。

例如,在Webpack配置文件中添加以下配置:

const MiniCssExtractPlugin = require('mini-css-extract-plugin');module.exports = {// ...module: {rules: [{test: /.less$/,use: [MiniCssExtractPlugin.loader,"css-loader","less-loader",{loader: "postcss-loader",options: {plugins: [require("autoprefixer")()]}}]}]},plugins: [new MiniCssExtractPlugin({filename: "[name].css",chunkFilename: "[id].css"})],optimization: {usedExports: true}
}

这样,Webpack会将Less文件单独打包成一个JavaScript模块,然后在Tree Shaking优化时检测它的导出代码是否被使用,以删除未使用的代码。

Q:基于上述的描述,那么未被引用到的less或者css文件也就会被自动删除掉吗?

未被引用的CSS或Less文件并不会自动被Webpack删除,因为它们虽然未被引用,但是它们仍然被包含在Webpack的打包文件中,因此仍然会增加打包文件的体积。

如果需要将未使用的CSS或Less文件从打包文件中删除,可以使用插件或者手动处理。

例如,可以使用purgecss-webpack-plugin插件,在打包后对未使用的CSS文件进行删除。这个插件会分析打包后的HTML和JavaScript代码,检测哪些CSS样式类未被使用,然后将其从CSS文件中删除。

安装purgecss-webpack-plugin

npm install -D purgecss-webpack-plugin

在Webpack配置文件中添加以下配置:

const PurgeCssWebpackPlugin = require('purgecss-webpack-plugin');
const glob = require('glob');module.exports = {// ...plugins: [new PurgeCssWebpackPlugin({paths: glob.sync(`${path.join(__dirname, 'src')}/**/*`,  { nodir: true }),// whitelist patternswhitelistPatterns: [/^a-/, /^is-/, /^has-/, /^router-link-active$/]})]
}

这样,purgecss-webpack-plugin就会在打包后检测未使用的CSS样式类,并将其从CSS文件中删除。

需要注意的是,purgecss-webpack-plugin只能处理在HTML和JavaScript代码中使用的CSS样式类,无法处理在CSS文件中定义但未使用的样式类。因此,在使用该插件前需要仔细检查CSS文件,确保所有的样式类都被使用。

Q:webpack4相比于webpack3,升级了哪些地方?

1.性能优化:Webpack 4具有更好的性能和更快的构建速度。新的版本使用了更好的算法和数据结构,以减少构建时间。此外,Webpack 4还通过将模块ID生成算法从数字更改为基于字符串的算法,实现了更好的缓存和更小的包大小。

2.模块优化:Webpack 4优化了模块系统,允许开发者使用ES6模块,并且默认启用Tree Shaking,可以消除未使用的代码,减少包的大小。

3.Mode选项:Webpack 4新增了mode选项,可以配置为“development”、“production”和“none”三种模式,每种模式都有不同的默认配置和插件,便于开发者进行不同环境的构建和优化。

4.新的插件:Webpack 4提供了许多新的插件和特性,如OptimizeCSSAssetsPlugin、SplitChunksPlugin、NoEmitOnErrorsPlugin等。

5.更好的文档:Webpack 4的文档进行了改进,更加清晰明了,方便开发者使用。

Q:SplitChunksPlugin比CommonsChunkPlugin优点在哪儿?

SplitChunksPlugin是Webpack 4中用于代码分割的新插件,与Webpack 3中的CommonsChunkPlugin相比,SplitChunksPlugin有以下几个优点:

  1. 更好的默认配置:SplitChunksPlugin提供了更好的默认配置,可以更好地适应不同的项目需求,而CommonsChunkPlugin需要手动配置选项。

  2. 更灵活的配置选项:SplitChunksPlugin提供了更灵活的配置选项,可以根据实际需求进行定制化设置,例如可以基于模块的大小、被引用的次数等进行分割。

  3. 更好的性能:SplitChunksPlugin相比CommonsChunkPlugin具有更好的性能,可以更有效地将代码分割为更小的块,并实现更好的缓存机制。

  4. 更好的Tree Shaking特性:SplitChunksPlugin可以更好地支持Tree Shaking特性,可以更有效地消除未使用的代码,从而减少打包的体积。

总的来说,SplitChunksPlugin在功能和性能上都比CommonsChunkPlugin更优秀,可以更好地满足现代前端项目的需求。但是,如果您正在使用Webpack 3,CommonsChunkPlugin仍然是可用的,并且可以实现代码分割的功能。

CommonsChunkPlugin是Webpack中用于提取公共代码的插件,它的作用是将多个入口文件中相同的代码提取到一个单独的文件中,以便在多个页面之间共享使用,避免代码重复和增加页面加载时间。以下是CommonsChunkPlugin的常用配置选项:

  • name:表示提取出的公共模块的名称,可以使用字符串或者函数来指定名称。

  • filename:表示生成的文件名,可以使用[hash]等占位符。

  • minChunks:表示在多少个模块中使用的模块才会被提取为公共模块,默认值是2,也可以使用函数来指定。

  • chunks:表示在哪些入口chunk中使用的模块才会被提取为公共模块,可以是一个字符串或字符串数组,也可以是一个函数。

  • children:表示是否在所有的chunk中查找公共模块,默认值是false。

  • async:表示将异步加载的模块中公共部分提取到单独的文件中。

Q:webpack5相比于webpack4做了哪些升级?

Webpack 5 相比于 Webpack 4 做了很多升级,以下是一些主要的升级点:

  1. 更快的构建速度:Webpack 5 使用了一些新的技术,如持久化缓存和更好的多线程处理,从而提高了构建速度和性能。

  2. 更好的 Tree Shaking:Webpack 5 在 Tree Shaking 算法上进行了优化,可以更准确地识别和剔除没有使用的代码。

  3. 更好的模块解析:Webpack 5 对模块解析进行了升级,支持更多的模块类型和模块路径解析方式,例如支持 type: module,从而使得 ES Modules 能够更好地工作。

  4. 更好的代码块拆分:Webpack 5 对代码块拆分进行了升级,支持动态导入的模块和代码块,可以更好地控制代码块的大小和数量。

  5. 更好的输出管理:Webpack 5 对输出管理进行了升级,支持更多的输出选项和格式,例如支持输出 ESM 格式的代码。

  6. 更好的错误处理:Webpack 5 对错误处理进行了升级,可以提供更详细和有用的错误信息和提示。

  7. 更好的插件系统:Webpack 5 对插件系统进行了升级,支持更多的插件选项和钩子,例如支持 beforeRunafterEmit 两个新的钩子。

  8. 更好的缓存管理:Webpack 5 对缓存管理进行了升级,支持更多的缓存选项和控制方式,例如支持自定义缓存目录和缓存方式。

除了以上几点之外,Webpack 5 还有很多其他的升级和改进,可以去官方文档查看详细信息。总的来说,Webpack 5 对 Webpack 4 进行了全面的升级和改进,提高了构建速度、代码质量和开发体验。

Q:webpack为什么对于Import()的模块会单独创建一个或者多个异步块?

Webpack对import()的模块单独创建异步块的目的是实现代码分割(code splitting)和按需加载(on-demand loading)的优化策略。

代码分割是一种将代码拆分成较小块的技术,它可以使应用程序在加载时只请求所需的代码块,而不是一次性加载所有代码。这样可以减少初始加载时间,并提高应用程序的性能。通过将import()的模块单独创建异步块,Webpack能够将这些模块的代码与主应用程序的代码分离,使得在初始加载时只加载必要的代码,延迟加载其他模块。

异步块的创建还使得按需加载成为可能。当应用程序需要某个模块时,可以通过动态导入(import())该模块来触发异步请求,从而按需加载该模块的代码。这种按需加载的方式可以根据用户操作、路由变化或其他条件来决定何时加载特定模块,以优化应用程序的性能和资源利用。

另外,通过将import()的模块单独创建异步块,Webpack还能够利用浏览器的并行加载能力。当浏览器发起异步请求时,它可以同时请求多个文件,从而加快加载速度。

总之,通过将import()的模块单独创建异步块,Webpack实现了代码分割和按需加载的优化策略,以提高应用程序的性能和加载速度。它允许开发人员根据需要延迟加载模块,减少初始加载的大小,并充分利用浏览器的并行加载能力。

Q:为什么有的模块没有被使用,但是也没有tree-shaking掉?

如果一个模块没有显示的声明sideEffects,也没用添加/#PURE/这样的声明。那么就要依赖Terser来进行推断副作用了。但是在现实场景下,这是一件很困难的事情。贴一下webpack官方文档里的一个demo:

import { Button } from '@shopify/polaris';import hoistStatics from 'hoist-non-react-statics';function Button(_ref) {// ...
}function merge() {var _final = {};for (var _len = arguments.length, objs = new Array(_len), _key = 0;_key < _len;_key++) {objs[_key] = arguments[_key];}for (var _i = 0, _objs = objs; _i < _objs.length; _i++) {var obj = _objs[_i];mergeRecursively(_final, obj);}return _final;
}function withAppProvider() {return function addProvider(WrappedComponent) {var WithProvider =/*#__PURE__*/(function (_React$Component) {// ...return WithProvider;})(Component);WithProvider.contextTypes = WrappedComponent.contextTypes? merge(WrappedComponent.contextTypes, polarisAppProviderContextTypes): polarisAppProviderContextTypes;var FinalComponent = hoistStatics(WithProvider, WrappedComponent);return FinalComponent;};
}var Button$1 = withAppProvider()(Button);export {// ...,Button$1,
};

When Button is unused you can effectively remove the export { Button$1 }; which leaves all the remaining code. So the question is “Does this code have any side effects or can it be safely removed?”. Difficult to say, especially because of this line withAppProvider()(Button). withAppProvider is called and the return value is also called. Are there any side effects when calling merge or hoistStatics? Are there side effects when assigning WithProvider.contextTypes (Setter?) or when reading WrappedComponent.contextTypes (Getter?).

Terser actually tries to figure it out, but it doesn’t know for sure in many cases. This doesn’t mean that terser is not doing its job well because it can’t figure it out. It’s too difficult to determine it reliably in a dynamic language like JavaScript.

reference: https://webpack.js.org/guides/tree-shaking/#clarifying-tree-shaking-and-sideeffects

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/3761.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

E6新语法for of 和ES3的for in 有什么区别?useState为什么是用数组结构而不用对象?

for of 是es6新增的循环方式&#xff0c;请问for in 和for of的区别 1 for in会返回数组中所有可枚举属性,包括原型链上可枚举的属性,会遍历对象的整个原型链,性能较差不推荐使用; for of 不会往原型链下继续循环遍历,只会返回数组索引对应的属性值;for in 遍历数组拿到的是数…

【MySQL】MySQL数据库的初阶使用

文章目录 一、MySQL服务的安装二、数据库基础1.什么是数据库&#xff1f;&#xff08;基于CS模式的一套数据存取的网络服务&#xff09;2. Linux文件系统和数据库的关系 && 主流数据库3.MySQL架构 && SQL分类 && MySQL存储引擎 三、MySQL操作库1.库结构…

查询网络服务和端口

netstat 命令用于显示各种网络相关信息&#xff0c;如网络连接, 路由表&#xff0c;接口状态 (Interface Statistics)&#xff0c;masquerade 连接&#xff0c;多播成员 (Multicast Memberships) 等等。 列出所有端口 (包括监听和未监听的): netstat -a列出所有 tcp 端口: n…

ELK-日志服务【redis-配置使用】

目录 环境 【1】redis配置 【2】filebeat配置 【3】对接logstash配置 【4】验证 【5】安全配置&#xff1a;第一种&#xff1a;kibana-nginx访问控制 【6】第二种&#xff1a;在ES-主节点-配置TLS 【7】kibana配置密码 【8】logstash添加用户密码 环境 es-01,kibana 1…

掘金量化—Python SDK文档—5.API 介绍(1)

​ Python SDK文档 5.API 介绍 5.1基本函数 init - 初始化策略 初始化策略, 策略启动时自动执行。可以在这里初始化策略配置参数。 函数原型&#xff1a; init(context)参数&#xff1a; 参数名类型说明contextcontext上下文&#xff0c;全局变量可存储在这里 示例&…

本周信息差 | 微软合并暴雪新进展

⭐️ 微软合并暴雪新进展 美国一位联邦法官发现&#xff0c;联邦交易委员未能证明微软收购动视暴雪&#xff0c;一个在线游戏开发商&#xff0c;会如何损害竞争&#xff0c;并且驳回了该机构阻止交易的禁令请求。联邦交易委员会认为&#xff0c;微软会让动视暴雪的畅销游戏&am…

C# 枚举使用整理_C# enum详解

一、枚举的定义 枚举类型 是由基础整型数值类型的一组命名常量定义的值类型。 System.Enum 类型是所有枚举类型的抽象基类。 它提供多种方法来获取有关枚举类型及其值的信息。 有关更多信息和示例&#xff0c;请参阅 System.Enum API 参考页。 可在基类约束中使用 System.En…

数据分析之Matplotlib

文章目录 1. 认识数据可视化和Matplotlib安装2. 类型目录3. 图标名称title4. 处理图形中的中文问题5. 设置坐标轴名称&#xff0c;字体大小&#xff0c;线条粗细6. 绘制多个线条和zorder叠加顺序7. 设置x轴刻度xticks和y轴刻度yticks8. 显示图表show9. 设置图例legend10. 显示线…

vue 项目优化

去除冗余的css 消除框架中未使用的CSS,初步达到按需引入的效果 使用背景&#xff1a;vue2.x, webpack3.x 使用插件&#xff1a;purifycss-webpack 安装&#xff1a; npm i purifycss-webpack purify-css glob-all -D安装后各个插件的版本&#xff1a; “glob-all”: “^3.3.…

从小白到大神之路之学习运维第64天--------Zabbix监控mysql、ftp服务以及自定义配置

第三阶段基础 时 间&#xff1a;2023年7月19日 参加人&#xff1a;全班人员 内 容&#xff1a; Zabbix监控mysql、ftp服务以及自定义 目录 一、Zabbix监控mysql数据库 二、Zabbix监控ftp服务 三、Zabbix自定义监控项 整体zabbix搭建完成&#xff0c;server端huyang1监…

吴恩达机器学习2022-Jupyter-Scikit-Learn教学

1可选实验室: 线性回归使用 Scikit-Learn 有一个开源的、商业上可用的机器学习工具包&#xff0c;叫做 scikit-learn。本工具包包含您将在本课程中使用的许多算法的实现。 1.1目标 在这个实验室里: 利用 scikit-学习使用线性回归梯度下降法来实现 1.2工具 您将利用 sciki…

Navidrome - 开源音乐服务器【打造属于自己的音乐播放器】「端口映射」随时随地想听就听

转载自cpolar极点云文章&#xff1a;Navidrome - 开源音乐服务器【打造属于自己的音乐播放器】「端口映射」随时随地想听就听 1. 前言 不知从何时开始&#xff0c;我们能用的音乐软件越来越少&#xff0c;笔者使用小米手机很久了&#xff0c;自从小米手机的自带音乐播放器变成…

【数据结构】堆的应用——Top-K

目录 前言&#xff1a; 一、Top-K问题描述&#xff1a; 二、不同解决思路实现&#xff1a; ①.排序法&#xff1a; ②.直接建堆法&#xff1a; ③.K堆法 总结&#xff1a; 前言&#xff1a; 上篇文章我们学习了二叉树的顺序存储结构&#xff0c;并且对于实际使用中所常…

RabbitMQ到底为什么要使用它?

导入 一个技术的衍生必然是为了解决现实出现的问题&#xff0c;在讲这个问题之前我们先了解一下传统开发中关于服务调用出现的问题&#xff08;痛点&#xff09;有哪些&#xff1f; 我们为什么要使用MQ&#xff1f; ①、同步——超时 在多服务体系架构中&#xff0c;必然存在…

Kyuubi的介绍优势(官网链接)

官网链接&#xff1a;https://kyuubi.apache.org/ Apache Kyuubi™ 是一个分布式多租户网关&#xff0c;用于在数据仓库和 Lakehouse 上提供无服务器 SQL。 Kyuubi 在各种现代计算框架&#xff08;例如 Apache Spark、 Flink、 Doris、 Hive和Trino等&#xff09;之上构建分布…

全志F1C200S嵌入式驱动开发(GPIO输出)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 和v3s一样,f1c200s本身的外部引脚比较少。所以这个时候,不可避免地,很多引脚的功能就会重叠在一起。这种情况下,我们就要学会取舍了。比如说,如果是学习sd卡的时候,那么spi的…

MS1826 HDMI 四进四出多功能视频处理器

MS1826 是一款多功能视频处理器&#xff0c;包含 4 路独立 HDMI 音视频输入通道、4 路独立 HDMI 音视频输出通道以及四路独立可配置为输入或者输出的 SPDIF、I2S 音频信号。支持 4 个独立 的字库定制型 OSD&#xff1b;可处理隔行和逐行视频或者图形输入信号&#xff1b;有四…

CSS——基础知识及使用

CSS 是什么 CSS是层叠样式表 (Cascading Style Sheets)的简写.CSS 能够对网页中元素位置的排版进行像素级精确控制, 实现美化页面的效果. 能够做到页面的样式和结构分离。 基本语法规范 选择器 { 一条/N条声明 } 选择器决定针对谁修改 (找谁)声明决定修改啥. (干啥)声明的…

css3的新特性

动画效果 过渡 transition 鼠标放上去瞬间变大 过渡是变大的过程慢慢变化 第一个参数&#xff1a;对哪些值进行过渡。all为hover中所有&#xff0c;也可以指定属性 第二个参数&#xff1a;让动画过渡多长时间。要添加单位&#xff08;s秒&#xff09; 第三个参数&#xff1…

P5708 【深基2.习2】三角形面积

题目描述 一个三角形的三边长分别是 &#xfffd;a、&#xfffd;b、&#xfffd;c&#xff0c;那么它的面积为 &#xfffd;(&#xfffd;−&#xfffd;)(&#xfffd;−&#xfffd;)(&#xfffd;−&#xfffd;)p(p−a)(p−b)(p−c)​&#xff0c;其中 &#xfffd;12(&a…