今天复习《Node.JS开发指南》发现有个小知识点我没有弄明白,我给前辈们截出来
模块与文件一一对应。文件不仅可以是JavaScript代码或二进制代码,还可以是一个文件夹。最简单的包,就是一个作为文件夹的模块。下面我们来看一个例子,建立一个叫做somepackage的文件夹,在其中创建index.js//somepackage/index.js
exports.hello=function(){
console.log('Hello.');
};
然后在somepackage之外建立getpackage.js,内容如下:
//getpackage.js
var somePackage=require('./somepackage');
somePackage.hello();
运行node getpackage.js,控制台将输出结果Hello。
为什么不是写作var somePackage=require(‘./somepackage/index’);呢?如果一个文件夹下面有一个文件(模块),那么引入这个文件夹就相当于引入了这个文件夹下的文件(模块)了吗?这样作有什么用意吗?
4 回复
因为我的理解是每个文件(模块)中都会有各自的exports对象作为暴露自身内容的接口,可是如果一个文件夹下有多个文件,那require这个文件夹获得的是哪个文件(模块)中的exports呢?还是说一个文件夹下只能放一个文件(模块)呢?这样就没有冲突了
首先一个文件夹下面可以有任意个文件(module),你可以通过相应的路径来引用这些module,路径指定的是哪个module,引用的就是哪个module。而如果没有指定module名,默认会去找index。
一般可重用的第三方包会提供一个index module作为整个包的统一入口。比如你写了一个包myPackage,在包的根目录下有两个模块:module1, module2, 那么index.js可以这样写:
exports.module1 = require('./module1');
exports.moduel2 = require('./moduel2');
将index作为入口,将你想要公开的接口exports出来,当然,用户还是可以直接require你的内部module,只是大家一般不这么做。
具体的module机制,请仔细阅读官方文档: http://nodejs.org/api/modules.html