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

时间:2016-09-28 02:22:52

标签: node.js npm ecmascript-6

开发用于节点的JS库时,编写利用es6功能但仍然不支持es6的节点版本的库的最佳实践是什么?

例如,我有一个开源库,我几年前在es5中写过,但我想升级它以使用es6。我是否必须告诉我的用户,如果您想继续使用我的库,那么您的节点版本也必须升级吗?处理这个问题的社区首选做法是什么?

3 个答案:

答案 0 :(得分:2)

  

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

首先,您必须决定是否继续支持您的图书馆的ES5版本。如果你是,那么你最终可能会得到你的库的两个分支,一个适用于ES5,另一个需要ES6并利用ES6中的功能。您必须决定您为ES5版本投入多少精力以及投入多长时间。据推测,您至少在一段时间内修复了该版本中发现的重大错误,并最终导致该版本没有新的更改/修复。

如果这个库的目的地是node.js作为目标环境,那么你可以立即测试你的ES6库以查看启动时是否有适当的环境,如果没有,则登录到控制台并抛出一个带有意义消息的异常作为错误,如果他们的库具有错误的环境,则建议开发人员。

如果您不打算继续支持具有其他功能或修复的库的ES5版本,那么您可能会将您的存储库分支到ES5的最新版本,以便开源社区可以继续如果他们这样选择,请单独支持/加强。

  

我是否必须向我的用户说,如果你想使用我的图书馆   转发你的节点版本也必须升级吗?

你没有做任何事情。您可以根据自己的想法选择适合您的图书馆和您的情况的人。由于它是开源的,您可能还想考虑开源贡献者想要做的事情。

  

处理此问题的社区首选做法是什么?

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

你会注意到该图表中支持v4在2016年12月结束之前的所有内容。并且在v4中有重要的ES6功能(不是全部),所以如果你可以在v4中构建ES6功能,那么它会可能很快就要求node.js v4是合理的。如果您希望使用仅在node.js v6中使用的ES6功能,那么您真的必须轮询您的用户群,以了解如果您的分支机构具有新功能会带来多大的困难开发需要node.js v6。 node.js v6现在只是LTS(长期支持),所以它现在真正处于更长的支持周期的开始。

答案 1 :(得分:1)

我说,这取决于您需要使用哪些功能,以及您希望支持哪些版本的Node。值得注意的是,对4.0.0之前的每个版本的节点(当LTS发布时)的支持正在结束支持by the end of this year;许多ES6功能,例如let / const声明和Promise支持,已在4.0.0中提供。 1 如果您只需要这些功能,设置支持哪些版本的下限应该是合理的,特别是如果你提高了包的版本,以便使用它作为依赖项的旧项目不会自动更新。 2

如果您想使用最新的,最强大的JavaScript功能现在,那么我建议您使用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 此表格详细介绍了支持ES6功能的地方。
2 此页面提供了一些有关npm如何根据版本号处理向后兼容性的信息。
3 一个值得注意的例外是ES6 Proxy objects,旧的JavaScript引擎无法模拟它。

答案 2 :(得分:0)

我最近一直在使用babeltransform-runtime插件,它允许您在不干扰其他(可能不使用babel)代码的情况下使用运行时内容。

如果您公开类似async函数的内容,则基于承诺的代码将能够访问它。