每个市场都受到某些常见概念的制约,JavaScript 也不例外。

产品生命周期就是其中的一个概念,它可用于多个不同的环境,用以了解和预测产品的行为。这是一个商业概念,能够帮助我们了解产品在其生命中经历的阶段,并解释这些阶段对其受欢迎程度的影响 —— 在大多数情况下以销售情况来体现。可以通过观察市场行为模式评估产品当前所在的阶段,从而对其受欢迎的程度做出一些预测。

产品开发生命周期

产品生命周期有四个阶段:引入、增长、成熟和下降,在上图中,你可以看到每个阶段对预期产品销售的影响。例如智能手机的销售额并没有像五年前那样增长 —— 实际情况恰恰相反,客观地说智能手机正在进入成熟阶段。

在过去几年中,可以看到在 JavaScript 中引入了许多新技术,但我们需要时间来了解市场将如何采用它们。没有人想成为掌握无用技术的专家。在本文中,我将分析 JavaScript 的流行度,以及可能影响这种流行度的因素,并尝试预测 JavaScript 的未来趋势。

JavaScript 语言功能的未来

自欧洲计算机制造商协会(ECMA)为 ECMAScript 建立年度发布周期的机制以来,我们还没有看到太多的新功能出现在语言中 —— 每年只有几个。这可能是被编译为 ES5 的语言增加的原因之一,如 TypeScript 或 ReasonML 都为社区高度要求的语言带来了新功能。但这并不新鲜 —— JavaScript 之前曾经历过这个过程(CoffeeScript),这些功能最终会被合并到语言标准本身,这可能是我们未来可以期待的新类型的功能。

但是我们开始看到随着浏览器中 WebAssembly 的可用性的增加,compile-to-js 的游戏规则发生了变化。现在我们几乎可以用任何一种语言,并将其编译为在浏览器中以几乎本机的速度运行,更重要的是,我们已经开始看到未来功能的支持,如线程支持,这将使我们能够利用代表未来的的多处理器架构设备。

