静态资源
图片优化
webpack5已经内置了图片转换的功能,而webpack4则需要依靠file-loader或url-loader来处理图片。
file-loader主要是把文件发送到指定的输出目录url-loader主要是把小于指定文件大小的图片转换成base64
module.exports = {
module: {
rules: [
{
test: /.(png|jpg|gif)$/i,
// webpack4
+ use: [
+ {
+ loader: 'url-loader',
+ options: {
+ limit: 8096,
+ }
+ },
+ ],
// webpack5
+ type: 'asset'
+ parser: {
+ dataUrlCondition: {
+ maxSize: 4 * 1024 // 4kb
+ }
+ }
},
]
},
}
webpack5新增了资源模块asset-module的四种新类型,它允许使用资源文件(字体,图标等)而无需配置额外loader。
asset/resource发送一个单独的文件并导出 URL。之前通过使用file-loader实现。asset/inline导出一个资源的 data URI。之前通过使用url-loader实现。asset/source导出资源的源代码。之前通过使用raw-loader实现。asset在导出一个 data URI 和发送一个单独的文件之间自动选择。之前通过使用url-loader,并且配置资源体积限制实现。
同时,webpack依然支持使用loader来处理某些你希望的文件类型。只需要把type设置为javascript/auto即可,但一定要记得配置loader来处理。
那么书归正传,图片转换成base64的好处在哪里呢?
众所周知,浏览器获取静态资源的方式是通过发送请求来获取,如果图片不转换成base64,那么一张图片就会代表一个http请求。
那么问题就出现了,如果某些网站的图片很多,而且图片文件普遍偏小,那么服务器压力就会较大。但如果换成base64内联进文件,那么等于小图片都会随着一次请求到达浏览器中。
当然了,这种选择也有弊端,那就是转换后的文件大小比转换前的文件大小会大一点。
那么总结:
只有在图片体积较小,且数量较多的情况下,使用base64的方案才会较为明显的性能优化效果。这种方案是典型的以文件大小换取服务器压力释放的方案。
修改静态资源的输出文件位置
module.exports = {
// 第一种方法
output: {
filename: 'main.js',
path: path.resolve(__dirname, 'dist'),
// hash是webpack根据文件内容算出的值,具有唯一性
// ext是文件名后缀
assetModuleFilename: 'images/[hash][ext][query]'
},
// 第二种方法
module: {
generator: {
asset: {
// asseet 模块的 generator 选项
// 自定义 asset 模块的 publicPath,自 webpack 5.28.0 起可用
publicPath: 'assets/',
// 将静态资源输出到相对于 'output.path' 的指定文件夹中,webpack 5.67.0 后可用
outputPath: 'cdn-assets/',
},
'asset/inline': {
// 同上
},
'asset/resource': {
// 同上
},
},
rules: [
{
test: /.png/,
type: 'asset/resource',
generator: {
// 第三种 该方法只适用于 asset和asset/resource
filename: 'static/[hash][ext][query]'
// 此处也可以像第二种方法设置publicPath outputPath
}
}
]
},
}
个人推荐使用第三种方案,个人强迫症。如果静态资源不多的话,可以直接使用第一种或第二种。
自动清空上次打包内容
webpack5 output.clean设为true后,自动清空output.path配置的文件目录
webpack 自带clean配置项
webpack4 插件clean-webpack-plugin
const CleanWebpackPlugin = require('clean-webpack-plugin');
module.exports = {
plugins: [
new CleanWebpackPlugin(),
],
};
代码格式校验 Eslint
事先准备
项目中安装
eslintwebpack5安装eslint-webpack-pluginwebpack4安装eslint-loader
配置文件
.eslintrc.*位于文件目录- .eslintrc
- .eslintrc.js
- .eslintrc.json
- 以上三种皆可
package.json中eslintConfig字段进行配置.eslintignore忽略文件中目录的代码校验
配置
parserOptionsecmaVersionES语法版本,值为数字或者年份sourceType默认为script,现在一般都使用moduleecmaFeaturesimpliedStrict启用严格模式jsx启用jsx
env启用全局变量nodeNode.js全局变量和Node.js作用域。browser浏览器环境中的全局变量。es6启用除了modules以外的所有ECMAScript6特性(该选项会自动设置ecmaVersion解析器选项为 6)。
extends继承一些预设的规则集合Eslint官方eslint:recommendvue cli脚手架plugin:vue/essentialcreate-react-app脚手架react-app
rules配置各种代码校验规则- 官网规则
- 级别分为三种:关闭(0或off)、警告(1或warn)、错误(2或error)
- 某些规则还有一些额外的选项
- 当rules配置的规则与extends继承的规则冲突时,规则级别以rules配置为准;规则选项如果都配置了,则以rules为准;若rules未配置,则保留继承的规则选项。
{
"parserOptions":{
"ecmaVersion": 6,
"sourceType": "module",
"ecmaFeatures": {
"jsx": true
}
}
"env": {
"browser": true
"node": true
"es6": true
},
// 等价于 "extends": ["eslint:recommended"]
"extends": "eslint:recommended",
"rules": {
"eqeqeq": "off",
"curly": "error",
"quotes": ["error", "double"]
"prefer-const": ["error", {"destructuring": "all"}]
}
}
实际使用中,若有不可抗力导致校验出现警告或错误,可以用以下方法处理,行级注释与块注释皆可。
// 当前行忽略
alert('foo'); // eslint-disable-line
// 下一行忽略
// eslint-disable-next-line
alert('foo');
// 针对指定规则忽略
alert('foo'); // eslint-disable-line no-alert, quotes, semi
// eslint-disable-next-line no-alert, quotes, semi
alert('foo');
使用方式
webpack4
module.exports = {
// ...
module: {
rules: [
{
test: /.js$/,
exclude: /node_modules/,
use: ["babel-loader", "eslint-loader"]
}
]
// 或用下面这个方法
rules: [
{
enforce: "pre",
test: /.js$/,
exclude: /node_modules/,
loader: "eslint-loader"
},
{
test: /.js$/,
exclude: /node_modules/,
loader: "babel-loader"
}
]
}
};
webpack5
const ESLintPlugin = require('eslint-webpack-plugin');
module.exports = {
// ...
plugins: [new ESLintPlugin(options)],
// ...
};
- options
- EslintWebpackPlugin | webpack 中文文档 (docschina.org)
context指定文件根目录,类型为字符串。extensions指定需要检查的扩展名,默认js。可传字符串和数组exclude默认值node_modules,指定需要排除的文件及目录。必须是相对于options.context的相对路径。files指定的文件及目录。必须是相对于options.context的相对路径。