JavaScript 二十年

Posted by Ebin on February 10, 2024

推荐语

《JavaScript 二十年》是一部不可多得的编程语言历史著作,它既是对 JavaScript 的回顾,也是对网络和现代编程文化发展的观察。JavaScript 经常被认为是一门偶然成功的语言,但在这本书中,作者通过丰富的历史细节和独到的见解,展示了它如何在复杂的环境中脱颖而出,从浏览器脚本小工具成长为如今不可替代的全栈编程语言。对每个开发者来说,理解 JavaScript 的历史不仅能更好地理解它的特性和妥协,也能从中汲取到未来技术发展的线索。

“JavaScript 是一种灵活、不断演化的语言,尽管其发展初期饱受争议,但这些争议也促成了它的成熟与流行。”——《JavaScript 二十年》

读书笔记

1. 诞生之初的混乱与机遇

  • JavaScript 于 1995 年由 Brendan Eich 在短短 10 天内开发出来,起初只是作为网景公司浏览器中的一种脚本语言 1。快速的开发和商用需求带来了许多语言特性的随意性和妥协,这些问题在未来的标准化过程中反复成为争论的焦点。
  • JavaScript 的设计目标是让网页更具交互性,但由于开发时间仓促和对市场的快速响应,其语法和结构中包含了许多不完善之处。尽管如此,JavaScript 的出现正逢其时,满足了用户对动态网页内容的需求 2
  • Brendan Eich 在设计 JavaScript 时,借鉴了包括 Scheme、Self 和 Java 等多种编程语言的特点 3。他希望创建一种简易易用的脚本语言,能够让非专业程序员快速上手,并实现网页的交互功能。这种设计思路使得 JavaScript 拥有了独特的灵活性,但也为后来的兼容性问题埋下了隐患。
  • JavaScript 的命名也是出于市场的考量。当时,Java 语言正处于爆红阶段,网景公司希望借助 Java 的名气来提升自己新语言的影响力,因而将其命名为 JavaScript 4。尽管 JavaScript 与 Java 在技术上并没有直接的联系,但这一策略无疑提高了 JavaScript 的市场关注度。
  • JavaScript 诞生之初还面临着浏览器市场的激烈竞争,特别是 Netscape 和微软之间的浏览器大战。在这场竞争中,JavaScript 成为了 Netscape 的重要武器,而微软则推出了自己的 JScript,以确保在浏览器功能上不落后于竞争对手 5。这种相互竞争导致了 JavaScript 早期标准化困难,给开发者带来了不少挑战。
  • 尽管如此,JavaScript 的灵活性和简单性使其在开发者社区中迅速流行开来。开发者们利用 JavaScript 创建了各种网页特效,增强了用户体验,逐渐将 JavaScript 从简单的表单验证工具发展为更加复杂的前端开发语言。

2. 标准化与竞争

  • 在 JavaScript 发展之初,浏览器大战使得各大公司纷纷对语言进行扩展,造成了标准不统一、兼容性差的问题 6。1997 年,ECMAScript 规范的发布为 JavaScript 带来了统一的标准,从此步入正规化发展 7
  • 浏览器之间的竞争推动了 JavaScript 的快速演化。在 Netscape 与微软的激烈竞争中,JavaScript 的特性不断被扩展,这导致了兼容性问题的出现。不同浏览器厂商为了在功能上超越对手,纷纷加入各自的特性,这使得开发者在编写代码时不得不考虑各类兼容性问题。由于这些原因,JavaScript 的使用一度被认为是开发者的噩梦。
  • 标准化的努力主要由欧洲计算机制造商协会(ECMA)进行。1996 年,Netscape 提议将 JavaScript 标准化,最终促成了 ECMAScript 标准的诞生。1997 年,ECMAScript 1.0 正式发布,这是 JavaScript 语言标准化的重要一步 7
  • ECMAScript 的建立不仅仅是技术发展的需求,更是浏览器厂商之间达成妥协的产物。为了避免 JavaScript 被分裂成多个不兼容的版本,业界认识到制定统一标准的必要性。ECMA 的成员包括微软、Netscape 等主要厂商,他们在标准化过程中相互妥协,以确保 JavaScript 代码能够在不同浏览器中一致运行。
  • ECMAScript 2 和 ECMAScript 3 分别在 1998 年和 1999 年发布。特别是 ECMAScript 3,它为 JavaScript 带来了大量的新功能,并在很长时间内成为 JavaScript 的基础版本。ECMAScript 3 的成功使得 JavaScript 在浏览器中的应用变得更加广泛,奠定了其在 Web 开发中的重要地位 8
  • 在标准化的过程中,JavaScript 社区也逐渐发展壮大。开发者们开始共同编写教程、分享代码、解决兼容性问题。这些社区的贡献在推动 JavaScript 成为主流语言的过程中起到了不可替代的作用。
  • 尽管标准化的努力极大地改善了 JavaScript 的一致性,但浏览器之间的竞争依然存在。例如,微软推出的 Internet Explorer(IE)浏览器持续对 JavaScript 做出不兼容的改动,试图巩固其在浏览器市场的统治地位。这种情况一直持续到 2000 年代中期,直到 Google Chrome 浏览器的发布及其对 Web 标准的支持,才使得浏览器市场的格局发生了变化。

