Deno 兼容浏览器具体指的是什么?

Deno 里面有一句描述:"Aims to be browser compatible",可以看到 Deno 的目标是兼容浏览器。那么这里的兼容浏览器到底如何是什么意思呢?

我简单谈谈我的理解吧。

首先这里的兼容性肯定不是 Deno 直接在浏览器端运行。因为 Deno 是一个和浏览器平级的 Runtime。

很多人还有误解以为兼容浏览器指的是 Deno 会提供“类似 Node.js 里的 UMD 写法”。首先我们明确一点,这里的兼容不是单指语法层面的兼容,并不是说要兼容 ES3 ES5。所以不要产生这种误解,以为可以通过 babel 兼容 Node.js 和 Deno。

在 Deno 的 Roadmap 里面作者就已经写到了:

Deno does not aim to be API compatible with Node in any respect. Deno will export a single flat namespace "deno" under which all core functions are defined. We leave it up to users to wrap Deno's namespace to provide some compatibility with Node.

这里的兼容,我的理解是兼容浏览器的 API 和生态。(坐等被打脸)

之前有个 issue discussion: struct the browser-compatible APIs #82 讨论这个问题,在 issue 中列举了一些想要兼容的浏览器 API:

  • High level
    • Console ✓
    • URL ✓
    • File/FileList/FileReader/Blob
    • XMLHttpRequest/Fetch
    • WebSocket
    • URLSearchParams
  • Middle level
    • AudioContext/AudioBuffer
    • Canvas

讨论中还包括 WebGL 设置 GPU 的支持。我们可以隐约猜到 Deno 的一个目标就是让浏览器中的代码可以直接运行在 Deno 上面

我的观点依然是:Deno 不是下一代 Node.js。(再次坐等被打脸)

Deno 是一个“A secure TypeScript runtime on V8”。一个安全的基于 V8 的 TypeScript 运行时,这个怎么理解呢。

浏览器可以认为是安全的 JavaScript 运行时,所有的 JavaScript 代码都是在沙盒(Sandbox)里面运行。浏览器虽然安装在你的电脑上,但是浏览器里面运行的 JavaScript 代码可以来自世界各地,换言之浏览器里面运行的都是不受信代码,如何保证浏览器的 JavaScript 代码不破坏你的电脑系统,这是浏览器安全机制需要解决的一个问题。而 Node.js 则不是,和任何的 Web 服务器一样,Node.js 运行的是受信代码

之前 V8 出现了关于逃逸分析(Escape Analysis)的安全漏洞,Chrome 采取了紧急措施,在下一个版本中删掉了逃逸分析相关的功能,相比之下,Node.js 则没有受到影响,因为 Node.js 运行的代码本来就是受信的。

从这个角度讲,Deno 和浏览器的定位很像。

  • V8 团队的一个错误,使得整个互联网变慢

因为我们可以看到,兼容服务器端生态和兼容浏览器端生态的一个区别:

  • 浏览器里面运行的都是不受信代码
  • 服务器运行的是受信代码

我们再换一个角度聊聊服务器生态。

很多人还有一个误解,就是觉得上面提到的那些 API,对于 Node.js 也完全可以兼容,比如 Console、URL、XMLHttpRequest/Fetch 等,很多 API 都已经被 Node.js 实现了。

当 Node.js 被开发出来的时候,类似 File、URL、Buffer 这类的 API 浏览器端都还没有,但由于 Node.js 定位为服务器端运行平台,因此 Node.js 参考的是其他 Web 服务器或者服务器编程语言。例如文件系统(File System),实现了一系列 POSIX(Portable Operating System Interface,可移植操作系统接口) 兼容的函数和功能。

还有一点需要注意的是 Node.js 和浏览器的趋同化,例如 Node.js 7 加入的 URL API,而当今的主流浏览器也都提供了这个 API,这是因为 Node.js 也使用了 WHATWG URL 标准。

