zoukankan      html  css  js  c++  java
  • 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"
    }
    }
    }
  • 相关阅读:
    Spring中内置的一些工具类
    那些年遇到过的面试题
    ThreadPoolExecutor策略配置以及应用场景
    程序员如何谈加薪?
    日常工作中该注意哪些点?
    aarch64的系统上执行armhf程序
    挂载镜像
    pycharm折叠代码
    暴力破解分类
    weblogic常见漏洞
  • 原文地址:https://www.cnblogs.com/youxin/p/3956952.html
Copyright © 2011-2022 走看看