【问题标题】:Best practice backwards compatible es6 node library development向后兼容 es6 节点库开发的最佳实践
【发布时间】:2016-09-28 02:22:51
【问题描述】:

在为 node 开发 JS 库时,编写一个利用 es6 功能但仍适用于不支持 es6 的 node 版本的库的最佳实践是什么?

例如,我有一个几年前用 es5 编写的开源库,但我想升级它以使用 es6。我是否必须对我的用户说,如果你想继续使用我的库,你的节点版本也必须升级?处理此问题的社区首选做法是什么?

【问题讨论】:

  • 这完全取决于它是什么类型的库以及它使用什么功能。有时可以将用户推向更高的 Node 版本,有时则不行。有时为了向后兼容而维护以前的主要版本是个好主意,有时则不是。如果这些功能可以很好地转换为 ES5,您始终可以将 ./dist 设置为 main 以确保不会让任何人感到不安。

标签: node.js npm ecmascript-6


【解决方案1】:

例如,我有一个开源库,我写了几个 几年前在 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

您会在该图表中注意到,在 2016 年 12 月 v4 结束之前支持所有内容。v4 中有重要的 ES6 功能(尽管不是全部),所以如果您可以在 v4 中构建 ES6 功能,那么它将很快就需要 node.js v4 可能是合理的。如果您希望使用仅在 node.js v6 中提供的 ES6 功能,那么您真的必须调查您的用户群以了解如果您的新功能开发分支需要 node.js 会有多大的困难。 js v6。 node.js v6 现在刚刚进入 LTS(长期支持),所以它现在真的处于其更长支持周期的开始。

【讨论】:

  • 为什么投反对票?请解释一下,我会改进我的答案。
【解决方案2】:

我想说,这取决于您需要使用哪些功能,以及您想要支持哪些版本的 Node。值得注意的是,对 4.0.0 之前的每个版本的 Node 的支持(当 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 引擎模拟。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多