webpack的基础用法2

webpack的优化方向

  1. 提升开发体验
  2. 提升打包构建速度
  3. 减少代码体积
  4. 优化代码运行性能
SourceMap

生成一个.map文件,形成一个映射, 可以通过错误找到源文件

开发模式: cheap-module-source-map

  • 优点: 打包编译速度快, 值包含行映射

  • 缺点: 没有映射列

生产模式: source-map

  • 优点: 包含行列映射

  • 缺点: 打包编译速度更慢

使用

// 开发模式
devtool: 'cheap-module-source-map',
// 模式
mode: 'development'
// 生产模式
devtool: 'source-map',
// 模式
mode: 'production'
HotModuleReplacement (热模块替换)

目前修改文件, 网页会重新加载,因为webpack重新打包了

css里面的style-loader已经实现了热模块替换

js默认不能实现hmr

// 手动实现hmr

if(module.hot) {	// 如果支持hmr
module.hot.accept('./js/count')
}

但是在vue中有使用vue-loader实现了hmr, 不需要自己去配置

小结: 不用配置, 默认是开启的, 或手动开启

devServer: {
host: 'localhost', // 服务器域名
port: '3000', // 端口
open: true, // 自动打开浏览器
hot: true
},
OneOf

每一个文件只能被一个rules里面的规则编译,开发模式和生产模式都可以

rules: [
{
oneOf: [
// loader的配置
{
test: /\.css$/, // 只检测css文件
use: [
// 执行顺序: 从右到左, 从上到下
'style-loader', // 将js中的css通过创建style标签的方式添加到html文件中生效
'css-loader' // 将css资源编译成commonjs的模块到js中
]
},
{
test: /\.less$/, // 只检测less文件
// use 可以使用多个loader, loader只能使用一个laoder
use: [
// 执行顺序: 从右到左, 从上到下
'style-loader', // 将js中的css通过创建style标签的方式添加到html文件中生效
'css-loader', // 将css资源编译成commonjs的模块到js中
'less-loader', // 将 less编译成css
]
},
{
test: /\.s[ac]ss$/, // 检测scss或sass
// use 可以使用多个loader, loader只能使用一个laoder
use: [
// 执行顺序: 从右到左, 从上到下
'style-loader', // 将js中的css通过创建style标签的方式添加到html文件中生效
'css-loader', // 将css资源编译成commonjs的模块到js中
'sass-loader', // 将 scssss编译成css
]
},
{
test: /\.(png|jpe?g|gif|webp|svg)$/,
type: 'asset', // 这个会转base64
parser: {
dataUrlCondition: {
// 小于10kb转base64
// 优点: 请求减少, 缺点: 体积变大
maxSize: 15 * 1024, // 10 kb
}
},
generator: {
// 输出图片名称, hash 更具文件内容生成的hash值 :10 取前10位, ext: 文件的后缀 query 查询
filename: 'static/images/[hash:10][ext][query]'
}
},
{
test: /\.(ttf|woff2?|mp3|mp4|avi)$/,
type: 'asset/resource', // 会原封不动的输出
generator: {
// 输出图片名称, hash 更具文件内容生成的hash值 :10 取前10位, ext: 文件的后缀 query 查询
filename: 'static/media/[hash:10][ext][query]'
}
},
{
test: /\.js$/,
exclude: /node_modules/, // 排除node_modules里面的js文件
loader: 'babel-loader',
// options: {
// presets: ["@babel/preset-env"]
// }
}
]
}
] // rules里面的内容剪切, 里面放一个对象, oneOf: [剪切的内容]
Include和Exclude

包含和排除, 只能写一个

用法: loader和plugins里面都能用

// eslint的配置
new ESLintPlugin({
// 检测哪些文件
context: path.resolve(__dirname, '../src'),
exclude: "node_modules" // 也需要exclude
}), {
test: /\.js$/,
exclude: /node_modules/, // 排除node_modules里面的js文件
// include: path.resolve(__dirname, '../src'), // 只处理src下面的文件, 绝对路径,跟上面exclude只能写一个
loader: 'babel-loader',
// options: {
// presets: ["@babel/preset-env"]
// }
}
cache 缓存

对eslint检查 和 babel编译的结果缓存, 加快地二次打包速度

