我可以使用 esm 开发 Koishi 吗?

Koishi 官方文档全部使用 ts,但我的模板项目中生成的代码都是 cjs 格式的,Koishi 支持 esm 的情况如何?我可以开发导出 esm 的插件吗?我可以在 esm 文件中加载 Koishi 吗?

1 个赞

Koishi 的模块化政策

  1. 所有人都可以并且我们推荐用 esm 开发
  2. 在 Node.js 上我们要求编译到 cjs,为了兼容性考虑
  3. 在浏览器上我们使用纯 esm

关于 Node.js 的具体说明

为什么不放弃 cjs

截至我写这篇论坛贴的时候,Koishi 支持的 Node.js 最低版本是 14。在这个版本中,Node.js 尚未完全放弃 cjs。由于 cjs 不能静态加载 esm,一旦 Koishi 放弃 cjs,这将意味着大量 cjs 用户会无法顺利使用 Koishi。我们已经在许多其他库的 issue 中看到了相关的抱怨。采用 pure esm 的库作者通常会告知已经放弃了对这些用户的支持,但我们不会。Koishi 对用户的支持与主流软件的生命周期保持一致。

我能使用 esm 开发 Koishi 插件吗?

可以。我们的模板项目就是使用 esm 开发的,经过构建可以很好地变成 cjs。

但请注意:请不要把未经构建的 esm 代码作为插件直接发布,这将导致没有人能加载你的插件

我能原生地使用 esm 加载 Koishi 吗?

可以。Koishi 及其核心生态都提供了 esm 导出。

4 个赞

根据TypeScript 5.0 RC,TypeScript 在 5.0 版本添加了 bundler 作为 moduleResolution 的新参数,自从我们使用 esbuild 作为捆绑器,这个参数配置使得我们可以一边在源代码中写 import {} from './utils' (不带扩展) 一边得益于 esbuild 的自动打包到 ESM 那个要求扩展名在导入中。
由于 TypeScript 截至目前还未发表 5.0,我们可以保持关注,个人觉得这是非常有用的对于 Koishi。

2 个赞

原来 TypeScript 5.0 解决了这个问题!我昨天还在询问别人这个问题如何解决,最后选择了 esbuild

这个功能能变成 TypeScript 的内置功能的话就太好了,现在越来越期待 TypeScript 5.0 了

1 个赞

我想你可能有误解在这里,moduleResolution: bund;er 的设置引入自 TypeScript 5.0 解决了无扩展与 ESM 共生的问题,这是方便的为了 esbuild 等捆绑器而不适用 tsc 的编译。
目前我还未实际运用这个配置在产品中,我期待它能解决问题的 Koishi。

1 个赞

是的,我上周看了发行说明,这确实有一点令人遗憾