在稍早前的 JS Conf Berlin 上,被称为 Nodejs 之父的 Ryan Dahl 发表了《10 Things I Regret About Node.js》演讲,并且发布了新项目 Deno,值得一提的是,这是 Ry 的第二次公开演讲,而第一次是发布 Node.js,本文将带领大家回顾一下 Ry 演讲上所提到的重点。

来自 twritter 网友 @malweene 的手绘概括

演讲第一部分: Nodejs 的成功

这一部分,讲了 Node 的发展历程,Ry 认为 Node 在 I/0,事件驱动的 http server 方面已经做得很好了,提到了 Node 对一些协议的支持,跨平台,以及 npm 生态系统等促成 Node 成功的因素,以及感谢了一些为 Node 做出过贡献的人。 Ry 始终认为 JavaScript 是最好的动态语言,而动态语言用来做科学计算是合适不过了(这可能和 Ry 离开 Node 后加入 Google 的 Brain 团队,从事深度学习方面的研究的历程有关)。

演讲第二部分: 对 Nodejs 的吐槽

这一部分可以说是整个演讲的高潮,前后吐槽了 Node 上 7(不是应该 10 个么???) 个让 RY 觉得遗憾的设计。

1. 没有坚持使用 Promise

Promise 是 async/await 的必要抽象,Promise 的没有坚持使用导致后面 Node 的很多异步 API 严重老化。

2. 没有足够的安全性

V8 本身是一个非常好的沙箱环境,但是 Node 在早期的设计中却没有利用好这一先天优势,导致程序可以轻松访问系统和网络。

3. 错误地坚持使用 GYP

由于 Chrome 放弃了 GYP,使得 Node 是 GYP 唯一的用户,并且 Ry 认为这其中有太多的复杂且不必要的抽象,与其让用户自己去编写 C++ 扩展来绑定 V8,不如提供一个核心外部函数接口来得更加可靠。Ry 认为在构建系统上的设计错误是 Node 的最大遗憾。

4. package.json

