相关命令
打包
webpack
查看打包相关详细信息
webpack --stats detailed
设置打包入口文件
webpack --entry 文件路径
设置打包模式
webpack --mode production/development
修改文件自动打包
webpack --watch
热更新(ctrt+s后页面自动更新内容)
- 先安装依赖
npm i webpack-dev-server
-
修改配置项
devServer: { // 提供静态文件目录地址,就是热更新时候浏览器编译的文件目录 static: './dist', }
3.启动项目
webpack-dev-server
插件
插件提供了一些额外的强大功能,我的理解相当于游戏外挂
html-webpack-plugin
功能: 自动帮你生成html
文件,并且让你在生成html
时以其他html
文件作为模板
npm
安装依赖
npm install --save-dev html-webpack-plugin
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
plugins: [new HtmlWebpackPlugin()],
};
配置项笔记
变量名 | 类型 | 示例 | 描述 |
---|---|---|---|
title | String | 我好帅 | 生成的html 文件标题 |
template | String | 将生成的html 文件以哪个现有的html 文件作为模板 | |
filename | String | Function | index.html | 生成的html 文件名 |
inject | String | Boolean | body | 将生成的js ,css 文件插入到哪里 |
mini-css-extract-plugin
功能: css抽离插件(抽离成单独的css文件)
使用:
1.安装依赖
npm i mini-css-extract-plugin -D
2.引入
const MineCssExtractPlugin = require('mini-css-extract-plugin')
3.插件注册
plugins: [
new HtmlWebpackPlugin({
// 标题
title: 'aavv',
// 以哪个html为模板
template: './src/index.html',
// 生成的html文件名
filename: 'app.html',
// 脚本等相关文件注入到哪里
inject: 'body',
}),
// here
new MineCssExtractPlugin({
filename: 'css/[contenthash].css',
}),
new CssMinimizerPlugin(),
],
4.loader
使用
{
test: /\.(css|scss)$/,
use: [MineCssExtractPlugin.loader, 'css-loader', 'sass-loader'],
},
css-minimizer-webpack-plugin
css压缩插件
1.安装依赖
npm i css-minimizer-webpack-plugin
2.引入
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin')
3.配置
// 优化配置
optimization: {
minimizer: [new CssMinimizerPlugin()],
},
terser-webpack-plugin
js
代码压缩插件
该插件在webpack
5自带,直接引入并配置就行
// js压缩插件webpack5内置该插件无需安装,仅在生产环境有效
const TerserPlugin = require("terser-webpack-plugin");
optimization: {
// 通过自定义插件覆盖默认插件配置
minimizer: [new TerserPlugin()],
},
Assets Module
资源模块(asset module)是一种模块类型,它允许使用资源文件(字体,图标等)而无需配置额外 loader。其实就是废弃了以前的什么file-loader
,url-loader
等等资源处理的插件.
asset/resource
将资源原样输出到打包后的文件夹
asset/inline
将图片资源转成base64
asset/source
将文件源代码原样输出
module: {
// 配置规则
rules: [
{
// 匹配哪些文件
test: /\.png$/,
// 同之前的file-loader
// file-loader 就是一个可以用来处理图片字体等文件资源的 loader,它的处理方式是将资源复制到打包后的文件夹,并重命名。
type: 'asset/resource',
// 生成的文件信息
generator: {
// 文件名 contenthash:根据文件内容生成hash值
filename: 'img/[contenthash][ext]',
},
},
{
test: /\.(svg|png)$/,
// 目前的理解是图片转成base44
type: 'asset/inline',
},
{
test: /\.txt$/,
// 将文件源代码原样输出
type: 'asset/source',
},
],
},
loader
loader
可以让webpack
拥有解析除js
和json
以外格式的文件比如css
,图片文件
加载scss
文件
安装依赖
"css-loader": "^6.7.1",
"node-sass": "^7.0.1",
"sass": "^1.50.0",
"sass-loader": "^12.6.0",
"style-loader": "^3.3.1",
配置
{
test: /\.(css|scss)$/,
use: ['style-loader', 'css-loader', 'sass-loader'],
},
babel-loader
babel-loader
能将es6以及更高的语法转成es5的
安装依赖
npm install -D babel-loader @babel/core @babel/preset-env
继续安装依赖
npm i @babel/plugin-transform-runtime
npm install --save @babel/runtime
webpack
配置
{
test: /\.js$/,
// 排除node_modules文件夹下的文件
exclude: /node_modules/,
use: {
loader: 'babel-loader',
// babel-loader的配置项
options: {
presets: ['@babel/preset-env'],
plugins: [['@babel/plugin-transform-runtime']],
},
},
},
postcss-loader
github
地址postcss
postcss-loader
能让你项目中的css
具有一些超能力,该loader
有很多插件
autoprefixer
提高兼容性,自动给部分样式加前缀
安装以下依赖
postcss postcss-loader autoprefixer
webpack配置
{
test: /\.(css|scss)$/,
use: [MineCssExtractPlugin.loader, 'css-loader', 'sass-loader', 'postcss-loader']
},
根目录新建postcss.config.js
文件
该文件可以理解为对postcss
工具的一些配置
使用autoprefixer
module.exports = {
plugins: {
autoprefixer: {
}
}
}
代码分包
1.动态导入(懒加载)
使用import.then
语法
懒加载的好处就是打包的体积不变,但是浏览器对于使用懒加载的模块是不会去加载这些js
文件的,用到的时候才会加载这些文件
1.1 魔法注释
/* webpackChunkName: "my-chunk-name" */
相关的块起名字,名字将在打包后的文件夹下看到
/*webpackPrefetch: true */
浏览器会在空闲时间把模块下载下来,存到缓存中
缺点: 不利于网页流量统计
还有一个webpackPreload
,但是好像不常用,也是预加载,但是优先级跟别的chunk
块是一样的
2.插件配置
// 一个插件,用来抽离公共代码
splitChunks: {
// all不管是异步加载还是同步加载的公共模块都会被抽离
chunks: 'all',
},
3.多个入口起点
entry: {
// 多个入口打包
index: './src/index.js',
// another: './src/lodash.js',
},
源代码追踪
devtool
配置
选项 | 描述 |
---|---|
eval | 加载速度快,但是没有正确显示错误行号 |
source-map | 直接打个.map文件出来,会显示源代码错误行号 |
eval-source-map | 能够正确追踪到行号,初次加载速度慢 |
cheap-eval-source-map | 没有列追踪,只能追踪到行 |
cheap-module-eval-source-map | 跟上面差不多,module 相当于支持babel 这种预编译工具 |
代码校验
webpack
中使用es-lint
工具进行代码校验
安装依赖
npm install eslint -S
快速生成配置文件
npx eslint --init
webpack5
需要安装EslintWebpackPlugin插件来使webpack
在打包时es-lint
生效
npm
安装 eslint-webpack-plugin
npm install eslint-webpack-plugin --save-dev
然后把插件添加到你的 webpack
配置
const ESLintPlugin = require('eslint-webpack-plugin');
module.exports = {
// ...
plugins: [new ESLintPlugin(options)],
// ...
};
解析(resolve)
设置模块如何被解析
配置别名(alias)
module.exports = {
resolve: {
alias: {
'@': path.resolve(__dirname, 'src')
}
}
}
优化相关
externals
下的配置可以将第三方包打包时排除在外,其中key
值为import a from b
中的b
,value
就目前的理解为你全局使用的那个变量.
externals:{
jQuery: '$'
}
可视化分析工具
npm
安装依赖
npm install webpack-bundle-analyzer –save-dev
require
引入
const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer')
安装插件
plugins: [
// 可视化分析插件
new BundleAnalyzerPlugin()
]
执行命令浏览器打开可视化界面
webpack serve
Tree Shaking
这个选项是webpack
默认开启的,import
但没有使用的东西,会被视为dead code``webpack
将不会打包这些模块,但webpack
打包是很智能的,它会自动判断这个模块有没有被使用,就是说你如果import
一个css
文件,我测试的时候是不管你用没用里面的样式,这个css
文件都会参与打包。我发现在打包的时候这个摇树还是很智能的。
sideEffects
该选项接收可以接收的参数有,true
,false
,数组,并且该配置项在package.json
文件夹下,true
表示所有的文件都有副作用,不能打包删除,false
表示所有的打包文件都没副作用,dead code
可以被删除,数组: [“*.js”],表示所有的js
文件都有副作用,不能被剔除。
Polyfills
项目打包时不一定所有的高级语法特性都会被转为浏览器能识别的es5
以以前的语法,这时候polyfills
(垫片)就很好的解决了这一个问题,让某些浏览器不支持的语法(api
)变得能够支持
thread-loader
这个loader
能够让其它loader
另开线程打包,说的简单点,就是对于那些打包时耗时比较长的loader
,采用thread-loader
另开线程,增加打包速度,每个另开线程的启动时间为600ms,慎用!
一些配置
const path = require('path')
// 插件
// html自动生成插件
const HtmlWebpackPlugin = require('html-webpack-plugin')
// css抽离插件
const MineCssExtractPlugin = require('mini-css-extract-plugin')
// css压缩插件
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin')
// js压缩插件webpack5内置该插件无需安装,仅在生产环境有效
const TerserPlugin = require('terser-webpack-plugin')
// eslint-插件
const ESLintPlugin = require('eslint-webpack-plugin')
// 可视化分析插件
const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer')
module.exports = {
// 打包的入口文件
entry: {
// 多个入口打包
index: './src/index.js'
// another: './src/lodash.js'
},
resolve: {
alias: {
'@': path.resolve(__dirname, 'src')
}
},
output: {
// 生成的js名字
filename: 'js/[name].[contenthash].js',
// 输出的文件目录
path: path.resolve(__dirname, 'dist'),
// 每次打包清除dist文件夹下面的内容
clean: true,
// 默认输出的静态资源文件名
assetModuleFilename: 'images/[contenthash][ext]',
// 打包后生成的资源路径前缀
publicPath: './'
},
devServer: {
// 提供静态文件目录地址,就是热更新时候浏览器编译的文件目录
static: './dist'
},
// 追踪源代码出错位置
devtool: 'inline-source-map',
// 开发环境 | 生产环境
mode: 'production',
plugins: [
new HtmlWebpackPlugin({
// 标题
title: 'aavv',
// 以哪个html为模板
template: './src/index.html',
// 生成的html文件名
filename: 'app.html',
// 脚本等相关文件注入到哪里
inject: 'body'
}),
// css抽离插件
new MineCssExtractPlugin({
filename: 'css/[contenthash].css'
}),
// 代码校验插件
new ESLintPlugin()
// 可视化分析插件
// new BundleAnalyzerPlugin()
],
module: {
// 配置规则
rules: [
// {
// // 匹配哪些文件
// test: /\.png$/,
// // 同之前的file-loader
// // file-loader 就是一个可以用来处理图片字体等文件资源的 loader,它的处理方式是将资源复制到打包后的文件夹,并重命名。
// type: 'asset/resource',
// // 生成的文件信息
// generator: {
// // 文件名 contenthash:根据文件内容生成hash值
// filename: 'img/[contenthash][ext]',
// },
// },
{
test: /\.(svg|png)$/,
// 目前的理解是图片转成base44
type: 'asset/inline'
},
{
test: /\.txt$/,
// 将文件源代码原样输出
type: 'asset/source'
},
{
test: /\.jpg$/,
// 让webpack自己选转base64还是转成图片存到打包后的文件夹
type: 'asset',
// 解析器
parser: {
// 资源转换规则
dataUrlCondition: {
// 图片小于2M转base64
maxSize: 2 * 1024 * 1024
}
}
},
{
test: /\.(css|scss)$/,
use: [MineCssExtractPlugin.loader, 'css-loader', 'sass-loader', 'postcss-loader']
},
{
test: /\.js$/,
// 排除node_modules文件夹下的文件
exclude: /node_modules/,
use: [
'thread-loader',
{
loader: 'babel-loader',
// babel-loader的配置项
options: {
// 支持一系列es6语法
presets: ['@babel/preset-env'],
// 支持async await语法
plugins: [['@babel/plugin-transform-runtime']]
}
}]
}
]
},
// 优化配置
optimization: {
// 通过自定义插件覆盖默认插件配置
minimizer: [new CssMinimizerPlugin(), new TerserPlugin()],
// 一个插件,用来抽离公共代码
splitChunks: {
// all不管是异步加载还是同步加载的公共模块都会被抽离
// chunks: 'all',
// 哪些模块需要缓存,一般第三方模块需要缓存
cacheGroups: {
vendor: {
test: /[\\/]node_modules[\\/]/,
name: 'vendors',
chunks: 'all'
}
}
}
// 对于import却没有使用的模块,不参与打包
// usedExports: true
},
// 排除打包的依赖
externals: {
lodash: '_'
}
}
博客
欢迎访问我的博客www.smartxy.cc