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. [深度探索C++对象模型]memcpy和memset注意事项

    不管使用memcpy()还是memset(),都只有在"classes不含任何由编译器产生的内部members"时才能运行.如果这个类声明一个或者一个以上的virtual func ...

  2. 通过Docker启动Solace,并在Spring Boot通过JMS整合Solace

    1 简介 Solace是一个强大的实时性的事件驱动消息队列.本文将介绍如何在Spring中使用,虽然代码使用的是Spring Boot,但并没有使用相关starter,跟Spring的整合一样,可通用 ...

  3. ng-alain全局配置NzMessageService

    官方文档是这样子的,抄下来会报错,因为没有后两个设置 import { NgZorroAntdModule, NzConfig, NZ_CONFIG } from 'ng-zorro-antd'; c ...

  4. JS实现excel数据透析,形成关系图

    网上查了好多例子,都没有找到答案,只能自己硬着头皮写了 想要的样子: 下面是DEMO,已经实现效果了!!!! 举例  导入 <!DOCTYPE html> <html lang=&q ...

  5. 【学习笔记】动态树 Link-Cut Tree

    - 闲话 LCT 优秀博客: \(\color{black}{\textsf{F}}\color{red}{\textsf{lashHu}}\) 大佬的 cnblogs:https://www.cnb ...

  6. 如何找到CSDN中关注的用户和粉丝?

    如何找到CSDN中关注的用户和粉丝? 刚刚在CSDN个人账号里找了半天都没找到自己关注的人 对CSDN的页面更新感到很迷, 个人账号管理很不人性化, 或者说是根本找不到自己关注的用户以及关注自己的粉丝 ...

  7. 9月23日内容总结——pycharm的安装与使用、python语法规范与注释、变量和常量、索引取值以及部分数据类型简介

    今日内容总结 目录 今日内容总结 一.pycharm的安装 1.软件介绍 2.正版安装 1.下载软件 2.安装软件 3.其他方法安装(需要先下载相关资源) ①无限试用法 ②傻瓜式激活法 ③淘宝购买 二 ...

  8. 《Terraform 101 从入门到实践》 第二章 Providers插件管理

    <Terraform 101 从入门到实践>这本小册在南瓜慢说官方网站和GitHub两个地方同步更新,书中的示例代码也是放在GitHub上,方便大家参考查看. 不怕出身低,行行出状元. 插 ...

  9. 基于Apache Hudi 构建Serverless实时分析平台

    NerdWallet 的使命是为生活中的所有财务决策提供清晰的信息. 这涵盖了一系列不同的主题:从选择合适的信用卡到管理您的支出,到找到最好的个人贷款,再到为您的抵押贷款再融资. 因此,NerdWal ...

  10. 继承与多态 动手动脑3方法覆盖(override)”的要点

    方法覆盖(override)"的要点 方法覆盖要求子类与父类的方法一模一样,否则就是方法重载(overload)! 在子类中,若要调用父类中被覆盖的方法,可以使用super关键字. 以下子类 ...