1.实现逻辑
entry: {
index: "./src/index.js",
list: "./src/list.js",
},
plugins: [
new htmlWebpackPlugin({
template: "./src/index.html",
filename: "index.html",
chunks: ["index"],
}),
new htmlWebpackPlugin({
template: "./src/list.html",
filename: "list.html",
chunks: ["list"],
}),
new MiniCssExtractPlugin({
filename: "css/[name].css",
})
]
把上面静态的entry 和 plugins里的htmlWebpackPlugin对象数组,调整为动态读取。
- glob遍历文件夹关系,得出文件夹列表对象entryFiles
- 遍历entryFiles 得出entry和 htmlwebpackplugins数组
- 插入module.exports = {}的对象里面
2.安装相关依赖
package.json
"scripts": {
"mpa" : "webpack --config ./webpack.mpa.config.js"
},
"devDependencies": {
"autoprefixer": "^10.0.1",
"axios": "^0.21.0",
"clean-webpack-plugin": "^3.0.0",
"css-loader": "^5.0.0",
"cssnano": "^4.1.10",
"express": "^4.17.1",
"file-loader": "^6.2.0",
"glob": "^7.1.6",
"html-webpack-plugin": "^4.5.0",
"less": "^3.12.2",
"less-loader": "^7.0.2",
"mini-css-extract-plugin": "^1.2.1",
"postcss": "^8.1.4",
"postcss-loader": "^4.0.4",
"style-loader": "^2.0.0",
"url-loader": "^4.1.1",
"webpack": "^4.43.0",
"webpack-cli": "^3.3.12",
"webpack-dev-server": "^3.11.0"
},
3.代码实现
webpack.mpa.config.js
const path = require("path");
const htmlWebpackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
const glob = require("glob");
const setMpa = () => {
const entry = {};
const htmlwebpackplugins = [];
const entryFiles = glob.sync(path.join(__dirname, "./src/*/index.js"));
entryFiles.map((item, index) => {
const entryFile = entryFiles[index];
const match = entryFile.match(/src\/(.*)\/index\.js$/);
const pageName = match[1];
entry[pageName] = entryFile;
htmlwebpackplugins.push(
new htmlWebpackPlugin({
template: `./src/${pageName}/index.html`,
filename: `${pageName}.html`,
chunks: [pageName],
})
);
});
return {
entry,
htmlwebpackplugins,
};
};
const { entry, htmlwebpackplugins } = setMpa();
module.exports = {
entry,
output: {
path: path.resolve(__dirname, "./mpa"),
filename: "[name].js",
},
mode: "development",
module: {
rules: [
{
test: /\.css$/,
use: ["style-loader", "css-loader"],
},
{
test: /\.less$/,
use: [
MiniCssExtractPlugin.loader,
"css-loader",
"postcss-loader",
"less-loader",
],
},
{
test: /\.(png|jpe?g|gif)$/,
use: {
loader: "url-loader",
options: {
name: "[name].[ext]",
outputPath: "images/",
publicPath: "../images",
limit: 1024 * 3,
},
},
},
{
test: /\.(eot|woff|woff2)$/,
use: {
loader: "file-loader",
options: {
name: "[name].[ext]",
publicPath: "../",
},
},
},
],
},
plugins: [
...htmlwebpackplugins,
new MiniCssExtractPlugin({
filename: "css/[name].css",
}),
new CleanWebpackPlugin(),
],
};