WHATWG 的全称是 Web Hypertext Application Technology Working Group,网页超文本应用技术工作小组。这是一个相当“有重量”的组织,当 W3C 决定放弃 HTML 打算将未来的重点放在 XHTML 2.0 上时,WHATWG 坚决拥护 HTML,并制定了下一代 HTML 计划。最终 WHATWG 说服了 W3C 并与其一起发布了 HTML5。

如今 Web 的飞速发展我们要感谢这些组织的努力。

那么现在就有一个疑问了:如果 Node.js、浏览器、Deno 都使用这些标准后,那么他们是不是就会变得一样,Deno 会不会取代 Node.js,成为下一代 Node.js?或者 Deno 变成一个和 Node.js 一样但是比 Node.js 还难用的平台,最终被边缘化或者被抛弃?

不会。因为性能和安全是不可兼得的,比如 File/FileReader/Blob 这种 API 天生就是为浏览器端沙盒环境设计的(WHATWG 好多标准都是为浏览器设计的)。Node.js 还没有提供相应的 API,而且也不打算提供,毕竟在服务器端环境我们更需要的是文件系统,所以 Node.js 不去拥抱 WHATWG,而选择了 POSIX。

既然谈到了这个,那我就再讲的深入一点吧,深入到底层看看为什么 Node.js 不是用 Blob 和 FileReader 来读取文件。

在浏览器端文件通常来自于网络,由 url 提供,或者来自于表单的用户主动选择。无论何种方式都是由浏览器来完成文件的读取,并把文件内容加载到内存缓冲区中,这时 JavaScript 可以通过 Blob 来操作此文件。但是 Node.js 却没有实现这些 API,而是在文件系统之上构建了 Stream 模块来实现。再看看其服务器端编程语言例如 Java、PHP 也都提供了 Stream。

如果我们把 Node.js 作为一个 Web 服务器,那么我们横向和 Nginx 对比一下。如果使用 js 开发一个静态文件服务器,那么 Nginx 可以轻轻松松以十倍百倍的性能辗压 Node.js。

我们可以从底层分析一下两者为何相差悬殊。这里有几个知识点:

  • 用户空间
  • 内核空间
  • 进程上下文
  • 中断上下文
  • DMA
  • Zero Copy

为了安全考虑操作系统不允许用户代码直接操作硬件,为了保证操作系统内核的安全,将空间划分为两部分,一部分为内核空间,一部分为用户空间。用户编写的代码运行在用户空间,当需要使用底层功能时,可以通过系统调用进入内核,例如文件读取。

当用户进程通过系统调用从用户空间进入到内核空间时,系统需要将用户进程的上下文保存起来,当再次从内核空间回到用户空间时,系统恢复此上下文。

对于静态服务器,则这个步骤大概是:

  • 调用 read,文件被 copy 到内核缓冲区
  • read 函数返回,文件从内核缓冲区 copy 到用户缓冲区
  • write 函数调用,将文件从用户缓冲区 copy 到内核与 socket 相关的缓冲区
  • 数据从 socket 缓冲区 copy 到相关协议引擎

可以看到文件在整个过程中被 copy 了 4 次。

而 Nginx 底层使用 sendfile,可以实现 Zero Copy (零拷贝)。

整个流程变成了:

  • sendfile 系统调用,文件被 copy 至内核缓冲区
  • 从内核缓冲区 copy 至内核中 socket 相关的缓冲区
  • 从 socket 相关的缓冲区 copy 到协议引擎

可以看到在这个过程中,只有 3 次 copy。而且没有了用户空间和内核空间的切换,也不需要保存和恢复进程的上下文。其实上面还有优化的余地,因为在内核中发生了一次缓冲区到缓冲区的 copy。在 Linux 内核版本 2.4 之后,DMA 模块将数据直接从内核缓冲区传递给协议引擎。

虽然称为 Zero Copy,但是数据依然是从磁盘复制到了内存,从操作系统的角度来看这个是必须的,所谓的零拷贝是指内核中没有冗余数据,数据不需要在内核拷贝。借助 DMA 模块此过程完全不需要 CPU 参与。

