理解 Deno
2019-02-14 本文已影响17人
王谙然
deno: A new way to JavaScript
为什么要花时间学习它呢?
- 前端开发 JavaScript 是世界上最大的生态圈。
- TypeScript 作为 JavaScript 的超集,兼顾了 JavaScript 灵活性和工程化能力。
- V8 使用 EventLoop 并发模型,天生适合事件驱动型场景。
- 在后端业务开发逐渐标准化的趋势下,业务开发工具最需要的是可控的效率。
- deno 的作者在创建完 node.js 后,总结大量工业经验,系统架构设计得很简洁,简洁的东西稳定性高,根基正,可成大树。
然后,从各种资料里屡清楚这个项目的脉络
- 作者 Ryan Dahl 的演讲《10 Things I Regret About Node.js》 和 《Deno, A New Server-Side Runtime》
- 官网:https://deno.land
- 使用手册:https://deno.land/manual.html
- 源码发布信息:Release.md
可以看到 deno 的设计目标:为 TypeScript/JavaScript 提供一个安全简洁的沙箱运行时。
在原型实现里,即 Golang 版本,使用 V8 编译 JavaScript,基于 v8 做了一个叫 v8worker2 的模块,通过消息传递的方式实现 js 和 Golang 的沟通,将消息传递抽象成 send/recv,消息体使用 protobuf 编码,以简化架构。
后面的迭代中,由于 Golang GC 和 V8 GC 使运行时的不确定性大大增加,作者决定用 Rust 重写内核部分,Rust 的 runtime 没有 GC,主要以显示声明资源的所属权来规避资源竞争的问题,没有垃圾产生,故不需要回收。
deno 使用第三方开源库 tokio 作为内部资源异步请求的调度模块。
由于消息体编码模块最重要的高性能,所以也从开始的 protobuf 切换到 flatbuffers。
有了这些背景知识,我们大致就能看懂架构图了:
deno.png
JS 本身通过 V8 编译成可执行文件,通过 libdeno 以收发消息的形式与 deno runtime 沟通,即操作 OS 资源。