背景
平时我们在 js 中引用的图片文件会被打包放入打包文件中,但是当在 html 模版中引入 图片时,这个图片不会被打包。如下:
我们先设置模版 html,不做任何操作,直接引用一个图片,如下:
<!-- ./public/index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="app"></div>
<img src="../src/test.jpeg" alt="">
</body>
</html>
然后设置
/** ./webpack.config.js **/
let path = require('path');
let HtmlWebpackPlugin = require('html-webpack-plugin');
//...
let htmlplugins = ['index'].map(chunkName=> {
return new HtmlWebpackPlugin({
filename: `${chunkName}.html`,
inject:'body',
chunks:[chunkName],
template: `./public/${chunkName}.html`
})
})
//...
module.exports = {
//...
module: {
rules: [
{
test: /\.(jpeg|jpg|png|gif)$/,
use: [{
loader: 'url-loader',
options: {
limit: 10240,
outputPath: 'img'
}
}]
}
]
},
plugins:[
...htmlplugins
]
}
直接打包,结果如下:
通过结果我们就可以发现这是有问题的,图片没有被打包,路径也没有被改变。
解决方法
安装 html-withimg-loader
yarn add html-withimg-loader --dev
配置 loader
/** ./webpack.config.js **/
let path = require('path');
let HtmlWebpackPlugin = require('html-webpack-plugin');
//...
let htmlplugins = ['index'].map(chunkName=> {
return new HtmlWebpackPlugin({
filename: `${chunkName}.html`,
inject:'body',
chunks:[chunkName],
template: `./public/${chunkName}.html`
})
})
//...
module.exports = {
//...
module: {
rules:[
{
test:/\.(htm|html)$/,
use: 'html-withimg-loader'
},
{
test: /\.(jpeg|jpg|png|gif)$/,
use: [
{
loader: 'url-loader',
options: {
limit: 10240,
esModule: false, // 关闭 esModule
outputPath: 'img'
}
}
]
}
]
}
plugins:[
...htmlplugins
]
}
注意:使用 html-withimg-loader 必须把 url-loader 的 esModule 设置为 false,不然路径会被包裹在一个路径中的 default 中。
打包结果如下:
这时候我们就发现图片已经被打包了。