查看原文
其他

JavaScript 不再像以前那样

CUGGZ 前端充电宝 2022-07-21

现在很多人都在抱怨:JavaScript的状态是多么混乱,随着生态系统不断扩大,一个问题有不同的解决方案,而且似乎没有一个是社区标准。说到 UI 框架,有十几种:React Angular、Vue.js、Svelte等流行框架,以及Inferno、pReact、Riot、Polymer、Aurelia、Ember、Knockout、Mithril、Dojo 等。

打包工具?CSS框架?CSS-in-JS工具?包管理器?测试框架?许多概念蓬勃发展:SPA、SSR、Ant、微前端...

15 年前,Web 不像现在的平台那么严谨。当时 JavaScript 只是一个操作 DOM 节点并发出 AJAX 请求的玩具。如果你知道如何使用 Vanilla JS 在棋盘中制作动画,那你就是一个很酷的孩子。JQuery 在 2006 年迅速崛起,它简化了工作流程,以至于没有必要再对 JavaScript 提出更多的要求。

这不仅仅是一个框架的问题,JavaScript 本身存在很多问题。缺乏类型系统是很糟糕的,类型的强制是很奇怪的,undefined 和 null 的存在令人困惑。以至于有开发者决定干脆停止使用 null,类似的问题数不胜数。

Douglas Crockford 曾写了一本著名的《JavaScript:the good parts》,这是许多经验丰富的 JavaScript 工程师的重要学习资源。这本书成为下面这幅著名图画的一部分,它展示了一个明确的信息:「整个 JavaScript 只有一个子集是"好的"。」

动物代表了书的重量

但是,很多人往往会忘了一件事。

JavaScript 已经 26 岁了

1995 年,来自网景公司的 Brendan Eich 在短短 10 天内开发了一种受 Java 启发的语言。它开始被命名为 LiveScript、Mocha,最后命名为 JavaScript。

该语言随后被嵌入到网景浏览器中,而 Microsoft 为 Internet Explorer 设计了自己的JScript语言(ECMA 规范的一种实现),它作为网景的第一个真正竞争者进入浏览器市场。

这就是 Internet Explorer 的开始,它的噩梦在版本7达到高潮,当时我们必须为项目编写特定的IE代码。2007年火狐和Opera加入了臭名昭著的浏览器大战,Chrome 也在一年后问世。

尽管如此,web 并没有等待战争结束。许多增强功能将被添加到 JavaScript中,ECMA 委员会有一项职责:不要破坏web。直到今天,没有其他语言能像 JavaScript 那样长久。

从诞生之日起,JavaScript 用了将近 10 年的时间才成为一种强大的语言,嵌入了客户端-服务器通信,并在 Web 上提供了丰富的动态体验。

随着技术的发展,无论是在功能上还是在美学上,web都有必要紧跟技术的发展。JavaScript实际上是 Web 的动态客户端语言,到目前为止还没有竞争对手。但它必须接受自己的缺陷,同时向更现代的设计迈进。应用程序变得更重、更复杂,JavaScript不再是一个玩具。

这就导致了JavaScript 超集的诞生,即 CoffeeScript 和 TypeScript,后者现在是市场的赢家。将类型引入 JavaScript 可以显著增强可维护性,并简化协作。但它在这个过程中添加了一个构建步骤,这在当时还不是JavaScript工具包的一部分。

这时出现了一个大玩家,一个将改变一切的人:Node.js。几年后,NPM紧随其后,它最终解决了每种编程语言的一个常见问题:「依赖关系管理」。这一演变成为了web客户端开发的一个巨大转变。

正如你所看到的,JavaScript有一个巨大的背景,它无法摆脱,否则 web 就会崩溃。委员会也别无选择,只能保留大部分内容,同时添加新功能以弥补缺陷。ECMAScript 2015(ECMA 6.0)将类语法引入JavaScript,随后ECMAScript 2016(ECMA 7.0)和 ECMAScript 2017(ECMA 8.0)将promise、generators、async/await添加到JavaScript中。

JavaScript的遗留问题是无法在没有不可估量的后果的情况下改变的。我们对此无能为力。JavaScript注定会保留其旧的缺陷。

