在日常工作中,需要开发一些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直接指向源码,由使用者自行编译。
我的观点是,这取决于这个
package
的需求。package
是否支持browser
直接引入,如果需要,按该package
支持的浏览器版本编译。browser
直接引入,按支持的node
版本进行编译。node
支持,否则其实不需要编译,如果第三方自己需要支持,自己编译。