const path = require('path')
const fs = require('fs')
const vm = require('vm')
function Module(id) {
this.id = id
this.exports = {}
}
Module.warp = function(script){
let arr = [
`(function (exports,require,module,__filename,__dirname){`,
script,
`})`
]
return arr.join('')
}
Module._extensions = {
'.js': function (module) {
let content = fs.readFileSync(module.id,'utf8')
let fnStr = Module.warp(content)
let fn = vm.runInThisContext(fnStr)
let exports = module.exports
let require = myRequire
let __filename = module.id
let __dirname = path.dirname(module.id)
fn.call(exports,exports,require,module,__filename,__dirname)
},
'.json': function (module) {
let content = fs.readFileSync(module.id,'utf8')
Module.exports = JSON.parse(content)
},
'.node': function (module) { }
}
Module._resolveFilename = function (filePatha) {
let filePath = path.resolve(__dirname, filePatha)
let exists = fs.existsSync(filePath)
if (exists) return filePath
let keys = Object.keys(Module._extensions)
for (let i = 0; i < keys.length; i++) {
let currentPath = filePatha + keys[i]
if(fs.existsSync(currentPath)) return currentPath
}
}
Module.prototype.load = function(filename){
let extname = path.extname(filename)
Module._extensions[extname](this)
}
Module._load = function (filePatha) {
let fileName = Module._resolveFilename(filePatha)
let module = new Module(fileName)
module.load(fileName)
return module.exports
}
function myRequire(filePath) {
return Module._load(filePath)
}
let r = myRequire('./a.js')
console.log(r)