而好消息是:避免这些缺陷是比较容易的。

JavaScript 被高估的痛苦

在Twitter上有很多关于奇怪强制、浮点错误、undefined实际上是两个值(要么是属性不存在,要么是属性存在但未定义)等问题。

但它并没有就此止步,所有的这些缺点都是出了名的糟糕。但作为一个初学者,我们中有多少人真正遭受过浮点转换的痛苦?大多数问题只会影响到少部分开发者。解决强制问题只需要再加一个等号,使用严格的等式,然后完全消除强制。

开发人员确实不应该与语言的缺陷作斗争,但不幸的是,事实就是这样。然而,就我的工作而言,我还没有遇到语言本身的问题,它所需要的只是避免不好的部分。

JavaScript 很有趣

我甚至要说一些可能会冒犯纯粹主义者的话:我用JavaScript编程很有趣。首先,我是一名C语言程序员。与JavaScript相比,该语言更简单(不是更容易),但互动性要差得多。我也做了很多PHP,即使在今天,这种语言的结构也不如JavaScript优雅:传递回调、使用Promise、在数组上链接方法,所有这些都是传统PHP中的一个大禁忌。

但在 JavaScript 中,通过其集成的垃圾收集器,一切都变得简单:

  • 不需要管理 IO 缓冲区(读取文件、套接字、管道…),字符串会根据需要自动扩展;
  • 它是一种带有事件循环的单线程语言,因此不必掌握与线程同步和通信相关的知识(除非制作多进程的Node.js应用程序);
  • 与多线程环境相比,JavaScript中的并发编程要容易得多;
  • 甚至不需要对堆栈分配有所了解;
  • 可以链接方法调用(连续调用),虽然这在处理数组时较少,而经常在对象上使用。
  • JavaScript允许的结构(链接,回调,promise和函数式编程)使得编写优雅的代码变得容易。

所有这些功能不一定是 JavaScript 独有的,但是使用它们非常有趣。如果仔细应用一些编程风格的原则,比如 SOLID原则或GoF设计模式,再加上函数式编程范式和对JavaScript怪癖的理解,那么就为可维护性铺平了道路。我坚信开发人员快乐的最重要因素仍然是在现有代码库上便利的工作,因为这是我们每天都要处理的问题。我们厌倦了吗?

我们有很多框架,它们或多或少都在做同样的事情,尽管有所不同。这些选择让我们很多人陷入困惑,因为在工作中我们需要时间去评估一个工具表现如何。我们是有选择权的,就像给婴儿多个玩具玩一样。这就是创新的驱动方式。

我们不需要学习相关的每个框架和每个工具。在过去的四年里,我主要使用 React、 Angular 和 Vue.js,还有一些 Svelte。我了解足够多的 Webpack 和 Babel 来让我的应用程序正常工作,这已经足够了。

「学习工具的原理和概念比使用它更有意义。」

JavaScript 不再像以前那样

「JavaScript 不再是人们可以嘲笑的玩具」。它正在为每个网站来提供丰富的交互,这些都是现在司空见惯的事情。

的确,JavaScript 有缺点,而且它不会很快摆脱这些缺点。幸运的是,只要稍加小心,就很容易避免这些问题。

是的,有很多框架,时不时会有新的框架出现,我们被反复告知要保持最新状态。但是在过去的十年里发生了多少重大突破?

举几个例子:Angular(SPA)、Babel(Transpiler)、React(声明式 SPA)、Webpack(打包)、Svelte(静态生成站点)和 JAM Stack、React-Native/NativeScript(用于构建原生应用程序的 JS )。

大多数框架和库都或多或少地围绕着相同的想法,这当然需要时间来掌握,「但是一旦学会,这些知识不需要再次学习就可以与其他工具一起使用」

与此同时,有些人仍在使用 jQuery,并对它感到满意。看起来那些人并没有因为疲劳而筋疲力尽。

「JavaScript 不再像以前那样了」。它长大了,但还没有成熟。

作者:Anthony Cyrille
译者:CUGGZ
原文:https://javascript.plainenglish.io/javascript-is-not-what-it-used-to-be-de4c623f3db5

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存