1、从 Node.js 到 Deno:个安全效的 JavaScript/TypeScript 运时录当前 Node.js 态存在的问题与 Node.js 的异同Deno深理解 Deno 底层架构前的态DenoDeno的未来Node.js 态有什么问题?History of JavaScriptV8 Release ProcessNode.js 发布之后,JS 发了很变化PromiseAsync/AwaitES ModulesTypedArraysNPM 丰富的包但是。When you run npm installdeno 也使 Node.js,并且。Deno is a new server-si
2、de JavaScript runtimeDeno 的底层技术:V8RustTokio(event loop)TypeScriptNode vs DenoNode DenoServer-side JS Server-side TSV8 V8Libuv TokioC+ RustDeno vs OSLinux DenoProcesses Web WorkersSyscalls OpsFile descriptors (fd) Resource ids (rid)Scheduler TokioUserland: libc+ / glib / boost deno_std/proc/$/stat de
3、no.metrics()man pages deno -typesDeno 只有个可执件Deno 是个可执件这个可执件就是你运 Deno 程序所需要的全部东Deno 总是并且永远采这种式发Deno 是独于系统和平台的前 Deno 可以在 Mac、Linux、Windows 系统上运安装 Denocurl -fsSL https:/deno.land/x/install/install.sh | sh运 Deno deno https:/deno.land/std/examples/welcome.tsDownload https:/deno.land/std/examples/welcome.
4、tsCompile https:/deno.land/std/examples/welcome.tsWelcome to Deno deno https:/deno.land/std/examples/welcome.tsWelcome to Deno 使 URL 导模块import serve from https:/deno.land/stdv0.6/http/server.ts; 简单、标准、兼容于浏览器的模块系统。没有 node_modules 和 index.js 不依赖于集中式服务器。 Deno runtime 可以透明的加载、缓存、编译代码。 络的情况下也可以运。并且具有版本控制
5、的功能。 未来:持更便地导模块import maps默认的安全模式我们希望让户能够运不受信任的第三代码 deno run https:/deno.land/welcome.tsWelcome to Deno 要访问磁盘、络、进程或精度时间,户必须使可选的命令标志:-allow-read=/tmp-allow-net=开箱即的 TypeScript 持编译器被编译进了 Deno。使 V8 Snapshots 加速 TS 编译器的快速启 TypeScript动。持并励户使 JavaScript!当使 JS 时,不会使 TS compiler,因此开发者不担 runtime 膨胀。Deno runt
6、ime和标准模块使 TypeScript 编写。VS Code插件: https:/ Deno 的标并不是持全部的浏览器 API。它们有不同的的。API尽可能地使浏览器 。Deno 想要了解 Deno 持哪些 API,可以查看全局变量 (v0.22.0)window, atob, btoa, fetch, clearTimeout, clearInterval, setTimeout,setInterval, location, crypto, Blob, File, CustomEventInit,CustomEvent, EventInit, Event, EventTarget, URL
7、, URLSearchParams,Headers, FormData, TextEncoder, TextDecoder, Request, performance,postMessage, Worker兼容性图表来源 deno/wptW3C vs WAHTWGHTML5在 HTML5 之前是 HTML4 吗?NO HTML + XML = XHTMLWHATWGhttps:/html.spec.whatwg.orghttps:/console.spec.whatwg.orghttps:/encoding.spec.whatwg.orghttps:/fetch.spec.whatwg.org
8、https:/url.spec.whatwg.orghttps:/streams.spec.whatwg.orgNode.js 的变化Inside The CoreAPI 层使 TypeScript 编写没有任何“特权”在受限环境中运如果需要运特权代码(络、件系统、环境变量等)需要以消息的机制向 Rust端申请通讯使 TypedArray 传递libdeno 层使 C+ 编写介于 TypeScript 和 Rust 之间,负责两者之间的消息传递主要来封装 V8Deno的 snapshot 保存了个完整的 TypeScript 编译器,极的缩短了编译器的启动时间Rust 层件系统、络、环境变量等
9、的“特权代码”读取由 Rust 实现DenoTokioTokio最初版本由 Go 实现,由于存在“双GC”的问题,后来改 Rust 实现维护了个效的线程池依赖于 Rust 的 Future 特性,这个特性类似于 JavaScript 的 Promises通过消息传递机制进 Native 绑定Example跟 V8 交互1. 加载 snapshot2. 创建 isolatepshot3. 在 rust 中注册消息监听函数和消息回调函数4. 为 JS 执环境创建 context5. 使 C/C+ 将 libdeno 的 API 绑定到 V86. 在 V8 中执 js 函数:denoMain从 Ty
10、peScript 到 Rust 的调流程1. await deno.readFile(“./citys.json”)2. const nread = await sendAsyncMinimal(dispatch.OP_READ, rid, p)3. const buf = core.dispatch(opId, scratchBytes, zeroCopy)4. libdeno.send5. void Send(const v8:FunctionCallbackInfo& args)Zero-Copy 机制Zero-Copy 机制Zero-Copy 机制Deno 的未来?Ryan Dahl(Node.js 作者)V8(Google)TypeScript(Microsoft)Rust(Mozilla)总结DenoDenoDeno拥抱浏览器态具有开箱即的 TypeScript 持默认是安全的