问题
每次创建新的页面时,如果都要去更改webpack的入口 配置文件,那样太不爽了,我们改造我们的代码来动态获取入口文件。
改造
1、安装glob
$ npm install glob -D
2、动态获取目录中的文件
const glob = require('glob');
/*
* 1. 我们以文件夹里是否有html文件为准,来判断是否需要生成多页面
* 2. 我们的多页应用目录最多支持三级
*/
const pages = glob.sync('./src/pages/**?/**/index.html').map(item => {
/*
* pathArr
* = [ '.', 'src', 'pages', 'home', 'index.html' ]
* = [ '.', 'src', 'pages', 'blog', 'list', 'index.html' ]
* = [ '.', 'src', 'pages', 'blog', 'list', 'detail', 'index.html' ]
*/
const pathArr = item.split('/');
// 从第3个截取至倒数第一个,为我们的文件名
return pathArr.slice(3, pathArr.length - 1).join('-');
});
更新 webpack
1、创建入口
const createEntry = () => {
let entry = {};
pages.forEach(name => {
const pagePath = name.split('-').join('/');
entry[name] = path.join(__dirname, `./src/pages/${pagePath}/index.js`);
});
return entry;
};
2、创建htmlWebpackPlugin
const createHtmlPlugin = () => {
let plugins = [];
pages.forEach(name => {
const pagePath = name.split('-').join('/');
plugins.push(
new HtmlWebpackPlugin({
minify: false,
title: name,
template: path.join(__dirname, `./src/pages/${pagePath}/index.html`),
filename: path.join(__dirname, `./dist/${name}.html`),
inject: 'body',
chunks: [name],
hash: false,
publicPath: '',
}),
);
});
return plugins;
};
webpack.config.js
module.exports = {
entry: createEntry(),
// ...
plugins: [...createHtmlPlugin()],
};
项目源码见(切换 tag 至 multi-page-app4)git checkout multi-page-app4:
https://github.com/pengjielee/reactapp/tree/main/multi-pages