// let a = require('xxxx')
// 1.讀取給定路徑的檔案裡的內容,拿到字串
// -- 可能給了字尾,直接讀
// -- 可能沒有給字尾,沒有的話就按照順序 .js .json .node優先順序來載入檔案
// 2.拿到絕對路徑去快取裡查詢一下,是否有載入過
// -- 有就直接return
// -- 沒有建立這個模組,模組裡有個this.exports物件
// 3.放如快取
let path = require('path')
let fs = require('fs')
let vm = require('vm')
function Module(fullPath) {
this.fullPath = fullPath;
this.exports = {};
}
Module._extentions = ['.js', '.json', '.node'];
Module._cache = {};
Module._resovleFilename = function(relativePath){
let p = path.resolve(__dirname, relativePath);
let ext = path.extname(p);
if (ext && Module._extentions[ext]) {
// 寫的是全路徑
} else {
// 拼接
for (let i = 0; i < Module._extentions.length; i++) {
let fullPath = p + Module._extentions[i];
try{
fs.accessSync(fullPath);
return fullPath
}catch(e){
console.log(e)
}
}
}
}
Module.prototype.load = function(){
// js加閉包,json直接當物件
let ext = path.extname(this.fullPath)
Module._extentions[ext](this);
}
Module.wrapper = ["(function(exports, module, require){" , "\n})"]
Module.wrap = function(script) {
return Module.wrapper[0] + script + Module.wrapper[1];
}
Module._extentions['.js'] = function(module){
let codeText = fs.readFileSync(module.fullPath);
let fnStr = Module.wrap(codeText)
let fn = vm.runInThisContext(fnStr);
fn.call(module.exports, module.exports, module, req)
}
Module._extentions['.json'] = function(module){
let codeText = fs.readFileSync(module.fullPath);
module.exports = JSON.parse(codeText)
}
function req(p) {
// 搞出絕對路徑
let fullPath = Module._resovleFilename(p);
// 拿到絕對路徑去快取裡找
if(Module._cache[fullPath]) {
return Module._cache[fullPath];
}
// 沒有快取說明沒有載入過
let module = new Module(fullPath);
module.load();
Module._cache[fullPath] = module.exports;
return module.exports
}
let a = req('./a')
console.log(a);
a.name = 'jack'
let bb = req('./a')
console.log(bb)
/* ***********引用傳遞,原來的那個會被改掉哦************ */
let a = require('./a')
console.log(a);//{ name: 1, age: 2 }
a.name = 'jack'
let bb = require('./a')
console.log(bb)//{ name: 'jack', age: 2 }
複製程式碼
commonjs require原理
相關文章
- 手寫CommonJS 中的 require函式JSUI函式
- 實現 CommonJs 規範中的 Require 模組JSUI
- require工作原理UI
- CommonJS,AMD,CMD,ES6,require 和 import 詳解JSUIImport
- 探討ES6的import export default 和CommonJS的require module.exportsImportExportJSUI
- commonjsJS
- 來來來,探究一下CommonJs的實現原理JS
- 前端技術探秘-Nodejs的CommonJS規範實現原理前端NodeJS
- JavaScript中使用import 和require打包後實現原理JavaScriptImportUI
- 報錯ReferenceError: require is not defined,找不到requireErrorUI
- Commonjs規範JS
- sap.ui.require in SAP UI5 and require in nodejsUINodeJS
- node中的CommonJSJS
- require.contextUIContext
- CommonJs載入規範JS
- Nodejs的require流程NodeJSUI
- php中 include,require,include_once,require_once 的區別PHPUI
- include與require、require_once與include_once的區別UI
- 簡要理解CommonJS規範JS
- AMD , CMD, CommonJS,ES Module,UMDJS
- 前端模組化之CommonJS前端JS
- require 和 import 詳解UIImport
- NodeJS require()原始碼解析NodeJSUI原始碼
- require_once攻擊UI
- 深入 CommonJs 與 ES6 ModuleJS
- Commonjs規範與模組化JS
- CommonJS的兩種匯出方式JS
- 深入 CommonJs 與 ES6 ModuleJS
- CommonJs 和 ESModule 的 區別整理JS
- CommonJS模組 和 ECMAScript模組JS
- 單步除錯理解webpack裡通過require載入nodejs原生模組實現原理除錯WebUINodeJS
- require()迴圈引用問題UI
- Nodejs中的require函式NodeJSUI函式
- NodeJS require a global module/package in linuxNodeJSUIPackageLinux
- amd規範&require.jsUIJS
- require 和 import 的區別?UIImport
- import和require的區別ImportUI
- // @require file://C:xxxxxxxxx.jsUIJS