在上个月的柏林 JSConf EU 2019 会议上,npm 首席数据官 Laurie 通过一系列数据和分析介绍了 JavaScript 行业的现状,并展望了 Web 开发的未来前景。本文整理内容如下。
大家好,我是 Laurie,是 npm 公司联合创始人之一,也是 npm 的首席数据官。实际上我是一名 Web 开发者,过去 23 年来一直致力于让 Web 更加普及、体验更好、更易访问。
这次演讲中我主要谈 JavaScript,涉及几个主题:
首先是“我们是谁”,我们这些JavaScript开发者都是什么样的;
然后是“在哪里使用”,JavaScript都用在哪些领域;
“用什么工具”,使用哪些工具开发JavaScript;
还有“为什么”,为什么JavaScript如此受欢迎;
最后就是“接下来做什么”,谈谈JavaScript生态的未来发展。
我希望今天的演讲能让大家更好地了解 JavaScript 的现状,对自己正在从事的工作更有信心,并对一些之前从未听说过的新事物产生兴趣。
我所了解的这些信息来自于下面几个来源:
npm包管理库数据统计,其中包含规模惊人的开发者使用数据;
npm的2018/2019用户调查报告,2018年我们收到了16000份问卷,2019年收到了33000份之多。大家在调研问卷中为我们提供了丰富的反馈信息,让我们得以了解他们正在做和计划要做的事情;
2018年JavaScript现状调查报告,这是很好的补充和参考信息来源;
最后还有一项,就是JSconf EU过去十年来所有演讲的标题与文本内容数据。
有趣的数据内容
整整十年!JSconf EU 都已经举办这么久了,主办方把过去十年来的演讲文本都交给了我们,让我们做一下分析和数据挖掘,看看能不能挖出来一些有趣的内容。我们也总结了一些令人印象深刻的结论:
首先是讲座的数量,第一年只有44个讲座,今年足足提交了932个之多。
过去十年来所有演讲中最常见的表达就是“这次演讲中我们将要谈论……”,其次是“学到怎样……”,它们的使用频率很多时候不分伯仲。
我们还做了一个名为JSConf EU热度计的指标,用来追踪各种技术的受欢迎程度变化。我们分析了各种技术在讲座中被提到的次数然后做成图表,下图就是Node和npm的示例。可以看到大家谈论Node的次数比以前少了,而谈论npm的热度没有太大变化。
正式开始之前我要先做两个免责声明:
这次演讲中有些内容是事实,有些内容是我的观点。比如说我可能会展示一张图表,上面的数据显示你喜欢的技术正在逐渐没落,请尽量不要因此而感到气愤,因为这只是在阐述事实而已。你可以批判我的观点,为我的观点感到气愤,但我除了和npm有利益关联之外并不是任何技术的利益相关方,我列举的事实没有什么偏见。
当我提到“最流行”“最受欢迎”这类表述的时候,我并不是在说它“是最好的”,这两种意思是不一样的,不能划等号的。最流行的技术不见得就是最好的技术,我也不知道怎么定义“最好”“最优秀”。不过对于技术来说,用户众多本身就是一种优势:如果有很多人使用你的技术,那么就会有很多人去寻找并修复它的bug,编写很多教程,在Stack Overflow上有很多人为它解答问题,等等。流行的工具往往会让你的工作更轻松。
JavaScript 开发者画像
我们是谁?其实我们 JavaScript 开发者和其他人没什么区别。看看统计数据就会发现,我们和其他软件开发者的年龄分布、地域分布、使用的工具和配置文件都差不多。因为其实 JavaScript 开发者就是软件开发产业的主流群体。
如今全球有 1100 万 JavaScript 开发者,他们使用的开源软件比其他任何语言社区都更多。npm 存储库是当今最大的开源存储库,在几乎所有指标上都比排行第二的存储库规模大出两倍多。其他所有存储库加起来都没 npm 大。
在 GitHub 上,JavaScript 的代码行数等指标是所有语言中最多的,而且这个位置已经保持了七年之久。
Stack Overflow 对 8 万人做的调查报告也显示 JavaScript 是最流行的编程语言,有 68%的开发者会用到 JavaScript。JavaScript 开发者的数量也是过去所有语言中最多的。事实证明:
JavaScript是当下全球最流行的编程语言,也是有史以来最流行的编程语言。
随着 JavaScript 不断发展,我们发现 JavaScript 社区也在变化。根据过去两年 npm 的调查,我们发现 JavaScript 开发者越来越有经验,写 JavaScript 代码的时间越来越长。拿 npm 的使用状况来说,过去两年间 npm 用户中“新人”(使用时长少于 2 年)的比例在下降,老手的比例在增长。
此外,2014 年的时候很多 npm 用户是 JavaScript 老手,当时 JavaScript 开发者的数量比 npm 用户多很多;而如今 99%的 JavaScript 开发者都在使用 npm,新人初学 JavaScript 就会开始使用 npm。换句话说,现在 npm 的用户数据就等同于 JavaScript 开发者的整体情况了。
随着 JavaScript 开发者群体不断扩大,JavaScript 社区的关注重点也在发生变化。根据 npm 去年的分析数据,JavaScript 老手更重视优秀的实践;他们会做更多测试、使用更多的 linter 和包、更重视安全性,等等。整个社区都在变得更加成熟,开发者越来越关心这些事务。
过去一年来,越来越多的开发者开始关注开源模块的安全隐患。npm 也增加了一些验证和检测手段来保护发布者的账户和标记恶意软件包。但恶意包并不是最流行的威胁,更常见的是各种意外漏洞。所以 npm 去年引入了 npm audit 命令,通过升级软件包版本来查找和修复应用中的安全漏洞。仅在过去一个月中 npm 就执行了 3.35 亿次安全检查。不过相比安全问题,大家对性能问题的关注度更高,足足是前者的三倍之多。
此外,成熟的 JavaScript 开发者也更加关注他们使用的软件许可证,这真的很让人惊讶,我个人向来不管什么许可证的事情。有 58%的开发者表示软件许可证是他们选择开源软件的考虑因素之一,其中 55%的开发者表示他们的公司禁止他们使用某种许可证。
哪些许可证不受欢迎呢?其中有 GPL 和 AGPL,不过更多公司会禁止员工使用许可证不明的开源软件;因为如果公司要操心许可证的法律问题就得聘用法律顾问,当软件许可证不明的时候这部分开销会更多,所以如果你要开源你的软件就请把许可证放在显眼的位置,然后选一个大家熟悉的许可证。
虽然 JavaScript 是 2019 年最流行的编程语言,但还是四分之一的开发者并没有把它当作是自己的主力语言来用。换句话说他们之所以用 JavaScript 只是因为它太流行了,自己不得不用。在这部分开发者群体中,他们最常用的主力语言包括 TypeScript、Python、Java 等等。
另一方面,有 12%的 JavaScript 开发者只会使用这一种语言,其他什么语言都不用,这也是个很有趣的事实。
JavaScript 都用在哪里?
我们都会在哪里写 JavaScript 代码呢?答案是几乎所有你能想到的领域。首先来看大家在 JSConf 上谈论前端和后端的热度指标:可以看到多年来两大领域的热度一直不相上下,但最近几年前端的热度占据了上风。
有 97%的 JavaScript 开发者正在为浏览器写 JavaScript 代码,有 77%的开发者在为服务端写 JavaScript,可见 Node.js 依旧是社区中的主流方案。这里还有两个不小的惊喜:一是有 46%的开发者在用 JavaScript 写原生应用——我说的不是那种渐进式 Web 应用,或者 Web 应用在设备主屏幕上的简化小工具,而是正儿八经的原生 PC 或手机应用程序;另外还有 13%的开发者在编写嵌入式应用,应用在可穿戴设备、智能电器等领域。
下面我们来深入研究一些细节。
第一个问题,开发者为浏览器编写应用时,目标是移动端还是桌面端呢?答案是绝大多数人都会兼顾两大平台;虽说很多人都在喊移动优先之类的口号,但其实只有 2%的开发者只为移动平台开发 Web 应用;相比之下,有 27%的开发者完全不考虑移动端,这也可以理解——因为有很多 Web 应用可能永远都不会跑在手机上的。
下面来看原生应用的情况。有 46%的 JavaScript 开发者正在编写原生应用,其中移动端占据了主流——35%的开发者在写原生移动端应用,写原生桌面应用的占 26%。
可我们用什么工具写原生应用呢?这里就出现了一个问题。大家知道用 JavaScript 编写桌面应用主要使用 Electron 这个途径,可是写原生桌面应用的开发者有 26%,但使用 Electron 的开发者只有 21%。换句话说有 5%的开发者在使用其他工具写原生桌面应用,那他们在用什么呢?我是搞不清楚!而且 Electron 过去的使用率还有 24%,说明人们对它的兴趣还在减弱。
再来看看热度计,数据显示 2017 年后 Electron 的热度迅速衰退,到底发生了什么?我是更糊涂了。
下面是移动端开发者的情况。我设法测量了一系列框架的受欢迎程度,具体怎么测量的就不细说了。绿线是所有原生框架的热度总计,可以看出原生开发一直都很受欢迎,但相关的框架就越来越碎片化了。最流行的框架是 React Native,其次是 Cordova——后者曾经是唯一的选择,现在就没那么热门了。根据数据推断,大约 19%的开发者使用 React Native,加上 Cordova 一共是 35%左右。
最后再来看看服务端应用的现状。我们在哪里部署 JavaScript 呢?不出所料,Docker 和 Kubernetes 依旧是舞台主角,它们是我们部署 JavaScript 的主要目标;像 Heroku 和 Netlify 这样的平台表现也很出色;令人惊讶的是 VM,它并没有我们想象的那么受欢迎。除此之外,还有三分之一的开发者选择了无服务器部署,说明无服务器现在不再是什么新兴技术了,它已经无可置疑地成为了主流方案。
来看热度计。我选择了无服务器、微服务和 Docker 来做对比。Docker 从 2015 年开始兴起,但最近热度开始减退;无服务器的热度还在快速上升。
我们用哪些工具?
进入这个主题之前,首先我要引入一个名为“npm 库份额”的指标。这个指标很好用,不过也容易让人产生误解,所以我要先具体解释一下。
上面是 npm 库每周下载量的图表。现在我们每周的下载量高达 120 亿次,比过去增长了 250 倍之多。从下载量来看,所有内容的受欢迎程度都在上升。比如下面这个流行前端框架的下载量图表,可以看出它们的绝对增长速度非常快。哪怕是最冷门的软件包也在不断吸引新的用户,因为有很多人一开始面对这么大的库也不知道该从哪里入手,所以就随便挑点冷门的包下载吧。
用下载量的绝对数字做指标是行不通的,所以我们改用不同软件的相对份额来衡量它们的热度,就像是 JSConf 热度计那样,也就是所谓“npm 库份额”这个指标。这样一来什么事就都很清晰了——有些技术在上涨,有些持平,有些下滑,等等。但这里要牢记一点,份额的下降不代表绝对热度的下滑,只是意味着它发展的没那么快而已。在这个图表上稳定不变意味着增长了 250 倍,份额增大意味着增长率超过了 250 倍,反之是低于 250 倍。
我们来谈谈这些框架吧。2019 年前端框架领域总结起来非常简单,那就是 React 已经占据了统治地位。React 的下载量是排行第二框架的四倍多,它的受欢迎程度是前所未有的。有部分原因在于 React 并不仅仅是个前端框架,其实它都不算是一个前端框架;React 只是一个组件模型,可以用在 Web 应用、React Native 应用和桌面应用中。
再来看看对开发者的实地调研情况。根据我们的调查,有 63%的 JavaScript 开发者表示他们正在使用 React。但“使用”这个词还是比较模糊的,所以我们进一步问了一些具体问题。有 57%的开发者自己写 React 代码,6%的开发者在使用别人写的代码。注意剩下的开发者中,还有 15%的比例表示他们正在考虑使用 React。所以就算 React 现在都这么流行了,它依旧还是有一些增长潜力的。不过从 npm 库份额来看 React 的增长速度已经放慢了,未来究竟如何发展有待观察。
进一步挖掘,在 57%自己写 React 的开发者中,49%(也就是占全部开发者 28%的比例)的开发者将 React 作为主要工具使用。把其他“有时使用”React 的开发者都算上的话,就意味着差不多一半的 JavaScript 开发者会经常用 React。
谈谈其他框架。去年我自己出了个糗,因为我把 Angular 的第一版和第二版当成了同一个框架的两个版本,结果被别人纠正说它们俩完全不是一回事。Angular 第一版现在改名叫 AngularJS,而新版 Angular 和旧版是两码事,这真的很让人困惑。
自 2016 年以来 AngularJS 的库份额一直在下滑,Angular 新版自 2017 年以来也在下滑。但记住这里只是相对份额,绝对数字来看它们都在高速增长,赢得了大量新用户。
总体来看 Angular 非常受欢迎,37%的 npm 用户表示他们在用 Angular,有 20%的用户用的是 AngularJS,29%在用新版。这意味着 Angular 的用户总数起码有三百万。
另一个框架是 Vue,它是 React 之外唯一在高速增长的框架,其库份额在过去两年间翻了一倍,换算成绝对下载量增长就是超过 10 倍。我们的调查数据也表明现在有 27%的用户在用 Vue,用户规模快接近 Angular 了。
再从热度计看看几种框架的情况。2009 年大家都在讨论 Dojo 和 jQuery,现在基本没人提了;Angular 的热度 2015 年后也不行了;React 还在增长,和库份额数据一致。
上面没提到的一项内容是 Web 组件。因为 Web 组件是内置在浏览器中的,没人会去 npm 下载它们,所以我们也没法跟踪它的使用数据。另外 Web 组件似乎也不怎么受欢迎,JavaScript 现状调查报告显示只有不到百分之一的开发者在用 Web 组件。我不是有意无视 Web 组件,而且 Web 组件的用户都跟我说它的实际受欢迎程度远超我的估计,但这应该是自卖自夸吧。
说完前端框架,该讲后端的故事了。
后端框架已经经历了一场变革。以前我们讨论后端框架的时候主要谈的是 Sales、Amber 和 Happy 之类的话题;这些框架依旧健在,增长也很平稳。但现在人人都在写富前端应用,上面提到的这些静态框架面对新的需求已经力不从心了。
于是乎,前端框架粉丝们意识到他们需要使用预呈现的 HTML 来提升性能,然后给这种方案起了个响亮的名字叫“服务端呈现(SSR)”。然后大家发明了一些轮子(服务器、路由等等)来解决这个需求,也就是说重新发明了一堆后端轮子,让开发者可以使用熟悉的框架打造完整的服务端。
我不知道你们是怎么看这个事情的。对我来说,我很喜欢这种把组件扔进现有框架的主意,还不用管服务啦解析啦之类让人头疼的问题,很棒的想法嘛——但这个主意很眼熟啊,这不就是 PHP 么!要是将来有一天有人跟我说可以在服务器上 FTP 我的 React 组件,那么就彻底走完一个循环啦!
但要注意,这些 SSR 框架的份额现在还是很少。拿 Express 来对比,Express 自己就曾占据 npm 库 1.5%的份额,现在依旧份额不小。相比之下其他框架都是图中下面的横线那点比例。
剔除 Express 专门观察剩余的这一小部分时就能发现很多有趣的事情了。其中最受欢迎的是 Gatsby,它使用 React 并提供了一整套工具用来将其连接到后端部署。注意现在有 8%的开发者在用 Gatsby,相比之下前面提到的 Amber 和 Happy 的使用率都在 4%左右,比现在的 Gatsby 低得多。Gatsby 影响力已经很可观了,而且增长非常迅速。
下面的三个框架名字太像了。首先是 NextJavaScript,使用率有 9%,大家都很看重它;然后是 NuxtJavaScript,和 NextJavaScript 很像,但后者用的是 Vue;最后是使用 Angular 的 NestJavaScript,使用率应该在 2%,增长率很健康。
那么热度计数据呢?这可就难办了。“Next”这个词太常见了,大家用这个词一般不是指这个框架的;“Nest”这个词表示嵌套的意思,通常也不是在说 NestJavaScript 框架。所以热度计只能看 Gatsby 了,这些年来是在直线上升嘛!
GraphQL 与这些现在扮演后端框架角色的前端框架关系很密切,它是一种构建 API 来支持这些内容的新方法,很流行。如你所见,GraphQL 的核心库和两个最受欢迎的客户端都在高速增长,调查数据也印证了这种趋势。22%的受访者正在使用 GraphQL,此外有 49%的受访者表示他们正在考虑使用它,这个数字可是够大了,2019 年肯定会是 GraphQL 元年。
最后一组趋势数据是关于“逃离 JavaScript”的趋势。上面提到过有些开发者并不把 JavaScript 当作自己的主力语言,尤其是使用 Java、C#和 C++等类型语言的开发者。现在这种趋势中占主导的是 TypeScript,去年有 46%的受访者在用它,今年竟然增长到了 63%之多。
“使用”意味着什么呢?其实 15%的开发者只是在用 TypeScript 写的东西,这还主要是因为 Angular(Angular 是 TypeScript 编写的),所以 Angular 用户自动等同于 TypeScript 用户了。其实 React 和 Amber 里也都有 TypeScript,只有 Vue 和它没关系。
那么写 TypeScript 的用户中有多少是拿它当主力语言呢?52%。另外有 34%的用户偶尔会写。这意味着 36%的 npm 用户会经常写 TypeScript,多么惊人的事实啊——三分之一的 JavaScript 开发者再也不想用 JavaScript 了!顺便提一句,TypeScript 的一个功能是一些类型化的描述文件,这些文件托管在 npm 库里。上次我看这方面数据时,有 2.5%的下载量是类型描述文件,主要是 VS Code 自动下载来的,这得感谢微软了。
另一个逃离 JavaScript 的趋势是 WebAssembly。它能以接近原生的速度运行 Web 应用。除了性能以外它还能让人直接在 Web 上使用其他语言编写的现成代码。我觉得它最棒的一个功能是你可以编写模块发布到 npm 库里,然后无缝安装到你的应用中。
统计数据表明 WebAssembly 还处于初期发展阶段,只有百分之三的用户在用,也就是 30 万开发者;npm 库里只有 0.6%是 wasm 包,但这些包都很出色。值得注意的是有 54%的开发者在考虑使用 WebAssembly,说明它的发展潜力是非常大的。
为什么 JavaScript 是最流行的编程语言
在这个环节,我要回答的第一个问题是为什么 JavaScript 是最流行的编程语言?
首先我们是说 JavaScript“最流行”,别觉得它就是“设计最好”的编程语言。JavaScript 之所以如此热门,一大因素就是 npm 库的存在。有人做了一项研究,想搞清楚人们到底为什么选择某种编程语言,是因为它的功能?性能?还是被老板强迫用它?结果排在第一位的答案是这个语言存在很多开源库。如果一种语言有很多可以帮助大家完成工作的库,那么开发者就会很乐意用它。
不断有人给我发这张图片,显示 JavaScript 为什么有如此惊人的魔力——这张图画的很好,因为每当有人在 npm 中加一个包,JavaScript 的陷阱就会更深一些,吸引更多的开发者并把他们牢牢绑在这里。开发者越多,陷阱的吸力就越强。
这种状况还导致了一种新的现象,那就是出现了很多“不情愿的 JavaScript 开发者”。以前这类人数量很少,但现在起码有四分之一的 JavaScript 开发者属于这种类型。他们不喜欢写 JavaScript,讨厌 JavaScript,之所以还得写 JavaScript 是因为他们没有选择。这对其他 JavaScript 开发者来说不是什么好消息,因为讨厌 JavaScript 的开发者也写不出很好的 JavaScript 代码。
其实以前就有过这种事情,几年前 Ruby 开发者发现自己陷入了 JavaScript 的世界,他们很讨厌这样,在各种调查中表达不满,还试图发明 CopyScript 来解决这个问题。结果 Ruby 开发者的心声被听到了,如今 JavaScript 中有一大堆我们曾在 Ruby 中使用的功能。TypeScript 也是类似的路子。前面提到很多主要使用类型语言,尤其是 Java、C#等等的开发者,他们很想念类型,而 TypeScript 能让他们重新拥抱类型,非常讨他们欢心。
此外,我们的调查里对 WebAssembly 感兴趣的用户中有 17%表示,他们之所以对 WebAssembly 感兴趣就是因为不想再写 JavaScript 了。WebAssembly 可以让人们不用再写 JavaScript 了,这解放许多不情愿的 JavaScript 开发者。这不是什么坏消息,因为首先并不是所有人都会这么做,其次当人们编写 WebAssembly 时,想要共享代码的时候自然而然会想到 npm 库。他们继续用 npm 就能让 JavaScript 变得更强大,这是非常让人期待的事情。
下面来看 React 的情况。为什么它这么受欢迎?部分原因在于它并不是一个完整的 Web 框架,没有诸如路由、数据模型一类的东西。React 只是一个组件模型,它创建了真正可复用的优秀组件。比如说这个颜色选择器和日期选择器就是很好的例子。
React 还可以使用 React Hooks,这是一种处理状态的方法,你可以用 npm 把它们安装到你的应用里。React Use 这个库为你提供了一大堆酷炫的功能,它们都使用 Web API,你不需要从头编写大量代码就能轻松导入它们,为你的 React 应用增添色彩。
这也预示着一种美好的未来,我们可以把 Web 应用构建为一种新的层次更高的抽象;不用多操心服务端,只要把现成的组件放在一起,不用在每个项目中从零开始构建也能做出出色的应用。这也会形成一个良性循环,npm 的组件越多,吸引力越强,社区的能力也就越强。React 就会成为推动历史车轮前进的力量,永不停歇。但这样的未来也不一定会发生。React 的增速正在放缓,同时 Vue 却增长强劲。将来我们会看到 React 是否能一直保持现在的地位。
React 在前端的统治地位也完全改变了后端的面貌。现在支持 React 应用的服务端呈现框架比传统的后端框架更受欢迎。我们只要为客户端编写代码即可,不用再为服务端构建什么东西了。我们让服务器处理并呈现。让 Web 应用都变为富前端应用并在服务端呈现的想法很好吗?我不知道。但这个想法的确很流行很受欢迎,至少有一家浏览器厂商已经开始做针对性的优化,让浏览器可以更快地运行 React 应用。去年我认为 React 组件应该成为 WebAPI 的一部分,现在我也坚持这个观点。
未来展望
综合这些趋势和分析,我们就可以展望 JavaScript 的未来。
首先可以确定的是npm Tink,这项技术非常值得期待。
接下来是组件化的趋势。想象一下未来的Web世界:你只要组装各种各样的组件,不需要了解这些组件的细节就能创建非常棒的应用,多么诱人啊。人们讨厌VB6,但它曾经是全世界最流行的编程语言。VB6降低了编程的门槛,培养了整一代程序员。如今类似的故事在重演,想象一下开发Web应用变得只需要拖拖放放各种组件这么简单,那么会有多少新人加入到这个行业里呢?这并不会威胁现在程序员们的饭碗。高水平的程序员负责编写组件,然后十倍数量的普通开发者会用它们搭积木。一个全新的抽象层次,全新的Web开发者群体,这是非常令人兴奋的未来。
此外还有WebAssembly,你可以通过它为JavaScript世界带来其他各种各样的库,让它们互操作,使应用构建变得更容易,构建的内容也更丰富。最后是原生应用开发,有将近一半的JavaScript开发者在开发原生应用。将来我们的应用不仅会运行在Web端,而且还会出现在我们的手表、鞋帽、VR头盔等等设备上。JavaScript会无处不在,将所有语言都吸收到一个由不断扩张的开发者社区构建的大量开源组件的统一世界中。这样的未来已经可以想象出来了。
过去 23 年来,我从未像现在这样踌躇满志。所有的 JavaScript 开发者都站在这个舞台中心,在正确的时间出现在正确的场合参与到历史的进程中。Web 是推动善恶成长的神奇力量,它是玩具也是工具,是游乐园也是大市场。它为我们带来了令人惊叹和恐惧的强大力量。我们可以在 Web 上开辟天地,也能毁灭美好的事物。但我相信,长远来看我们将选择帮助世界成长的那条道路。我们都不同程度上做过有害的事情,但随着时间推移,我们的善念和善行会更加耀眼。
我希望今天分享的内容能帮助 JavaScript 开发者了解现状,激励大家前进,引发大家的兴趣。谢谢诸位观看。
英文原文: https://2019.jsconf.eu/laurie-voss/javascript-who-what-where-why-and-next.html
评论