我们在项目中也会用到很多的图片和字体,我们也需要他直接被打包到项目里去。这个时候可以使用系统自带的Asset Modules来帮助我们打包文件。
在webpack5之前,加载文件使用file-loader,url-loader和raw-loader三个loader来处理,在webpack5之后,官方推荐使用内置的Asset Modules来管理文件。
资源模块(asset module)是一种模块类型,它允许使用资源文件(字体,图标等)而无需配置额外 loader。
资源模块类型(asset module type),通过添加 4 种新的模块类型,来替换所有这些 loader:
asset/resource 发送一个单独的文件并导出 URL。之前通过使用 file-loader 实现。
asset/inline 导出一个资源的 data URI。之前通过使用 url-loader 实现。
asset/source 导出资源的源代码。之前通过使用 raw-loader 实现。
asset 在导出一个 data URI 和发送一个单独的文件之间自动选择。之前通过使用 url-loader,并且配置资源体积限制实现。
const path = require('path');
module.exports = {
mode: "production",
//所选模式告诉webpack相应地使用其内置优化。"production" | "development" | "none"
entry: "./src/main.js",
// 指定入口文件 string | object | array
output: {
// webpack 如何输出结果的相关选项
path: path.resolve(__dirname, "dist"), // string
// 所有输出文件的目标路径 , 必须是绝对路径(使用 Node.js 的 path 模块)
filename: "bundle.js", // string | array
// 出口文件名称
publicPath:'dist/',
// 公开地址(最终项目地址,所有被打包的文件路径都会加上此前缀)
},
module: {
rules: [
{
test: /\.css$/,
use: [ 'style-loader', 'css-loader' ]
},
{
test: /\.less$/,
use: [{
loader: "style-loader" // creates style nodes from JS strings
}, {
loader: "css-loader" // translates CSS into CommonJS
}, {
loader: "less-loader" // compiles Less to CSS
}]
},
{
test: /\.(png|svg|jpg|jpeg|gif)$/i,
type: 'asset',
//使用asset类型,可以自动base64小图片
parser: {
dataUrlCondition: {
maxSize: 8 * 1024 // 8kb
//自动装换base64最大文件大小,默认8kb,不写则默认
}
},
generator: {
filename: 'img/[name]_[hash:8][ext][query]',
//指定输出路径和文件名格式
}
},
{
test: /\.(png|svg|jpg|jpeg|gif)$/i,
type: 'asset',
//使用asset类型,可以自动base64小图片
parser: {
dataUrlCondition: {
maxSize: 8 * 1024 // 8kb
//自动装换base64最大文件大小,默认8kb,不写则默认
}
},
generator: {
filename: 'img/[name]_[hash:8][ext][query]',
//指定输出路径和文件名格式
}
},
{
test: /\.(woff|woff2|eot|ttf|otf)$/i,
type: 'asset/resource',
generator: {
filename: 'fonts/[name]_[hash:8][ext][query]',
//指定输出路径和文件名格式
}
},
]
}
}
TIP:如果路劲不正确需要增加一个参数 publicPath 来指定项目路径
在src目录下新建img文件夹,并在其中放一张图片。
body{background-image: url(../img/head.jpg);}
在src目录下面新建font文件夹,并在其中放入一个字体。本案例使用字体来自阿里开源项目iconfont
配置好 loader 并将字体文件放在合适的位置后,你可以通过一个 @font-face 声明将其混合。本地的 url(...) 指令会被 webpack 获取处理,就像它处理图片一样:
@font-face {
font-family: "testfont";
src: url('../font/iconfont.ttf') format('truetype');
}
.testfont {
font-family: "testfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
<i class="testfont"></i>
运行命令打包项目.
npx webpack