webpack5

为什么要去学习webpack

开发时可能会使用框架(react、vue)、ES6、less/sass等css预处理器;
这样的代码想要在浏览器运行必须经过编译,成为浏览器可以识别的js、css等语法,才可以运行;

webpack用来处理以上编译,并且具备压缩代码、兼容性处理、提升代码性能;

以一个文件或者多个文件作为打包入口,将整个项目所有文件编译组合成一个或多个文件输出;输出的文件就是编译好的文件,可以在浏览器运行;
webpack输出的文件叫做bundle;

功能介绍

  • 开发模式:仅编译js的es module语法;
  • 生产模式:能编译js的es module语法,还可以压缩js代码
    但是webpack只能处理js语法,遇到css资源就无法处理了

核心功能

  • entry
  • output
  • loader:threader-loader(开启多进程)
  • plugin:
    • ESLintPlugin
    • HtmlWebpackPlugin(创建html文件,结构和原来一致)
    • MiniCssExtraPlugin(生成单独的css文件,通过link方式引入)
    • CssMinimizerPlugin(压缩css文件)
    • TerserWebpackPlugin(js压缩插件,配置项里开启多进程)
    • image-minimizer-webpack-plugin(压缩image、有分无损压缩和有损压缩)
    • preload:告诉浏览器立即加载资源(只加载,不执行;只能加载当前页面用到的资源)
<Link href="staic/js/math.chunk.js" rel="preload" as="script" />
- prefetch:告诉浏览器空闲时加载资源(只加载不执行;可以加载下一个页面用到的资源)查看兼容性的网站 can I use
  • mode
    压缩的话,也可以放在optimization里面的minimizer(防止css压缩、js压缩插件)

css处理

动态创建一个style标签,里面是css代码

图片资源

file-loader、url-loader(已经内置,不需要再安装了)
base64:将图片转化为字符串(不需要额外发请求了)

ESLint

eslintrc.js(error、warn)
eslintignore

babel

babel.config.js
presets:[@babel/preset-env, @babel/preset-react, @babel/preset-typescript]
@babel/preset-env:处理箭头函数

在webpack.config.js文件中对js文件加上babel-loader;排除exclude: /node_modules/

处理html资源

htmlPlugin

搭建开发服务器

使用devServer(不会输出资源,是在内存中编译打包);自动搭建服务器,每次有代码修改,都自动重新打包

提取css成单独文件

MiniCssExtraPlugin.loader 替换掉style-loader
样式文件通过link引入,不再通过style标签引入
postcss-loader:处理样式兼容性(比如flex)
CssMinimizerPlugin:css插件压缩css文件
默认html、js都进行了压缩

oneOf

正常来说module加载器里面会设置一个rules规则,匹配对应的文件,匹配到就使用对应的loader来进行配置处理
如果不做任何操作,会给每个文件匹配所有的规则,使用oneOf可以在文件匹配到之后不再往下匹配;

Include/Exclude

开发时需要使用第三方库或者插件,所有文件都会下载到node_modules,这些文件不需要编译可以直接使用,所以处理js文件时,要排除node_modules下面的文件;
include:包含,只处理xxx文件;
exclude:排除,除了xxx文件以外其他文件都处理

include和exclude只能使用一个
使用babel-loader、eslint插件的都需要使用这个
使用babel-loader的使用include,只处理src下面的文件;
使用ESLintPlugin排除node_modules下面的文件;

Cache

每次打包js文件都要经过eslint检查和babel编译,速度比较慢;
可以缓存之前的eslint检查和babel编译结果,这样第二次打包速度就会更快了;

在babel-loader配置项中:添加options配置项;
cacheDirectory: true,// 开启babel缓存
cacheCompression: false,// 关闭缓存文件压缩

提升打包速度

js文件处理主要用了eslint、babel、terser;默认js文件会压缩就是用了terser这个工具;

开启多进程同时处理js文件,速度就比之前的单进程打包更快;
进程启动需要600ms左右时间,所以仅在特别耗时的操作中使用;
使用os库,获取cpus核数;下载thread-loader库;

