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

时间:2024-01-02 10:58:38

前言

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

包与NPM

第三方模块中,模块和模块之间是散列在各地的,互相之间不能直接引用。而在模块之外,包和NPM则是将模块联系起来的一种机制。

CommonJS的包规范定义其实也十分简单,它由包结构和包描述文件两个部分组成,前者用于组织包中的各种文件,后者用于描述包的相关信息,以供外部读取分析。

包结构

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

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

包描述文件与NPM

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

NPM常用功能

1.查看帮助

安装Node之后,执行npm -v可以查看当前NPM版本:

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

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

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

使用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');

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

从本地安装

对于一些没有发布到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文件:

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

注册包仓库帐号

执行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可以列出当前路径下能够通过模块路径找到的所有包,并生成依赖树:

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

局域NPM

NPM潜在问题

前后端共用模块