以下几篇文档比较重要:
CommonJS module spec
CommonJS package spec
npm install
node package.json
node module reference
node实现了CommonJS的模块规范和包结构规范
模块规范(module spec)主要是定义不同模块间require,exports,module等API
包结构规范(package spec)主要是定义目录结构,以及package.json的格式。另外node在package.json中还扩展了一些自定义的字段,其中最重要的就是main,后面会提到,当require一个目录时,该字段描述了哪个js文件作为入口
实际上,即使不遵循包结构规范,比如没有package.json,js文件之间相互引用也是可以的,比如:
这里只有一个单独的calculator.js,显然谈不上什么包结构,但是这个模块也完全可以被其他模块引用
var cal = require("c:/calculator"); var sum = cal.add(1, 2); console.log(sum);
但是,如果想要方便地管理模块,或者提供给别人使用,那么就需要遵循包结构规范。同时node也提供了npm来管理node module
一个典型的node module,通常是一个单独的目录,放在node_modules下。目录下有lib,bin等子目录,以及package.json描述文件,比如:
package.json是核心,其中描述了该模块的入口,模块依赖的模块等。用npm install命令,可以自动读取分析package.json中描述的依赖,并安装到本地仓库(放在node_modules下)
安装模块通常有3种情况
典型的比如grunt-cli,使用npm install -g xxx命令。有些公用的模块,后续需要用命令行来执行的,一般用这种方式安装
这种不需要在命令行参数里指定目标module name,只要执行npm install,就会读取并分析package.json中声明的依赖,然后下载安装
如下目录
在test_npm中,是这样引用test模块的:
var test = require("test");
其实除非是为了将自己开发的模块发布到npm registry或是npm source上,一般没必要安装本地模块,因为可以通过相对路径或者绝对路径加载到
这个特别重要,要详细看这篇文档:node module reference
大致上有3种情况:
require("http");
require("mongo"); require("mysql"); require("express");
require("./abc"); require("../def"); require("/ghi");