跳至主要內容

多页面配置

Mr.LRH大约 2 分钟

多页面配置

目录结构

├── config
│   ├── webpack.config.js
│   ├── webpack-help.js
├── src
│   ├── api
│   ├── libs
│   ├── pages
│   ├── pages
│   │   ├── home
│   │   │   ├── home.html
│   │   │   ├── home.js
│   │   │   ├── home.css
│   ├── utils
│── package.json
config/webpack-help.js
const path = require('path');
const glob = require('glob');
const HtmlWebPackPlugin = require('html-webpack-plugin');

function getEntry() {
  var entryFiles = glob.sync('./pages/*/*.js', {
    cwd: path.join(__dirname, './src'),
  });
  var resultEntry = {};
  entryFiles.forEach((filePath) => {
    // // path.dirname() 返回 path 的目录名
    // // eg: path.dirname('/src/pages/home.html') --> '/src/pages'
    // const dirname = path.dirname(filePath);

    // path.extname() 返回 path 的扩展名,即 path 的最后一部分中从最后一次出现的 .(句点)字符到字符串的结尾。
    // eg: path.extname('/src/pages/home.html') --> '.html'
    const extname = path.extname(filePath);
    // path.basename() 返回 path 的最后一部分
    // eg: path.basename('/src/pages/home.html') --> 'home.html'
    // eg: path.basename('/src/pages/home.html', '.html') --> 'home'
    const basename = path.basename(filePath, extname);

    // // path.join() 方法使用特定于平台的分隔符作为定界符将所有给定的 path 片段连接在一起,然后规范化生成的路径。
    // // eg: path.join('/src', 'pages', 'home.html') --> '/src/pages/home.html'
    // let pathname = path.join(dirname, basename);

    resultEntry[basename] = filePath;
  });
  return resultEntry;
}

function getHtmlWebpackPlugins() {
  const entries = getEntry();
  return Object.keys(entries).reduce((plugins, filename) => {
    const filePath = entries[filename];
    const dirname = path.dirname(filePath);
    plugins.push(
      new HtmlWebPackPlugin({
        template: `${dirname}/${filename}.html`,
        filename: `${filename}.html`,
        inject: 'body', // js插入的位置。 true/'head'/'body'/false
        hash: true, // 为静态资源生成 hash 值
        chunks: ['vendors', filename],
        minify: {
          // 压缩HTML文件
          removeComments: true, // 移除HTML中的注释
          collapseWhitespace: false, // 删除空白符与换行符
        },
      })
    );
    return plugins;
  }, []);
}

module.exports = { getEntry, getHtmlWebpackPlugins };

::: detail webpack.config.js

const { getEntry, getHtmlWebpackPlugins } = require('./webpack-help.js');

module.exports = {
  mode: 'development',
  entry: getEntry(),
  optimization: {
    splitChunks: {
      chunks: 'async', // 三选一: "initial" | "all" | "async" (默认)
      minSize: 30000, // 最小尺寸,30K,development 下是 10k,越大那么单个文件越大,chunk 数就会变少(针对于提取公共 chunk 的时候,不管再大也不会把动态加载的模块合并到初始化模块中)当这个值很大的时候,就不会做公共部分的抽取了
      maxSize: 0, // 文件的最大尺寸,0 为不限制,优先级:maxInitialRequest/maxAsyncRequests < maxSize < minSize
      minChunks: 1, // 默认 1,被提取的一个模块至少需要在几个 chunk 中被引用,这个值越大,抽取出来的文件就越小
      maxAsyncRequests: 5, // 在做一次按需加载的时候最多有多少个异步请求,为 1 的时候就不会抽取公共 chunk 了
      maxInitialRequests: 3, // 针对一个 entry 做初始化模块分隔的时候的最大文件数,优先级高于 cacheGroup,所以为 1 的时候就不会抽取 initial common 了
      automaticNameDelimiter: '~', // 打包文件名分隔符
      name: true, // 拆分出来文件的名字,默认为 true,表示自动生成文件名,如果设置为固定的字符串那么所有的 chunk 都会被合并成一个
      cacheGroups: {
        vendors: {
          test: /[\\/]node_modules[\\/]/, // 正则规则,如果符合就提取 chunk
          priority: -10, // 缓存组优先级,当一个模块可能属于多个 chunkGroup,这里是优先级
        }
      },
    }
  },
  plugins: [
    ...getHtmlWebpackPlugins(),
  ],
};

:::

上次编辑于:
贡献者: lingronghai