webpack5

devtools/2025/1/3 8:00:45/

webpack_0">为什么要去学习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.ppmy.cn/devtools/131264.html

相关文章

146、LRU缓存-cangjie

题目 146、LRU缓存 思路 数据结构&#xff1a; 使用 HashMap (map) 存储缓存的键值对。键是缓存的键&#xff0c;值是链表节点&#xff0c;可以通过键快速访问。使用 LinkedList (lists) 来维护缓存的顺序。链表从头到尾表示使用时间&#xff0c;头部是最老的元素&#xff0c…

基于yolov5的输电线,电缆检测系统,支持图像检测,视频检测和实时摄像检测功能(pytorch框架,python源码)

更多目标检测和图像分类识别项目可看我主页其他文章 功能演示&#xff1a; yolov5&#xff0c;输电线(线缆)检测系统&#xff0c;系统既支持图像检测&#xff0c;也支持视频和摄像实时检测【pytorch框架】_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于yolov5的输…

HarmonyOS鸿蒙开发入门,常用ArkUI组件学习(一)

刚开始接触HarmonyOS的开发&#xff0c;希望不会太晚。在我学习的过程中&#xff0c;我会将我学到的内容&#xff0c;通过写博客的形式&#xff0c;来进行回忆和复习。同时也希望能够遇到志同道合的朋友&#xff0c;我们一起学习&#xff0c;一起进步&#xff0c;文章中有什么不…

24/11/3 算法笔记 Adam优化器拆解

Adam 优化器是一种用于深度学习中的自适应学习率优化算法&#xff0c;它结合了两种其他流行的优化方法的优点&#xff1a;RMSprop 和 Momentum。简单来说&#xff0c;Adam 优化器使用了以下方法&#xff1a; 1. **指数加权移动平均&#xff08;Exponentially Weighted Moving …

利用Python进行数据可视化:实用指南与推荐库

利用Python进行数据可视化:实用指南与推荐库 数据可视化是将数据转化为图形和图表的过程,它能够帮助我们更直观地理解数据的趋势、模式和关系。在Python中,有许多强大的库可用于数据可视化,从简单的折线图到复杂的交互式图表,应有尽有。本文将详细介绍Python数据可视化的…

k8s 小版本升级

众所周知k8s每一个月左右都会更新一次小版本所以在 Kubernetes 生态系统中&#xff0c;保持集群的版本更新是至关重要的。这不仅能够带来新的特性和改进&#xff0c;还能确保集群的安全性和稳定性。随着 Kubernetes 项目的快速发展&#xff0c;小版本的升级成为了集群维护的一个…

微服务设计模式 - 网关路由模式(Gateway Routing Pattern)

微服务设计模式 - 网关路由模式&#xff08;Gateway Routing Pattern&#xff09; 定义 网关路由模式&#xff08;Gateway Routing Pattern&#xff09;是微服务架构中一种非常重要的设计模式&#xff0c;主要用于在客户端和微服务之间提供一个中间层。这一模式通过中央网关路…

elementUI table 多级表头隔行变背景颜色

效果图如下&#xff1a; 代码如下&#xff1a; 其中rowIndex 0 意思为多级表头的第一行&#xff0c;columnIndex 0 意思为某一行的第一列 如 rowIndex 0&#xff0c; columnIndex 1 的意思为多级表头的第一行中的第二列 指在上效果图中 激活指标 如 rowIndex 1&#x…