【发布时间】:2022-01-07 23:56:52
【问题描述】:
我有一个用 Typescript 编写的混合 cjs/esm 节点包。
它由两个文件组成——core.ts 和extra.ts,我想将它们分开。 extra.ts 导入 core.ts(字面意思是 import { ... } from './core';),它们是包的单独入口点。客户端仅导入 core.ts 或同时导入两者。
Rollup 可以轻松地为多个入口点、多种输出格式创建构建步骤,一切看起来都很好。
但现在我遇到了一个问题:
假设我有 example.mjs 或 example.cjs 导入或需要 my-package 和 my-package/extra 入口点。
这行不通。错误信息略有不同但含义相同——读取extra.mjs/cjs时找不到./core模块。
-
由 Rollup 构建的
extra.cjs包含行var core = require('./core'); -
由 Rollup 构建的
extra.mjs包含行import { ... } from './core';
默认情况下,Node 12 不会猜测文件扩展名(我没有对此提出质疑)。
我必须将其称为 node --experimental-modules --es-module-specifier-resolution=node ./example.mjs 才能使其正常工作。这是不令人满意的解决方案。我需要 example.mjs 在没有额外标志的情况下运行。
在我看来,文件扩展名可以而且应该添加到已编译的 cjs/mjs 文件中的 import/require 语句中,以使其按照规范工作。
虽然,由于我在 Rollup 配置中为这两个文件和 external: ['./core'] 在 extra.ts 的选项中有不同的构建步骤,但对于 Rollup,它们完全不相关。否则 Rollup 只会将它们捆绑到一个文件中,这也不是我需要的。
那么问题来了:
-
是否有插件或配置选项可以使 Rollup 生成具有正确本地导入的文件(根据格式添加到本地导入的文件扩展名)?
-
如果没有现有解决方案,在构建过程中添加额外步骤以修补导入的最佳方法是什么?
-
也许有不同的捆绑器可以用于相同的任务?
【问题讨论】:
标签: node.js typescript es6-modules commonjs rollupjs