假设我的文件夹结构类似于:
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来自https://jsfiddle.net/ujhfwz0g/3/说明:
路径解析的工作方式略有不同:ESM不支持NODE_PATH和require.extensions。它的说明符始终是URL也会导致一些细微差别。
在ERR_MODULE_RESOLUTION_LEGACY
下面的错误消息中 - 谷歌几乎没有显示任何内容。
答案 0 :(得分:2)
好的,所以同事(感谢@ robin-balmforth)给了我答案:
来自https://nodejs.org/api/esm.html#esm_no_node_path它说:
import和require之间的显着差异没有NODE_PATH NODE_PATH 不是解析导入说明符的一部分。请使用符号链接 这种行为是可取的。
来自更为规范的事物:
import语句不支持以下所有内容:
$ NODE_PATH $ HOME / .node_modules $ HOME / .node_libraries $ PREFIX / lib / node 根据需要使用本地依赖项和符号链接。
因此,我不必设置NODE_PATH环境变量,而是设置符号链接:
ln -s ../lib node_modules/lib
似乎工作正常。
我们假设原因是与es6模块的浏览器实现兼容?
在此节点-eps问题https://github.com/bmeck中,https://github.com/nodejs/node-eps/issues/11对此更改背后的原因进行了一些讨论,如:
解决方案不是解决方法,而是路径解析的工作方式。 拥有一个平面命名空间,用于"裸"路径解析是 重要的。