在我们的项目中,使用与TestMace API配合使用的IDE(TypeScript)作为主要语言,因此我们对与此语言相关的项目非常感兴趣。 今天,您的注意力是有关TypeScript的Deno运行时工具的文章的翻译(但这不是它的唯一功能)。 阅读愉快。

大约三个月前, Ryan Dahl (Node.js的创建者)在会议上作了“ 关于Node.js的十件事我很抱歉 ”的演讲,他在演讲中谈到了他对Node.js的一些不成功的设计决策。 他将演讲的几乎一半用于实验原型Deno,其目的是消除Node.js的缺点。
Deno已经达到了v0.1版本( 译者注 -已经是v0.3.8 ),并且在将来可以替代Node.js。
Node.js有什么问题?
任何程序都可以将数据写入文件系统或网络
这可能会导致安全风险,尤其是在安装未经验证的npm软件包时。 例如,在crossenv 事件中 。 如果crossenv没有写许可权,则不会发生。
快速离开的异步API
承诺于2009年出现在Node.js中,并于2010年2月消失了。 但是,大多数库仍然使用回调来处理异步代码。
构建系统(GYP)
组装用于通过GYP将库连接到C的模块是一种折磨。 为了获得足够的开发人员经验,您必须使用node-gyp(位于GYP之上的一层)以及可能的其他层(例如nan )。 我在自己的小型项目中亲自尝试了上述所有方法,并且我准备同意,这让我很汗。
模块系统和npm
主要问题是模块系统与浏览器不兼容,这意味着代码不是完全同构的。 造成这种情况的主要原因主要有两个:将依赖项存储在node_modules中以及package.json的存在。
什么是德诺?
“ Deno是基于V8引擎的TypeScript运行时,”
- 瑞安·达尔 ( Ryan Dahl)
鉴于Typescript是Javascript的扩展版本,Deno也是Javascript的运行时环境。
Deno是Ryan Dahl (Node.js的创建者)的一个新项目,旨在修复上面讨论的Node.js设计错误。
迪诺的主要特点
安全性
默认情况下,Deno禁止执行敏感操作,例如读取环境变量或写入文件系统。
Deno进程以非特权模式启动,并且为了访问诸如环境变量之类的数据,必须传递特殊标志。
禁止写入文件系统的权限以及与环境和网络有关的权限。 要启用这些操作,必须使用参数--allow-write
和--allow-net
调用Deno。
特权的Deno进程和v8之间的所有交互都取决于消息传递(以前是用Go编写的,现在已移植到Rust了)。 这使您可以创建一个点来检查所有消息。
模块系统
忘记package.json和node_modules。 导入源文件时,可以指定相对路径或绝对路径,或完整路径:
import { test } from "https://unpkg.com/deno_testing@0.0.5/testing.ts" import { log } from "./util.ts"
默认情况下,所有源文件都被缓存。 您可以使用--reload参数来更新依赖关系。 它像浏览器中的F5键一样工作。
开箱即用的TypeScript支持
默认情况下,Deno支持TypeScript。 来了 一无所有。 没有配置。
Deno v0.1.4的实际应用
首先,下载Deno二进制文件:
$ mkdir deno-test && cd deno-test $ wget https://github.com/denoland/deno/releases/download/v0.1.4/deno_linux_x64.gz $ gunzip -c deno_linux_x64.gz > deno $ chmod u+x deno $ ./deno --version deno: 0.1.4 v8: 7.0.247-deno
现在创建一个打字稿文件并执行它:
function hello(place: string): string { return `Hello ${place}` } console.log(hello('world'))
$ ./deno myscript.ts Hello world
您也可以尝试通过URL导入。 唯一的要求是URL末尾的文件必须具有.ts扩展名。
import { factorial } from "https://gist.githubusercontent.com/DanielRamosAcosta/ad514503b1c7cf8290dadb96a5fddee9/raw/4733e267f05d20110ba962c4418bab5e98abfe93/factorial.ts" console.log(factorial(10))
$ ./deno myimport.ts Downloading https://gist.githubusercontent.com/DanielRamosAcosta/ad514503b1c7cf8290dadb96a5fddee9/raw/4733e267f05d20110ba962c4418bab5e98abfe93/factorial.ts 3628800
在脚本执行期间,模块将加载并添加到缓存中。 要更新缓存,可以使用--reload参数调用Deno,这等效于F5或Ctrl + R键的操作。
下面是使用axios库的更复杂的示例:
import axios from "https://gist.githubusercontent.com/DanielRamosAcosta/2f773d815f5434f185c59aec1bab418c/raw/a442cdd8699e39ab9855cbaa571a79049a7b67d4/axios.ts"
唯一的问题是VSCode无法远程加载类型,因此在编辑器中将出现以下错误:
An import path cannot end with a '.ts' extension.
但是代码仍然可以正常工作并产生正确的结果:
./deno --allow-net axios-test.ts User name: Leanne Graham
结论
Deno将需要大量的时间才能成长为成熟的工作工具,但是,我认为它正在朝着正确的方向发展,并且它有可能成为比Node.js更精致的Javascript运行时。
感谢您的关注!