我可以使用本机es6模块(mjs)为本地模块使用裸导入吗?

时间:2018-06-15 07:30:26

标签: node.js commonjs es6-modules

背景:

假设我的文件夹结构类似于:

  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下面的错误消息中 - 谷歌几乎没有显示任何内容。

1 个答案:

答案 0 :(得分:2)

好的,所以同事(感谢@ robin-balmforth)给了我答案:

来自https://nodejs.org/api/esm.html#esm_no_node_path它说:

  

import和require之间的显着差异没有NODE_PATH NODE_PATH   不是解析导入说明符的一部分。请使用符号链接   这种行为是可取的。

来自更为规范的事物:

https://github.com/bmeck/node-eps/blob/es6-module/002-es6-modules.md#521-removal-of-non-local-dependencies说:

  

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对此更改背后的原因进行了一些讨论,如:

  

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