>背景:
假设我的文件夹结构是这样的:
project/
-- package.json
-- index.mjs
-- lib/
-- config/
-- index.mjs
当我在节点中本机使用require()
时,我可以使用裸导入引用本地模块,例如:
const x = require('config')
因为我将库文件夹的根目录添加到NODE_PATH
环境变量中。(当然,假设当我使用 cjs/require 时,扩展名会.js
(
问题:
当我尝试使用本机 es6 模块 (mjs( 执行此操作时,如下所示:
import x from 'config'
我收到错误:
Error [ERR_MODULE_RESOLUTION_LEGACY]: config not found by import in [SOME_ABS_PATH]/index.mjs. Legacy behavior in require() would have found it at [SOME_ABS_PATH]/lib/config/index.mjs
问题:
有人知道如何解决这个问题吗?或者,在节点原生 es6 模块系统中处理本地模块解析的相对路径的未来是什么?
迄今为止的研究:
到目前为止,我找到的唯一资源来自这里 http://2ality.com/2017/09/native-esm-node.html 说明:
路径解析的工作方式略有不同:ESM 不支持 NODE_PATH 和 require.extensions。它的说明符始终是 URL 也会导致一些细微的差异。
在下面的错误消息中ERR_MODULE_RESOLUTION_LEGACY
- 谷歌实际上什么也没显示。
好的,所以一位同事(感谢@robin-balmforth(给了我答案:
从 https://nodejs.org/api/esm.html#esm_no_node_path 它说:
导入和不需要NODE_PATH NODE_PATH之间的显着差异 不是解析导入说明符的一部分。请使用符号链接,如果 此行为是必需的。
从更规范的东西:
https://github.com/bmeck/node-eps/blob/es6-module/002-es6-modules.md#521-removal-of-non-local-dependencies 说:
导入语句不支持以下所有内容:
$NODE_PATH $HOME/.node_modules $HOME/.node_libraries $PREFIX/lib/node 根据需要使用本地依赖项和符号链接。
因此,我必须设置一个符号链接,而不是设置NODE_PATH环境变量,例如:
ln -s ../lib node_modules/lib
似乎工作得很好耶。
我们假设原因是为了与 es6 模块的浏览器实现兼容?
在这个node-eps问题中,有一些关于此更改背后的原因的讨论 https://github.com/bmeck https://github.com/nodejs/node-eps/issues/11 例如:
解决方案不是解决方法,而是路径解析的工作方式。 具有用于"裸"路径解析的单个平面命名空间是 重要。