NodeJS - "require" 函数的 LOAD_SELF_REFERENCE 如何工作?
NodeJS - How the LOAD_SELF_REFERENCE of the "require" function works?
根据 NodeJS docs,require
函数有一个名为 LOAD_SELF_REFERENCE
的加载阶段。它有以下伪代码:
LOAD_SELF_REFERENCE(X, START)
1. Find the closest package scope to START.
2. If no scope was found, return.
3. If the `package.json` has no "exports", return.
4. If the name in `package.json` isn't a prefix of X, throw "not found".
5. Otherwise, load the remainder of X relative to this package as if it was loaded via `LOAD_NODE_MODULES` with a name in `package.json`.
我假设此算法解析模块,这些模块与 "require" 调用者嵌套在同一个包内。例如,从 a/y.js
.
调用 require("a/x")
根据 (4.),如果 package.json
中的名称不是 X 的前缀,算法 应该抛出错误 。所以我假设以下代码和文件夹结构 应该崩溃 :
node_modules
|-a
|-package.json
|-a.js
|-b
|-package.json
|-b.js
|-x.js
其中:
node_modules/a/package.json
:
{
"name": "a",
"main": "./a",
"exports": {
".": "./a"
}
}
node_modules/a/a.js
:
require("b/x");
node_modules/b/package.json
:
{
"name": "b",
"main": "./b",
"exports": {
".": "./b",
"./x": "x"
}
}
但它以某种方式起作用。
这是文档中的错误吗?或者我错误地解释了伪代码?
请指教。谢谢。
看来这是一个specification bug.
根据 NodeJS docs,require
函数有一个名为 LOAD_SELF_REFERENCE
的加载阶段。它有以下伪代码:
LOAD_SELF_REFERENCE(X, START)
1. Find the closest package scope to START.
2. If no scope was found, return.
3. If the `package.json` has no "exports", return.
4. If the name in `package.json` isn't a prefix of X, throw "not found".
5. Otherwise, load the remainder of X relative to this package as if it was loaded via `LOAD_NODE_MODULES` with a name in `package.json`.
我假设此算法解析模块,这些模块与 "require" 调用者嵌套在同一个包内。例如,从 a/y.js
.
require("a/x")
根据 (4.),如果 package.json
中的名称不是 X 的前缀,算法 应该抛出错误 。所以我假设以下代码和文件夹结构 应该崩溃 :
node_modules
|-a
|-package.json
|-a.js
|-b
|-package.json
|-b.js
|-x.js
其中:
node_modules/a/package.json
:
{
"name": "a",
"main": "./a",
"exports": {
".": "./a"
}
}
node_modules/a/a.js
:
require("b/x");
node_modules/b/package.json
:
{
"name": "b",
"main": "./b",
"exports": {
".": "./b",
"./x": "x"
}
}
但它以某种方式起作用。 这是文档中的错误吗?或者我错误地解释了伪代码?
请指教。谢谢。
看来这是一个specification bug.