背景
平时我们在 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 中。
打包结果如下:

这时候我们就发现图片已经被打包了。
