You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// imported.tsconsthandler=(e: Event): void=>{console.log(`got ${e.type} event in event handler (imported)`);};window.addEventListener("load",handler);window.addEventListener("unload",handler);window.onload=(e: Event): void=>{console.log(`got ${e.type} event in onload function (imported)`);};window.onunload=(e: Event): void=>{console.log(`got ${e.type} event in onunload function (imported)`);};console.log("log from imported script");
执行 deno main.ts 脚本,可以看到 addEventListener 和 on 事件的区别,imported.ts 中的 on 事件会被 main.ts 中的覆盖,而 addEventListener 不会被覆盖:
下面从安装、使用以及和 Node.js 对比进行 Deno 实践
安装
以下代码运行环境:
First Blood
hello world
在控制台执行以下脚本,运行一个 hello word 的例子试下:
执行结果如下,可以看到 deno 可以直接运行第三方脚本,首先从远程下载 welcome.ts 文件,然后再经过编译运行输出运行结果:
typescript runtime
Deno 自带 tsc,可以看到 deno 将 welcome.ts 文件安装到了 deps 目录下,gen 目录下是 ts 编译后生成的 js 文件:
安全沙盒环境
Deno 是一个类似沙盒的安全环境,限制了文件、网络等操作。下面编写一个测试脚本:
可以看到 deno 中支持直接使用 ES6 Module Import 以及 Top Level Await。
由于 deno 限制了网络访问能力,所以直接运行上面的脚本会报错:
加上 allow-net 条件参数再次运行 deno --allow-net test-0.ts 即可。
Promise 和 Top level await
和 nodejs 的区别是,nodejs 设计之初都是基于 callback 形式,而 deno 中所有异步操作都会返回一个 Promise,并且支持 Top Level Await。
Promise
以创建子进程和系统信号为例:
Top level Await
Top level await 目前已经进入 TC39 stage-3,再 ES8 之前只能再 async 函数中使用 await,通过 top level await 可以直接在模块顶层使用 await 语句。
Deno 中可以直接使用 top level await 语法:(目前 Node.js 可以在 ES Modules 中使用)
模块加载和打包
Deno 的设计避免 Node.js 的模块加载机制,支持 ES modules 而不使用 require,通过 ULR 或者文件路径引用依赖包。并且 deno 自带 bundle 功能,打包出的文件可以直接在浏览器中使用:
生成的 bundle 文件基本类似于一个简单版本的 webpack 打包后的内容:
包管理
Deno 摒弃类似 npm 这样的三方包管理模式,三方模块都是以类似浏览器中 import 的形式直接通过链接的形式引用:
Deno 也没有 node.js 项目中 package.json 和 node_modules ,如果在项目中进行依赖模块维护的话,可以有两种方式:
imported.ts 分别通过 addEventListener 和 onload 在 window load , unload 上绑定事件监听:
执行 deno main.ts 脚本,可以看到 addEventListener 和 on 事件的区别,imported.ts 中的 on 事件会被 main.ts 中的覆盖,而 addEventListener 不会被覆盖:
将上面 deno bundle 打包出的脚本,直接以 script 的形式内联到 index.html 中:
打开浏览器控制台可以看到运行结果:
使用 node_module
因为 Deno 支持 ES modules,所以可以使用部分 ES module 格式的 node.js 包,https://jspm.io/ 上面是一些 ES module 格式的 npm 包,如果没有依赖 node.js API 的话,都是可以直接在 deno 或者 浏览器环境使用的:
比如:
输出结果:
deno std 库里面包含已经兼容的 Nods.js API
语法
Deno 直接支持了许多新的 TC 39 语法,比如 nullish default 和 optional chaining ,以及上面提到的 top level await 等等:
输出结果:
API
在终端输入 deno ,可以进入 REPL,执行
console.log(Deno)
,返回的是 Deno 提供的各种 API:v.s. Node.js
The text was updated successfully, but these errors were encountered: