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时,会发生一系列的任务:
-
调用在lib / module.js中声明的
Module.prototype.require
函数,它声明path存在并且是一个string -
调用
Module._load
,这是lib / module.js中通过Module._resolveFilename(request, parent, isMain)
parsing文件的函数, - 调用
Module._resolveFilename
函数,并检查模块是否为本地模块(本机模块是由lib / internal / bootstrap_node.js中定义的NativeModule
函数返回的),如果是则返回模块,否则检查模块的字符数parh(必须至less包含2个字符)和一些字符(path必须以./
Module._resolveLookupPaths
)通过定义在lib / internal / bootstrap_node.js中的Module._resolveLookupPaths
函数 - 检查包含该文件的目录
- 如果path包含一个扩展(在我们的例子中是:mod.js), lib / path.js中定义的basename函数检查扩展是否为“ js ”
- 那么它会为在参数
var module = new Module(filename, parent);
给出的文件创build一个新的模块var module = new Module(filename, parent);
- 内容将通过在lib / internal / bootstrap_node.js中定义的函数
NativeModule.prototype.compile
通过v8进行编译 - 在lib / internal / bootstrap_node.js中定义的
NativeModule.wrap
需要编译mod.js
的javascript内容并包装它:它将其包装在其他一些使所有这些工作成功的代码中。 所以你在mod.js
写的代码被封装在一个函数expression式中。 这意味着您在节点中编写的所有内容都在V8中运行 - 一个module.exports是什么返回
源代码可以在这里下载: http : //nodejs.org/ exports / require是关键字,我不认为它们是直接用javascript编码的。 节点是用C ++编写的,javascript只是C ++核心的一个脚本。