一、模块路径解析规则
1.1 内置模块
内置模块。使用
require("fs");
1.2 node_modules目录
这个目录是用来存放模块的。例如某个模块的绝对路径是/home/user/hello.js,在该模块中使用require(‘foo/bar’)方式加载模块时,则NodeJS依次尝试使用以下路径。
/home/user/node_modules/foo/bar
/home/node_modules/foo/bar
/node_modules/foo/bar
NODE_PATH环境变量
用于指定NodeJs额外的模块搜索路径。linux下用:
分隔,windows下使用;
分隔。例如定义了以下NODE_PATH环境变量:
NODE_PATH=/home/user/lib:/home/lib
当使用require(‘foo/bar’)的方式加载模块时,则NodeJS依次尝试以下路径。
/home/user/lib/foo/bar
/home/lib/foo/bar
二、包
2.1 index.js
我们可以把由多个子模块组成的大模块称做包,并把所有子模块放在同一个目录里。
- /home/user/lib/
- cat/
head.js
body.js
main.js
require(’/home/user/lib/cat/main’)
就能达到目的。如果把main.js
改为index.js
可以像下面那样写。
// 感觉整个目录被当做单个模块使用
var cat = require('/home/user/lib/cat');
var cat = require('/home/user/lib/cat/index');
2.2 package.json
如果想自定义入口模块的文件名和存放位置,就需要在包目录下包含一个package.json文件,并在其中指定入口模块的路径。如路径
- /home/user/lib/
- cat/
+ doc/
- lib/
head.js
body.js
main.js
+ tests/
package.json
它的package.json可以这么写。
{
"name": "cat",
"main": "./lib/main.js"
}
这样,就可以通过下面语句获取模块了。
var cat = require('/home/user/lib/cat');
三、工程目录
一个命令行程序为例,一般我们会同时提供命令行模式和API模式两种使用方式,并且我们会借助三方包来编写代码。除了代码外,一个完整的程序也应该有自己的文档和测试用例。因此,一个标准的工程目录都看起来像下边这样。
- /home/user/workspace/node-echo/ # 工程目录
- bin/ # 存放命令行相关代码
node-echo
+ doc/ # 存放文档
- lib/ # 存放API相关代码
echo.js
- node_modules/ # 存放三方包
+ argv/
+ tests/ # 存放测试用例
package.json # 元数据文件
README.md # 说明文件
记录命令行程序
地址
四、NPM
npm的应用场景。
- 允许用户从NPM服务器下载别人编写的三方包到本地使用。
- 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
- 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。