# Lastest version of Webpack4 loaders
- css-loader@5.2.7
- sass-loader@10.2.0
- postcss-loader@4.2.0
- less-loader@7.3.0
- mini-css-extract-plugin@1.6.2
- copy-webpack-plugin@6.4.1
# loader使用规则
loader 从右到左(或从下到上)地取值(evaluate)/执行(execute)
# 使用loader
{ test: /\.vue$/, loader: 'vue-loader' } // loader属性
// 使用use
{
test: /\.css$/,
use: [
// [style-loader](/loaders/style-loader)
{ loader: 'style-loader' },
// [css-loader](/loaders/css-loader)
{
loader: 'css-loader',
options: {
modules: true
}
},
// [sass-loader](/loaders/sass-loader)
{ loader: 'sass-loader' }
]
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# webpack打包vue文件
需要使用vue-loader (opens new window)
const { VueLoaderPlugin } = require('vue-loader')
module.exports = {
module: {
rules: [{ test: /\.vue$/, loader: 'vue-loader' }],
},
plugins: [
new VueLoaderPlugin()
]
}
2
3
4
5
6
7
8
9
10
# 自动构建
最后在package.json的script中添加
"scripts": {
"dev": "webpack ./src/main.js --mode development --config ./build/webpack.config.js -o dist"
},
2
3
# 处理css
# style-loader
{ test: /\.css$/, use: ['style-loader', 'css-loader', 'postcss-loader'] }
# css-loader
css-loader和style-loader的区别 ===> https://blog.csdn.net/wu_xianqiang/article/details/104560613
# sass
使用 style-loader css-loader sass-loader
yarn add style-loader css-loader sass-loader -D
{
test: /\.s[ac]ss$/i,
use: [
// Creates `style` nodes from JS strings
!IS_PRODUCTION
? {
loader: 'style-loader',
options: {
esModule: true
}
}
: MiniCssExtractPlugin.loader,
// Translates CSS into CommonJS
'css-loader',
{
loader: 'postcss-loader',
options: {
postcssOptions: {
plugins: [
['postcss-preset-env',{
// 其他选项
},],
],
},
},
},
// Compiles Sass to CSS
'sass-loader',
],
},
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# postcss-preset-env
PostCSS Preset Env (opens new window)允许您将现代 CSS 转换为大多数浏览器可以理解的内容,根据您的目标浏览器或运行时环境确定您需要的polyfill (opens new window)。
# Babel处理js文件
# Babel-loader
webpack doc (opens new window)
This package allows transpiling JavaScript files using Babel (opens new window) and webpack (opens new window).
yarn add babel-loader @babel/core @babel/preset-env -D
babel.config.js
module.exports = {
presets: [
["@babel/preset-env",
{ useBuiltIns: 'usage', corejs: 3, modules: false }
]
]
}
2
3
4
5
6
7
8
# 处理图片
# webpack5
https://webpack.docschina.org/guides/asset-modules/#resource-assets
在 webpack 5 之前,通常使用:
raw-loader(opens new window) 将文件导入为字符串url-loader(opens new window) 将文件作为 data URI 内联到 bundle 中file-loader(opens new window) 将文件发送到输出目录
webpack5 可以使用assets module
{ test: /\.(jpeg|png)/i, type: 'asset/resource' }
webpack 将按照默认条件,自动地在
resource和inline之间进行选择:小于 8kb 的文件,将会视为inline模块类型,否则会被视为resource模块类型。
小于8kb的图片会被转成base64字符串---inline
asset/inline
会被转换为base64字符串
可以自定义URI生成器
# webpack4
{
test: /\.(png|svg|jpe?g)$/i,
loader: 'url-loader',
options: {
esModule: false
}
},
{
test: /\.(woff|woff2|eot|ttf|otf)$/i,
loader: 'file-loader',
options: {
esModule: false
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
# 压缩svg
# mini-svg-data-uri
# 打包后网站ico图标丢失
原因是打包时没有将ico图标文件复制到dist目录内
使用CopyWebpackPlugin
const CopyWebpackPlugin = require('copy-webpack-plugin');
module.exports = {
// ...
output: {
path: path.resolve(__dirname, 'dist'),
// ...
},
plugins: [
new CopyWebpackPlugin({
patterns: [
{
from: path.resolve(__dirname, '../public/favicon.ico'),
to: path.resolve(__dirname, '../dist/')
}
],
}),
],
// ...
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20