国际新闻

您所在位置:首页 > 国际新闻 > 正文

一文道尽JavaScript 20年的发展史

文章作者:www.wwxingxi.com发布时间:2019-09-19浏览次数:950

图像

关于作者:Andrew Montalenti是Parse.ly的首席技术官,Parse.ly是一位长期的Python爱好者,也是初创公司和其他项目的创始人。

原文链接:

在过去的几个月里,我通过Node 8,Webpack 4和Babel 7提供的本机工具学到了很多关于现代JavaScript和CSS开发的知识。作为其中的一部分,我正在研究第二个“重新识别JavaScript”。我在1998年首次研究JS。然后在2008年,在“好的部分”时代,Firebug,jQuery,IE6兼容性,以及最终成熟的Node生态系统的时代。那时,我在线编写了一个部署最广泛的JavaScript前端系统。

图像

现在我在ECMAScript(ES6/ES2017)时代重新学习它,预编译,第三方库和模块化正式支持,以及PWA,代码分段和WebWorkers/ServiceWorkers等移动网络性能。令人惊讶的是,使用ECMAScript标准和Babel,JS已经发展成为一种非常好的编程语言,所有内容都被考虑在内。

为了巩固所有这些,我使用webpack/babel为简单的Python/Flask Web应用程序构建所有静态资产,并最终将其部署为具有数百个页面的静态站点。

一个周末,我使用ES2017功能移植了从Flask-Assets到webpack的所有内容,并探索了Sass CSS预处理器和一些D3.js示例。让我们从头开始!

我在1998年首次学习JavaScript。很难相信这是20年前的事了。本文将描述自那以来的二十年 - 涵盖1998年,2008年和2018年的JavaScript。本文的重点是“现代”JavaScript。根据我在2018/2019的理解,特别是非JavaScript程序员应该知道语言及其相关工具和运行时是如何演变的。

如果你是那种思维程序员,“我正在用Python/Java/Ruby/C编写代码,所以我不使用JavaScript,也不需要理解它。”你错了,我会说明原因。顺便说一下,你在1998年是对的,你可以在2008年拥有它,而你在2018年错了。

另外,如果你是程序员,他认为“JavaScript是一种非常快速的技术,我宁愿避免它,因为它缺乏基本的基础设施,我们认为这是'真正的'编程语言中理所当然的”,你也错了。我将能够告诉你,2018年“不认真对待JavaScript”与2008年的无知一样严重,因为程序员并没有认真对待Python或Ruby。

JavaScript不仅是一种语言,而且已经并将继续在几个重要领域接管世界。要成为一名认真的程序员,您必须了解JavaScript和其他服务器端语言的现代和优秀部分,例如Python,Ruby,Go,Elixir,Clojure,Java等。但是,尽管您可以使用不同的后端语言,但您无法避免使用JavaScript:它在各种Web部署方案中很常见。此外,开发人员工具完全响应您的期望。

浏览器是一个以开发为目标的苛刻环境;不仅互联网采用率低,而且互联网连接不仅速度缓慢,而且浏览器大战 - 主要是网景和微软之间 - 引起了很多混乱。

Netscape Navigator 4于1997年发布,Internet Explorer 5于1998年发布。网络仍在尝试理解HTML和CSS;毕竟,CSS1仅在一年前发布。

在这种环境下,当时最权威的Web开发书籍是“JavaScript:The Definitive Guide”,超过500页。请注意,在1998年,使用最广泛的编程语言是C,C ++和Java,以及Microsoft Visual Basic for Windows。因此,“什么是编程”的主题主要围绕这些语言。

从这个意义上说,JavaScript是非常不同的。它没有编译器,没有调试器(至少不是一个好的调试器),没有办法“运行JavaScript程序”,除了在浏览器中编写脚本并查看它们是否正在运行。 JavaScript开发工具仍然是原始的或不存在的。当然,JS中没有很多开源社区;为了弄清楚如何做事,你通常会在其他人的网站上“查看源代码”。此外,Web开发人员编程社区中的大多数讨论都是JavaScript中兼容性和安全性的噩梦。

不仅可以跨浏览器实现不同的实现,而且有很多方法可以直接依赖JavaScript来破坏Web应用程序的安全性。那个时代的一个常见安全漏洞是使用JavaScript验证表单,但仍允许将无效(和不安全)值传递给服务器。或者,密码系统,但检查JavaScript代码本身可能会破坏对系统的访问。结合缺乏适当的开发环境,使用JavaScript的“真正的网络程序员”只是最后的手段 - 将一些客户端代码和逻辑注入服务器的服务器端。我记得当时JavaScript最常见的用例之一是在悬停时更改图像,作为样式效果,或在复杂的多选项卡表单上实现基本悬停菜单。目前,这些任务可以在纯CSS中实现,但当时,JavaScript DOM操作是您唯一的选择。