WebAssembly官方工具链能够帮助你编译 C/C++ 代码,但是许多社区也提供了不同语言的编译器,如 RustPythonJavaBlazor(C#)

特别是 Rust 社区非常活跃,我们开始看到完整的前端框架,如YewDodrio

这为基于浏览器的应用带来了更多新的可能性,你只需要测试一些使用 WebAssembly 构建的优秀应用,就可以知道基于浏览器的近乎原生的应用现在已经成为现实,例如 SketchupMagnum

编译为 ES5 的类型语言已经足够成熟,玩家也已经很成熟,并且在不久的将来这些语言并不会消失(或与ES合并),但我们会看到类型语言会缓慢的改变 WebAssembly。

Web 端

前端框架

每年,我们都会在 web 前端框架市场上看到一场大战,由于 React 推出了他们的 game-changer、Virtual DOM 等技术,在过去几年里一直是无可争议的赢家,可以看到它的竞争者几乎也用了类似的技术,以便在战斗中不被淘汰。

几年前,我们看到 Svelte(一种“编译框架”)引入了一种全新的 Web 应用开发方法: 依赖在编译后消失,只留下小而高效的 JavaScript 代码。然而这个功能还不足以说服社区转移到 Svelte,但随着最近推出的 Svelte 3.0实时响应式编程引入框架并使社区激动不已,所以也许我们正在见证前端框架中的下一个重大事件。

灵感来自 destiny operator

var a = 10;
var b <= a + 1;
a = 20;
Assert.AreEqual(21, b);

Svelte 在编译时指示代码以拓扑顺序执行,通过重载 label 语句,为 JavaScript 带来响应性:

var a = 10;
$: b = a + 1;
a = 20;
Assert.AreEqual(21, b);

这是一个激进的新想法,可能会在不同的情况下有所帮助,因此 Svelte 的创建者也在 svelte-gl(一个编译器框架)上工作,它将直接从 HTMLx 中声明的 3D 场景图生成低级 WebGL 指令。

不能说 ReactAngularVue.js 将会在一夜之间消失,他们的社区非常庞大,并且将在未来几年保持这种态势 —— 我们甚至不确定 Svelte 是否会成为真正的继任者,但我们可以确定的是:我们迟早会使用不同的东西。

WebXR 和沉浸式 Web 的未来

虚拟现实在过去 60 年里一直在努力寻求成为主流,但这项技术还没有准备好。不到十年前,当 Jon Carmack 加入 Oculus VR(现在是 Facebook Technologies 的一部分, LLC)时,新的 VR 浪潮开始兴起,从那时起,我们已经看到很多新设备支持不同类型的 VR,当然还有支持 VR 的应用程序的激增。

浏览器供应商不想失去这个机会,因此他们加入了 WebVR 规范,允许使用 WebGL 在 JavaScript 中创建虚拟世界,并且出现了 three.js 之类知名的库。然而拥有 6dof 设备的用户的市场份额对于大规模 Web 部署来说仍然微不足道,但移动网络仍然能够通过设备定位 API 提供 3D 体验,所以我们能够看到一堆实验性的应用和很多全景视频

2017年,随着 ARKitARCore 的推出,新功能被引入移动设备和带有 ARMR 体验的各种应用程序。

但是,当你探索周围的世界时,为特定的 AR 体验下载一个特定的程序仍然感觉有点不自然。如果我们只用一个程序来探索不同的体验……这听起来很熟悉。我们过去用浏览器解决了这个问题,为什么不再来一次

去年,Mozilla WebXR设备API规范(在撰写本文时,最后一份工作草案是在两周前将 AR,VR 和 MR (ergo XR)功能引入了浏览器。

一些最重要的浏览器供应商紧随其后,但有一个重要的例外:移动版 Safari,所以为了证明自己的观点,Mozilla 发布了一个支持 WebXR 的iOS平台浏览器 WebXR Viewer

现在,这是一个重要的步骤,因为 AR 和 VR 的结合将 6dof 带到了移动设备和基于移动设备的耳机,如 Google CardboardSamsung Gear VR等,大幅提高了 6dof 设备的市场份额,并实现大规模 Web 部署的可能性。

与此同时,Mozilla 的工作人员一直致力于开发一个新的 Web 框架,用以促进创建名为 A-Frame 的 3D 世界和应用程序,这是一个基于组件的声明框架,其 HTML 语法基于 three.jsWebGL,它只考虑一件事 —— 将乐趣和轻松带到 Web 编程中。

这是他们对沉浸式 Web 讨伐的一部分,这是关于未来 Web 的一系列新构想。幸运的是他们并不孤单,我们将会看到越来越多的身临其境的体验页面。

如果你想尝试一下,请下载 WebXR Viewer 并访问此站点了解沉浸式网络的可能性。

再次强调,标准的基于浏览器的应用不会在一两年内消失 —— 我们可能会一直使用它们。但 3D 应用程序和 XR 体验正在增长,市场已经准备就绪并且渴望拥抱它们。

ES6 的原生支持

在过去十年中,几乎所有用 JavaScript 发明的技术都是为了解决浏览器底层实现所产生的问题而创建的,但是过去几年平台本身已经成熟了很多,而且大多数问题已经消失了,我们可以看到其与 Lodash 一起统治了性能基准。

DOM 也是如此,其存在的问题曾经是创建 Web 应用框架的灵感。现在它却是成熟的API,你可以不用框架创建程序 —— 实际上这就是 web components。它们是创建基于组件的应用程序平台的“框架”。

关于平台演变的另一个有趣的部分是语言本身。过去几年我们一直通过 Babel.js 来使用 ECMAScript 的最新功能,但由于标准本身在最后一点开始停滞不前几年,这足以让浏览器厂商实现他们的大部分功能,包括静态导入声明的原生支持。所以现在我们可以开始考虑在没有 Babel.js 或其他编译器的情况下创建应用程序,因为我们(再次)支持自己的平台中的语言功能,以及由于 Node.js 使用了与 Google Chrome 相同的 V8 VM ,我们已经看到 Node.js 对 ES6 更强的支持。

并不是说我们不会再看到专业级的应用程序编译,但是这意味着从基于浏览器的应用开始将像以前一样简单而有趣。

服务器端 JavaScript

尽管 JavaScript 在 1995 年就可以基于 Netscape Enterprise Server 开发服务器端,但直到 Ryan Dahl 在 2009 年的演示之后,JavaScript 才开始被认真的考虑用于服务器端应用。在过去十年中,Node.js 发生了很多事情。它不断发展和成熟,再次创造了突破新技术的机会。

Node.js 的创作者 Ryan Dahl 一直致力于用 Deno 探索服务器端安全的应用程序的新视角,这个平台本身支持最新的语言功能 async/await,以及最受欢迎的能够编译为 js 语言的 TypeScript,由于他基于Rust的实现以及 Tokio 的使用,能够达到最佳性能 。但更重要的是,新的安全哲学将其与大多数服务器端平台区分开来,(如PythonRubyJava)。受浏览器安全模型的启发,Deno 只有在用户明确授予进程权限后才能使用主机的资源,这在开始时可能有点乏味。但是仅仅通过信任平台,允许我们在安全的环境中运行不安全的代码,可能会产生很多重要的影响。

Node.js 的未来仍在那里,但我们可能会开始看到像 AWS Lambda 这样的 serverless 服务和 Azure Functions 提供 Deno 功能的替代方案,在其系统上提供不安全的服务器端代码执行。

结论

这些都是 JavaScript 世界激动人心的地方 —— 许多技术已经成熟到足以为创新留出大量空间的地步,活跃的社区一只都在用令人惊叹和难以置信的想法让我们惊讶,而且我们期望有很多新的替代方法来建立成熟的工具,因为他们的成熟阶段很快就要到了;我们不会停止使用它们,因为它们中的大部分都非常好,并且在实际项目中有充足的证据,但是令人兴奋的新的市场将开始出现,你最好做好准备。

随着开发速度的提高,掌握最新的 JavaScript 动态并不容易,但有一些资源可以提供帮助。首先在我看来,最重要的新闻来源是 Echo JS,每小时你都会获得大量的新内容。但是如果你没有时间,那么 JavaScript Weekly 时事通讯为你提供一周的 JavaScript 精彩摘要。除此之外,关注世界各地的会议以及 JSConfReact Conf 等 YouTube 频道也很重要,Google Chrome Developers 也非常有帮助。

相反,如果你有兴趣看到一些建设性的批评 JavaScript 的方向,我建议阅读由 Justen Robertson 撰写的作为一个JS开发人员,这是什么使我夜不能寐 一文。