概要:本篇博客主要介绍了node.js中的包

  包是在模块基础上更深一步的抽象,Node.js的包类似于C/C++的库函数或者Java/.Net的类库。它将某个独立的功能封装起来,用于发布、更新、依赖管理和版本控制。Node.js的包是一个目录,其中包含一个JSON格式的包说明文件package.json。严格符合CommonJS规范的包应该具备以下特征:

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

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

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

  ● 文档应该在doc目录下;

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

1.作为文件夹的模块

  模块与文件是一一对应的。文件不仅可以是JavaScript代码或二进制代码,还可以是一个文件夹。最简单的包,就是作为一个文件夹的模块。下面我们来看一个例子:建立一个叫somepackage的文件夹,在其中创建index.js,内容如下:

  1. exports.hello = function(){
  2. console.log('Hello');
  3. };

然后在somepackage之外建立getpackage.js,内容如下:

  1. var somepackage = require('./somepackage');
  2. somepackage.hello();

运行getpackage.js 控制台将输出结果:Hello.

  我们使用这种方法可以把文件夹封装为一个模块,即所谓的包。通过定制package.json,我们可以创建更复杂、更完善、更符合规范的包:

在前面例子中的somepackage文件夹下,我们创建一个叫做package.json的文件,内容如下所示:

  1. {
  2. "main" : "./lib/interface.js"
  3. }

然后将index.js重命名为interface.js并放入lib子文件夹下。以同样的方式再次调用这个包,依然可以正常使用。

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

  完全符合规范的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示例:

  1. {
  2. "name": "mypackage",
  3. "description": "Sample package for CommonJS. This package demonstrates the required
  4. elements of a CommonJS package.",
  5. "version": "0.7.0",
  6. "keywords": [
  7. "package",
  8. "example"
  9. ],
  10. "maintainers": [
  11. {
  12. "name": "Bill Smith",
  13. "email": "bills@example.com",
  14. }
  15. ],
  16. "contributors": [
  17. {
  18. "name": "BYVoid",
  19. "web": "http://www.byvoid.com/"
  20. }
  21. ],
  22. "bugs": {
  23. "mail": "dev@example.com",
  24. "web": "http://www.example.com/bugs"
  25. },
  26. "licenses": [
  27. {
  28. "type": "GPLv2",
  29. "url": "http://www.example.org/licenses/gpl.html"
  30. }
  31. ],
  32. "repositories": [
  33. {
  34. "type": "git",
  35. "url": "http://github.com/BYVoid/mypackage.git"
  36. }
  37. ],
  38. "dependencies": {
  39. "webkit": "1.2",
  40. "ssl": {
  41. "gnutls": ["1.0", "2.0"],
  42. "openssl": "0.9.8"
  43. }
  44. }
  45. }

