标签:style blog http color io 使用 ar java for
稳定性:5 - 锁定
1 var circle = require(‘./circle.js‘); 2 console.log(‘The area of a circle of radius 4 is ‘ 3 + circle.area(4));
circle.js 的内容如下:
1 var PI = Math.PI; 2 3 exports.area = function(r) { 4 return PI * r * r; 5 }; 6 7 exports.circumference = function(r) { 8 return 2 * PI * r; 9 };
模块 circle.js 导出了函数 area() 和 circumference()。想把函数和对象添加到你的模块的根节点,你可以把它们添加到特殊的 exports 对象中。
模块的局部变量是私有的,好像模块被一个函数包裹起来一样。在这个例子里面,变量 PI 是 circle.js 私有的。
如果你想你的模块的导出的根节点是一个函数(例如是一个构造函数)或者如果你想在一次指派就能导出一个完整的对象而不是每次都新建一个属性,把它指派到 module.exports 而不是 exports 中。
在下面,bar.js 使用了一个导出一个构造函数的 square 模块:
1 var square = require(‘./square.js‘); 2 var mySquare = square(2); 3 console.log(‘The area of my square is ‘ + mySquare.area());
square 模块定义在 square.js 中:
1 // assigning to exports will not modify module, must use module.exports 2 module.exports = function(width) { 3 return { 4 area: function() { 5 return width * width; 6 } 7 }; 8 }
模块系统的实现在 require("module") 模块中。
1 console.log(‘a starting‘); 2 exports.done = false; 3 var b = require(‘./b.js‘); 4 console.log(‘in a, b.done = %j‘, b.done); 5 exports.done = true; 6 console.log(‘a done‘);
b.js :
1 console.log(‘b starting‘); 2 exports.done = false; 3 var a = require(‘./a.js‘); 4 console.log(‘in b, a.done = %j‘, a.done); 5 exports.done = true; 6 console.log(‘b done‘);
main.js :
1 console.log(‘main starting‘); 2 var a = require(‘./a.js‘); 3 var b = require(‘./b.js‘); 4 console.log(‘in main, a.done=%j, b.done=%j‘, a.done, b.done);
当 main.js 加载 a.js,然后 a.js 转而加载 b.js。在此时,b.js 师徒加载 a.js。为了防止无限的循环,a.js 的 exports 对象的一个未完成的拷贝返回给 b.js 模块。然后 b.js 完成加载,并将它的 exports 对象提供给 a.js 模块。
当 main.js 加载完所有的模块时,这些模块都完成了完整的加载。程序的输出因此将是:
$ node main.js main starting a starting b starting in b, a.done = false b done in a, b.done = true a done in main, a.done= true, b.done=true
如果你在你的程序中有模块的循环依赖,确保有依据地组织。
1 { "name": "some-library", 2 "main": "./lib/some-library.js" }
如果 package.json 文件在 ./some-library 文件夹中,那么 require(‘./some-library‘) 将会尝试加载 ./some-library/lib/some-library.js。
这是 Node 能感知 package.json 文件的程度。
如果在文件夹中没有 package.json 文件,那么 node 将尝试加载 index.js 或 index.node 文件。例如,如果在上述例子中没有 package.json 文件,那么 require(‘./some-library‘) 将尝试加载:
1 var EventEmitter = require(‘events‘).EventEmitter; 2 3 module.exports = new EventEmitter(); 4 5 // Do some work, and after some time emit 6 // the ‘ready‘ event from the module itself. 7 setTimeout(function() { 8 module.exports.emit(‘ready‘); 9 }, 1000);
然后在另外一个文件我们可以
1 var a = require(‘./a‘); 2 a.on(‘ready‘, function() { 3 console.log(‘module a is ready‘); 4 });
注意给 module.exports 赋值立即完成,不能在回调函数中完成。下面的方式不会正常工作:
x.js:
1 setTimeout(function() { 2 module.exports = {a: "hello" }; 3 }, 0);
y.js
1 var x = require(‘./x‘); 2 console.log(x.a);
1 function require(...) { 2 // ... 3 function(module, exports) { 4 // Your module code here 5 exports = some_func; // re-assigns exports, exports is no longer 6 // a shortcut, and nothing is exported. 7 module.exports = some_func; // makes your module exports 0 8 } (module, module.exports); 9 return module; 10 }
作为参考,如果 exports 和module.exports 之间的关系对你来说想变魔术一样,忽略 exports 只使用 module.exports。
● id 字符串
● 返回值: 对象 解析出来的模块的 module.exports
module.require 方法提供一个加载模块的途径使得就好像 require() 是在原始的模块被调用的一样。
注意为了这样做,你必须得到一个 module 对象的引用。由于 require() 返回 module.exports,且 module 通常只能在特定的模块代码里被访问,因此为了使用它必须明确地导出。
● 字符串
模块的模块标识。典型地这是绝对路径文件名。
require(X) from module at path Y 1. If X is a core module, a. return the core module b. STOP 2. If X begins with ‘./‘ or ‘/‘ or ‘../‘ a. LOAD_AS_FILE(Y + X) b. LOAD_AS_DIRECTORY(Y + X) 3. LOAD_NODE_MODULES(X, direname(Y)) 4. THROW "not found" LOAD_AS_FILE(X) 1. If X is a file, load X as JavaScript text. STOP 2. If X.js is a file, load X.js as JavaScript text. STOP 3. If X.json is a file, parse X.json to a JavaScript Object. STOP 4. If X.node is a file, load X.node as binary addon. STOP LOAD_AS_DIRECTORY(X) 1. If X/package.json is a file a. Parse X/package.json, and look for "main" field. b. let M = X + (json main field) c. LOAD_AS_FILE(M) 2. If X/index.js is a file, load X/index.js as JavaScript text. STOP 3. If X/index.node is a file, load X/index.node as binary addon. STOP LOAD_NODE_MODULES(X, START) 1. let DIRS=NODE_MODULES_PATHS(START) 2. for each DIR in DIRS: a. LOAD_AS_FILE(DIR/X) b. LOAD_AS_DIRECTORY(DIR/X) NODE_MODULES_PATHS(START) 1. let PARTS = path split(START) 2. let ROOT = index of first instance of "node_modules" in PARTS, or 0 3. let I = count of PARTS -1 4. let DIRS = [] 5. while I > ROOT a. if PARTS[I] = "node_modules" CONTINUE b. DIR = path join(PARTS[0 .. I] + "node_modules") c. let I = I - 1 6. return DIRS
1 require.main === module
对应文件 foo.js,如果通过 node foo.js 运行该值将是 true,但如果通过 require(‘./foo‘) 运行给支将是 false。
因为 module 提供了一个 filename 属性(通常和 __filename相等),当前应用程序的入口点可以通过检查 require.main.filename 得到。
标签:style blog http color io 使用 ar java for
原文地址:http://www.cnblogs.com/gvgarven/p/4009629.html