package.json 因为 require 的支持,使得这后来成了事实上的模块标准,可是很遗憾,因为默许了 package.json 的存在,可是 require(‘module') 又是不明确的,导致当出现本地依赖库或者私有依赖库时候,变得很混乱。并且 package.json 包含了太多冗余描述,许可证,仓库,描述等等,而且 package.json 提出的“module”作为文件目录也不是必要的抽象。

5. node_module

增加了模块的解析复杂度,并且是偏离了浏览器语义,但是现在已经没法剔除出去了。

6. require('module') 没有加上扩展名".js”

多此一举的做法,模块加载器必须得去猜测是‘.js’还是’.json’,并且也是跟浏览器语义不符的。

7. index.js

实际上默认去加载 index.js 也是没有必要的,因为可能会有 index.html….

以上提到的遗憾都主要集中在代码管理上而非早期 Ry 关注的建立高性能服务器上。实际上在 Ry 提出这些遗憾的时候,相当于已经提出了新一代 js/ts 的 v8 runtime 的原型 -> Deno,而其主要目标就是解决以上问题。

演讲第三部分: 对 Deno 的介绍和期望

1.安全性

Deno 将利用 JS 是安全沙箱的事实,允许安全运行不受信任的程序

  • 默认情况下,不允许程序直接访问网路或者文件系统
  • 可以通过 —allow-net —allow-write 的方式访问 不允许扩展函数直接绑定到 V8 上,简化流程,也易于审计
  • 所有系统调用都通过消息传递完成(protobuf 序列化)
  • 两个原生函数: send 和 recv

2.简化模块系统

  • 不会去尝试和现有 Node 模块系统兼容
  • 仅导入相对/绝对的 URL,并且导入路径必须提供扩展名
  • 远程 URL 在第一次加载之后将被永远缓存,只有提供 --reload 才能再次获取资源,可以通过指定非默认缓存目录来绕过

3.将 TypeScript 编译器内置于可执行文件之中

  • Deno 内置 TS 编译器以实现模块解析与构建结果的增量缓存
  • 未修改的 TS 文件不会被重新编译
  • 普通 JS 也同样有效
  • 利用 V8 的 snapshot 来快速启动,暂未在原型中设计 (参考《使用 v8 snapshot 将启动速度提升 8 倍》)

4.单个可执行文件

5.充分利用 2018 技术优势

使用 Parcel 把 Node 模块编译打包,来实现运行时的自举。

以原生代码的方式提供强大的基础设施

  • 已有其他机制负责实现 HTTP,而此前的 Node 是无法实现的
  • 目前 Deno 的非 JS 部分以 go 语言编写,但还没全面完成原型设计,其实 Rust 和 C++ 在某些方面也不错

6.其它

  • 发生未捕获 Promise 错误时直接终止程序
  • 支持 top-level 的 await
  • 兼容浏览器(当功能重叠时)

Ry 的演讲大致就是以上这些内容,尽管 Deno 目前还是不可用的,也没有发行二进制版本,但是该项目推出短短数日便获得了上万个 Star。

后话:

目前大前端开发的工程化,SSR 等能力基本都由 Node 提供,加上一些利用 Node 优势而搭建的后端服务,都有一定发展时间,因此对于 JS 开发者而言 Node 在未来很长一段时间内依然是值得继续学习的一个项目。

当然如果 Deno 有部分设计你是认可的,那现在最好的方法就是开始投资学习,从学习 Go 语言开始,学完 Go 就去看 Deno 源码,边看还可以边提 PR,看完 Deno 源码后 API 也差不多出来了,你就可以用 TypeScript 写 Demo 了,最后即使 Deno 没人用进了博物馆,你还学会了 Go 和 Typescript,还为大型开源项目贡献过源码....

参考资料:

  • Deno
  • Deno Roadmap
  • 演讲视频
  • 演讲 PPT
  • 《Deno 不是下一代 Node》-jastjavac

【JSConf EU 2018】Ryan Dahl: Node.js 的设计错误相关推荐

  1. Node.js 框架设计及企业 Node.js 基础建设相关讨论

    大家好,我是若川.19年我写的 lodash源码 文章投稿到海镜大神知乎专栏竟然通过了,后来20年海镜大神还star了我的博客,同时还转发了我的微博.时间真快啊.今天分享这篇Node.js的讨论. 2 ...

  2. Node.js listen EADDRINUSE 错误解决 How to solve nodejs Error: listen EADDRINUSE

    代码 var http = require('http'); var requestListener = function (request, response) {response.writeHea ...

  3. 基于 Koa 的微服务 Node.js 框架设计思路与简单实现

    大家好,我是前端点线面,毕业于华中科技大学,非科班出身的一枚新时代农民工,现在是百度前端研发工程师,著有<前端百题斩>.数十篇学习思维导图(go.React.Redux.Vue.Vuex. ...

  4. 【JSConf EU 2018】WebAssembly 的手工艺术

    在今年欧洲的JSConf上Emil Bay进行了一场题为<Hand-Crafting WebAssembly>的演讲.Emil表示:"现在已经有很多关于WebAssembly(W ...

  5. [JSConf EU 2018] 大脑控制 Javascript

    先解释,本人为前端菜鸟,之前也未参加过类似的活动,没有翻译过什么文章,此次是好奇心使然,也是想尝试下,学习学习,英文很烂,全靠有道,但是视频整个看下来,还是很有收获的,现在来分享一下! 主题:Expl ...

  6. Node.js 报语法错误 SyntaxError: Unexpected identifier

    原文链接:https://blog.csdn.net/sleepwalker_1992/article/details/81029380 刚开始学习node.js,安装完以后,写了一个简单的js代码, ...

  7. 【JSConf EU 2018】有关浏览器弹出式窗口的相关探讨

    在前端大爆发的今天,随着层出不穷的新技术和新框架的不断推出和W3C标准的不断更新,前端开发已经不局限于展示服务端返回的信息,而更多的去关注功能,这也带给了我们更多思考. 本次JSCONF2018大会上 ...

  8. mysql econnreset_如何在Node.js中调试错误ECONNRESET?

    我正在使用Socket.io运行Express.js应用程序用于聊天Web应用程序,并且在24小时内大约5次随机收到以下错误.节点进程将被永久封装,并立即重新启动. 问题是重新启动Express将我的 ...

  9. Node.js:它是什么,何时以及如何使用它,以及为什么要使用它

    by Pablo Regen 通过帕勃罗·雷根(Pablo Regen) You've probably read these sentences before- 您可能已经读过这些句子了-- Nod ...

最新文章

  1. 安装中文VS2008 SP1之后 智能提示是英文的解决办法
  2. 2018提高组训练Day2
  3. MATLAB数据分析
  4. linux 查看磁盘空间_【linux磁盘划分】3分钟看懂!
  5. http://zhcsmx22.blog.51cto.com
  6. 关于iOS声音识别的框架
  7. hdu 1074 Doing Homework
  8. 【流媒体服务】海康摄像头RTSP视频推流、转码、拉流、直播综合应用(六):【1】VLC+FFMPEG+Nginx实现RTSP到RTMP网页直播
  9. 哇塞,可以用Python实现电脑自动写小说了!!!
  10. 辗转相除法——求最大公约数
  11. 利用水文分析提取山脊线山谷线
  12. 《指弹:千与千寻:Always with me》
  13. 腾讯云服务器的项目部署
  14. java毕业设计软件工程专业教辅平台课程子系统mybatis+源码+调试部署+系统+数据库+lw
  15. 嵌入式Linux自学笔记(二)——文件IO
  16. 网站排名下降的原因,网站排名下降怎么办?
  17. 秒杀系统常用的削峰方法
  18. 2023河北大学计算机考研信息汇总
  19. c++ promer和c++ primer Pluse下载
  20. 离线数仓模型构建的简单见解

热门文章

  1. 最早的神经元从何而来?海绵基因图谱揭示神经系统起源
  2. 短信升级为5G消息?三大运营商联合发布的《5G消息白皮书》说了啥?
  3. 总经费8.4亿的上海市脑科学重大专项进展如何?且看2019年度工作汇报会
  4. AIoT重磅报告:四大关键助力,AI+IoT重新定义未来的可能性
  5. 第一本用机器生成的书籍由施普林格•自然出版
  6. 300 多行代码搞定微信 8.0 的「炸」「裂」特效!
  7. 是凡尔赛本赛了,马斯克回应成为全球首富
  8. 给互联网巨头“搬砖”的人
  9. 这里有三位程序员,你能找出来吗?| 每日趣闻
  10. 少年五年升阿里P8,他如何从低谷登上“光明顶”?