JavaScript运行时环境和标准

更新日期: 2022-05-27阅读: 973标签: 环境

JavaScript 主要运行在浏览器端,随着技术不断发展出现很多服务端 JavaScript 运行时,甚至可以做硬件相关的嵌入式开发。

开发 Web 站点时,使用 SSG (Static Site Generation) 或 SSR (Server Side Render)等相关技术时 ,前后端开发可以使用同一种编程语言,对开发者的体验是相当友好。

但不同端的 JavaScript 运行时环境,会有一些差异。

Web 标准规范组织

JavaScript 标准规范是由 ECMA International 组织制定,但很多 Web apis 不属于 ECMAScript 规范标准。

这些 Web APIs 规范标准是由 WHATWG 和 W3C 来制定,包括 htmldom、调试用的 Console API、编码相关的 Encoding、请求相关的 Fetch API、存储相关的 Storage 等等,都有相关的规范标准。

浏览器端几乎所有的 Web APIs 都有规范标准,服务器端则会选择性的遵循部分 Web APIs 标准规范,而一些则是服务端特有的,比如 Node.js 的 Common JS 模块规范等。

JavaScript 运行时环境

JavaScript 的运行时环境就是各家的 JS 引擎,包括 Chrome 的 V8、Firefox 的 SpiderMonkey、Safari 的 JavaScriptCore,另外还有轻量化的 QuickJS、Hermes 等。

尽管都使用 JavaScript 语言,但到了服务端,JavaScript 就是一门后端语言,它没有 DOM、Window、Canvas、Cookies 等一些浏览器相关的 Web APIs,进而会有文件系统、网络相关 API、与底层操作系统交互的各种 API 等等。

Full JavaScript Runtime

现有服务端 JavaScript 运行时环境著名的有 Node.js、Deno,都基于 V8 引擎,Deno 则使用 Rust 来原生支持了 TypeScript 。

做为后端语言,优势为异步非阻塞、事件驱动机制。同时支撑着庞大的前端工程化相关体系,包括很多的脚手架、打包工具、一些前端相关的编译器等等。

Edge JavaScript Runtime

CDN 作为内容存储分发,用户可以就近取得所需内容;边缘计算则提供计算能力,让服务端的能力在靠近用户的边缘节点上就可以提供。

依托覆盖全球的边缘节点,在提供存储的基础上提供一定的计算能力,边缘计算可以更好的提高应用性能和延迟。


现有主流边缘计算相关的产品有:

  • AWS Lambda@Edge
  • Cloudflare Workers
  • Vercel Edge Functions
  • Netlify Edge Functions

他们都提供支持使用 JavaScript 来编写在边缘节点运行的后端代码(无需自己的服务器),Lambda@Edge、Cloudflare Workers、Vercel Edge Functions 采用 Node.js 来作为他们的 JavaScript 运行时,Netlify Edge Functions 则选择使用 Deno。

因为是边缘节点的 JavaScript 运行时,所以在使用一些 API 上会有所限制,比如不能使用本地文件系统、对代码大小的限制、执行时间限制等,并且会提供一些扩展的 APIs 来满足自己的相关业务需求。

普通的 CDN 中,你只能存取静态文件内容,没有命中则会从源站中取得然后缓存在节点中。边缘计算则可以将本来放在单个地区的服务器的一些业务逻辑放到靠近用户的边缘节点中,比如一些 A/B 测试、权限授权验证、缓存 API 内容、API 请求限制等等。

IoT JavaScript Runtime

在嵌入式设备上运行 JavaScript,需要在内存和计算资源都及其有限的情况下运行,并针对硬件有相关的优化。

大多会选择性的遵循 ECMAScript 部分标准和一些 Web APIs 规范标准,一切为了在嵌入式设备上可以流畅运行。

相关的 JavaScript 运行时:

  • jerryscript - https:// github.com/jerryscript- project/jerryscript
  • duktape - https:// github.com/svaarala/duk tape
  • Espruino - https:// github.com/espruino/Esp ruino
  • tiny-js - https:// github.com/gfwilliams/t iny-js

Application JavaScript Runtime

许多应用也会利用 JavaScript 运行时来实现自己的需求。比如因为 Node.js 的特性,很多 NoSQL 都使用 Node.js 来查询数据和管理应用。

Nginx 则通过自研 JavaScript 的运行时 njs 来扩展 Nginx 功能,参考 Nginx 中运行 JavaScript 详细介绍。

前端跨平台方案,小程序react Native、Weex 等,都会使用 JS 引擎,iOS 上一般会是 JavaScriptCore、Android 上则是 V8。因为使用在移动端,需要兼顾引擎的大小、性能、内存使用等,React Native 团队则自己研发了 JS 引擎 Hermes 。

