Deno是新的Node.js吗?

在我们的项目中,使用与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" // Make a request for a user with a given ID axios.get('http://jsonplaceholder.typicode.com/users/1') .then(response => { // handle success console.log("User name:", response.data.name); }) .catch(error => { // handle error console.error("error:", error); }) 

唯一的问题是VSCode无法远程加载类型,因此在编辑器中将出现以下错误:


An import path cannot end with a '.ts' extension.


但是代码仍然可以正常工作并产生正确的结果:


 ./deno --allow-net axios-test.ts User name: Leanne Graham 

结论


Deno将需要大量的时间才能成长为成熟的工作工具,但是,我认为它正在朝着正确的方向发展,并且它有可能成为比Node.js更精致的Javascript运行时。


感谢您的关注!

Source: https://habr.com/ru/post/zh-CN449000/


All Articles