node-web-mvc
Version:
node spring mvc
76 lines (75 loc) • 2.54 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
/**
* @module ModuleLoader
* @description 模块装载工具
*/
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const src_1 = __importDefault(require("../../hmr/src"));
const allowExtensions = {
'.js': true,
'.ts': true,
};
class ModuleLoader {
/**
* 装载指定目录下对应模块
* @param dir 目录
* @param cache 缓存清单,如果文件已经加载过,则跳过加载,
* 这里主要用解决windows下目录大小写导致同个模块存在两份。
*/
constructor(dir, cache, exclude) {
this.exclude = exclude || [];
this.load(dir, cache || {});
}
/**
* 判断当前模块是否可加载
* @param id
*/
loadable(id) {
const ext = path_1.default.extname(id);
return (ext === '.js' || ext === '.ts');
}
isExclude(id) {
const exclude = this.exclude;
if ((exclude === null || exclude === void 0 ? void 0 : exclude.length) < 1) {
return false;
}
return exclude.some((e) => {
return id.indexOf(e) > -1;
});
}
/**
* 加载指定目录下模块
* @param dir 待加载目录
* @param cache 缓存配置
*/
load(dir, cache) {
const children = fs_1.default.lstatSync(dir).isDirectory() ? fs_1.default.readdirSync(dir) : [dir];
children.forEach((name) => {
const id = path_1.default.isAbsolute(name) ? name : path_1.default.join(dir, name);
const ext = path_1.default.extname(name);
if (fs_1.default.lstatSync(id).isFile() && !allowExtensions[ext] || id.indexOf('/node_modules/') > -1 || id.indexOf('.d.ts') > 0) {
return;
}
if (this.isExclude(id)) {
console.log('ModuleLoader exclude:', id);
// 如果需要排除
return;
}
if (fs_1.default.lstatSync(id).isDirectory()) {
// 装载子目录
return this.load(id, cache);
}
else if (this.loadable(id) && !cache[id.toLowerCase()]) {
// 装载
require(id);
}
});
}
}
exports.default = ModuleLoader;
src_1.default.create(module).accept(() => { });