做者按:由於教程所示圖片使用的是 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
這個選項中配置的。經常使用參數含義以下:app
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
文檔: https://www.webpackjs.com/loaders/html-loader/html-webpack-plugin
文檔: https://www.webpackjs.com/plugins/html-webpack-plugin/