最近项目开发中发现同事使用了一个环境变量
NODE_PATH
,觉得很是神奇,于是便趁机学习了一波。
其实,NODE_PATH
就是一个环境变量啦,只不过,Node
在加载模块的时候会去读取这个环境变量:
node模块加载
node
模块加载主要是依靠于require
,require
做的工作就是去加载我们需要的模块:
- 如果是相对路径,那么就解析成绝对路径去加载,如果内存(
require.cache
)中已有那么就直接读取内存,否则加载文件。 - 如果是绝对路径,更简单了,就是第一中情况中的绝对路径去加载。
- 如果是类似
require('XXX')
,那么,require
就会从当前目录的node_modules
开始寻找,找不到就到父层级,一直到最后。最后再到全局安装的目录去寻找。如果都没有,这个时候就会使用我们的NODE_PATH
了。
NODE_PATH的使用
如图所示,一共定义了三个文件
- package.json
- index.js
- app/test.js
文件内容分别如下:
package.json
{
"name": "node_path_test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "NODE_PATH=app node index.js"
},
"author": "",
"license": "ISC"
}
index.js
require('test');
app/test.js
console.log('i am test');
打开终端执行npm run start
定义多个NODE_PATH
前面我们讲过,NODE_PATH其实是一个环境变量,这个环境变量是我们可以指定的,如果直接按照上面的去做,系统中的环境变量其实是会被替换掉的。
比如这个时候,我增加了一个新的目录 dd/haha.js
,我可以把它添加到NODE_PATH中
,
package.json
{
"name": "node_path_test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "NODE_PATH=app:dd:$NODE_PATH node index.js"
},
"author": "",
"license": "ISC"
}
这个时候我在其他地方就可以使用require('haha')
去引用dd/haha.js
文件了。
这里加上了$NODE_PATH
是为了不覆盖环境变量中的NODE_PATH
。
加载顺序
当然是以第一个找到的为准啦。