babel:

 {
test: /\.js$/,
exclude: /node_modules/, // 排除node_modules里面的js文件
// include: path.resolve(__dirname, '../src'), // 只处理src下面的文件, 绝对路径,跟上面exclude只能写一个
loader: 'babel-loader',
options: {
// presets: ["@babel/preset-env"],
cacheDirectory: true, // 开启babel缓存
cacheCompression: false, // 关闭缓存压缩 }
}

重新运行后会在node_modules里面生成一个.cache/babel-loader文件

eslint:

 new ESLintPlugin({
// 检测哪些文件
context: path.resolve(__dirname, '../src'),
exclude: "node_modules", // 也需要exclude
cache: true, // 开启缓存
cacheLocation: path.resolve(__dirname, '../node_modules/.cache/eslintcache')
}),

开启缓存, 创建一个缓存路径, 重新运行后就有生成文件夹了

多进程打包

在特别耗时的任务中使用, 每个进程启动大约为600ms

下载

npm i thread-loader -D

分为 babel, eslint, 和 js压缩

babel:

const os = require('os')        // 获取内核

const threads = os.cpus().length    // 获取cpu核数

// babel里面使用多进程, 使用use, 添加一个 thread-loader

 {
test: /\.js$/,
exclude: /node_modules/, // 排除node_modules里面的js文件
// loader: 'babel-loader',
use: [
{
loader: 'thread-loader', // 开启多进程
options: {
works: threads // 进程数量
}
},
{
loader: 'babel-loader',
options: {
cacheDirectory: true, // 开启babel缓存
cacheCompression: false, // 关闭缓存压缩
}
}
] }

eslint

 // eslint的配置,  多进程直接添加一个threads就行了
new ESLintPlugin({
// 检测哪些文件
context: path.resolve(__dirname, '../src'),
exclude: "node_modules", // 也需要exclude
cache: true, // 开启缓存
cacheLocation: path.resolve(__dirname, '../node_modules/.cache/eslintcache'),
threads, // 开启多进程和进程数量
}),

js压缩, 生成模式默认会压缩, 里面用的是内置的 terser 插件

// 引入
const TerserWebpackPlugin = require('terser-webpack-plugin') // 使用
new TerserWebpackPlugin({
parallel: threads
})

一般压缩可可以放在optimization 里面

optimization: {
minimizer: [
// 压缩css
new cssMinimizerPlugin(), new TerserWebpackPlugin({
parallel: threads
})
]
}, // 将plugins里面的两项去掉同样可以达到效果
treeshaking

**依赖 es module ** 自动移除无用的代码

webpack默认开启了这个功能 (生产模式)

babel

减少babel生成文件的体积

babel会为编译每个文件都插入辅助代码, 使代码体积过大

babel对一些公共方法使用了非常小的辅助代码, 如 _extend , 默认情况下会被添加到每一个需要它的文件中

可以将这些辅助代码作为一个独立的文件, 来避免重复引入

@babel/plugin-transform-runtime: 禁用了bable自动对每个文件的runtime注入, 而是引入 @babel/plugin-transform-runtime 并且使所有辅助代码从这里引入

下载 (开发和生产都可以)

npm i @babel/plugin-transform-runtime -D

使用

{
test: /\.js$/,
exclude: /node_modules/,
loader: 'babel-loader',
options: {
cacheDirectory: true, // 开启babel缓存
cacheCompression: false, // 关闭缓存压缩
plugins: ["@babel/plugin-transform-runtime"], // 减少代码体积
}
}
图片压缩

下载

npm i image-minimizer-webpack-plugin imagemin -D

无损压缩

npm i imagemin-gifsicle imagemin-jpegtran imagemin-optipng imagemin-svgo -D

有损压缩

npm i imagemin-gifsicle imagemin-mozjpeg imagemin-pngquant image-svgo -D

使用 包很难下

// 引入
const ImageMinimizerPlugin = require('image-minimizer-webpack-plugin') optimization: {
minimizer: [
// 压缩css
new cssMinimizerPlugin(),
// 并行压缩js
new TerserWebpackPlugin({
parallel: threads
}),
// 压缩图片
new ImageMinimizerPlugin({
minimizer: {
implementation: ImageMinimizerPlugin.imageminGenerate,
options: {
plugins: [
['gifsicle', { interlaced: true}],
['jpegtran', { progressive: true}],
['optipng', { optimizationLevel: 5}],
[
'svgo',
{
plugins: [
'preset-default',
'prefixIds',
{
name: 'sortAttrs',
params: {
xmlnsOrder: 'alphabetical'
}
}
]
}
]
]
}
}
})
]
},
code split

代码分割, 按需加载

entry: {
app: './src/app.js',
main: './src/main.js'
},
output: {
path: resolve(__dirname, 'dist'),
filename: '[name].js' // 以文件名自己命名
}
提取公共模块
optimization: {
splitChunks: {
chunks: all, // 对所有模块分割
// 一堆默认值, 按需修改
...
}
}
统一命名
filename: [name].[ext]
chunkFilename: [name].chunk.[ext] // 动态导入的chunk

webpack5基础用法2的更多相关文章

  1. PropertyGrid控件由浅入深(二):基础用法

    目录 PropertyGrid控件由浅入深(一):文章大纲 PropertyGrid控件由浅入深(二):基础用法 控件的外观构成 控件的外观构成如下图所示: PropertyGrid控件包含以下几个要 ...

  2. logstash安装与基础用法

    若是搭建elk,建议先安装好elasticsearch 来自官网,版本为2.3 wget -c https://download.elastic.co/logstash/logstash/packag ...

  3. elasticsearch安装与基础用法

    来自官网,版本为2.3 注意elasticsearch依赖jdk,2.3依赖jdk7 下载rpm包并安装 wget -c https://download.elastic.co/elasticsear ...

  4. BigDecimal最基础用法

    BigDecimal最基础用法 用字符串生成的BigDecimal是不会丢精度的. 简单除法. public class DemoBigDecimal { public static void mai ...

  5. Vue组件基础用法

    前面的话 组件(Component)是Vue.js最强大的功能之一.组件可以扩展HTML元素,封装可重用的代码.根据项目需求,抽象出一些组件,每个组件里包含了展现.功能和样式.每个页面,根据自己所需, ...

  6. Smarty基础用法

    一.Smarty基础用法: 1.基础用法如下 include './smarty/Smarty.class.php';//引入smarty类 $smarty = new Smarty();//实例化s ...

  7. 前端自动化测试神器-Katalon的基础用法

    前言 最近由于在工作中需要通过Web端的功能进行一次大批量的操作,数据量大概在5000左右,如果手动处理, 完成一条数据的操作用时在20秒左右的话,大概需要4-5个人/天的工作量(假设一天8小时的工作 ...

  8. Bootstrap fileinput:文件上传插件的基础用法

    官网地址:http://plugins.krajee.com/ 官网提供的样例:http://plugins.krajee.com/file-input/demo 基础用法一 导入核心CSS及JS文件 ...

  9. asyncio 基础用法

    asyncio 基础用法 python也是在python 3.4中引入了协程的概念.也通过这次整理更加深刻理解这个模块的使用 asyncio 是干什么的? asyncio是Python 3.4版本引入 ...

  10. oracle入坑日记<六>自增列创建和清除(含序列和触发器的基础用法)

    0   前言 用过 SQLserver 和 MySQL 的自增列(auto_increment),然而 Oracle 在建表设置列时却没有自增列. 查阅资料后发现 Oracle 的自增列需要手动编写. ...

随机推荐

  1. 最大公约数gcd和最小公倍数lcm

    迭代版本 int gcd(int a, int b) { while (b != 0) { int r = a % b; a = b; b = r; } return a; } int lcm(int ...

  2. 模板层语法、模板层之标签、模板的继承与导入、模型层之ORM常见关键字

    模板层语法.模板层之标签.模板的继承与导入.模型层之ORM常见关键字 一.模板层语法 1.模板语法的传值 urls代码: path('modal/', views.modal) views代码: de ...

  3. eosio.cdt发布带来的变化

    change of version 1.3.x+,EOSIO.CDT After eos version 1.3.x, generation of cdt tools, Smart Contracts ...

  4. OPA-CH32x系列芯片OPA使用注意事项

    1 OPA运放基本功能说明 1.1 OPA引脚详细说明方式 说明方式1如下所示: OPN0.OPP0.OPO为OPA的第0通道 OPN0:OPA_0通道的N端 OPP0:OPA_0通道的P端 OPO: ...

  5. Android IO 框架 Okio 的实现原理,如何检测超时?

    本文已收录到  AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 前言 大家好,我是小彭. 在上一篇文章里,我们聊到了 Square 开源的 I/O 框架 Okio 的三个 ...

  6. ChatGPT留给知乎、小红书的时间不多了

    大家好啊,今天我打算给大家整点好活!挑战一下用ChatGPT打入各平台内部. 知乎挑战! 首先了解一下"知乎体" 知乎体是以专业知识为基础,以清晰的条理对问题进行阐述,并解决该问题 ...

  7. 使用Docker搭建EPICS的IOC记录

    一直在centos使用KVM跑虚拟机搭建IOC,后来又使用zstack,web环境下管理虚拟机就更方便了. 最近电子源系统需要把束测系统跑起来,空间比较局促,不好放置服务器机柜.想着用一台工控机跑起来 ...

  8. 【NOIP2012提高组】开车旅行

    题目 到处都有 闲话 碰巧考场上出了 \(Noip\) 原题 然后这题自然而然想到 预处理一个点开始分别由 \(A,B\) 驾驶会走到的下一个点 然后用预处理的数组求答案 当然你会发现 \(X=X0\ ...

  9. group by 、concat_ws()、 group_caoncat()的使用

    group系列 之前觉得这里简单不需要再进行总结了.后来发现还是需要总结巩固一下,还是有一些方法之类的之前未使用过.这里来重新整理,记录一下. group by 将表中的数据根据某个条件进行分组. 比 ...

  10. 钓鱼攻击之:Flash 网页钓鱼

    钓鱼攻击之:Flash 网页钓鱼 目录 钓鱼攻击之:Flash 网页钓鱼 1 准备资料 2 具体钓鱼流程 3 生成后门并捆绑flash的安装程序 4 处理WEB站点过程 1 准备资料 Flash网站克 ...