经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JSJS库框架 » JavaScript » 查看文章
webpack4 系列教程(十三):自动生成HTML文件
来源:cnblogs  作者:GodBMW  时间:2018/10/19 9:13:23  对本文有异议

作者按:因为教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步《webpack4 系列教程(十三):自动生成 HTML 文件》原文地址。更欢迎来我的小站看更多原创内容:godbmw.com,进行“姿势”交流 ?(^?^*)

0. 课程介绍和资料

本节课的代码目录如下:

本节课用的 plugin 和 loader 的配置文件package.json如下:

  1. {
  2. "devDependencies": {
  3. "file-loader": "^1.1.11",
  4. "html-loader": "^0.5.5",
  5. "html-webpack-plugin": "^3.2.0",
  6. "url-loader": "^1.0.1",
  7. "webpack": "^4.16.1"
  8. }
  9. }

1. 为什么要自动生成 HTML?

看过这个系列教程的朋友,都知道在之前的例子中,每次执行webpack打包生成js文件后,都必须在index.html中手动插入打包好的文件的路径。

但在真实生产环境中,一次运行webpack后,完整的index.html应该是被自动生成的。例如静态资源、js 脚本都被自动插入了。

为了实现这个功能,需要借助HtmlWebpackPlugin根据指定的index.html模板生成对应的 html 文件,还需要配合html-loader处理 html 文件中的<img>标签和属性。

2. 编写入口文件

编写src/vendor/sum.js文件,封装sum()函数作为示例,被其他文件引用(模块化编程):

  1. export function sum(a, b) {
  2. return a + b;
  3. }

编写入口文件src/app.js,引入上面编写的sum()函数,并且运行它,以方便我们在控制台检查打包结果:

  1. import { sum } from "./vendor/sum";
  2. console.log("1 + 2 =", sum(1, 2));

3. 编写 HTML 文件

根目录下的index.html会被html-webpack-plugin作为最终生成的 html 文件的模板。打包后,相关引用关系和文件路径都会按照正确的配置被添加进去。

  1. <!-- index.html -->
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  8. <title>Document</title>
  9. </head>
  10. <body>
  11. <div></div>
  12. <img src="./src/assets/imgs/xunlei.png">
  13. </body>
  14. </html>

4. 编写Webpack配置文件

老规矩,HtmlWebpackPlugin是在plugin这个选项中配置的。常用参数含义如下:

  • filename:打包后的 html 文件名称
  • template:模板文件(例子源码中根目录下的 index.html)
  • chunks:和entry配置中相匹配,支持多页面、多入口
  • minify.collapseWhitespace:压缩选项

除此之外,因为我们在index.html中引用了src/assets/imgs/目录下的静态文件(图片类型)。需要用url-loader处理图片,然后再用html-loader声明。注意两者的处理顺序,url-loader先处理,然后才是html-loader处理。

  1. const path = require("path");
  2. const webpack = require("webpack");
  3. const HtmlWebpackPlugin = require("html-webpack-plugin");
  4. module.exports = {
  5. entry: {
  6. app: "./src/app.js"
  7. },
  8. output: {
  9. publicPath: __dirname + "/dist/",
  10. path: path.resolve(__dirname, "dist"),
  11. filename: "[name]-[hash:5].bundle.js",
  12. chunkFilename: "[name]-[hash:5].chunk.js"
  13. },
  14. module: {
  15. rules: [
  16. {
  17. test: /\.html$/,
  18. use: [
  19. {
  20. loader: "html-loader",
  21. options: {
  22. attrs: ["img:src"]
  23. }
  24. }
  25. ]
  26. },
  27. {
  28. test: /\.(png|jpg|jpeg|gif)$/,
  29. use: [
  30. {
  31. loader: "url-loader",
  32. options: {
  33. name: "[name]-[hash:5].min.[ext]",
  34. limit: 10000, // size <= 20KB
  35. publicPath: "static/",
  36. outputPath: "static/"
  37. }
  38. }
  39. ]
  40. }
  41. ]
  42. },
  43. plugins: [
  44. new HtmlWebpackPlugin({
  45. filename: "index.html",
  46. template: "./index.html",
  47. chunks: ["app"], // entry中的app入口才会被打包
  48. minify: {
  49. // 压缩选项
  50. collapseWhitespace: true
  51. }
  52. })
  53. ]
  54. };

5. 结果和测试

运行webpack进行打包,下面是打包结果:

可以在/dist/中查看自动生成的index.html文件,如下图所示,脚本和静态资源路径都被正确处理了:

直接在 Chrome 打开index.html,并且打开控制台:

图片成功被插入到页面,并且 js 的运行也没有错误,成功。

6. 更多资料

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号