77 lines
3.2 KiB
JavaScript
77 lines
3.2 KiB
JavaScript
"use strict";
|
||
Object.defineProperty(exports, "__esModule", { value: true });
|
||
exports.analysis = void 0;
|
||
const tslib_1 = require("tslib");
|
||
const fs_1 = tslib_1.__importDefault(require("fs"));
|
||
const path_1 = tslib_1.__importDefault(require("path"));
|
||
/**
|
||
* 分析项目中的模块
|
||
* @param dir 项目目录
|
||
* @param output 输出目录
|
||
*/
|
||
const analysis = (dir, config) => {
|
||
const BuiltinModule = require("module");
|
||
// 兼容一些模拟环境下的 module 构造函数
|
||
const Module = module.constructor.length > 1 ? module.constructor : BuiltinModule;
|
||
// 保存原始的 _resolveFilename 方法
|
||
const oldResolveFilename = Module._resolveFilename;
|
||
const successImported = new Set();
|
||
// 重写 _resolveFilename 方法
|
||
Module._resolveFilename = function (request, // 模块请求路径
|
||
parent, // 调用方模块
|
||
isMain, // 是否是主模块
|
||
rFoptions // 解析选项
|
||
) {
|
||
// 调用原始的 _resolveFilename 方法
|
||
const filename = oldResolveFilename.call(this, request, parent, isMain, rFoptions);
|
||
// 记录成功导入的模块
|
||
successImported.add(filename);
|
||
// 返回解析后的模块路径
|
||
return filename;
|
||
};
|
||
const filterProjectModules = (modulePath) => {
|
||
if (config.includeNodeModules) {
|
||
return modulePath.includes(dir);
|
||
}
|
||
return modulePath.includes(dir) && !modulePath.includes('node_modules');
|
||
};
|
||
/**
|
||
* 将所有的文件复制到指定目录,并保持目录结构
|
||
* @param files 文件列表 string[]
|
||
* @param dest 目标目录
|
||
* @param root 原目录的根目录
|
||
*/
|
||
const copyFiles = (files, dest, root) => {
|
||
files.forEach(file => {
|
||
const relativePath = path_1.default.relative(root, file);
|
||
const destPath = path_1.default.join(dest, relativePath);
|
||
fs_1.default.mkdirSync(path_1.default.dirname(destPath), { recursive: true });
|
||
fs_1.default.copyFileSync(file, destPath);
|
||
});
|
||
};
|
||
const { watch } = require("./watch");
|
||
watch(dir).then(s => {
|
||
setTimeout(() => {
|
||
console.log('shutting down...');
|
||
s().then(() => {
|
||
console.log('server stoped');
|
||
// 把导入成功的输出
|
||
const project = Array.from(successImported).filter(filterProjectModules);
|
||
// 添加本地的scripts下的所有文件和package.json
|
||
const scriptsDir = path_1.default.join(dir, 'scripts');
|
||
const pkgPath = path_1.default.join(dir, 'package.json');
|
||
const files = fs_1.default.readdirSync(scriptsDir);
|
||
const scriptFiles = files.map(file => path_1.default.join(scriptsDir, file));
|
||
project.push(pkgPath, ...scriptFiles);
|
||
// 复制文件
|
||
const dest = path_1.default.join(dir, config.outputDir);
|
||
fs_1.default.mkdirSync(dest, { recursive: true });
|
||
copyFiles(project, dest, dir);
|
||
console.warn('分析结果以项目启动所需依赖为准,如果涉及动态导入,请设计routine,在项目启动时进行加载!');
|
||
process.exit(0);
|
||
});
|
||
}, 1000);
|
||
});
|
||
};
|
||
exports.analysis = analysis;
|