Nodejs 之 exports, require, module, __filename, __dirname

開頭

Nodejs代碼中常見的引入模塊函數「require」。其實不多人瞭解爲何能使用「require」,以及Nodejs基本的運行機制。javascript

是否還記得「arguments」,arguments能夠直接拿到調用函數傳入的參數。html

(function() {
  console.log(arguments)} // [1, 2, 3]
)(1, 2, 3)
複製代碼

其實Nodejs能夠直接打印 arguments。用Node運行文件:java

// index.js
// node index.js 運行
console.log(arguments)
// 輸出
//{ '0': {},
// '1':{ [Function: require]
// '2':
// Module {
// id: '.',
// exports: {},
// parent: null,
// filename: 'D:\\Personal\\Desktop\\a
// loaded: false,
// children: [],
// paths:
// [ 'D:\\Personal\\Desktop\\abc\\nod
// 'D:\\Personal\\Desktop\\node_mod
// 'D:\\Personal\\node_modules',
// 'D:\\node_modules' ] },
// '3': 'D:\\Personal\\Desktop\\abc\\inde
// '4': 'D:\\Personal\\Desktop\\abc' }
複製代碼

能夠看到arguments內有五個參數。這五個參數分別是 exports, require, module, __filename, __dirnamenode

源碼解析

在Nodejs源碼 loader.js文件中,能夠看到這幾行js代碼git

Module.wrap = function(script) {
  return Module.wrapper[0] + script + Module.wrapper[1];
};

Module.wrapper = [
  '(function (exports, require, module, __filename, __dirname) { ',
  '\n});'
];

// ....
Module.prototype._compile = function(content, filename) {
 content = internalModule.stripShebang(content);
  // create wrapper function
 var wrapper = Module.wrap(content);
// ....
複製代碼

大體邏輯是:github

在執行文件內容的頭部添加 '(function (exports, require, module, __filename, __dirname) { 'api

在執行文件內容尾部添加 '\n});'app

以後的解析就是把字符串轉爲代碼(函數)供來調用。函數

備註

exports require module __filename __dirnameui

相關文章
相關標籤/搜索