作者:大道至简1024
转发链接:
https://mp.weixin.qq.com/s/AVkbPPuI64dKmV2djKbHyg
JavaScript 每十年会有一次大换血。我认为,一个加速变革的时期刚刚开启,在未来可能会被认为是 JavaScript 的第三个时代。
Third age
JS 的第一个时代,1997-2007 年,开局很热闹,结局让人唏嘘。大家都知道 Brendan Eich 的故事,但也许很少有人知道 ES4 是如何在 Flash/Actionscript 等封闭生态系统的激烈竞争中步履维艰的。JS 的完整起源故事被其主要作者 Brendan Eich 和 Allen Wirfs-Brock 在 JavaScript: The First 20 Years ¹一文中讲述得更好。
ECMAScript 历史时间线
JS 的第二个时代,2009-2019年,开始于神奇的 2009 年。这一年,npm,Node.js 和 ES5 诞生了。随着 Doug Crockford 发表的JavaScript 语言精粹,开发者创造了一大堆 JS 构建工具和库,并将 JS 的领域扩展到桌面端和新型智能手机。到 2019 年,我们甚至看到了像Facebook 的 Hermes这样的手机端专用 JS 运行时和 Svelte 3 这样的编译器优先的前端框架。
2020 年感觉像是一个新时代的开始。如果说第一个时代是关于语言的构建,而第二个时代是关于用户对语言的探索和扩展,那么第三个时代则是关于清除遗留假设和缩减工具层。
注:我之前发布过 Collapsing Layers ²论文。
被清除的主要遗留假设是 JS 生态系统对 CommonJS 的依赖,这是一系列妥协的结果。它的替代品—— ES 模块,已经蓄势待发了,但是由于现有的工具体系虽然速度慢但还够用,它缺乏真正飞跃的动力。在前端,现代浏览器也提供了部分支持,但是一些重要的细节问题还没有解决。Pika/Snowpack 项目的定位正是通过提供一个可以随着 ES 模块的完成而消失的外观模式来加快这个进程。作为最后的奖励,IE11 将从今年开始它缓慢的退出之路,直到 2029 年终结。
另一个要抛弃的假设是 JavaScript 工具必须用 JavaScript 构建。热路径(hot path,编译器中的概念,花费时间最多的代码执行路径)中的类型安全和10倍-100倍性能提升的潜力太大了,不容忽视。随着 TypeScript 几乎完全可替换 JavaScript,“JS 自给自足”的理想已经消失。现在的 Deno 和 Relay 也证明,人们会学着用 Rust 来贡献核心 JS 工具。Brandon Dail 预言这个转换将在 2023 年完成。我们会继续用 JavaScript 和 TypeScript 编写大多数强调可用性胜过性能的工具。我们曾经思考的“函数式内核,命令式外壳”³,现在将转向“系统内核,脚本外壳”。
注:尚存争议,Python 的 PyPy 也表明这还不是定论。
工具层缩减的方式也挺有意思。Deno 采用了一种激进的方法来编写一个全新的运行时,它用 TypeScript 将常见的用于测试、格式化、linting 和打包等任务的一系列工具合并成一个二进制文件,甚至还包括一个标准库。Rome 采取了不同的策略,将所有工具层都折叠于 Node.js 之上(据我所知,我也不太熟悉)。
有一些 10 年前不存在的一些东西,现在已经成为了生活的一部分,那就是公有云(AWS、Azure、GCP等)。JavaScript 和云之间有一种有趣的关系,我也说不太清楚——云平台开发者是不会碰 JS 的,但 JS 却是他们最大的客户。AWS Lambda 首先用 JS 发布。还有一个明显的变化是,IDE 和云之间的分层将被折叠简化,处于中间的麻烦的开发机器变得无关紧要了。Glitch、Repl.it、Codesandbox、GitHub Codespaces、Stackblitz 以及更多工具都是云发行版,都在利用 JS 探索这个领域。
即使在前端框架中,进展情况也是极好的。Svelte 把从动画到状态管理的所有内容都压缩进编译器环节。React 正在探索 metaframeworks 和客户端-服务器集成。Vue 正在致力于一个名为 Vite 的 dev server 项目。
综上所述:第三个时代的 JS 工具将会:
所有这些工作的结果是更好的开发者体验(更快的构建,行业标准工具)和用户体验(更小的资源包,更快的功能交付)。从网站脚本玩具语言,到完整的应用程序平台,JavaScript 最终完成了转变。
如果加里·伯恩哈特的预测⁴是正确的,第三个时代可能是 JavaScript 的最后一个时代(他给出的时间线是截止到 2035 年)。Web Assembly 总像一个若隐若现的幽灵——即使是 Brendan Eich,也将他的名言改成了“始终押注于 JS,以及 WASM”。他最初认为 JS 可能是“通用虚拟机”,但他曾告诉我现在 WASM 才是这个想法的最终实现。
若真如此,我们目前正处于终局之战(Endgame)。
《前端上传前预览文件 image、text、json、video、audio「实践」》
《深入细品 EventLoop 和浏览器渲染、帧动画、空闲回调的关系》
《推荐13个有用的JavaScript数组技巧「值得收藏」》
《前端必备基础知识:window.location 详解》
《不要再依赖CommonJS了》
《犀牛书作者:最该忘记的JavaScript特性》
《36个工作中常用的JavaScript函数片段「值得收藏」》
《Node + H5 实现大文件分片上传、断点续传》
《一文了解文件上传全过程(1.8w字深度解析)「前端进阶必备」》
《【实践总结】关于小程序挣脱枷锁实现批量上传》
《手把手教你前端的各种文件上传攻略和大文件断点续传》
《字节跳动面试官:请你实现一个大文件上传和断点续传》
《谈谈前端关于文件上传下载那些事【实践】》
《手把手教你如何编写一个前端图片压缩、方向纠正、预览、上传插件》
《最全的 JavaScript 模块化方案和工具》
《「前端进阶」JS中的内存管理》
《JavaScript正则深入以及10个非常有意思的正则实战》
《前端面试者经常忽视的一道JavaScript 面试题》
《一行JS代码实现一个简单的模板字符串替换「实践」》
《JS代码是如何被压缩的「前端高级进阶」》
《前端开发规范:命名规范、html规范、css规范、js规范》
《【规范篇】前端团队代码规范最佳实践》
《100个原生JavaScript代码片段知识点详细汇总【实践】》
《关于前端174道 JavaScript知识点汇总(一)》
《关于前端174道 JavaScript知识点汇总(二)》
《关于前端174道 JavaScript知识点汇总(三)》
《几个非常有意思的javascript知识点总结【实践】》
《都2020年了,你还不会JavaScript 装饰器?》
《JavaScript实现图片合成下载》
《70个JavaScript知识点详细总结(上)【实践】》
《70个JavaScript知识点详细总结(下)【实践】》
《开源了一个 JavaScript 版敏感词过滤库》
《送你 43 道 JavaScript 面试题》
《3个很棒的小众JavaScript库,你值得拥有》
《手把手教你深入巩固JavaScript知识体系【思维导图】》
《推荐7个很棒的JavaScript产品步骤引导库》
《Echa哥教你彻底弄懂 JavaScript 执行机制》
《一个合格的中级前端工程师需要掌握的 28 个 JavaScript 技巧》
《深入解析高频项目中运用到的知识点汇总【JS篇】》
《JavaScript 工具函数大全【新】》
《从JavaScript中看设计模式(总结)》
《身份证号码的正则表达式及验证详解(JavaScript,Regex)》
《浏览器中实现JavaScript计时器的4种创新方式》
《Three.js 动效方案》
《手把手教你常用的59个JS类方法》
《127个常用的JS代码片段,每段代码花30秒就能看懂-【上】》
《深入浅出讲解 js 深拷贝 vs 浅拷贝》
《手把手教你JS开发H5游戏【消灭星星】》
《深入浅出讲解JS中this/apply/call/bind巧妙用法【实践】》
《手把手教你全方位解读JS中this真正含义【实践】》
《书到用时方恨少,一大波JS开发工具函数来了》
《干货满满!如何优雅简洁地实现时钟翻牌器(支持JS/Vue/React)》
《手把手教你JS 异步编程六种方案【实践】》
《让你减少加班的15条高效JS技巧知识点汇总【实践】》
《手把手教你JS开发H5游戏【黄金矿工】》
《手把手教你JS实现监控浏览器上下左右滚动》
《JS 经典实例知识点整理汇总【实践】》
《2.6万字JS干货分享,带你领略前端魅力【基础篇】》
《2.6万字JS干货分享,带你领略前端魅力【实践篇】》
《简单几步让你的 JS 写得更漂亮》
《恭喜你获得治疗JS this的详细药方》
《谈谈前端关于文件上传下载那些事【实践】》
《面试中教你绕过关于 JavaScript 作用域的 5 个坑》
《Jquery插件(常用的插件库)》
《【JS】如何防止重复发送ajax请求》
《JavaScript+Canvas实现自定义画板》
《Continuation 在 JS 中的应用「前端篇」》
作者:大道至简1024
转发链接:
https://mp.weixin.qq.com/s/AVkbPPuI64dKmV2djKbHyg