- 文件路径读取 (实现指定文件打包)
const fs = require("fs");
const path = require("path");
const pagesResult = {};
// 需要忽略的pages目录下面的文件夹或者文件名称
const ignorePages = [];
// 表示获取那部分的路径当做 入口文件路径
// E:\FE\edu_xadmin\src\pages\new\k12_front_exam.js ==> \new\k12_front_exam
const buildFolder = '\\pages';
const webpackFiles = ["index.js", "index.jsx"];
// 递归读取文件夹下内容 (如果文件夹下有index.js 只打包index.js , 没有的话, 打包文件夹下文件)
function folderRead(filePath) {
const fileItems = fs
.readdirSync(filePath)
.filter(item => !ignorePages.includes(item));
const fileItemsLen = fileItems.length;
for (let i = 0; i < fileItemsLen; i++) {
// 文件路径
const filedir = path.join(filePath, fileItems[i]);
// 判断文件是否存在
const fileStat = fs.statSync(filedir);
if (fileStat.isDirectory()) {
// 判断文件夹下面是否存在index.js 存在的话, 只打包index.js 不存在的话, 打包整个目录
const filedirIndexJS = path.resolve(filedir, "index.js");
// const filedirIndexJSX = path.resolve(filedir, 'index.jsx')
try {
// 文件不存在的话, 会抛出异常
const indexJSFileStat = fs.statSync(filedirIndexJS);
// 表示存在该文件 filedir/index.js
if (indexJSFileStat) {
let key = getFolderExt(filedirIndexJS, buildFolder);
key = path.dirname(key);
pagesResult[key] = filedirIndexJS;
}
} catch (e) {
// 表示不存在 filedir/index.js 文件, 继续遍历filedir文件夹
folderRead(filedir);
}
} else if (fileStat.isFile()) {
// 排除掉json文件的影响
if (!filedir.endsWith(".json")) {
const key = getFolderExt(filedir, buildFolder);
pagesResult[key] = filedir;
}
}
}
}
// E:\FE\edu_xadmin\src\pages\new\k12_front_exam.js ==> \new\k12_front_exam
function getFolderExt(filedir, after) {
// const keyTmp = filedir.split(after)[1].slice(1);
const keyTmp = filedir.split(after)[1];
const index = keyTmp.lastIndexOf(".");
// 获取文件后缀前面的数据
const key = keyTmp.substring(0, index);
return key;
}
function folderRead2(filePath) {
const fileItems = fs
.readdirSync(filePath)
.filter(item => !ignorePages.includes(item));
const fileItemsLen = fileItems.length;
for (let i = 0; i < fileItemsLen; i++) {
const filedir = path.join(filePath, fileItems[i]);
const fileStat = fs.statSync(filedir);
if (fileStat.isDirectory()) {
// 只要有一种类型的文件存在就返回文件地址, 证明存在index文件, 当前目录下的其他文件不需要打包
const filedirIndexJS = isExists(filedir, webpackFiles);
if (filedirIndexJS) {
let key = getFolderExt(filedirIndexJS, buildFolder);
key = path.dirname(key);
pagesResult[key] = filedirIndexJS;
} else {
// 表示不存在该文件
folderRead2(filedir);
}
} else if (fileStat.isFile()) {
// 排除掉json文件的影响
if (!filedir.endsWith(".json")) {
const key = getFolderExt(filedir, buildFolder);
pagesResult[key] = filedir;
}
}
}
}
function isExists(filepath, fileArr) {
var i = 0;
for (i = 0; i < fileArr.length; i++) {
try {
const fsStat = fs.statSync(path.resolve(filepath, fileArr[i]));
if (fsStat) {
return path.resolve(filepath, fileArr[i]);
}
} catch (e) {}
}
if (i === fileArr.length) {
return null;
}
}
// 读取pages页面下面的所有目录文件
// folderRead(path.resolve(__dirname, './css_test/'));
folderRead2(path.resolve(__dirname, "./css_test/"));
console.log(pagesResult);
- webpack配置
module.exports = {
// 多入口
entry: pagesResult,
output: {
path: path.resolve(__dirname, 'build/pages'),
filename: '[name].js',
// ... 省略
}
// 省略....
}