首先,对于一个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。这是出口
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.**
import { sync as mkdir } from 'make-dir'
^^^^
SyntaxError: The requested module 'make-dir' does not provide an export named 'sync'我被困在这里了吗?我需要和性病/esm呆在一起吗?(但看起来这个项目现在已经结束了)我不能/不应该使用我的整个代码库来容纳cjs模块
import mk from 'make-dir'
const mkdir = mk.sync为了让任何人都能轻松地重新创建,我已经做了一个回购--一个可以克隆并运行以查看这个差异的。
https://github.com/dkebler/core-esm-named-import-error
无论如何,假设v14中的esm将是使用std/esm的替代物。显然不是:
发布于 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这样的运行时来说,这是不值得的。
那么我们能做些什么呢?下面是我遇到这个问题时一直在做的事情:
https://stackoverflow.com/questions/62088912
复制相似问题