原标题:Node Bug 太多惨遭创始人抛弃,前端开发要变天?

曾经 Node 的面世,将 Java 首次带入了后端服务器端开发,不仅让诸多的前端开发者更能轻而易举地编写出高性能的 Web 服务,同时也大大地提高了服务器的安全性。而如今经过九年的发展,其创始人 Ryan Dahl 不仅"嫌弃"了存在很多槽点的 Node,还重新发布了一个新的开源项目——Deno,而这究竟是怎么一回事?Deno 会将 Node 取而代之吗?对前端开发者的影响大吗?接下来,我们将一一为大家解读其中背后的故事。

近日,在 2018 年的 JSConf 上,Node 之父 Ryan Dahl 发表了主题为《Design Mistakes in Node》的演讲,在演讲中,他为曾在 Node 设计上所犯的一些错误表示遗憾,并为此提出了一种新的原型设计思路,创建了一套立足于 V8 的安全 Type 运行时项目——Deno。

▌Node 初始目标

对于 Node 最初创建的目标,主要是集中于编程事件驱动的 HTTP 服务器上。随着时间的推移,后来也验证了这一点对于当时服务器端 Java 来说至关重要。遗憾的是,Node 后期并没有得到很好的维护,因为在 2012 年,已经在这个项目上耗费了四年时光的 Ryan Dahl 认为 Node 已经实现了他的预期目标,如:

支持多种协议:HTTP、SSL、......

