《深刻浅出Nodejs》笔记——模块机制(2)

前言

书上还有很大一部分讲了C/C++模块的编译过程、核心模块编写和C/C++扩展模块的内容,不过我对C++一窍不通所以没有仔细看,若是之后须要再自习看吧。javascript

包与NPM

第三方模块中,模块和模块之间是散列在各地的,互相之间不能直接引用。而在模块以外,包和NPM则是将模块联系起来的一种机制。
CommonJS的包规范定义其实也十分简单,它由包结构和包描述文件两个部分组成,前者用于组织包中的各类文件,后者用于描述包的相关信息,以供外部读取分析。java

包结构

包其实是一个存档文件,即一个目录直接打包为.zip或tar.gz格式的文件,安装后解压还原为目录,彻底符合CommonJS规范的包结构应该包含以下这些文件:node

  • package.json 包描述文件
  • bin 存放可执行二进制文件
  • lib 存放js代码
  • doc 存放文档
  • test 存放单元测试用例代码

包描述文件与NPM

包描述文件用于表达非代码相关的信息,它是一个JSON格式的文件——package.json,位于包的根目录下。文件中的字段就不放上来了(字太多了);npm

NPM经常使用功能

1.查看帮助

安装Node以后,执行npm -v能够查看当前NPM版本:
npm-vjson

执行NPM查看帮助引导说明:
npm后端

使用npm help <command>能够查看具体命令说明,执行命令后会在浏览器打开一个说明文档。浏览器

2.安装系统依赖包

安装系统依赖包是NPM最多见的用法,它的执行语句是npm install <packageName>。执行命令后Node会在当前目录下建立node_modules目录(若是当前目录下不存在这个目录),而后在node_modules中建立对应包名的目录,而后将压缩包解压到这个目录下。安装好依赖包后就能够经过require(<packageName>)来引入包。网络

全局模式安装

若是包中含有命令行工具,那么须要执行npm install <packageName> -g来进行全局模式安装。工具

全局模式这个称谓具备误导性,全局模式安装并非将一个模块包安装为一个全局包,它并不意味着能够从任何地方用require()引用到这个模块。它其实是将一个包安装位全局可用的可执行命令,它根据包描述文件中的bin字段配置,将实际脚本连接带与Node执行文件相同的路径下。单元测试

经过全局模式安装的包都被安装进了一个同一目录下,这个目录能够用以下方式推算出来:

path.resolve(process.execPath, '..', '..', 'lib', 'node_modules');

从本地安装

对于一些没有发布到NPM上或者由于网络缘由没下载的包,能够经过将包下载到本地,而后以本地安装。本地安装只需为NPM指明package.json文件所在的位置便可:它能够是一个包含package.json的存档文件,也能够是一个URL地址,也能够是一个目录下有package.json文件的目录位置:

npm install <tarball file>
npm install <tarball url>
npm install <folder>
从非官方源安装

若是不能经过官方源安装,能够经过镜像源安装。在执行命令时,添加--registry=http://registry.url便可,示例以下:

npm install underscore --registry=http://registry

能够指定默认源:

npm config set registry http://registry.url

3.NPM钩子命令

4.发布包

编写模块
//hello.js
exports.sayHello = function () {
    return 'Hello, world.';
}
初始化包描述文件

能够在包目录下使用npm init来生成package.json文件:

注册包仓库账号

执行npm adduser而后按顺序进行便可。

上传包

在package.json文件所在目录下,执行npm publish

安装包

执行npm install <packageName> --registry=https://registry.npmjs.org/

管理包权限
npm owner ls <packageName>
npm owner add <user> <packageName>
npm owner rm <user> <pacjageName>
分析包

npm ls能够列出当前路径下可以经过模块路径找到的全部包,并生成依赖树:

局域NPM

NPM潜在问题

先后端共用模块

相关文章
相关标签/搜索