背景

  • 我通过其初始开发来创建和管理Node。
  • 我的目标主要集中在对事件驱动的HTTP服务器进行编程上。
  • 当时的重点对于服务器端JavaScript至关重要。当时还不明显,但是服务器端JS需要一个事件循环才能成功。

当我2012年离开时,我感到Node已经(或多或少)实现了我对用户友好的非阻塞框架的目标:

  • 核心支持许多协议:HTTP,SSL,…
  • 在Windows(使用IOCP),Linux(epoll)和Mac(kqueue)上工作。
  • 相对较小的内核,具有比较稳定的API。
  • 通过NPM不断增长的外部模块生态系统。

但是我错了-还有很多事情要做…

从那时起,关键工作一直在使Node不断增长。

  • npm(也称为“ Isaac”)解耦了核心节点库,并允许分布生态系统。
  • N-API是设计精美的绑定API
  • Ben Noordhuis和Bert Belder建立了libuv。
  • Mikeal Rogers组织了治理和社区。
  • Fedor Indutny在整个代码库中产生了巨大影响,尤其是在加密方面。
  • 还有许多其他人: TJ Fontaine, Rod Vagg, Myles Borins, Nathan Rajlich, Dave Pacheco, Robert Mustacchi, Bryan Cantrill, Igor Zinkovsky, Aria Stewart, Paul Querna, Felix Geisendörfer, Tim Caswell, Guillermo Rauch, Charlie Robbins, Matt Ranney, Rich Trott, Michael Dawson, James Snell

在过去的6个月中,我才再次开始使用Node。

这些天我的目标不一样了。

动态语言是科学的正确工具计算,经常需要进行快速的一次性计算。

JavaScript是最好的动态语言。

相反,我会抱怨Node中的所有疣。

错误从来没有那么明显当你是对他们负责的人。

有时,Node对我来说就像钉在黑板上的指甲。

本来可以更好。

遗憾

不信守Promises

  • 我在2009年6月向Node添加了promises,但在2010年2月愚蠢地将它们删除了。
  • Promises是 async/await的必要抽象。
  • Node中对promises的统一使用可能会加速最终标准化和async/await的交付
  • 今天,Node的许多async API都因此而严重老化。

安全

  • V8本身就是一个非常好的安全沙箱。
  • 如果我对如何为某些应用程序进行维护进行了更多的思考,Node可能会有一些不错的安全保证,而其他任何语言都无法保证。
  • 示例:您的linter不能完全访问您的计算机和网络

构建系统(GYP)

  • 构建系统非常困难且非常重要。
  • V8(通过Chrome)开始使用GYP,并且我将Node切换为拖曳。
  • 后来Chrome放弃了GN的GYP。 剩下唯一GYP用户Node。
  • GYP也不是一个丑陋的内部接口,它暴露给任何试图绑定到V8的人。
  • 对于用户而言,这是一个糟糕的体验。 这是non-JSON,Python改编版。
  • GYP的继续使用可能是Node核心最大的故障。
  • 我应该提供一个核心的外部函数接口(FFI),而不是指导用户编写与V8的C++绑定。
  • 早期,很多人建议使用FFI(即Cantrill),但遗憾的是我没有理会他们。
  • (我对libuv采用自动工具感到非常不满。)

package.json

  • Isaac在NPM中发明了package.json(大部分情况下)。
  • 但是我通过允许Node的require()检查package.json文件中的”main“来批准它
  • 最终,我将NPM包含在Node发行版中,这使其成为事实上的标准。
  • 不幸的是,模块有一个集中的(甚至是私有控制的)存储库。
package-json

require(“somemodule”)不是特定的。定义的地方太多了。

  • 允许package.json引起了”module”作为文件目录的概念。
  • 这不是绝对必要的抽象-网络上不存在。
  • package.json现在包含各种不必要的信息。执照? 仓库? 描述? 这是样板噪音
  • 如果在导入时仅使用相对文件和URL,则路径将定义版本。无需列出依赖项。

node_modules

它极大地使模块解析算法复杂化。

默认情况下,供应商有良好的意图,但实际上,仅使用$NODE_PATH不会排除这种情况。

与浏览器语义大相径庭。

这是我的错,非常抱歉。

不幸的是,现在无法撤消。

require(“module”)没有扩展名“.js

  • 不必那么明确。
  • 不是浏览器JavaScript的工作方式。 您不能在脚本标记src属性中省略“.js”。
  • 模块加载器必须在多个位置查询文件系统,以猜测用户的意图。
  • index.js

我认为这很可爱,因为那里有index.html …

它不必要地使模块加载系统复杂化。

在需要受支持的package.json之后,它变得特别不必要。

我与Node的问题几乎完全围绕它如何管理用户代码。

与早期重点关注事件I/O相比,模块系统本质上是事后的想法。

考虑到这一点,我长期以来一直在思考如何更好地做…

Deno V8上的安全TypeScript运行时

Design Mistakes in Node