mpvue-entry
Version:
集中式页面配置,自动生成各页面的入口文件,优化目录结构,支持新增页面热更新
124 lines (109 loc) • 3.73 kB
JavaScript
const fs = require('fs');
const path = require('path');
const { equalConfig } = require('./utils/equal');
const { resolveApp, resolveModule } = require('./utils/resolve');
const isOldLoader = require('./utils/version');
/**
* @param {(Object|String)} [paths]
* @param {String} [paths.pages]
* @param {String} [paths.main]
* @param {String} [paths.template]
* @param {String} [paths.app]
* @param {String} [paths.dist]
* @param {String} [paths.entry]
*/
function parsePaths(paths) {
const {
pages, main, template, app, dist, entry,
} = typeof paths === 'string' ? { pages: paths } : paths;
return {
// 页面配置文件
pages: resolveApp(pages || './src/pages.js'),
// 主入口文件,作为模板
main: resolveApp(main || './src/main.js'),
// 入口模板文件,优先级较高
template: resolveApp(template || main || './src/main.js'),
// 项目配置文件
app: resolveApp(app || (isOldLoader ? './dist/app.json' : './src/app.json')),
// 项目构建目录
dist: resolveApp(dist || './dist'),
// 入口文件目录
entry: entry ? resolveApp(entry) : resolveModule('./dist'),
};
}
/**
* @param {Object} paths
* @param {String} paths.pages
* @param {String} paths.entry
* @param {Array} [oldPages]
*/
function parsePages(paths, oldPages = []) {
require.cache[paths.pages] = null;
const pages = require(paths.pages);
const formatedPages = pages
.map((page) => {
const fdPage = typeof page === 'string' ? { path: page } : page;
const entryName = fdPage.path.replace(/\/(\w)/g, (match, $1) => $1.toUpperCase());
fdPage.path = fdPage.path.replace(/^\//, '');
fdPage.route = fdPage.route ? fdPage.route.replace(/^\//, '') : fdPage.path.replace(/\.vue$/, '');
fdPage.root = fdPage.root && fdPage.root.replace(/^\/|\/$/g, '');
fdPage.entry = path.join(paths.entry, `${entryName}.js`);
fdPage.subPackage = fdPage.subPackage || !!fdPage.root;
return fdPage;
});
const pagesMap = new Map(formatedPages.map(page => [page.path, page]));
const oldPagesMap = new Map(oldPages.map(oldPage => [oldPage.path, oldPage]));
const changedPages = formatedPages
.filter((page) => {
const oldPage = oldPagesMap.get(page.path);
if (oldPage && equalConfig(page, oldPage)) {
return false;
}
return true;
});
const invalidPages = oldPages
.filter(page => !pagesMap.has(page.path));
return {
formated: formatedPages,
changed: changedPages,
invalid: invalidPages,
};
}
/**
* @param {Object} paths
* @param {String} paths.template
*/
function parseTemplate(paths) {
const mixinReg = /Vue\.mixin\((.*)\).*/;
const relativeReg = /import (.* from )?['|"](\..*)['|"]/;
let template = fs.readFileSync(paths.template).toString()
.replace(/.*mpType.*/, '')
.replace(/.*app-only-begin[^]*?app-only-end.*/g, '')
.replace(/.*app-only.*/g, '')
.replace(/!:\/\/.*/g, '')
.replace(/\/\*[^]*?\*\//g, '');
while (mixinReg.test(template)) {
template = template.replace(mixinReg, '')
.replace(new RegExp(`import ${RegExp.$1 || null}.*\n`), '');
}
while (relativeReg.test(template)) {
template = template.replace(relativeReg, (match, $1, $2) => {
const templateDir = path.dirname(paths.template);
const absolutePath = path.join(templateDir, $2).replace(/\\/g, '\\\\');
return match.replace($2, absolutePath);
});
}
return template.replace(/[\r?\n]{2,}/g, '\n\n');
}
/**
* @param {String} template
*/
function parseHome(template) {
return /pages:[^]*?\^(.*?)['|"]/.test(template) ? RegExp.$1 : '';
}
module.exports = {
parsePaths,
parseTemplate,
parseHome,
parsePages,
};