Node.js:包的更多相关文章

  1. Node.js包管理器Yarn的入门介绍与安装

    FAST, RELIABLE, AND SECURE DEPENDENCY MANAGEMENT. 就在昨天, Facebook 发布了新的 node.js 包管理器 Yarn 用以替代 npm .咱 ...

  2. Node.js包(JXcore)

    Node.js的代码是开放的,并准备好被复制像任何其他Javascript代码.但现在它不可能的了.JXcore 这是一个开源项目,引入了包装和源文件和其他资源加密成JX包一个独特的功能. 考虑大型项 ...

  3. Node.js包管理器:

    Node.js包管理器: 当我们要把某个包作为工程运行的一部分时,通过本地模式获取,如果要在命令行下使用,则使用全局模式安装 使用全局模式安装的包并不能直接在JavaScript文件中用require ...

  4. 9.Node.js 包管理器npm

    npm 是 Node.js  官方提供的包管理工具, 用于 Node.js包的发布.传播.依赖控制 安装 express ==> 流行的基于Node.js的Web开发框架,可以快速地搭建一个完整 ...

  5. 《Node.js 包教不包会》

    <Node.js 包教不包会> 为何写作此课程 在 CNode(https://cnodejs.org/) 混了那么久,解答了不少 Node.js 初学者们的问题.回头想想,那些问题所需要 ...

  6. Node.js包的依赖及版本号(转)

    原文:  http://www.cnphp6.com/archives/64130 Node.js最重要的一个文件就是package.json,其中的配置参数决定了功能.例如下面就是一个例子 { &q ...

  7. NPM Node.js 包管理

    1.NPM 简介 1.1 NPM Node.js® 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,可方便地构建快速,可扩展的网络应用程序的平台.Node.js 使用事件驱动, ...

  8. npm --- Node.js包管理器

    目录 1. 安装Node.js 2. 运行npm 3. npm介绍 3.1 安装插件 3.2 更新插件 3.3 卸载插件 3.4 查看当前目录中的插件列表 4. 使用cnpm 4.1 安装 npm( ...

  9. Node.js 包管理器 NPM 讲解

    包管理器又称软件包管理系统,它是在电脑中自动安装.配制.卸载和升级软件包的工具组合,在各种系统软件和应用软件的安装管理中均有广泛应用.对于我们业务开发也很受益,相同的东西不必重复去造轮子. 每个工具或 ...

  10. node.js 包教不包会 (Windows版详解)

    针对@alsotang 的新手入门教程 https://github.com/alsotang/node-lessons ,详解该教程在Windows中的实践,包括博主在实践过程中遇到的问题及解决方案 ...

随机推荐

  1. InnoDB的Named File Formats

    随着InnoDB存储引擎的发展,新的页数据结构有时用来支持新的功能特性.比如前面提到的InnoDB Plugin,提供了新的页数据结构来支持表压缩功能,完全溢出的(Off page)大变长字符类型字段 ...

  2. Selenium WebDriver多层表单切换

    [Java] 首先 测试网站frame结构为 -topframe: -centerframe: -leftframe: -mainframe: -bottomframe: 我当时遇到的问题是,首先在c ...

  3. typeJavaScript笔记----字符串,参数,函数,表达式,循环

    一.字符串新特性--双丿(撇)号声明字符串 .多行字符串 var myName = `fang my hao li jsk c sdf` //这样不会报错. .字符串模板 console.log(`q ...

  4. Tensorflow (1)

    'tf.placeholder' or 'tf.Variable' The difference is that with tf.Variable you have to provide an ini ...

  5. jQuery DOM 元素方法 - index() 方法

    元素的 index,相对于选择器 获得元素相对于选择器的 index 位置. 该元素可以通过 DOM 元素或 jQuery 选择器来指定. 语法 $(selector).index(element) ...

  6. Android中AlertDialog对话框禁止按[返回键]或[搜索键]

    alertDialog.setOnKeyListener(new DialogInterface.OnKeyListener() { @Override public boolean onKey(Di ...

  7. 算法系列——huffman编码

    哈夫曼编码,旨在对信息实现一种高效的编码,这种编码中任何一个都不是其他编码的前缀码.因此,在实际接收时,一旦匹配,就可以立即解码. 具体算法过程可以参加网上的很多教程. 给出一个自己的实现,一方面加强 ...

  8. HTTP 错误 403.14 - Forbidden的解决办法

    错误: HTTP 错误 403.14 - ForbiddenWeb 服务器被配置为不列出此目录的内容.   原因: 出现这个错误,是因为默认文档中没有增加index.aspx导致的. 解决方法: 打开 ...

  9. 更改系统相机UIImagePickerController导航栏的cancle为自定义按钮

    有时候需要对系统相册里面的取消按钮进行自定义,并获取点击事件做一些操作,那么你可以这样做. 第一:实现navigationController代理 - (void)navigationControll ...

  10. 1.webpack-----模块加载器兼打包工具

    一.webpack的优势 1. 能模块化 JS . 2. 开发便捷,能替代部分 grunt/gulp 的工作,比如打包.压缩混淆.图片转base64等. 3. 扩展性强,插件机制完善,特别是支持 Re ...