webpack 如何配置多页面应用

117 阅读1分钟

以下对应的 webpack config:

const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
  entry: { // 指定 js 文件路径并赋名
    app: './src/app.js',
    admin: '.src/admin.js'
  },
  plugins: [
    new HtmlWebpackPlugin({
      filename: 'index.html',
      chunks: ['app']  // 通过 chunks name 将 html 文件跟 entry 中指定的 js 文件绑定
    }),
    new HtmlWebpackPlugin({
      filename: 'admin.html',
      chunks: ['admin']
    })
  ]
}

但是,这样配置会有一个【重复打包】的问题:假设 app.js 和 admin.js 都引入了 vue.js,那么 vue.js 的代码既会打包进 app.js,也会打包进 admin.js。我们需要使用optimization.splitChunks将共同依赖单独打包成 common.js (HtmlWebpackPlugin 会自动引入 common.js)。

如何支持无限多页面呢?

写点 Node.js

const HtmlWebpackPlugin = require('html-webpack-plugin')
const fs = require('fs')
const path = require('path')

const filenames = fs.readdirSync('./src/pages') // 获取 pages 里所有以 .js 结尾的文件
    .filter(file => file.endsWith('.js'))
    .map(file => path.basename(file, '.js')) // 将获取到的文件的 .js 去掉

const entries = filenames.reduce((result, name) => ( // 通过遍历生成包含多个 entry 的对象
  { ...result, [name]: './src/pages/${name}.js' }
),{})
const plugins = filenames.map((name) => // 通过遍历生成包含多个 plugin 的数组
  new HtmlWebpackPlugin({
    filename: name + '.html',
    chunks: [name]
  })
)

module.exports = {
  entry: { // 将 entries 对象扩展到 entry 中
    ...entries
  },
  plugin: [ // 将 plugins 数组扩展到 plugin 中
    ...plugins
  ]
}