阅读 4428

《JavaScript 20 年》中文在线版发布

号外号外,由 JS 之父与 ES6 首席作者联合出品的前端键政必读书《JavaScript 20 年》,历时半年终于完成了中文翻译的在线版!

本书又名《没人比我们更懂的 JavaScript》和《TC39 执政回忆录》,详细记载和解读了自 1995 年语言诞生到 2015 年 ES6 规范制定为止,共计 20 年的 JavaScript 演化经历。全书不仅讲解了大量语言细节层面的演进,更复盘了更高层面上规范制定与标准博弈中的历史成败,是一部讲述人类如何在商业与技术上的竞争合作中促进产业发展的故事。

那么,在线版比之前连载的专栏文章多了些什么呢?其实还真不少:

  • 加入了共约 500 条的参考文献超链接。
  • 加入了共约 100 条的脚注超链接。
  • 加入了共约 100 条术语表的注解超链接。
  • 加入了共约 400 项的 JavaScript 演化时间线表格。
  • 加入了可跳转的章节目录。
  • 加入了标志着 JavaScript 诞生的公告稿译文。
  • 加入了其他重要附录表格,如登场人物表与组织表等。
  • 优化了专栏连载中 20 余份列表和表格的展示,将其由截图改为 HTML。
  • 修复了原文代码块示例中的若干问题,并美化了排版。
  • 改进了连载中过于口语化和非中性的陈述。

经过这些完善,在线版的篇幅已经达到了 25 万字的水平。下面简单分享下这些更新里有趣的料吧:

参考文献、脚注和术语表

相比之前的专栏连载版本,在线版的正文中加入了大量链接,其结构与原文保持了一致。它们能给你一种「很专业」的感觉。比如下面这段话:

TC39 [Herman 2008] 同时也对提供具有精简语义的「lambda 函数」感兴趣,比如支持消栈的尾调用g和 Tennent [1981] 一致性原则99。其支持者们认为,这样的函数将会在实现由语言或库所定义的控制抽象时有所用处。在 Harmony 进程早期,Brendan Eich [2008a] 在 es-discuss 上的一篇讨论贴中, 提出了一个最初由 Allen Wirfs-Brook 所提出的建议,即基于 Smalltalk 块语法的启发,采用一种简洁的 lambda 函数语法。例如 {|a,b| a+b} 就相当于 Herman 的 lambda(a,b){a+b}。Eich 的帖子引发了一场大规模但没有结论的线上讨论,话题涉及与(某种可能的)简明函数特性所相关的方方面面。作为关键总结,可以认为其中许多语法的灵感会带来解析或可用性上的问题,而且 JavaScript 的非本地控制转移语句——returnbreakcontinue——会显著地使编写控制抽象的机制变得更加复杂。大多数 TC39 成员和 es-discuss 订阅者似乎主要对简洁的函数语法更感兴趣,而非对 Tennent 一致性感兴趣。

加入并校订这些链接,主要是件体力活。其要点大概有这么几个:

  • 参考文献由 Allen Wirfs-Brock 提供的 BibTeX 解析生成,并在逐条插入过程中进行了一遍人工校对。
  • 脚注里有一些八卦,比如 Rust 原作者当年也参加过 TC39 会议之类。
  • 术语表相当于一份简易的「JavaScript 词典」。它连续回答了 100 个左右的「什么是函数」和「什么是 JS 引擎」一类的灵魂拷问式问题,对这些概念作出了直接的定义。本文由 ACM HOPL-IV 项目团队中以 Richard Gabriel 和 Guy Steele 为首的计算机科学家们审校过,相信可以信赖这些陈述的质量。

JavaScript 演化时间线

这条记载 JavaScript 演化的时间线,对应原文的附录 E,是一份事无巨细的表格,像这样:

这里我们可以直观地看到,许多影响 JavaScript 和 Web 发展的历史事件是如何交织在一起的。比如从上图中我们就能发现,Brendan Eich 才刚把 demo 级的 JavaScript 原型写出来三个月(1.0 都还没发布),他供职的 Netscape 就高歌猛进地上市了。再比如我们也可以找到 Chrome V8 发布后,各大主流浏览器花了多少时间跟进这项「性能革命」。

JavaScript 发布公告

你知道 JavaScript 当年是如何正式发布的吗?我们搬运回了附录 F 中这份当年 Netscape 和 Sun 联合发布的新闻稿,其中自然不乏亮点:

有了 JavaScript,就有可能在 HTML 页面中加入智能的表单。它可以根据用户的输入,在客户端执行贷款支付或货币兑换等计算。而某个用 Java 编写的多媒体天气预报 applet 小应用,也可以通过 JavaScript 脚本,根据某地区当前的天气读数来显示适当的图像和声音。服务端的 JavaScript 脚本可以做到从关系型数据库中提取数据,并飞快地将其格式化为 HTML。在页面中,还可能包含有在客户端和服务器上均可运行的 JavaScript 脚本。在服务器上,脚本可以根据存储在关系型数据库中的用户偏好,来动态地组合与格式化出 HTML 内容;在客户端上,脚本能将各种 Java applet 小应用和 HTML 表格元素粘合在一起,形成一个可实时交互的用户界面,以进行全网范围内的信息搜索……

它都预言了些什么呢?这说的不像是今天我们还在做的表单吗?不像是 Node.js 吗?不像是服务端渲染的 SSR 吗?不像是 JS 控制 Java 原生组件的 RN 吗?你看 Netscape 在 25 年前吹的牛逼,整个社区到了 2020 年的今天,居然也算把它们给实现得八九不离十(强行)。除此之外,附录资料中还藏着更多的细节,等待着你的发掘。

如何阅读

我们申请到了 cn.history.js.org 这个漂亮的域名,另外你也可以访问 jshistory-cn 这个 GitHub 项目主页,两者的阅读体验基本是一致的。

在线版使用 GitHub Pages 部署。如果你由于某些原因无法正常解析域名,在 hosts 中配置 185.199.108.153 cn.history.js.org 即可(这实际上是对 github.io 的解析问题,参考 GitHub 官方指南)。

另外,由于新增了大量不便于同步的细节格式优化,最早的知乎专栏连载文章将不再继续维护,它们的文中也已添加了相应的 deprecated warning。

最后,这里还准备了一份目录可供直达:

欢迎阅读与指正!

(题图:原书的两位作者 Brendan Eich 与 Allen Wirfs-Brock,2011 年)

One More Thing……

我们正在与博文视点的 @张春雨 老师积极合作,准备推出本书的纸质版。期待你的关注和支持噢!