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
以後的解析就是把字符串轉爲代碼(函數)供來調用。函數