手动打包多页面入口

我们之前打包的都是单页面,那么如何多包多页面的项目呢(一个项目中存在多个html文件)

  1. chapter
  2. ├─babel.config.js
  3. ├─package-lock.json
  4. ├─package.json
  5. ├─postcss.config.js
  6. ├─src
  7. | ├─index.html
  8. | ├─index.js
  9. | list.js
  10. ├─dell
  11. | ├─vendors.dell.js
  12. | vendors.dell.js.LICENSE.txt
  13. ├─build
  14. | ├─webpack.common.js
  15. | ├─webpack.dell.js
  16. | ├─webpack.dev.js
  17. | webpack.prod.js

src/index.js文件:

  1. import React, { Component } from "react";
  2. import ReactDom from "react-dom";
  3. class App extends Component{
  4. Super(){}
  5. render(){
  6. return(
  7. <div>
  8. <div>this is index</div>
  9. </div>
  10. )
  11. }
  12. }
  13. ReactDom.render(<App />,document.getElementById("root"));

src/list.js文件:

  1. import React, { Component } from "react";
  2. import ReactDom from "react-dom";
  3. class App extends Component{
  4. Super(){}
  5. render(){
  6. return(
  7. <div>
  8. <div>this is List</div>
  9. </div>
  10. )
  11. }
  12. }
  13. ReactDom.render(<App />,document.getElementById("root"));

如果我想要以上两个**JS**文件打包进两个**html**文件该如何进行配置呢?
1、增加打包入库
2、增加HtmlWebpackPlugin的配置,且进行配置filename和所需要用到的模块文件chunks

  1. // ...
  2. const commonConfig = {
  3. // 项目从哪个文件开始打包
  4. entry: {
  5. main: "./src/index.js",
  6. list: "./src/list.js"
  7. },
  8. // ...
  9. plugins: [
  10. // 自动引入打包好的js文件
  11. new HtmlWebpackPlugin({
  12. template: "./src/index.html",
  13. filename: "index.html",
  14. chunks: ["vendors", "main"]
  15. }),
  16. new HtmlWebpackPlugin({
  17. template: "./src/index.html",
  18. filename: "list.html",
  19. chunks: ["vendors", "list"]
  20. }),
  21. // ...
  22. ],
  23. }
  24. module.exports = (env) => {
  25. if (env && env.production) {
  26. return merge(commonConfig, prodConfig)
  27. } else {
  28. return merge(commonConfig, devConfig)
  29. }
  30. }

然后运行npm run build就能看到dist文件夹下生成了两个html文件。

自动打包多页面入口

以上就是如何打包多页面配置?我们发现如何新建一个html文件就需要我们在entry里面增加入口,plugin里面增加配置,那么如何自动完成这些操作呢

plugins单独抽离出来:

  1. const path = require("path");
  2. const HtmlWebpackPlugin = require("html-webpack-plugin");
  3. const { CleanWebpackPlugin } = require('clean-webpack-plugin');
  4. const { merge } = require("webpack-merge");
  5. const addAssetsHtmlWebpackPlugin = require("add-asset-html-webpack-plugin")
  6. const devConfig = require("./webpack.dev")
  7. const prodConfig = require("./webpack.prod")
  8. const markPlugin = (configs) => {
  9. let pluginArr = [
  10. // 清除dist文件夹
  11. new CleanWebpackPlugin({
  12. cleanOnceBeforeBuildPatterns: [
  13. path.resolve(__dirname, '../dist')
  14. ],
  15. }),
  16. // 将静态资源添加到html中
  17. new addAssetsHtmlWebpackPlugin({
  18. filepath: path.resolve(__dirname, "../dell/vendors.dell.js")
  19. })
  20. ];
  21. Object.keys(configs.entry).forEach(item => {
  22. pluginArr.push(
  23. new HtmlWebpackPlugin({
  24. template: "./src/index.html",
  25. filename: `${item}.html`,
  26. chunks: ["vendors", item]
  27. }),
  28. )
  29. })
  30. return pluginArr;
  31. }
  32. const commonConfig = {
  33. // 项目从哪个文件开始打包
  34. entry: {
  35. main: "./src/index.js",
  36. list: "./src/list.js",
  37. detail: "./src/detail.js"
  38. },
  39. // 项目打包输出的配置
  40. output: {
  41. // 打包后输出的路径(不写也是可以的,因为这就是默认的路径,建议w写上更加直观),__dirname 表示当前目录下
  42. path: path.resolve(__dirname, "../dist"),
  43. },
  44. resolve: {
  45. // 自动帮我们把文件后缀补齐(从左到右)
  46. extensions: [".js", ".jsx"],
  47. // 自动帮我们查找文件(从左到右)
  48. mainFiles: ["index", "child"],
  49. // 别名,根据配置的别名查找路径
  50. alias: {
  51. "@": path.relative(__dirname, "src/coms")
  52. }
  53. },
  54. module: {
  55. rules: [{
  56. test: /\.jpg|.jpeg|.png$/,
  57. use: {
  58. loader: "url-loader",
  59. options: {
  60. limit: 54000,
  61. name: "[name].[ext]",
  62. outputPath: "/images",
  63. }
  64. }
  65. }, {
  66. test: /\.m?js$/,
  67. exclude: /node_modules/, // 排除node_modules下的代码
  68. use: {
  69. loader: "babel-loader"
  70. }
  71. }]
  72. },
  73. optimization: {
  74. // TreeShaking 的配置
  75. usedExports: true,
  76. // SplittingCode 的配置
  77. splitChunks: {
  78. chunks: 'all', // 分割引入代码库的方式,默认为 async 异步,可选 all:同步和异步
  79. cacheGroups: {
  80. vendors: {
  81. test: /[\\/]node_modules[\\/]/,
  82. priority: -10,
  83. name: "chunk"
  84. }
  85. }
  86. },
  87. },
  88. // plugins: [
  89. // // 自动引入打包好的js文件
  90. // new HtmlWebpackPlugin({
  91. // template: "./src/index.html",
  92. // filename: "index.html",
  93. // chunks: ["vendors", "main"]
  94. // }),
  95. // new HtmlWebpackPlugin({
  96. // template: "./src/index.html",
  97. // filename: "list.html",
  98. // chunks: ["vendors", "list"]
  99. // }),
  100. // // 清除dist文件夹
  101. // new CleanWebpackPlugin({
  102. // cleanOnceBeforeBuildPatterns: [
  103. // path.resolve(__dirname, '../dist')
  104. // ],
  105. // }),
  106. // // 将静态资源添加到html中
  107. // new addAssetsHtmlWebpackPlugin({
  108. // filepath: path.resolve(__dirname, "../dell/vendors.dell.js")
  109. // })
  110. // ],
  111. }
  112. commonConfig.plugins = markPlugin(commonConfig);
  113. module.exports = (env) => {
  114. if (env && env.production) {
  115. return merge(commonConfig, prodConfig)
  116. } else {
  117. return merge(commonConfig, devConfig)
  118. }
  119. }

以上代码把plugins单独抽离出来,根据entry的对象进行循环,这样每次新建一个html文件我们只需要到entry里面增加一个配置,就可以啦。