// 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函式
- require工作原理UI
- 實現 CommonJs 規範中的 Require 模組JSUI
- CommonJS,AMD,CMD,ES6,require 和 import 詳解JSUIImport
- 探討ES6的import export default 和CommonJS的require module.exportsImportExportJSUI
- JavaScript中使用import 和require打包後實現原理JavaScriptImportUI
- 來來來,探究一下CommonJs的實現原理JS
- 瀏覽器載入 CommonJS 模組的原理與實現瀏覽器JS
- commonjsJS
- require和require_once的區別UI
- 報錯ReferenceError: require is not defined,找不到requireErrorUI
- require OR importUIImport
- 前端技術探秘-Nodejs的CommonJS規範實現原理前端NodeJS
- require_once()UI
- Commonjs規範JS
- commonjs詳解JS
- sap.ui.require in SAP UI5 and require in nodejsUINodeJS
- require.contextUIContext
- php--include 、requirePHPUI
- nodejs module/requireNodeJSUI
- node中的CommonJSJS
- include與require、require_once與include_once的區別UI
- php中 include,require,include_once,require_once 的區別PHPUI
- [php]require&require_once&include&include_once的用法與區別PHPUI
- require 和 import 詳解UIImport
- node.js之requireNode.jsUI
- require() 原始碼解讀UI原始碼
- Operations that Require Temporary Segments (26)UI
- Nodejs的require流程NodeJSUI
- require_once攻擊UI
- 前端模組化之CommonJS前端JS
- CommonJs載入規範JS
- CommonJS模組 和 ECMAScript模組JS
- commonjs,AMD,CMD區別JS
- AMD, CMD, CommonJS和UMDJS
- CommonJS Modules/1.0 規範JS
- 單步除錯理解webpack裡通過require載入nodejs原生模組實現原理除錯WebUINodeJS
- require()迴圈引用問題UI