从Node.js看模块与包(二)

在一中已经对模块及模块的创建进行了解释,这里对创建包进行相关分析:

首先包是在模块基础上更深一步的抽象,Node.js 的包类似于 C/C++ 的函数库或者 Java/.Net
的类库。它将某个独立的功能封装起来,用于发布、更新、依赖管理和版本控制。Node.js 根
据 CommonJS 规范实现了包机制,开发了 npm来解决包的发布和获取需求。
Node.js 的包是一个目录,其中包含一个 JSON 格式的包说明文件 package.json。严格符
合 CommonJS 规范的包应该具备以下特征:
  •  package.json 必须在包的顶层目录下;
  • 二进制文件应该在 bin 目录下;
  •  JavaScript 代码应该在 lib 目录下;
  • 文档应该在 doc 目录下;
  • 单元测试应该在 test 目录下。
Node.js 对包的要求并没有这么严格,只要顶层目录下有 package.json,并符合一些规范

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


1. 作为文件夹的模块
模块与文件是一一对应的。文件不仅可以是 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.。
我们使用这种方法可以把文件夹封装为一个模块,即所谓的包。 包通常是一些模块的集
,在模块的基础上提供了更高层的抽象,相当于提供了一些固定接口的函数库。通过定制

package.json,我们可以创建更复杂、更完善、更符合规范的包用于发布。


2. package.json
在前面例子中的 somepackage 文件夹下,我们创建一个叫做 package.json 的文件,内容如
下所示:
{
"main" : "./lib/interface.js"
}
然后将 index.js 重命名为 interface.js 并放入 lib 子文件夹下。以同样的方式再次调用这个

包,依然可以正常使用。


Node.js 在调用某个包时,会首先检查包中 package.json 文件的 main 字段,将其作为
包的接口模块,如果 package.json 或 main 字段不存在,会尝试寻找 index.js 或 index.node 作

为包的接口。


package.json 是 CommonJS 规定的用来描述包的文件,完全符合规范的 package.json 文
件应该含有以下字段。
  • name:包的名称,必须是唯一的,由小写英文字母、数字和下划线组成,不能包含空格。
  •  description:包的简要说明。
  •  version:符合语义化版本识别①规范的版本字符串。
  • keywords:关键字数组,通常用于搜索。
  •  maintainers:维护者数组,每个元素要包含 name、email (可选)、web (可选)字段。
  •  contributors:贡献者数组,格式与maintainers相同。包的作者应该是贡献者数组的第一个元素。
  •  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": "[email protected]",
}
],
"contributors": [
{
"name": "BYVoid",
"web": "http://www.byvoid.com/"
}
],
"bugs": {
"mail": "[email protected]",
"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"
}
}
}




猜你喜欢

转载自blog.csdn.net/Scrat_Kong/article/details/79150685
今日推荐