如何使用 yakumo 打包出同时支持 commonjs 模块与 esm 模块的包?

我注意到最近 cordis 这边在弄支持加载 esm 模块包,那我也想着顺便让我的插件用上 esm ()

但旧版本的 koishi 还不支持加载 esm 模块吧,因此我想同时打包出来 cjs 和 mjs 文件。

试着更新了一下 yakumo 版本,配置好 tsconfig.base.json:

image

也配置了 exports:

但是打包出来只有纯 mjs 文件(并且以 .js 为后缀),没有看到 cjs 文件。

所以想问一下该怎么弄,才能同时打包出来 mjs 和 cjs 文件(

感觉再等一两个 koishi 大版本,然后直接把最低版本设置到那里,是不是就可以直接不用管 commonjs 模块了

2 个赞

受人所托前来 @shigma




1 个赞

爆米爆米

¥100.00/月

-获得来自Koishi开发者的亲自答疑指导
-成为Koishi Sponsor,主页将留下你的名字

1 个赞

受人所托 @shigma

1 个赞

受人所托 @shigma

1 个赞

1 个赞

?byd 我自己已经修好了,这不是 koishi 的问题 :rage:

1 个赞

Koishi 计划于(最快)4.18 引入全面的 ESM 支持。目前正在进行相关的基建工作。

时间表:

  • 4.17 之前

    • Koishi 本体和少量核心插件同时支持 ESM、CJS
    • 实际运行模板项目时只会以 CJS 格式加载
  • 4.17

    • 发布 Cordis CLI,允许以纯 ESM 格式加载插件
    • Koishi 中任何只会以 CJS 格式加载
  • 4.18(最早)

    • Koishi 默认使用 ESM 加载
    • 旧的 CJS 插件既然可以使用

关于如何打包我下面说。

2 个赞

自问自答一下吧:

我在阅读 cordis 源码时,发现可以在 tsconfig.json 里设置 compilerOptions 里的 emitDeclarationOnly 为 true,这会让 tsc 检查 ts 代码,但只输出.d.ts 类型定义文件。

实际打包时由于 tsc 没有生成 js 文件,yakumo 就会调用 esbuild(这段我猜的逻辑)。此时基于我在 package.jsonexports 的配置,会同时编译出 cjs 和 esm 格式的 js 文件(esbuild 大概本身就支持)。

此问题已经解决,当然我也期待其他大佬给出比这个实现更好的方案( ,除此之外我还有个小意见:

能否让 yakumo 在使用 tsc 时支持多份类似 tsconfig.x.json 这样的构建配置(如 tsconfg.cjs.json),再基于不同的配置文件复用不同的增量编译缓存文件(如 tsconfig.cjs.jsontsconfig.cjs.buildinfo),变相实现用 tsc 同时编译出 cjs 和 esm 格式的文件?

优点:

  1. 不用再跑一遍 esbuild(好像我之前用的 yakumo 默认都是 tsc 构建吧。。),支持 tsc 的增量编译
  2. 不会类似 esbuild 遵循 package.json 里的 exports,基于其的导出把引用的文件都打包到相关文件里。(如 index.ts , a.ts , b.ts → index.mjs)

缺点:

  1. 需要跑两次 tsc。
  2. 不同配置的输出需要在不同的文件夹,因此需要使用者自己编写脚本移动,合并构建产物到同一文件夹下。
  3. 需要维护多个增量编译缓存文件。
4 个赞

这种方案是预期的,你可以理解成一种「零配置」,即你要打包出的文件仅根据你的 package.jsontsconfig.json 决定。我们采用这种设计就是为了减少打包的心智负担。(如果你直接使用 esbuild 和 tsc 等工具,你将不得不为每个包编写复杂的构建选项。)

你的做法是我们推荐的做法。

未来我们可能会将 yakumo tsc 和 yakumo esbuild 合并为一个统一的包,并提供相关的文档。

5 个赞