• node.js 模块和包


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

     模块是 Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个Node.js 文件就是一个模块,这个文件可能是 JavaScript 代码、JSON 或者编译过的 C/C++ 扩展。在前面章节的例子中,我们曾经用到了 var http = require('http'),其中 http是 Node.js 的一个核心模块,其内部是用 C++ 实现的,外部用 JavaScript 封装。我们通过require 函数获取了这个模块,然后才能使用其中的对象。require 函数获取了这个模块,然后才能使用其中的对象。

    创建包

    包是在模块基础上更深一步的抽象,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相同。包的作者应该是贡献者
    数组的第一个元素。
     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"
    }
    }
    }
  • 相关阅读:
    再次或多次格式化导致namenode的ClusterID和datanode的ClusterID之间不一致的问题解决办法
    Linux安装aria2
    POJ 3335 Rotating Scoreboard 半平面交
    hdu 1540 Tunnel Warfare 线段树 区间合并
    hdu 3397 Sequence operation 线段树 区间更新 区间合并
    hud 3308 LCIS 线段树 区间合并
    POJ 3667 Hotel 线段树 区间合并
    POJ 2528 Mayor's posters 贴海报 线段树 区间更新
    POJ 2299 Ultra-QuickSort 求逆序数 线段树或树状数组 离散化
    POJ 3468 A Simple Problem with Integers 线段树成段更新
  • 原文地址:https://www.cnblogs.com/youxin/p/3956952.html
Copyright © 2020-2023  润新知