use: [{loader: 'threader-loader', // 开启多进程处理options: {works: os.cpus().length, // 获取cpus核数}},{loader: 'babel-loader',options: {cacheDirectory: true, // 开启babel缓存}}
]

tree shaking

移除js中没有使用到的代码,依赖于es module

减少babel生成文件体积

babel默认会为每个文件注入辅助代码,使用@babel、plugin-transform-runtime,可以使所有辅助代码从这里引用

优化代码运行

打包代码会将所有js文件打包到一个文件中,体积太大了;只需要渲染首页的话,只加载首页的js文件,其他文件不应该加载;
所以需要用到代码分割;

代码分割:

  1. 分割文件;
  2. 按需加载;

分割文件需要用到多入口

module.exports = {entry: {app: './src/app.js',main: './src/main.js',},output: {path: path.resolve(__dirname, 'dist'),filename: '[name].js', // webpack命名方式},plugins: [new HtmlWebpackPlugin({template: path.resolve(__dirname, 'public/index.html'),})]
}

使用splitChunks

动态导入

动态导入的文件会被拆分成一个单独的模块
umi就是利用了这样的特性,会将每一个path对应的文件单独打包
默认配置:

React.lazy(() => import(
/* webpackChunkName: "p__index" */'@/pages/index.tsx')
)

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

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

相关文章

聪明的你能从千门八将108局学到什么,对你的未来人生有哪些深远的影响?

千门八将108局&#xff1a;智慧的启迪与人生指引 在古老智慧的宝库中&#xff0c;千门八将108局犹如璀璨星辰&#xff0c;闪耀着神秘而深邃的光芒。那些认真钻研过这些局的人&#xff0c;仿佛经历了一场穿越时空的智慧洗礼&#xff0c;从中收获了无价的人生财富。 一、从千门八…

Launcher3 去掉桌面搜索索框

文章目录 需求实现需求说明 参考资料修改文件实现思路首页显示的搜索框去除应用列表中的搜索框去除解决方案代码跟踪代码扩展 需求 Launcher3 去掉搜桌面索框 实现需求说明 每个平台平台源码有区别&#xff0c;比如&#xff1a;MTK、高通、展讯、RK、谷歌…单个平台下 不同A…

qt QDoubleSpinBox详解

1、概述 QDoubleSpinBox是Qt框架中的一个控件&#xff0c;专门用于浮点数&#xff08;即小数&#xff09;的输入和调节。它提供了一个用户界面元素&#xff0c;允许用户在预设的范围内通过拖动滑块、点击箭头或使用键盘来递增或递减浮点数值。QDoubleSpinBox通常用于需要精确数…

NVR小程序接入平台/设备EasyNVR多个NVR同时管理视频监控新选择

在数字化转型的浪潮中&#xff0c;视频监控作为安防领域的核心组成部分&#xff0c;正经历着前所未有的技术革新。随着技术的不断进步和应用场景的不断拓展&#xff0c;视频监控系统的兼容性、稳定性以及安全性成为了用户关注的焦点。NVR小程序接入平台/设备EasyNVR&#xff0c…

qt QAction详解

1、概述 QAction是Qt框架中的一个抽象类&#xff0c;用于表示用户界面中的一个动作&#xff08;action&#xff09;。这些动作可以绑定到菜单项、工具栏按钮或快捷键上&#xff0c;提供了一种灵活的方式来处理用户交互。QAction不仅包含了动作的名称、图标、提示信息等属性&am…

【快速上手】pyspark 集群环境下的搭建(Standalone模式)

目录 前言 &#xff1a; 一、spark运行的五种模式 二、 安装步骤 安装前准备 1.第一步&#xff1a;安装python 2.第二步&#xff1a;在bigdata01上安装spark 3.第三步&#xff1a;同步bigdata01中的spark到bigdata02和03上 三、集群启动/关闭 四、打开监控界面验证 前…

python如何调字体大小

1、打开电脑上的IDLE程序。 2、默认字体大小给出一个直观的展示。小编自认为还是比较小的&#xff0c;觉得调整大一点比较好。 3、点击菜单栏的【Options】。 4、然后点击【Configure IDLE】。 5、默认字体是新宋体&#xff0c;大小是size4。 6、根据自己需要设置字体大小后&am…

创造、竞争、征服:成为 The Sandbox 的创作者

Alpha 第 4 季将改变创作者在 The Sandbox 中实现激情的方式&#xff01;本季有 40% 的体验由我们的社区打造&#xff0c;The Sandbox 是你打造难忘冒险的平台&#xff0c;并在元宇宙中激励他人。无论你的梦想是制作惊险刺激的任务&#xff0c;还是设计自己生机勃勃的风景&…

Nico,从零开始干掉Appium,移动端自动化测试框架实现

开头先让我碎碎念一波~去年差不多时间发布了一篇《 UiAutomator Nico&#xff0c;一个基于纯 adb 命令实现的安卓自动化测试框》&#xff08;https://testerhome.com/topics/37042&#xff09;&#xff0c; 由于种种原因 (详见此篇帖子) 当时选择了用纯 adb 命令来实现安卓自动…

Vue项目开发:Vuex使用,表单验证配置,ESLint关闭与常见问题解决方案

文章目录 vuexvue配置form表单验证移除vue中表单验证的两种方法关闭vue项目的eslint代码校验做vue项目出现的问题 vuex Vue提供的状态管理工具&#xff0c;用于统一管理我们项目中各种数据的交互和重用&#xff0c;存储我们需要用到的数据对象属性 state&#xff1a;vuex的基本…

波尼音乐 2.3.0-b1 | 开源免费的音乐播放器,附两个公共接口

波尼音乐最初作为一个毕设项目&#xff0c;凭借其实现了本地与网络音乐播放的能力而受到许多用户的喜爱。随着百度在线音乐API的关闭&#xff0c;波尼音乐逐渐失去在线音乐播放功能。在开源社区的支持下&#xff0c;开发者发现新的网易云音乐API&#xff0c;重启项目并进行全面…

“死鱼眼”,不存在的,一个提词小技巧,拯救的眼神——将内容说给用户,而非读给用户!

视频录制时&#xff0c;死鱼眼问题常见 即便内容再好&#xff0c;眼神死板也会减分 痛点真痛&#xff1a;拍视频时容易紧张 面对镜头&#xff0c;许多人难免紧张 神情僵硬&#xff0c;眼神无光&#xff0c;甚至忘词 这不仅影响表现&#xff0c;还让人难以专注 忘我场景&#x…

Java | Leetcode Java题解之第525题连续数组

题目&#xff1a; 题解&#xff1a; class Solution {public int findMaxLength(int[] nums) {int maxLength 0;Map<Integer, Integer> map new HashMap<Integer, Integer>();int counter 0;map.put(counter, -1);int n nums.length;for (int i 0; i < n;…

C语言 | Leetcode C语言题解之第526题优美的排列

题目&#xff1a; 题解&#xff1a; int countArrangement(int n) {int f[1 << n];memset(f, 0, sizeof(f));f[0] 1;for (int mask 1; mask < (1 << n); mask) {int num __builtin_popcount(mask);for (int i 0; i < n; i) {if (mask & (1 <<…

HarmonyOS第一课 06 构建更加丰富的页面-习题解析

判断题 1. Tabs组件可以通过接口传入一个TabsController&#xff0c;该TabsController可以控制Tabs组件进行页签切换。T 正确(True) 错误(False) 使用 this.tabsController.changeIndex(this.currentIndex); 可以切换页签 WebviewController提供了变更Web组件显示内容的接口…

xilinx vitis 更换硬件平台——ZYNQ学习笔记5

1、重新生成硬件信息 2、选择带有bit信息 3、设施路径和名字 4、打开更新硬件选项 5、选择新的硬件信息 6、打开系统工程界面 7、复位硬件信息 更新完毕

哪一款防脱生发的产品效果好?教科书式教你如何挑

头发护理越来越被重视&#xff0c;因为现在脱发秃头的人实在太多了&#xff0c;本人几年前就开始关注头发护理了&#xff0c;目前头发光泽垂顺浓密&#xff0c;好多次被夸发质好发量多。今天给大家推荐几款好用的防脱育发精华吧&#xff0c;好用有效无平替版。 第1款&#xff…

一键AI换衣-可图AI试衣

我们的真的实现了穿衣自由了吗&#xff1f;上传一张人物图片和衣服的图片&#xff0c;就能实现一键换衣。 这就是可图AI试衣项目 魔塔地址&#xff1a;https://www.modelscope.cn/studio ... lors-Virtual-Try-On 参考&#xff1a; 一键AI换衣-可图AI试衣 https://www.jinsh…

vue项目安装组件失败解决方法

1.vue项目 npm install 失败 删除node_modules文件夹、package-lock.json 关掉安装对话框 重新打开对话框 npm install

HTML 基础标签——链接标签 <a> 和 <iframe>

文章目录 1. `<a>` 标签属性详细说明示例2. `<iframe>` 标签属性详细说明示例注意事项总结链接标签在HTML中是实现网页导航的重要工具,允许用户从一个页面跳转到另一个页面或嵌入外部内容。主要的链接标签包括 <a> 标签和<iframe> 标签。本文将深入探…