发布的npm包需不需要预编译?

新手上路,请多包涵

在日常工作中,需要开发一些sdk,发到公司的私有npm仓库上作为基础的第三方包。原则上,包最少要有一个umd格式的引用方案,以及module的引用方案。但在发布时遇到了一些疑虑。
所以想问问大家:
发布的npm包需不需要使用babel进行预编译。如果需要,又需要编译到哪个地步。

暂时想到的几种选择

1.编译到es5/es3

使用babel将语法编译到es5可以识别的环境,并且把transform-runtime编译到包内。

优点:
  • 引入时不报错,可以做甩手掌柜。
缺点:
  • 如果每个sdk都这样,那就有n个transform-runtime,巨大。
  • 因为返回的函数也是promise形式的,所以引用者在低版本浏览器上要使用还是得加polyfill。

2.编译到es6

使用babel将stage0-3的语法编译成es6确认通过的语法。

优点:
  • 不用加transform-runtime,小了很多,比如async/await只需要翻译成generator。
  • 情理上说的通。“你看,axios库也这样,需要你自己编译一波”
缺点:
  • 只是将stage 0-3的语法编译成es6,有点脱裤子放屁的感觉。
  • 大部分开发人员不会(不愿意)改动项目原有的babel插件配置,而通常babel配置中默认是不编译第三方包的。

3.完全不编译

优缺点和编译到es6差不多。


现暂时解决方案:

  • umd引入方式: dist里的min.js 编译到es5/es3。
  • es引入方式: npm包的main直接指向源码,由使用者自行编译。
阅读 4.3k
1 个回答
发布的npm包需不需要使用babel进行预编译。如果需要,又需要编译到哪个地步。

我的观点是,这取决于这个package的需求。

  1. 当前的package是否支持browser直接引入,如果需要,按该package支持的浏览器版本编译。
  2. 假如不支持browser直接引入,按支持的node版本进行编译。
  3. 所以除非需要对老版本node支持,否则其实不需要编译,如果第三方自己需要支持,自己编译。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题