最佳实践向后兼容的es6节点库开发

在开发面向节点的JS库时,编写一个利用es6function但仍然支持不支持es6的节点的版本库的最佳做法是什么?

例如,我有一个几年前在es5中编写的开源库,但是我想升级它以使用es6。 我必须对我的用户说,如果你想使用我的图书馆,你的节点版本也必须升级? 社区首选的做法是什么?

例如,我有一个几年前在es5中编写的开源库,但是我想升级它以使用es6。

首先,您必须决定是否要继续支持ES5版本的库。 如果你是这样的话,那么你最终可能会拥有两个分支,一个与ES5一起工作,另一个需要ES6,并利用ES6的function。 您必须决定您为ES5版本付出多less努力以及多长时间。 据推测,你会修复在该版本中发现的重大错误至less一段时间,最终你会日落的版本没有新的变化/修复。

如果这个库的目标是node.js作为目标环境,那么你可以立即testing你的ES6库,看看在启动时是否有适当的环境,如果没有,那么login到控制台并抛出一个exception有意义的消息作为错误,build议开发者是否对这个库有错误的环境。

如果您不打算继续支持具有附加function或修补程序的ES5版本的库,那么您可能会在ES5的最后一个版本中分发您的存储库,以便开源社区可以继续支持/增强它如果他们这样select的话。

我必须对我的用户说,如果你想使用我的图书馆,你的节点版本也必须升级?

你不必做任何事情。 这取决于你做什么你认为适合你的图书馆和你的情况。 既然它是开源的,你可能也想考虑一下你的开源贡献者想做什么。

社区首选的做法是什么?

没有特定的社区偏好同样适用于所有图书馆或情况。 node.js支持的一个起点是查看node.js为自己的版本所做的工作,并查看它为多个版本提供持续支持的时间。 你不需要那么慷慨(这取决于你的情况),但是你可能不需要比node.js更慷慨,因为在那时开发者会运行一个旧版本node.js不再支持自身。 这是看node.js版本的支持: https : //github.com/nodejs/LTS 。

你会注意到在那个图表中,支持v4之前的所有东西都是在2016年12月结束的。而且在v4中有很多重要的ES6特性(不是所有的),所以如果你可以在v4中构buildES6特性的话,要求node.js v4相当快。 如果您正在使用仅在node.js v6中使用的ES6function,那么您实际上必须轮询您的用户群,以了解如果具有新function开发的分支需要节点,那么这将是多么困难。 js v6。 node.js v6现在正在进行LTS(长期支持),所以现在它正处于更长的支持周期的开始阶段。

我想说,这取决于你需要使用哪些function,以及你想要支持哪些版本的节点。 值得注意的是,4.0.0之前(当LTS发布时)的每个版本的Node都支持到今年年底 。 和许多ES6function,如let / const声明和Promise支持,已经在4.0.0中可用。 1如果您只需要这些function,那么设置哪个版本的下限应该是合理的,特别是如果您打包了您的软件包的版本,以便旧版本的项目不会自动更新。 2

如果你想使用最新的,最好的JavaScriptfunction,那么我build议使用Babel来转换成ES5代码。 几乎所有最新的ES6特性3都是通过插件来支持的,你可以编译发布你的包到npm(或者任何地方),或者使用babel-register在运行时进行转换:

 // .babelrc file, babel configuration // the "es2015" preset transplies from ES6 to ES5 // you can also add "es2016" and "es2017" for newer features { "presets": [ "es2015" ], "plugins": [ "transform-runtime" ] } // index.js file require('babel-runtime'); // register babel require('./path/to/your/script.js'); // require your own code here, // which will be transplied with babel 

1下表显示了哪些ES6function支持哪些位置的完美概述。
2这个页面有一些关于npm如何根据版本号来对待后向兼容性的信息。
3一个明显的例外是ES6代理对象 ,旧的JavaScript引擎无法模拟这个对象 。

我最近一直在使用transform-runtime插件的babel ,它允许您使用运行时的东西,而不会干扰其他(可能不使用babel)代码。

如果你暴露像async函数那么基于承诺的代码将能够访问它。