快进到2008年10年,Douglas Crockford发布了“JavaScript:The Good Parts”一书。通过使用语言子集方法,Crockford指出JavaScript不仅仅是一种糟糕的语言,它实际上是一种优秀的语言,设计精良,具有一些关键特性,使其比竞争对手更加突出。

大约在这个时候,一些JavaScript库变得流行,尤其是jQuery,Prototype,YUI和Dojo。这些库试图为JavaScript提供它缺乏的东西:跨浏览器兼容性和用于动态操作浏览器中页面的编程模型,特别是对于新兴的JavaScript编程模型--AJAX。这是富Internet应用程序,“动态”Web应用程序,单页应用程序等趋势的开始。

JavaScript开发工具也取得了一些重要的飞跃。 2006年,Firefox团队发布了Firebug,这是Firefox的JavaScript和DOM调试器,后来成为世界上最受欢迎的Web浏览器和开源之一。两年后,谷歌将首次发布谷歌浏览器,它捆绑了一些开发者工具。在Chrome发布的同时,谷歌还发布了V8,这是嵌入Chrome内部的JavaScript引擎。这标志着全世界第一次看到JavaScript语言的完整,高性能开源实现,该语言未与浏览器完全集成。 Firefox的JS引擎SpiderMonkey是源代码树的一部分,但它不必是模块化的,而是在Firefox浏览器的上下文之外使用。

我记得除了Crockford确定JavaScript的优势之外,还有新的(和更好的)开发人员工具,一篇关于Mozilla的特定文章帮助我重新欣赏了语言并放弃了我1998年的概念。该文章称为JavaScript重新引入。它表明JavaScript实际上是一种真正的编程语言。它的标准库有点不足,所以你必须依靠框架(比如jQuery)为你提供一些工具,以及其他微库。

阅读那篇文章一年后,我写了一篇关于JavaScript的文章,称为“使用JavaScript的真实,功能程序”。它将JavaScript描述为一种非常令人惊讶的函数式语言,而不是Java 8或Python 2.7。而只需专注于理解功能的核心,就可以编写非常好的程序。我最近将这篇文章转换成了一组名为“Lambda JavaScript”的教学幻灯片,我现在用它来教授新设计师/开发人员第一原理语言。

好吧,让我们回到历史。 Chrome发布仅一年后,在2009年,我们看到了第一个版本的NodeJS,它使用V8 JavaScript引擎并将其嵌入到服务器端环境中。它可用于在REPL上测试JavaScript以进行脚本编写,甚至可以依靠高性能事件循环功能来实现HTTP服务器。

人们开始尝试用JavaScript编写的命令行工具和用JavaScript编写的Web框架。正是在这一点上,JavaScript社区的发展速度越来越快。 2010年,npm(节点包管理器)发布,其包注册表迅速发展,代表了完整的JavaScript开源社区的兴起。在接下来的几年里,Mozilla,谷歌,苹果和微软的浏览器厂商参与了“JavaScript引擎战争”,每个人都将SpiderMonkey,V8,Nitro和Chakra提升到一个新的水平。

同时,NodeJS和V8从命令行成为开发人员机器上运行的“标准”JS引擎。虽然开发人员仍然必须与旧的“ECMAScript 3”浏览器(例如IE6)兼容,但他们必须编写受限制的JavaScript代码,但Mozilla,Google和Apple的“年轻”(自动更新)浏览器适用于ECMAScript 5及其后续版本的支持ES版本,移动网络浏览已成为主流,使Chrome和Safari占据主导市场份额,特别是在智能手机上。

我记得在2012年,我发表了题为“用JavaScript编写真实程序!”的演讲。在当地的技术会议上。 “!”标点符号是故意的。这是我在一个充满开发人员的房间里记得的时代的变化:即“用JavaScript编写真正的程序.实际上可能!”将这些幻灯片视为历史网站这非常有趣。在讲座的前半部分,我让观众相信JavaScript的功能核心实际上非常好。然后我花了下半部分说服NodeJS可能.它可能.创建一个开发工具生态系统和JavaScript的标准库。像Comet vs Ajax这样的东西也有一些有趣的“环球航行”幻灯片,实际上并不多(但提醒技术趋势是好的)。

几年前,在Web 2.0,云和移动设备的噪音中,我们终于来到了移动时代。 2015年,移动流量超过桌面流量。我们还看到几个桌面操作系统迁移到大多数常绿模型。例如,Windows 10,Mac OS X和ChromeOS。因此,早在2015年 - 但肯定要到2018年--JavaScript是部署最广泛且性能最高的编程语言,在世界上几乎所有台式机和移动计算机上都具有“内置支持”。

换句话说,如果您希望您的代码在2015年左右“一次编写,随处运行”,那么最好的选择就是JavaScript。好吧,今天更是如此。广泛分布的代码的可靠选择仍然是JavaScript。正如Crockford在2008年预测的那样:“幸运比聪明更好。”

