首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从std/esm迁移到节点V14中的esm支持--无法找到命名导入--可以很好地处理std/esm

从std/esm迁移到节点V14中的esm支持--无法找到命名导入--可以很好地处理std/esm
EN

Stack Overflow用户
提问于 2020-05-29 15:00:08
回答 1查看 1.9K关注 0票数 3

首先,对于一个year+,我使用esm编写了我的所有代码,在std/esm包中,我能够无缝地使用带有cjs的依赖包,没有问题,不需要babel。

在nodejs中,V14混合esm/cjs支持现在包括在没有标志的情况下,并且std/esm项目似乎正在结束,所以我想我应该尝试迁移,看看问题可能是什么。我找到了一个。

https://github.com/standard-things/esm

模块

我面临的问题是,与std/esm不同,V14 nodejs中现在包含的esm/cjs支持破坏了与std/esm.很好地工作的命名导入(从我假设公共is模块导出)

https://github.com/sindresorhus/make-dir/blob/978bee9186bf0c41640ed21567921daf8c303225/index.js#L106为例

因为软件包使用的是cjs。这是出口

代码语言:javascript
复制
module.exports.sync = (input, options) => {
    checkPath(input);
    options = processOptions(options);

在我的package.json中使用package.json。我的代码中有导入import { sync as mkdir } from 'make-dir' ,它使用std/esm很好地工作。但是在nodejs 14中使用,它说它找不到命名的导出sync.**

代码语言:javascript
复制
import { sync as mkdir } from 'make-dir'
         ^^^^
SyntaxError: The requested module 'make-dir' does not provide an export named 'sync'

我被困在这里了吗?我需要和性病/esm呆在一起吗?(但看起来这个项目现在已经结束了)我不能/不应该使用我的整个代码库来容纳cjs模块

代码语言:javascript
复制
import mk from 'make-dir'
const mkdir = mk.sync

为了让任何人都能轻松地重新创建,我已经做了一个回购--一个可以克隆并运行以查看这个差异的。

https://github.com/dkebler/core-esm-named-import-error

无论如何,假设v14中的esm将是使用std/esm的替代物。显然不是:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-11 08:07:34

编辑:截至Node.js 14.13.0 (和Node.js 12.19.0LTS),导入CJS模块将使用https://github.com/guybedford/cjs-module-lexer解析文件,以检测最常见的命名导出,因此可以使用来自ESM的文件。最初的答案是过时的,但仍然与理解为什么Node.js没有检测到一些命名为exports的CJS有关。

Node.js只支持CJS脚本的默认导出的技术原因是ESM import是静态的(在模块执行之前对它进行了解析)和CJS module.exports是动态的(您可以做一些疯狂的事情,比如module.exports[Date.now()] = 0并摆脱它)。唯一确切地知道CJS模块导出的“名称”的方法是解析和执行它,这似乎与ES6规范不兼容。

一些绑定器(如std/esm)使用CJS模块代码上的regex来查找module.exports.<named export> =实例,并使用该正则表达式定义模块的命名导出列表。这种方法的缺点是找不到所有的导出,解析大型文件可能非常占用内存。另外,这意味着对CJS模块进行两次解析,虽然对于绑定器来说性能可能没有问题,但是对于Node.js这样的运行时来说,这是不值得的。

那么我们能做些什么呢?下面是我遇到这个问题时一直在做的事情:

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62088912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档