做者按:由于教程所示图片使用的是 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/