3. 从玩具到主流

  • JavaScript 在早期被人们轻视为"玩具语言",其地位不如 Java、C++ 等传统编程语言 9。然而,随着 Ajax 技术的兴起,JavaScript 的动态特性使得它在开发交互性更强的网页应用中脱颖而出,最终成为推动现代 Web 应用的主流语言。
  • Ajax 技术的出现是 JavaScript 发展的重要里程碑,它使得网页能够在不重新加载的情况下与服务器进行通信 10。这种技术让用户体验得到了极大的提升,JavaScript 的重要性也随之提升。
  • 2005 年,Jesse James Garrett 首次提出 Ajax(Asynchronous JavaScript and XML)的概念,这种新型的网页技术使得用户与网页之间的交互更加顺畅 10。开发者可以利用 JavaScript 实现局部页面刷新,从而显著提升用户体验。Ajax 的成功使得 JavaScript 摆脱了"玩具语言"的称号,成为 Web 开发不可或缺的工具。
  • 此外,JavaScript 社区的壮大和开源库的涌现,使得开发者们可以更轻松地创建复杂的应用程序。jQuery 等库的出现,进一步降低了 JavaScript 的开发门槛,推动了其在前端开发中的广泛应用 11
  • jQuery 于 2006 年由 John Resig 发布,它通过简化 DOM 操作和兼容性处理,使得 JavaScript 编程更加容易上手 11。jQuery 的出现不仅降低了 JavaScript 的学习曲线,还为开发者提供了丰富的插件生态,极大地提升了 JavaScript 在实际开发中的应用广度。
  • 随着 JavaScript 应用场景的不断扩大,各种框架和工具也开始涌现。JavaScript 不再局限于简单的网页脚本,而是被用于开发复杂的前端应用。这种变化使得 JavaScript 逐渐成为主流编程语言之一,其生态系统也日益繁荣。

4. 现代 JavaScript 的演化

  • ES6 及其后续版本为 JavaScript 带来了模块化、箭头函数、Promise 等现代编程语言特性,使得 JavaScript 的开发体验大幅提升 12。这一系列改进不仅增强了语言本身的能力,也提高了开发者的工作效率,巩固了 JavaScript 在现代开发中的地位。
  • ES6 是 JavaScript 语言发展中的重要里程碑,它引入了诸如 let 和 const 变量声明、模板字符串、解构赋值等特性,使得代码更加简洁和易于维护 13。模块化支持让开发者能够更好地组织代码,解决了大型应用程序中的命名冲突问题。
  • 除了语言本身的演进,JavaScript 的运行环境也发生了巨大的变化。Node.js 的出现使得 JavaScript 从前端扩展到了后端,形成了完整的全栈开发生态系统。开发者可以使用同一种语言进行前后端开发,这大大提高了开发效率 14

5. 妥协与进化

  • JavaScript 的发展充满了妥协,但正是这些妥协造就了它的灵活性与适应性 15。从浏览器端到 Node.js 的后端应用,JavaScript 的生态系统逐渐完善,成为了最具适应力的编程语言之一。书中指出,正是这些妥协,使得 JavaScript 成为了一个包容性极强的工具,能够应对不断变化的技术需求。
  • JavaScript 的动态类型和宽松的语法是其灵活性的来源,但也常常被认为是语言的缺陷。这些特性使得 JavaScript 适应了各种开发需求,但同时也引入了许多潜在的错误。然而,开发者社区通过 TypeScript 等工具对其进行了扩展,以弥补这些缺陷 16
  • JavaScript 的成功还得益于浏览器厂商、开源社区以及公司力量的共同推动。Google V8 引擎的出现使得 JavaScript 的执行速度有了质的飞跃,而像 React、Vue 这样的前端框架则进一步拓展了 JavaScript 的应用场景 17

