模块(Module)和包(Package)

在浏览器 JavaScript 中,脚本模块的拆分和组合通常使用 HTML 的script 标签来实现。Node.js 提供了 require 函数来调用其他模块,而且模块都是基于文件的。

Node.js 的模块和包机制的实现参照了 CommonJS 的标准,但并未完全遵循。不过两者的区别并不大,一般来说你大可不必担心,只有当你试图制作一个除了支持 Node.js之外还要支持其他平台的模块或包的时候才需要仔细研究。

模块是 Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个Node.js 文件就是一个模块,这个文件可能是 JavaScript 代码、JSON 或者编译过的 C/C++ 扩展。

1.创建模块

Node.js 提供了 exports 和 require 两个对

象,其中 exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获

取模块的 exports 对象。

//module.js创建模块
var name;
exports.setName=function(thyName){
	name = thyName;
}

exports.sayHello=function(){
	console.error("hello "+name);
}


//getmodule.js使用模块
var myModule = require("./module");
myModule.setName("流浪鱼");
myModule.sayHello();

 在以上示例中,module.js 通过 exports 对象把 setName 和 sayHello 作为模块的访

问接口,在 getmodule.js 中通过 require('./module') 加载这个模块,然后就可以直接访

问 module.js 中 exports 对象的成员函数了。

 创建包

 Node.js 的包是一个目录,其中包含一个 JSON 格式的包说明文件 package.json。严格符

合 CommonJS 规范的包应该具备以下特征:

 package.json 必须在包的顶层目录下;

 二进制文件应该在 bin 目录下;

 JavaScript 代码应该在 lib 目录下;

 文档应该在 doc 目录下;

 单元测试应该在 test 目录下。

Node.js 对包的要求并没有这么严格,只要顶层目录下有 package.json,并符合一些规范

即可。当然为了提高兼容性,我们还是建议你在制作包的时候,严格遵守 CommonJS 规范。

//somepackage/index.js
exports.hello=function(){
	console.log("Hello");
}

//getpackage.js
var somepackage = require("./somepackage");
somepackage.hello();

 

package.json 是 CommonJS 规定的用来描述包的文件,完全符合规范的 package.json 文

件应该含有以下字段。

 name:包的名称,必须是唯一的,由小写英文字母、数字和下划线组成,不能包含

空格。

 description:包的简要说明。

 version:符合语义化版本识别①规范的版本字符串。

 keywords:关键字数组,通常用于搜索。

 maintainers:维护者数组,每个元素要包含 name、email (可选)、web (可选)

字段。

 contributors:贡献者数组,格式与maintainers相同。包的作者应该是贡献者

数组的第一个元素。

 bugs:提交bug的地址,可以是网址或者电子邮件地址。

 licenses:许可证数组,每个元素要包含 type (许可证的名称)和 url (链接到

许可证文本的地址)字段。

repositories:仓库托管地址数组,每个元素要包含 type (仓库的类型,如 git )、

url (仓库的地址)和 path (相对于仓库的路径,可选)字段。

dependencies:包的依赖,一个关联数组,由包名称和版本号组成。

 下面是一个完全符合 CommonJS 规范的 package.json 示例:

 

{
"name": "mypackage",
"description": "Sample package for CommonJS. This package demonstrates the required
elements of a CommonJS package.",
"version": "0.7.0",
"keywords": [
"package",
"example"
],
"maintainers": [
{
"name": "Bill Smith",
"email": "bills@example.com",
}
],
"contributors": [
{
"name": "BYVoid",
"web": "http://www.byvoid.com/"
}
],
"bugs": {
"mail": "dev@example.com",
"web": "http://www.example.com/bugs"
},
"licenses": [
{
"type": "GPLv2",
"url": "http://www.example.org/licenses/gpl.html"
}
],
"repositories": [
{
"type": "git",
"url": "http://github.com/BYVoid/mypackage.git"
}
],
"dependencies": {
"webkit": "1.2",
"ssl": {
"gnutls": ["1.0", "2.0"],
"openssl": "0.9.8"
}
}
}