Deno会取代NodeJS吗?

594 阅读5分钟

原文链接:blog.bitsrc.io/what-is-den…

Deno会取代NodeJS吗?

现在下定论可能为时尚早,但有一些例子正在验证这个事情

让我们开始吧

2018年,Ryan 讨论了10个在Node.js 的设计错误。并且在最后他公布了Deno,在当时这还是个很小的项目,并且取名也是叫改进了更加安全的Node.js 2.0 (当时的介绍视频)

2年后,5月13日 官方正式发布Deno 1.0。对于后端是新的javascript运行时,但不是基于c++,而是基于Rust,并且基于Tokio平台(支持js的异步操作即时间循环机制),但还是运行在google的V8 引擎上。

就这?

我们不是在说这个新的js运行时 完全兼容现在的Node.js。相反,Ryan想把之前创建node时的一些缺陷和考虑欠佳的东西放到Deno中.

集成安全性

Node.js 默认允许你访问任何文件,这意味着你能直接读写文件系统, 直接向外发起请求, 直接获取环境变量 等等。虽然作为开发者有这些权限是有好处的,但同时也带来了安全风险当你不太关心你所写的代码的时候。

取而代之,Deno用命令行参数来允许或者静止访问不同的安全功能。当你想用script访问 /etc 文件夹,你可以:

deno --allow-read=/etc myscript.ts

这允许你的代码读取文件夹,还有你能获取到安全异常。这跟其它的平台获取安全很像。如果你是安卓用户,很多应用在安装到手机后,在访问不同的系统前需要被询问(例如通讯录,打电话,文件夹)等等,这其实是相同的层面。在使用命令行添加这些参数来执行你的脚本的同时,你需要在代码上提供许可。

一个更加完善的标准库

JavaScript在第一个node版本就提供了一个标准库,但是相比其它的语言它还是有很长的路要走。Deno同样也在改进这些并且声称有一个非常完善的标准库允许开发者使用官方的工具来完成一些基本的功能并只需要使用一点三方库就能完成负责的任务。

本质上就是开箱即用,Deno伴随的工具 color 直接用在命令行文本上,处理一些 数据结构 (例如 binary,csv,yaml等等),生成 UUIDs 已经直接写websockets 还有更多可用的基础模块,例如文件访问,日期帮助函数,http请求相关的函数 已经 更多

内置TypeScript

是的,如果你很喜欢TypeScript,Deno已经帮你做了,不需要额外的配置,内部直接转译成JavaScript

虽然Deno已经帮你做了很多事情,你可以重写配置项目,使用自定义的 tsconfig.json文件:

deno run -c tsconfig.json [your-script.ts]

默认配置使用严格(strict)模式,不规范的代码会立即抛出警告。

没有更多的NPM 或者 node_modules 文件夹

这是不是太臃肿了?这是一个错误的控制依赖的分发方式?这也是Node最具争议的地方,Deno决定摆脱这点。

所以Deno怎么处理依赖关系呢?你可以从任何地方加载模版。换言之,你可以简单的这样做:

import * as log from "https://deno.land/std/log/mod.ts"

不在需要一个中心化的仓库,当你在导入三方的源码的时候你要小心,特别是你还没完全掌握它的时候,它会是你的代码暴露在外面。

事实上,package.json 不见了,依赖管理现在变得非常简单,只需要一个模块列表和URLs在一个叫deps.ts的文件中。但是关于版本控制呢?直接在URL上指定包的版本就可以了,虽然看上去不是很优雅,但是它能工作。

deps.ts看起来像这样

export { assert } from "https://deno.land/std@v0.39.0/testing/asserts.ts";
export { green, bold } from "https://deno.land/std@v0.39.0/fmt/colors.ts";

只需要简单修改URL就可以导出不同版本的包。

顺便说一下,第一次导入的代码会进行缓存,直到在执行你的脚本时使用--reload标志

别的呢

Deno还有其它的特性,包括更多开箱即用的工具像 test runner,debugger, file watcher等等。但是说一下,其中一些只是提供了一些APIs,你要使用它们则要编写自己的工具。

举个例子:file watcher API 通过Deno.watchFs 提供给你,如果你想找一个类似nodemon的解决方案,你需要自己去实现。下面是一个实现

function startProcess(args: string[] = []):Deno.Process {
	return Deno.run({ cmd: ['deno', ...args]})
} 

const throttle = 500;
let app: Deno.Process = startProcess(Deno.args);
let appInitTime: number = Date.now();
let timeout: number|null = null;

funtion runApp(){
	appInitTime = Date.now();
    app && app.close();
    app = startProcess(Deno.args);
}

runApp();

for await (const event of Deno.watchFs('.')) {
	if (event.kind !== "access") {
    	if (timeout) clearTimeout(timeout);
        timeout = setTimeout(runApp, throttle)
    }
}

会迟早取代 Node.js 吗?

并不是,回到Node在0.10版本的时候,我们在使用Node.js 并且直接用在了产品上!可能现在会有点后怕,当时这样做可能是没有类似的东西。不是PHP,Python,甚至Ruby去跟使用有着异步I/O操作的,能写后端的Javascript了。经过这些年的发展,Node已经能够满足行业的需求了。虽然不够完美,但是在编程语言方面没有完美的选择了啊。

Deno也不是独特的,可能只是这两年会是个热点,它还没有被使用在产品中。它还没有经过考验在处理一些边界问题上。当哪天做到了,它可能会变成玩具在一些早期的体验者身上。也许这些年就会听到一些公司在尝试使用Deno,并且分享他们如何解决这些问题的经验,背后的社区也会不断的迭代去解决新的问题。然后它就能取代Node了?拭目以待吧。

后记

当我翻译完这篇文章的时候,掘金不经意间给我推送了一篇文章,有兴趣也可以读一下。 juejin.cn/post/689933…