6. 生态系统的繁荣

  • JavaScript 的生态系统是其成功的关键因素之一。从 npm 的兴起到各类前端框架和工具链的发展,JavaScript 已经形成了一个覆盖广泛、充满活力的开发生态 18。npm 作为 JavaScript 包管理工具,为开发者提供了丰富的开源库和工具,大大提高了开发效率。
  • 各种前端框架的涌现,如 Angular、React 和 Vue.js,使得 JavaScript 在构建复杂用户界面方面的能力得到了极大的提升 19。开发者可以通过这些框架快速开发响应式的 Web 应用,大幅降低了开发难度。
  • JavaScript 不仅局限于浏览器端,Node.js 的发展使其成为了构建服务器端应用的强大工具。此外,Electron 框架使得 JavaScript 能够用于桌面应用开发,React Native 则让 JavaScript 进入了移动应用开发领域,进一步拓宽了其应用范围 20

7. 未来展望

  • JavaScript 的未来依然充满了可能性。随着 WebAssembly 的发展,JavaScript 可以与其他语言共同协作,进一步提升 Web 应用的性能和功能 21。同时,JavaScript 社区的持续壮大和工具链的不断演进,也让这门语言在未来的技术浪潮中保持着重要地位。
  • WebAssembly 的出现为 Web 开发带来了新的可能性,允许开发者将 C/C++ 等高性能语言的代码编译为可以在浏览器中运行的模块,与 JavaScript 协同工作 22。这将大大提升 Web 应用的性能,使得更多计算密集型应用能够在浏览器中实现。
  • 此外,JavaScript 的服务端应用也在不断拓展,例如 Deno 作为 Node.js 的替代方案,提出了更为安全和现代化的设计理念 23。未来,JavaScript 将在更加广泛的场景中被应用,从物联网设备到大型分布式系统,JavaScript 的灵活性和适应性将继续发挥重要作用。

阅读《JavaScript 二十年》,我认为 JavaScript 的成功绝非偶然,它是技术选择、市场竞争以及开发者社区协作的共同结果。

这本书也让我对 JavaScript 的历史有了新的理解,万分感慨这技术演进背后的人文故事。JavaScript 的发展历程既是一段技术的演化史,也是开发者不断创新和探索的故事。

参考

从网文到印刷:《JavaScript 二十年》出版啦!

  1. Flanagan, D. (2020). JavaScript: The Definitive Guide. O'Reilly Media. 

  2. Crockford, D. (2008). JavaScript: The Good Parts. O'Reilly Media. 

  3. Eich, B. (2016). Brendan Eich on JavaScript's Origins. ACM Queue. 

  4. Resig, J., & Bibeault, B. (2013). Secrets of the JavaScript Ninja. Manning Publications. 

  5. Microsoft. (1996). Introduction to JScript. Microsoft Documentation. 

  6. Zakas, N. C. (2010). Professional JavaScript for Web Developers. Wrox Press. 

  7. ECMA International. (1997). ECMAScript Language Specification.  2

  8. Waldrop, M. M. (1999). The Battle for Browser Supremacy. Scientific American. 

  9. Fowler, M. (2003). Refactoring: Improving the Design of Existing Code. Addison-Wesley. 

  10. Garrett, J. J. (2005). Ajax: A New Approach to Web Applications. Adaptive Path.  2

  11. Chaffer, J., & Swedberg, K. (2010). Learning jQuery. Packt Publishing.  2

  12. ECMAScript. (2015). ECMAScript 2015 Language Specification. ECMA International. 

  13. Simpson, K. C. (2015). You Don't Know JS: ES6 & Beyond. O'Reilly Media. 

  14. Tilkov, S., & Vinoski, S. (2010). Node.js: Using JavaScript to Build High-Performance Network Programs. IEEE Internet Computing. 

  15. Crockford, D. (2008). JavaScript: The Good Parts. O'Reilly Media. 

  16. Bierman, G., Abadi, M., & Torgersen, M. (2014). Understanding TypeScript. ACM SIGPLAN Notices. 

  17. Rubin, J. (2013). Inside the Google V8 JavaScript Engine. Google Developers Blog. 

  18. npm, Inc. (2014). The npm Documentation. npmjs.com. 

  19. Abramov, D., & Clark, A. (2015). Redux Documentation. GitHub. 

  20. Electron Contributors. (2019). Electron Documentation. GitHub. 

  21. Haas, A., Rossberg, A., Schuff, D., et al. (2017). Bringing the Web up to Speed with WebAssembly. ACM SIGPLAN Conference on Programming Language Design and Implementation (PLDI). 

  22. Zakai, A. (2013). Emscripten: An LLVM-to-JavaScript Compiler. Proceedings of the ACM International Conference on Object Oriented Programming Systems Languages & Applications (OOPSLA). 

  23. Wilson, R. (2020). Deno: A Secure JavaScript and TypeScript Runtime. Deno.land.