WinterCG

WinterCG 社区(Web-interoperable Runtimes Community Group),是由 Cloudflare 、Node.js、Deno 合作最近正式成立的一个社区组。

致力于促进 Web APIs 标准的发展。让开发者可以在不同的 JavaScript 运行时中编写可移植的代码,包括浏览器端、服务端、嵌入式应用、边缘计算等,即 Write once , run everywhere.

我把 Web APIs 分为三种:

  • 只适用于浏览器端,比如像 HTML、css、Canvas 的规范标准,可访问性相关的标准等。
  • 只适用于非浏览器端,比如像本地文件系统、和操作系统交互的 API 等。
  • 多端通用,比如 Encoding、Fetch、URL、Stream 等。

WinterCG 的定位是,与现有的 Web APIs 标准规范组织(如 WHATWG 、 W3C)合作,充分考虑浏览器端和非浏览器端 JavaScript 运行时所需要的异同 ,让标准可以通用化。

如果一些标准在浏览器端和非浏览器端需要有必要的差异,则提供描述这些差异的清晰文档。

不排除如果一些功能只适合于非浏览器端,并且不于现在的 Web API 标准相冲突,则可能会发布自己的规范进行推进。比如只存在于服务端的文件系统等、未来发展的边缘计算 JavaScript 运行时中,必定会有只适合在该运行时的标准规范需要创建推进。

总结

WHATWG 和 W3C 在浏览器端的 Web APIs 标准规范已经很全。但随着不同类型的 JavaScript 运行时的发展,每种运行时的使用场景和解决的问题可能都会有所差异。

如果所有的 JavaScript 运行时都可以使用同一套标准规范,这必定有利于各 JavaScript 运行时的发展,各运行时可以直接使用已有的标椎规范来实现,而非自己实现临时的方案。

开发者可以以最小的代价移植应用程序到不同平台,比如可以无缝的在不同提供边缘计算服务的厂商中迁移,Node.js 和 Deno 的代码可以完全复用。

原文 https://zhuanlan.zhihu.com/p/521432526

链接: https://www.fly63.com/article/detial/11612

Webpack配置区分开发环境和生产环境

在项目开发的时候,我们通常会将程序分为开发环境和生产环境(或者叫线上环境),开发环境通常指的是我们正在开发的这个阶段所需要的一些环境配置,也就是方便我们开发人员调试开发的一种环境;

vue 全局环境切换

前端开发经常碰到切换环境的情况,测试环境,开发环境,正式环境,我们在utils中创建一个global.js文件main.js中使用

配置TypeScript工作环境

首先说明这个系列的博客是我刚刚接触TypeScript的学习笔记,可能不会太深入的解读一些原理方面的东西。但尽可能的把基础的入门使用解析清楚,毕竟使用TypeScript来实现的项目一般是比较复杂的项目,不仅仅只是简单的语法使用

typescript开发环境搭建

ts为typescript的缩写,是javascript的超集。由于 Node 的官方模块仓库网速太慢,模块仓库需要切换到阿里的源。执行下面的命令,确认是否切换成功。如果输出为 taobao字样,则表示切换成功

vue ssr服务端渲染环境搭建

网上有关ssr开发环境搭建的文章不算多,就算找到也是比较高级的,不太适合新手入坑;这篇内容只抽取了其中最重要的部分,实现最基础的开发环境搭建;所谓开发环境无非两件事:自动打包·自动刷新页面,叫法比较土,也可以叫热更新,热加载。

Mac配置PHP开发环境

众所周知,Mac对开发者非常友好,内置了很多开发语言的环境,比如Ruby、Python、PHP,本文主要给大家说一下小明 PHP环境的配置。我们编写好的PHP文件需要在Apache下运行,但Apache服务在Mac种默认是关闭的

vue需要nodejs环境吗?

vue需要nodejs环境,vue是一个js,但是安装它却有点与众不同。安装vue一般是通过npm进行安装,node.js中包括了这个npm,所以安装完node.js就可以使用npm了。使用vue-cli搭建项目时也需要nodejs。

dependencies和devDependencies有区分意义吗?

其实我们并不会去关心哪些是生产环境所需依赖,哪些是开发环境所需依赖,但是这也正常,因为其实在SPA项目中,这两个东西并不需要区分!所以我们平时没有过多了解也正常!

又出新JS运行时了!JS运行时大盘点

在前端技术日新月异的今天,新的 JavaScript 运行时环境不断涌现,它们为开发者提供了更多的选择和可能性。近期,诸如 LLRT 和 WinterJS 等新运行时环境的发布

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!