在 Nginx 中只需要数据副本的 2 个 copy,而 Node.js 则需要 4 次。如果 Node.js 要想使用 Zero Copy 也有方法,比如使用 os 模块的功能,或者直接使用 C 扩展。

从另一个角度讲,Node.js 的性能损耗不仅仅是 4 次 copy 以及进程上下文的保存和恢复,还包括数据和代码从 C 到 JavaScript 的反复跨越边界。

我们回过头来讨论浏览器,对于浏览器来讲,根本就不需要这个特性。因为浏览器中的 JavaScript 代码不仅仅是用户空间运行,而且还是在沙盒空间运行。

所以与其在此猜测兼容浏览器指的什么,不如对比浏览器和服务器的差别:

  • 浏览器运行不受信代码,服务器运行受信代码
  • 浏览器遵循 W3/WHATWG,服务器遵循 POSIX
  • 浏览器关心 API 层的性能,服务器更关心操作系统层的性能
  • 浏览器能力受限,服务器能力不受限

扫码二维码关注我的公众号,每周推送原创前端内容


更多专业前端知识,请上 【猿2048】www.mk2048.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366533.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

判断按键值_「正点原子NANO STM32开发板资料连载」第十六章电容触摸按键实验...

1)实验平台:ALIENTEK NANO STM32F411 V1开发板2)摘自《正点原子STM32F4 开发指南(HAL 库版》关注官方微信号公众号,获取更多资料:正点原子第十六章电容触摸按键实验上一章,我们介绍了 STM32F4 的…

将社交登录添加到Spring MVC Web应用程序:注册和登录

本教程的第一部分描述了如何配置Spring Social 1.1.0和Spring Security 3.2.0,但它留下了两个非常重要的问题尚未解答。 这些问题是: 用户如何创建新用户帐户? 用户如何登录? 现在该弄脏我们的手并回答这些问题了。 我们的示例…

实验五 编写、调试具有多个段的程序

(1)将下面的程序编译、连接,用Debug加载、跟踪,然后回答问题。 ①CPU执行程序,程序返回前,data段的数据为多少? 见下图d 0770:0000 000f结果。 ②CPU执行程序,程序返回前&#xff0c…

手机工商银行怎么转账_工商银行信用卡要哪些申请条件?想成功办理你需要了解这些!...

工商银行信用卡一直是卡友们热议的对象,也有不少卡友问过小白:工商银行信用卡怎么办理?要哪些条件?要等多长时间?那么今天小白就为大家详细的讲解一下工商银行信用卡申请的各种方法和技巧,希望对大家有帮助…

数据可视化的基本原理——视觉通道

数据可视化为了达到增强人脑认知的目的,会利用不同的视觉通道对冰冷的数据进行视觉编码。 我们在数据可视化的时候,一方面,展现可视化对象本身的位置、特性,对应的视觉通道类型是定性或者分类,比如汽车在什么地方、汽…

linux测试地址是否能访问_一个小测试能看出孩子注意力是否集中,提前弥补,上小学会很轻松...

文|秘籍君不少家长虽然重视孩子的教育,却总是习惯“临阵磨枪”,具体体现在:孩子在上幼儿园的前一两个月才开始着急,害怕孩子适应不了幼儿园;孩子上了大班才开始重视“幼小衔接”,却不知道,从孩子…

服务器怎么禁止iis静态文件,如何禁止IIS缓存静态文件

禁止IIS缓存静态文件(png、js、html等)背景:IIS为了提高性能,默认情况下会对静态文件js、html、gif、png等做内部缓存,这个缓存是在服务器iis进程的内存中的。IIS这么做在很大程度上可以提高静态文件的访问性能,在正常情况下只要静…

汇编实验五

一、 二、 三、 四、 第一个 反汇编后发现不行 第二个 发现也不行 第三个 发现代码正确 五、 编写代码如下 调试后查看内存,发现数据相加了 六、 编写代码如下 发现逆序存储成功 七、实验总结 对于代码段的使用有了更加深入的了解。 但是对于代码段内存这块还是不懂…

eclipse RTC下载的代码无android sdk

问题现象: 修复过程: 1.无ADT,安装ADT(FQ操作) https://dl-ssl.google.com/android/eclipse/ a图 b图 2.下载android sdk a.下载 3.应用到eclipse中去 转载于:https://www.cnblogs.com/liuyj-vv/p/9299913.html

亚马逊免费使用套餐:在EC2 Linux实例上安装Tomcat 7

Amazon Web Services提供了12个月的免费使用期限,使开发人员可以在云中运行任何他们想要的东西。 免费层包括14个服务,其中Web开发人员最关注EC2服务。 EC2是一项服务,通过停止和启动Windows和/或Linux的虚拟实例来提供可调整大小的虚拟计算。…

笔记:隐式转换规则

学习并背诵全文 原始值 类型UndefinedNullStringBooleanNumber值undefinednull所有字符串true false所有数字/NaN 引用类型 Object的成员叫对象,包括Array,Function,Math,Date,JSON,RegExp等除了原始值…

ble连接过程建立_九点之蓝牙连接

蓝牙连接蓝牙连接是如何进入到连接状态呢,首先必须经历前面提到的广播阶段,主端通过扫描到从端的广播来发现这个设备,之后让主端发出连接请求来要求与从端建立连接,便可以进入到连接状态。由于蓝牙连接牵涉的点比较多,…

华为服务器系统蓝屏,服务器主机蓝屏

服务器主机蓝屏 内容精选换一换云服务器创建后区域固定,不能将云服务器转移到另一个区域,也不能将云服务器转移到另一个帐号。您可以通过镜像迁移方式实现云服务器的跨帐号跨区域迁移。服务器迁移的常见场景与常用的迁移方式请参考常见的服务器迁移场景。…

多对一映射、一对多映射

Emp员工表 Dept部门表 多对一映射 在查询时,需要获取两张以上关联表的数据,通过关联映射,可以由一个对象获取关联对象的信息,例如:查询一个Emp员工对象,可以 通过关联映射获取员工所在的部门Dept对象信息 …

一道面试题目引发的思考

起因 多列布局是前端一个经典的反复被提及的面试题目,最典型的即两列,左列定宽菜单栏,右列变宽为内容区域。 通常得到的答案无外乎左列浮动定宽,然后右列或浮动,或设置外边距,或绝对定位等等。偶尔会有面试…

uniapp弹出框_uniApp上拉刷新,下拉加载,以及筛选功能

uniApp插件市场有很多友好的插件,今天举一个例子如上图所示,实现上拉刷新,下来加载,右上角点击弹出筛选框,只需要在插件市场搜索刷新选择你想要的效果(也可以下载后自己改动效果)点击导入插件,会自动打开项…

乐高无限的服务器怎么建,乐高无限悬空房子怎么建造 建造方法介绍

乐高无限悬空房子怎么建造?很多玩家对此还不是很清楚,下面给大家带来乐高无限悬空房子建造方法,还不知道怎么建造的朋友一起来看看吧!建造方法悬空房子非常容易搭建,如果我们想要将已经搭建的房子悬空,就只需要将建筑下方的土地挖…

Hibernate学习(一)

搭建环境 1、创建普通的Java工程 2、添加相应的jar包,下载链接:https://files.cnblogs.com/files/AmyZheng/required.rar 第一个实例 1、引用jar包 2、创建数据库和表 DROP TABLE IF EXISTS t_customer ;CREATE TABLE t_customer (id INT(5) PRIMARY KE…

使用Spring Webservices构建SOAP Webservices代理模块

前一段时间,我想看看使用Spring Web Services编写Web服务代理(wsproxy)有多么容易。 所以,我想我会在Github上分享结果。 可以随意使用它 (Apache v2许可证)或将其用作自己开发的基础。 本文的其余部分将解…

joc杂志影响因子2019_排名 ‖ 2019年中国体育学期刊影响因子

近日,由中国科学文献计量评价研究中心、清华大学图书馆研制,《中国学术期刊(光盘版)》电子杂志社有限公司出版的《中国学术期刊影响因子年报》(2019版)发布。该年报是中国科学文献计量评价研究中心自2002年…