关于JavaScript社区的一些事情在2018 - 2019年发生了变化。开发工具不再是刚刚起步,而是成熟。所有Safari,Firefox和Chrome浏览器都有内置的开发工具(大多数Firebug项目已被弃用)。还有一些方法可以使用移动开发工具调试移动Web浏览器。 NodeJS和npm是成熟的项目,是整个JavaScript社区的共享基础架构。

更重要的是,JavaScript已经发展成为一种语言。它不再仅仅是我们在1998年所知道的核心语言,它不再是我们在2008年所知道的“好部分”,而是JavaScript的“现代部分”包括几个新的语言特征,名为“ES6”(ECMAScript v6)或“ES2017”(ECMAScript 2017版)等。

HTML中的一些概念已经发展,例如HTML5视频和音频元素。随着CSS2和CSS3规范的批准和广泛采用,CSS也在不断发展。当然,JSON几乎完全取代XML作为交换格式,基于JavaScript。

V8引擎也实现了很多以性能为导向的开发。它现在是一种JIT编译语言,具有快速启动时间和CPU绑定块的快速近原生性能。现代Web性能技术几乎完全基于快速JavaScript引擎和脚本,可以编写Web应用程序加载方法的不同元素。

语言本身已适应可能在Python,Ruby,C和Java社区中找到的“编译器”和“命令行”工具。而不是JavaScript“编译器”,我们有节点,JavaScript单元测试框架,如Mocha/Jest,以及eslint和babel进行语法检查。

我们在我们最喜欢的浏览器中构建了devtools,而不是“调试器”,例如Chrome或Firefox。这包括丰富的调试器,REPL /控制台和可视化检查工具。与节点环境或浏览器进程的脚本化远程连接(通过诸如Puppeteer之类的新工具)进一步关闭了开发过程。

因此,在2018/2019中使用JavaScript是一个已经达到2008年成熟度的系统,您将在Python,Ruby和Java的编程生态系统中看到它。但是,在很多方面,JavaScript已经超越了这些社区。例如,Python 3的参考实现CPython在动态语言方面肯定是快速的。 JavaScript的参考实现V8通过JIT和热点优化技术进行优化,这些技术只能在更成熟的编程社区中找到,例如Java(在Sun中)在应用时代/高级编译器中已经实现了数百万美元的商业支持技术。这意味着未经修改的热点JavaScript代码可以通过Node Runtime和Chrome等浏览器自动针对本机代码进行优化。

虽然Java和C用户仍然可能会争论开源项目应该在何处发布其版本,但这个问题在JavaScript社区中得到了解决:它是npm,它在Python社区中像PyPI和pip一样运行。

最近才解决了一些重要的开发人员工具问题。例如,由于现代JavaScript(例如使用ES2017功能编写的代码)需要以旧版浏览器为目标,因此您需要使用“变换”工具将ES2017代码编译为旧版浏览器的ES3或ES5 JavaScript代码。因为“旧JavaScript”是图灵完整的函数式编程语言,我们知道我们几乎可以将任何新的“语法糖”翻译成旧语言。实际上,新语言功能的设计者只是谨慎地引入语法才能安全。编译。

但是,这意味着为了在JavaScript中开发“现代方式”,在使用其新功能时,您只需要使用本地转换器工具。当前的社区标准被称为babel,它很可能在未来很好地维护社区标准。

困扰JavaScript的另一个问题是构建工具和模块化。在2008-2012时代,像make这样的特殊工具被用来将JavaScript模块连接在一起,而基于Java的工具(例如Google的Closure Compiler或UglifyJS)经常被用来将JavaScript项目组装成可以包含在页面中的模块。在2012年,Grunt工具作为JavaScript构建工具发布,在NodeJS上编写,从命令行运行,可以使用JavaScript“Gruntfile”进行配置。在此期间发布了许多这样的构建工具,导致大量代码丢失和混乱。

幸运的是,今天像React这样的单页面应用程序框架在很大程度上解决了这个问题,包括webpack的优点和对NPM运行脚本的依赖。今天,webpack社区已经提出了一种合理的JavaScript模块化方法,它依赖于现代JS对模块的支持,然后主要通过webpack CLI工具提供的开发时间工具来构建本地开发和生产。这可以通过编写脚本并使用简单的NPM运行脚本命令将它们连接在一起来完成。因为webpack本身可以通过npm安装,这使得整个开发堆栈的自包含方式与Clojure中的lein或Python中的Python/PIP不同。

是的,已经20年了,但现在JavaScript已经成为Python后端和CLI工具项目的可行选择。对于网络的前端,它是您唯一的选择。所以,如果你是一个关心向用户分发代码的程序员,你应该关心JavaScript。

有兴趣的学生可以关注微信公众号爸爸号码农民,并不时分享有关投资,财务管理和IT的信息。

图像

http://wap.sunteeming.net.cn