let path = require('path');
let fs = require('fs');
let vm = require('vm');
function Module(id){
this.id = id;
this.exports = {}
}
Module._extensions = {};
Module._cache = {};
let wrapper = [
'(function(exports,module,require,__dirname,__filename){'
,
'})'
]
Module._extensions['.js'] = function(module){
let script = fs.readFileSync(module.id,'utf8');
let functStr = wrapper[0] + script + wrapper[1];
let fn = vm.runInThisContext(functStr);
fn.call(module.exports,module.exports,module,myRequire);
}
Module._extensions['.json']= function(module){
let script = fs.readFileSync(module.id,'utf8');
module.exports = JSON.parse(script);
}
Module.prototype.load = function(){
let ext = path.extname(this.id);
Module._extensions[ext](this)
}
function myRequire(filePath){
let absPath = path.resolve(__dirname,filePath);
let p = '';
try{
// 判断当前路径是否存在
fs.accessSync(absPath)
p = absPath;
}catch(e){
// 增加逻辑 看是否存在
let extensions = Object.keys(Module._extensions);
extensions.some(ext=>{
let url = absPath + ext;
try{
fs.accessSync(url);p = url;
return true;
}catch(e){
return false;
}
});
}
if(p){
// 单例模式
if( Module._cache[p]){ // 如果缓存中有直接将缓存中的exports属性返回回去即可
return Module._cache[p].exports;
}
let module = new Module(p); // 创建一个模块对象
Module._cache[p] = module
// 加载模块
module.load(); // 加载这个模块
return module.exports; // 只需要返回module.exports 属性
}else{
throw new Error('file not access')
}
}
let r = myRequire('./a1');
console.log(r);