可运行于 Windows(使用 lOCP:http://tinyclouds.org/iocp-links.html)、Linux(epoll)、Mac(kqueue)上。

具有稳定的 API。

通过 NPM 实现增加外部模块的生态系统。

且 Ryan Dahl 认为对于 Node 的后期也只需修复一下因不断增加的代码而出现的 Bug,于是他在 Node 如日中天时离开了 Node 团队。直至最近,他才发现曾经的自己错了,虽说当时 Node 已经为用户提供了一套友好的非阻塞框架,但是后续还是出现了很多不可回避的问题。

▌安全性不足

V8 本身是一个非常好的安全沙箱。如果当时能够对某些特定应用程序的维护更加上心,也许 Node 可以实现比其他任何语言更好的安全保障。譬如,用户的 linter 不应该具备完全访问计算机和网络的权限。

▌构建系统(GYP)

要知道构建系统是非常困难且重要的。最初 V8(借助 Chrome)开始使用 GYP,而 Node 也对接了 GYP,但是后来 Chrome 放弃了 GYP 而转向 GN,因此 Node 成为 GYP 的唯一用户。对于 GYP 的继续使用可能是 Node 核心最大的败笔。

对此,Ryan Dahl 认为自己不应该引导开发者基于 V8 引擎使用 C++ 编写,而是应该提供一个核心外部函数接口(FFI)。其实早前,就有很多人建议他转向 FFI,但当时 Ryan Dahl 并没在意,这让他现在追悔莫及。

最后, Ryan Dahl 还对 libuv 采用 autotools 表示非常不满意。

▌package.json

对于 NPM,虽然是 Isaac 创建了 package.json(绝大部分)。但最终是由 Ryan Dahl 通过了允许 Node 的 require() 函数来检查 package.json 文件,将 NPM 包含在 Node 的发行版本中,使之成为现实中标准方案。然而,令人懊恼的是,这其中存在一个模块的集中(私有控制)存储库。

即 require("somemodule") 并非唯一,它在很多地方都被定义了。

此外,package.json 这一文件还衍生出“模块”作为文件目录的概念。这不是一种绝对必要的抽象机制,此前在 web 上也从未出现过。

如今的 package.json 文件中包含了各种不必要的信息。譬如许可、库、描述等等。

如果在导入时仅使用相关文件和 URL,则路径就可定义版本,也没有必要列出依赖关系。

▌node_modules

node_modules 极大地提高了模块解析算法复杂度。vendored-by-default 初衷是好的,但是在实践中,仅使用 $NODE_PATH 并不能实现预期的目的。它偏离了浏览器语义。

Ryan Dahl 表示这是他的错,且遗憾的是,这一问题如今也无法弥补。

▌require("module") 没有 ".js"扩展名

在脚本标签的 src 属性中,“.js”不容忽视,而在 require("module") 中没有明确地显示出 .js 扩展名。

▌index.js

因为已有 index.html 文件的存在,index.js 则会给模块加载系统带来不必要的复杂因素。且在已受 package.json 支持下,它将变得毫无意义。

▌Deno:一套立足于 V8 的安全 Type 运行时

以上这些问题不仅成为其创始人 Ryan Dahl “嫌弃” Node 的原因,同时也为诸多开发者带来不少的麻烦。基于此,Ryan Dahl 使用 Go 语言代替 C++ 重新编写跨平台底层内核驱动,上层仍使用 V8 引擎,发布了一套安全 Type 运行时项目——Deno。其主要目标如下:

▌安全

利用 Java 是安全沙箱的这一事实:

默认情况下,应该在没有任何网络或文件系统写权限的情况下运行脚本;

用户可以选择通过标志访问:--allow-net --allow-write

允许用户运行不受信任的实用程序(如 linter)

不允许将任意本地函数绑定到 V8 中:

所有的系统调用都是通过消息传递完成的(protobuf 序列化)

确切地说有两个本地函数:send 和 recv

这既简化了设计,又使系统更易于审核。

▌简化模块系统

不再尝试与现有 Node 模块兼容;

导入只是相对或绝对URL;

import{test} from"https://unpkg.com/deno_testing@0.0.5/test.ts

import {log} from "./util.ts "

import 必须提供扩展;

通过远程 URL 方式引入依赖而非通过本地模块,且在第一次运行时进行加载和缓存。只有在使用 --reload 运行,依赖才会更新。

可以通过指定非默认缓存目录来完成交付。

▌将 Type 编译器内置于可执行文件当中

TS 很强大:

它终于实现了一种实用的可选类型语言。

且代码从快速构建到大型架构有良好的扩展。

Deno 将挂钩到 TS 编译器中, 以实现模块解析和构建结果的增量缓存。未修改的 TS 文件不能再重新编译。此外,普通的 JS 也可以工作(道理很简单,因为 TS 是 JS 的超集)。最后应该使用 V8 快照来实现快速启动(目前原型设计还没有这一功能)。

▌以最小的关联运行一个可执行文件

> ls -lh deno

-rwxrwxr-x 1ryan ryan 55M May 2823: 46deno

> ldd deno

linux-vdso.so .1=> ( 0x00007ffc6797a000)

libpthread.so .0=> /lib/x86_64-linux-gnu/libpthread.so .0( 0x00007f104fa47000)

libstdc++.so .6=> /usr/lib/x86_64-linux-gnu/libstdc++.so .6( 0x00007f104f6c5000)

libm.so .6=> /lib/x86_64-linux-gnu/libm.so .6( 0x00007f104f3bc000)

libgcc_s.so .1=> /lib/x86_64-linux-gnu/libgcc_s.so .1( 0x00007f104f1a6000)

libc.so .6=> /lib/x86_64-linux-gnu/libc.so .6( 0x00007f104eddc000)

/lib64/ld-linux-x86 -64.so .2( 0x00007f104fc64000)

▌发挥 2018 年的技术优势

通过使用 Parcel 将编译 Node 模块打包,引导运行。(这将大大地简化 Node 流程 )。

良好的基础架构现在存在于本地代码中,EG 不需要再为 HTTP 担心。 已有其他机制负责实现相关功能(Node 中的情况并非如此,Web 服务器还需要 100% 的手动滚动)。

目前 Deno 的非 JS 部分正在使用 Go 语言编写,对于替代语言:

Rust 或许是一个不错的选择;

如果允许其他人以 Go 或 Rust 语言编写自己的 Deno 项目,C++ 可能会是一个不错的选择?

▌Deno 的发布对开发者意味着什么?

Deno 提高了安全性、简化了模块系统、面向 Type,换句话说 Deno 主要是针对 Node 的痛点才出现的,那么 Deno 是否会取代以根深蒂固的 Node 呢?初学者是从 Deno 入手还是 Node?

对此,Ryan Dahl 表示,当然使用 Node,因为 Node 和 Deno 两者最大的区别是 Node 早已大行其道,而 Deno 开发仅有一个月的时间,还在初级阶段,仅是个 Demo 根本无法投入使用。因此,Deno 想要在短时间之内将 Node 取而代之也是不可能的。

Deno:https://github.com/ry/deno

PPT:http://tinyclouds.org/jsconf2018.pdf

责任编辑:

当node脱离v8_Node Bug 太多惨遭创始人抛弃,前端开发要变天?相关推荐

  1. 【web前端特效源码】使用 HTMLCSSJavaScript实现各种跳跃浮动慢跑翻转旋转坠落的魔幻文字动画效果~太上头了~/动画效果|前端开发|IT软件开发基础入门教程|网页制作|网站开发定制

    b站视频演示效果: [web前端特效源码]使用 HTML&CSS&JavaScript实现各种跳跃浮动慢跑翻转旋转坠落的魔幻文字动画效果~太上头了~/动画效果|前端开发|IT软件开 效 ...

  2. Hapi.js 起步 - 写给前端开发的 Node Web 框架入门

    为什么选择 Hapi 或许你已经使用过 Express, Koa2 等 Node.js 的 WEB 框架,在构建 WEB 应用程序时,你的工作仅仅是产出 RESTFUL API,或者通过 Node 调 ...

  3. 高阶前端开发人员必备工具-Node.JS知识讲解

    想要成为一个"值钱"的高阶Web前端开发人才,Node.JS是必须要掌握的技术之一.今天小千就为大家详细讲解Node.JS的知识,让你完全了解Node.JS的前世今生. 1.说起N ...

  4. 关于Bug太多问题的思考

    问题:代码Bug太多, 每次大家功能自测的时候,都能通过. 但提交QA后,总能发现bug, 即使某一轮测试提的bug全被修复,下一轮又会产生新的bug,总之不管怎样,Bug就是"野火烧不尽, ...

  5. 华为回应与陈春花教授相关传言;iPhone14Pro系列将独占A16芯片;Bug太多,Python 3.11推迟发布|极客头条

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...

  6. 华为回应与陈春花教授相关传言;iPhone14Pro系列将独占A16芯片;Bug太多,Python 3.11推迟发布|极客头条...

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...

  7. 创建 Web 前端开发环境(node和npm)

    Web 前端开发涉及多种工具,这里将常用工具的安装和配置进行说明,提供了详细的说明,为后继的开发创建一个坚实的基础. 本文介绍的工具有:NodeJS, NPM, Bower, Git 和 Grunt. ...

  8. web前端知识点太多_初学web前端,学习方法容易走偏,这是为什么?

    一.了解web前端 所谓"知己知彼,百战不殆",在学习web前端之前,还是让我们先了解一下什么是web前端吧! 所有用户终端产品与视觉和交互有关的部分,都属于前端开发的领域.从狭义 ...

  9. html调后台接口_前后端分离之让前端开发脱离接口束缚(mock)

    来源 | https://www.cnblogs.com/milo-wjh/p/6424246.html前后端分重构完成,再书写交互时遇到后台接口尚未完成,无法得到接口返回的测试数据,但是我们又需要一 ...

最新文章

  1. 测试x86cpu的指令集
  2. abap 添加alv上的工具栏的按钮_你需要属于自己的PPT工具栏!
  3. 让机器也拥有品味!时尚图像补全网络FiNet| ICCV 2019 Oral
  4. P2388 阶乘之乘
  5. 杭电1492 The number of divisors(约数) about Humble Numbers
  6. Python安装第三方库临时使用国内源
  7. [android]加载大量图片避免OOM
  8. oracle 批量生成约束,关于sql脚本导入Oracle时重复生成check约束的问题解决
  9. Atitit 2017年的技术趋势与未来的大技术趋势 1. 2017年的技术趋势 2 1.1. Web not native 2 1.2. 更加移动优先 ,,more spa 3 1.3. Ar
  10. 毕业论文格式大全、排版技巧及常见问题汇总
  11. fedora 29 使用百度网盘客户端
  12. 面试明明聊的很开心,为什么要挂我!
  13. 瀑布模型快速原型模型
  14. 【Shashlik.EventBus】.NET 事件总线,分布式事务最终一致性简介
  15. img 加载 svg占位符_SVG组件可创建占位符加载,例如Facebook卡加载
  16. 云计算机怎么分盘,电脑硬盘怎么分区
  17. IP地址的划分及其范围
  18. kali中使用Docker搭建vulhub靶场和vulapps靶场(新手向)
  19. 云服务器可以通过远程打游戏吗,云主机能玩游戏吗_云主机安全防护措施
  20. 如何进行区块链的开发?

热门文章

  1. 想学3D建模,选对行业也很重要!这些热门行业的发展趋势你要知道
  2. 删除手机图片后保持图库不会出现黑图的方法。
  3. MATLAB中abs和sqrt函数的使用方法
  4. 打开心灵——SD2.0大会更显大家风范
  5. 苹果电池测试软件i-t,Apple Watch出行绝佳伴侣,CHOETECH磁力充电座评测T313
  6. 商家WIFI码项目全解析
  7. 数字经济的大航海时代
  8. php 获取当前时间的农历,获取阴历(农历)和当前日期的js代码_javascript技巧
  9. LeetCode——218. 天际线问题(The Skyline Problem)[困难]——分析及代码(Java)
  10. 云栖科技评论第67期:完全自动驾驶实现遥遥无期?不必多虑!