相关文章推荐

前言

可能许多前端开发者都知道,自从去年 sindresorhus 发表 esm only 的宣言 一年多以来,许多项目开始转向了 esm only,即仅支持 esm 而不支持 cjs,以此来迫使整个生态更快的迁移到 esm only。

一些流行的项目已经这样做了

  • sindresorhus 维护的上千个 npm 包
  • node-fetch
  • remark 系列
  • 更多。。。
  • 它们声称:你可以仍然使用现有版本而不升级到最新版,大版本更新不会影响到你。事实如何?

    吾辈之前碰到过几次无法使用 esm only 包的问题,每当吾辈想尝试 esm only 时,总是还有一些问题,最痛苦的是,一些包是 esm only,而另一些是 cjs only,总要选择放弃一边,fuck esm only。主要问题一些是 cjs only 的包,以及必须兼容的包 typescript/jest/ts-jest/wallaby 未能正确支持 esm。当然,吾辈可以选择寻找 esm only 包的替代品,例如 globby => fast-glob、remark => markdown-it、node-fetch => [email protected] ,lodash-es => lodash,但这终究不是一个长久的选择,更何况有些包很难真正找到替代品,例如 remark 系列。

    那么,使用旧版本的包有什么问题呢?
    主要问题是很难找到正确的版本,当然,如果使用的是相对独立的包,例如 node-fetch 这个,就可以直接使用 v2 版本即可。但如果使用的是 vuepress/remark 这种 monorepo 中包含许多小型包的项目,你很难找到每个子项目正确的版本。

    吾辈最近在做 epub 生成器的时候需要从 markdown 并操作 ast 做一些转换,最后转换为 html,因此再次使用 remark,也决定真正尝试使用 esm,下面是一些尝试的过程。

    目标

    使用 esm 必须解决以下几个问题,否则在生产环境中使用是不可能的

  • typescript 支持 – 基本上全部的 web 项目都使用了 ts,不支持的话是不可接受的
  • jest 支持 – 同样大量使用的测试工具
  •  
    推荐文章