是否可以使用本机 es6 模块 (mjs) 对本地模块使用裸导入?



>背景:

假设我的文件夹结构是这样的:

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 例如:

解决方案不是解决方法,而是路径解析的工作方式。 具有用于"裸"路径解析的单个平面命名空间是 重要。

相关内容

  • 没有找到相关文章

最新更新