做者按:由於教程所示圖片使用的是 github 倉庫圖片,網速過慢的朋友請移步《webpack4 系列教程(十三):自動生成 HTML 文件》原文地址。更歡迎來個人小站看更多原創內容:godbmw.com,進行「姿式」交流 ♪(^∇^*)javascript
本節課的代碼目錄以下:html
本節課用的 plugin 和 loader 的配置文件package.json
以下:java
{
"devDependencies": {
"file-loader": "^1.1.11",
"html-loader": "^0.5.5",
"html-webpack-plugin": "^3.2.0",
"url-loader": "^1.0.1",
"webpack": "^4.16.1"
}
}
複製代碼
看過這個系列教程的朋友,都知道在以前的例子中,每次執行webpack
打包生成js
文件後,都必須在index.html
中手動插入打包好的文件的路徑。webpack
但在真實生產環境中,一次運行webpack
後,完整的index.html
應該是被自動生成的。例如靜態資源、js 腳本都被自動插入了。git
爲了實現這個功能,須要藉助HtmlWebpackPlugin
根據指定的index.html
模板生成對應的 html 文件,還須要配合html-loader
處理 html 文件中的<img>
標籤和屬性。github
編寫src/vendor/sum.js
文件,封裝sum()
函數做爲示例,被其餘文件引用(模塊化編程):web
export function sum(a, b) {
return a + b;
}
複製代碼
編寫入口文件src/app.js
,引入上面編寫的sum()
函數,而且運行它,以方便咱們在控制檯檢查打包結果:編程
import { sum } from "./vendor/sum";
console.log("1 + 2 =", sum(1, 2));
複製代碼
根目錄下的index.html
會被html-webpack-plugin
做爲最終生成的 html 文件的模板。打包後,相關引用關係和文件路徑都會按照正確的配置被添加進去。json
<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div></div>
<img src="./src/assets/imgs/xunlei.png">
</body>
</html>
複製代碼
Webpack
配置文件老規矩,HtmlWebpackPlugin
是在plugin
這個選項中配置的。經常使用參數含義以下:markdown
entry
配置中相匹配,支持多頁面、多入口除此以外,由於咱們在index.html
中引用了src/assets/imgs/
目錄下的靜態文件(圖片類型)。須要用url-loader
處理圖片,而後再用html-loader
聲明。注意二者的處理順序,url-loader
先處理,而後纔是html-loader
處理。
const path = require("path");
const webpack = require("webpack");
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
entry: {
app: "./src/app.js"
},
output: {
publicPath: __dirname + "/dist/",
path: path.resolve(__dirname, "dist"),
filename: "[name]-[hash:5].bundle.js",
chunkFilename: "[name]-[hash:5].chunk.js"
},
module: {
rules: [
{
test: /\.html$/,
use: [
{
loader: "html-loader",
options: {
attrs: ["img:src"]
}
}
]
},
{
test: /\.(png|jpg|jpeg|gif)$/,
use: [
{
loader: "url-loader",
options: {
name: "[name]-[hash:5].min.[ext]",
limit: 10000, // size <= 20KB
publicPath: "static/",
outputPath: "static/"
}
}
]
}
]
},
plugins: [
new HtmlWebpackPlugin({
filename: "index.html",
template: "./index.html",
chunks: ["app"], // entry中的app入口才會被打包
minify: {
// 壓縮選項
collapseWhitespace: true
}
})
]
};
複製代碼
運行webpack
進行打包,下面是打包結果:
能夠在/dist/
中查看自動生成的index.html
文件,以下圖所示,腳本和靜態資源路徑都被正確處理了:
直接在 Chrome 打開index.html
,而且打開控制檯:
圖片成功被插入到頁面,而且 js 的運行也沒有錯誤,成功。
html-loader
文檔: www.webpackjs.com/loaders/htm…html-webpack-plugin
文檔: www.webpackjs.com/plugins/htm…