node文档:https://nodejs.org/api/modules.html#modules_folders_as_modules
以下是从Node文档中摘要出来的。
文件模块
如果没有找到确切的文件名,然后Node.js的将尝试与添加的扩展加载所需的文件名:.js
,.json
,和最后 .node
。
.js
文件被解释为JavaScript文本文件,并且.json
文件被解析为JSON文本文件。.node
文件被解释为加载了的编译插件模块process.dlopen()
。
前缀'/'
为的必需模块是文件的绝对路径。例如,require('/home/marco/foo.js')
将在加载文件 /home/marco/foo.js
。
前缀'./'
为的必需模块是相对于文件调用的 require()
。也就是说,circle.js
必须在同一目录下foo.js
的 require('./circle')
找到它。
如果没有前导'/'
,'./'
或'../'
指示文件,则该模块必须是核心模块或从node_modules
文件夹加载。
如果给定的路径不存在,require()
则将抛出Error
,其 code
属性设置为'MODULE_NOT_FOUND'
。
文件夹作为模块
将程序和库组织到独立的目录中,然后为这些目录提供单个入口点是很方便的。可以通过三种方式将文件夹require()
作为参数传递给该文件夹。
第一种是package.json
在文件夹的根目录中创建一个文件,该文件指定一个main
模块。示例package.json
文件可能如下所示:
{ "name" : "some-library",
"main" : "./lib/some-library.js" }
如果这是在的文件夹中./some-library
, require('./some-library')
则将尝试加载 ./some-library/lib/some-library.js
。
这就是对package.json
Node.js中文件的了解程度。
如果package.json
目录中没有文件,或者 "main"
条目丢失或无法解析,则Node.js将尝试从该目录中加载index.js
或index.node
文件。例如,如果package.json
上没有定义main,那么require('./some-library')
则将尝试加载:
./some-library/index.js
./some-library/index.node
如果这些尝试失败,那么Node.js将报告整个模块丢失,并显示默认错误:
Error: Cannot find module 'some-library'
从node_modules
文件夹加载
如果传递给的模块标识符require()
不是 核心模块,并且不是以'/'
,'../'
或 开头'./'
,则Node.js从当前模块的父目录开始,然后添加/node_modules
,并尝试从该位置加载该模块。Node.js不会追加node_modules
到已经以结尾的路径中 node_modules
。
如果在该位置找不到文件,则将其移动到父目录,依此类推,直到到达文件系统的根目录为止。
例如,如果在文件'/home/ry/projects/foo.js'
叫 require('bar.js')
,然后Node.js的会看在以下位置,顺序如下:
/home/ry/projects/node_modules/bar.js
/home/ry/node_modules/bar.js
/home/node_modules/bar.js
/node_modules/bar.js
这使程序可以本地化其依赖项,以便它们不会发生冲突。
通过在模块名称后包含路径后缀,可以要求随模块一起分发的特定文件或子模块。例如, require('example-module/path/to/file')
将path/to/file
相对于所处example-module
位置进行解析。后缀路径遵循相同的模块解析语义。
从全局文件夹加载
如果将NODE_PATH
环境变量设置为以冒号分隔的绝对路径列表,则Node.js将在这些路径中搜索模块(如果未在其他位置找到)。
在Windows上,NODE_PATH
用分号(;
)代替冒号定界。
NODE_PATH
最初是为了在定义当前模块解析算法之前支持从不同路径加载模块而创建的。
NODE_PATH
仍然受支持,但由于Node.js生态系统已经确定了用于定位依赖模块的约定,因此不再需要此功能。有时,NODE_PATH
当人们不知道NODE_PATH
必须设置时,依赖于部署的部署会表现出令人惊讶的行为。有时,模块的依存关系会发生变化,从而导致在NODE_PATH
搜索时会加载不同的版本(甚至是不同的模块)。
此外,Node.js将在以下GLOBAL_FOLDERS列表中进行搜索:
- 1:
$HOME/.node_modules
- 2:
$HOME/.node_libraries
- 3:
$PREFIX/lib/node
$HOME
用户的主目录在哪里,$PREFIX
Node.js是否已配置node_prefix
。
这些主要是出于历史原因。
强烈建议将依赖项放在本地node_modules
文件夹中。这些将更快,更可靠地加载。
示例解析
在vue项目某个xxx.js文件中,比如要导入另外的js文件explore出来的变量: // src/main.js import store from './store' // 第一次查找 去上级目录下查找 store.js 或者 store.node 如果有就导入,结束。 // 如果上一步没有找到 检查是否有 store 文件夹,如果没有就导入失败,抛出异常,结束。 // 如果有 store 文件夹 就在 store 文件夹下寻找 package.json 文件,如果有 package.json 则按照 package.json 的配置来导入,结束。 // 如果没有 package.json 就在 store 文件夹下寻找 index.js 或者 index.node 如果有就导入,没有就导入失败,结束。