node.js中的require()如何工作?

我试过这个:

// mod.js var a = 1; this.b = 2; exports.c = 3; // test.js var mod = require('./mod.js'); console.log(mod.a); // undefined console.log(mod.b); // 2 console.log(mod.c); // 3, so this === exports? 

所以我形象,要求()可能是这样实现的:

 var require = function (file) { var exports = {}; var run = function (file) { // include "file" here and run }; run.apply(exports, [file]); return exports; } 

是对的吗? 请帮我理解require(),或者我在哪里可以find源代码。 谢谢!

源代码在这里 。 exports / require不是关键字,而是全局variables。 你的主脚本是在一个包含所有全局variables的函数的开始之前被包装的 。

请注意,尽pipemodule.js本身使用require() ,但这是一个不同的require函数,它在名为“node.js”的文件中定义

上面的副作用:在模块中间(不属于任何函数)有“返回”语句是非常好的,有效地“注释”其余代码

Andrey展示了源代码,但是如果你也想知道如何使用它,那么简单的解释就在这里( http://nodejs.org/api/modules.html )。

这是我两个很好的例子。

 //foo.js, multiple methods var circle = require('./circle.js'); console.log( 'The area of a circle of radius 4 is ' + circle.area(4)); //circle.js var PI = Math.PI; exports.area = function (r) { return PI * r * r; }; exports.circumference = function (r) { return 2 * PI * r; }; //bar.js var square = require('./square.js'); var mySquare = square(2); console.log('The area of my square is ' + mySquare.area()); //square.js, single method module.exports = function(width) { return { area: function() { return width * width; } }; } 

我最喜欢的模式是

 (function (controller) { controller.init = function (app) { app.get("/", function (req, res) { res.render("index", {}); }); }; })(module.exports); 
 var mod = require('./mod.js'); 

require是一个函数,它接受一个名为path的参数,在这种情况下,path是./mod.js

当调用require时,会发生一系列的任务:

  1. 调用在lib / module.js中声明的Module.prototype.require函数,它声明path存在并且是一个string

  2. 调用Module._load ,这是lib / module.js中通过Module._resolveFilename(request, parent, isMain)parsing文件的函数,

  3. 调用Module._resolveFilename函数,并检查模块是否为本地模块(本机模块是由lib / internal / bootstrap_node.js中定义的NativeModule函数返回的),如果是则返回模块,否则检查模块的字符数parh(必须至less包含2个字符)和一些字符(path必须以./ Module._resolveLookupPaths )通过定义在lib / internal / bootstrap_node.js中的 Module._resolveLookupPaths函数
  4. 检查包含该文件的目录
  5. 如果path包含一个扩展(在我们的例子中是:mod.js), lib / path.js中定义的basename函数检查扩展是否为“ js
  6. 那么它会为在参数var module = new Module(filename, parent);给出的文件创build一个新的模块var module = new Module(filename, parent);
  7. 内容将通过在lib / internal / bootstrap_node.js中定义的函数NativeModule.prototype.compile通过v8进行编译
  8. 在lib / internal / bootstrap_node.js中定义的NativeModule.wrap需要编译mod.js的javascript内容并包装它:它将其包装在其他一些使所有这些工作成功的代码中。 所以你在mod.js写的代码被封装在一个函数expression式中。 这意味着您在节点中编写的所有内容都在V8中运行
  9. 一个module.exports是什么返回

源代码可以在这里下载: http : //nodejs.org/ exports / require是关键字,我不认为它们是直接用javascript编码的。 节点是用C ++编写的,javascript只是C ++核心的一个脚本。