Node.js 模块系统
Node.js使用基于模块系统的文件。每个文件就是它自己的模块。每个文件都可以使用 module 变量访问当前模块定义。当前模块的导出由 module.exports 变量确定。要导入模块,请使用全局变量的require函数。
例子
以下代码在文件 myData.js
中创建一个函数,以便在应用程序的各个部分重复使用。要从位于c:/intro/base/myData.js中的文件导出函数,我们只需将其分配给module.exports。
module.exports = function () {
console.log("a function in file myData");
};
为了从文件c:/intro/base/myValue.js使用此函数,使用全局 require
函数导入myData,并将返回的值存储在局部变量中。
var myData = require("./myData");
myData(); // logs out : "a function in file myData"
module.export
Node.js中的每个文件都是一个模块。要从模块导出的项目应该附加到module.exports变量。module.exports被定义为每个文件中的一个新的空对象。module.exports = {}是隐式存在。
默认情况下,每个模块导出一个空对象, {}
。
console.log(module.exports); // {}
导出别名
我们可以从模块中导出多个变量。实现这一点的一种方法是创建一个新的对象字面量并将其分配给module.exports。在c:/intro/exports/myData1.js我们有:
var a = function () {
console.log("a called");
};
var b = function () {
console.log("b called");
};
module.exports = {
a: a,
b: b
};
在c:/intro/exports/myData2.js我们有:
module.exports.a = function () {
console.log("a called");
};
module.exports.b = function () {
console.log("b called");
};
Node.js帮助我们为module.export创建一个名为exports
的别名,而不是每次都键入module.exports.something
,你可以简单地使用exports.something。
在c:/intro/exports/myData3.js我们有
exports.a = function () {
console.log("a called");
};
exports.b = function () {
console.log("b called");
};
exports
就像任何其他的JavaScript变量一样。Node.js只是export = module.exports。如果我们添加一些东西,例如,添加myData到exports,也就是exports.myData = 123,因为JavaScript变量是引用,我们可以有效地实现module.exports.myData = 123。以下代码显示,所有这些方法从消费(导入)角度来看是等效的。
在c:/intro/exports/app.js我们有
var myData1 = require("./myData1");
myData1.a();
myData1.b();
var myData2 = require("./myData2");
myData2.a();
myData2.b();
var myData3 = require("./myData3");
myData3.a();
myData3.b();
模块的最佳实践
不要使用.js扩展名
最好是做require('./myData')而不是require('./myData.js'),即使两者对Node.js都很好。
相对路径
当使用基于文件的模块时,你需要使用相对路径(换句话说,做require('./myData')而不是require('myData'))。
利用exports
当你想要导出多个事物时,尝试并使用exports alias。
以下代码显示如何创建本地变量并导出
var myData = exports.myData = /* whatever you want to export as `myData` from this module */ ;
导出整个文件夹
如果有太多你持续导入到其他文件的模块在一起,尽量避免重复导入。
var myData = require("../something/myData");
var myValue = require("../something/myValue");
var another = require("../something/another");
var third = require("../something/third");
相反,在something文件夹中创建一个单独的index.js。在index.js中,导入所有模块一次,然后从此模块导出它们。
在c:/yourFolder/index.js我们有
exports.myData = require("./myData");
exports.myValue = require("./myValue");
exports.another = require("./another");
exports.third = require("./third");
现在你可以在每当你需要所有这些时简单地导入这个index.js:
var something = require("../something/index");