deno vs ts-node:有什么区别

时间:2018-11-22 09:50:36

标签: node.js ts-node deno

我正在处理一个相对较大的打字稿项目,正在使用ts-node来运行节点测试和示例。据我了解,ts-node会将ts文件编译为js文件并执行。

最近我听说deno,这是一个打字稿运行时。我尝试了一些使用ts-node的打字稿示例。我使用deno来运行示例,控制台中印有许多编译消息,然后执行代码。后来我发现/username/.deno中有缓存文件。我觉得deno的执行速度不比ts-node

似乎denots-node都将使用缓存进行编译和运行。它们之间有什么区别?

3 个答案:

答案 0 :(得分:14)

TL; DR

Deno更像Node而不是ts-node,即它是基于V8的JS运行时。与Node不同,Deno包含TypeScript编译器。 Deno不属于Node / npm生态系统。

另一方面,

ts-node是一个Node.js模块,它使用TypeScript编译器来转换TypeScript代码并在Node中运行它。 ts-node是Node / npm生态系统的一部分。

Deno很快。见下文。

Deno和ts节点的相似性

  • 它们都运行TypeScript代码
  • 它们都可以在Linux,Mac和Windows上运行(但ts-node也可以在SmartOS和AIX上运行)
  • 它们都使用Google V8 JavaScript引擎(ts-node通过引擎盖下使用的节点)

Deno和ts节点的差异

ts-node

  • ts-node是Node.js模块
  • 它是用Node.js编写的
  • 它与npm一起安装
  • 它使用TypeScript编译器作为对等依赖项
  • 它会安装自己的依赖项
  • 作为运行时,它使用使用libuv用C ++编写的Node

Deno

  • deno是独立的可执行文件
  • 它不使用Node.js
  • 它以单个二进制文件的形式分发
  • 它包含TypeScript编译器作为V8快照
  • 它没有依赖项
  • 这是使用Tokio用Rust编写的运行时

成熟度

ts-node

ts-node依赖于Node.js运行时,因此可以将其包含在此处:

  • Node.js于2009年发布,最新的LTS版本是10.15.3
  • npm于2010年发布,Node LTS中包含的版本为6.4.1
  • ts-node于2015年发布,最新版本为8.0.3

Deno

Deno本身就是一个运行时,因此它不使用其他任何东西:

  • Deno于2018年发布,最新版本为0.3.6

人气

GitHub:

堆栈溢出:

图书馆

ts-node

您可以使用npm上所有可用的Node库

(目前npm上有955,263个程序包,不是全部用于Node,但仍然很多)

npm上可用的Node库,即使它们最初是用TypeScript编写的,通常也会以*.d.ts文件(包含在npm软件包中或与安装成@types命名空间)。

Deno

https://deno.land/x/上有55个第三方模块,https://github.com/denolib/awesome-deno#modules上有56个库和工具(我没有检查是否全部相同)

Deno库只是TypeScript文件。

安装差异

ts-node

  • 您安装Node.js
  • 您安装typescriptts-node及其与npm的依赖关系
    • npm install typescript ts-node
    • 它将安装10个npm模块并将44MB的212个文件放入node_modules

Deno

您的代码差异

ts-node

  • 您的代码的工作方式与使用tsc进行编译并使用node运行的代码相同(因为它在幕后)
  • 您可以使用Node API
  • 您可以使用所有内置的Node模块
  • 您可以使用npm中的模块
  • 您可以使用相对路径{通常没有import后缀.ts文件
  • 您可以import npmyarn(或node_modules)安装的依赖项

Deno

  • 您的代码与Node中的代码不同(因为它不与Node一起运行)
  • 您使用的是Deno API
  • 您可以使用Deno内置模块
  • 您可以使用其他可用的Deno模块
  • 您可以使用相对路径{始终带有import后缀.ts文件
  • 您可以直接从网络上import个URL(不需要npm install

示例

这里是发布用TypeScript编写的最小库并使用它的示例。

使用带有Node和ts-node的TypeScript库创建和使用

这是我现在在以下示例项目上正在做的事情:

https://github.com/rsp/node-ts-hello

创建库:

  1. 找到一个在npm上免费的名称(不再足够,请参阅下文)
  2. 在GitHub上创建存储库
  3. 使用package.json创建npm init
  4. 使用npm install typescript
  5. 安装TypeScript编译器
  6. 确定您是否将package-lock.json保留在回购协议中(各有利弊)
  7. 创建一个src目录,您将在其中保存TypeScript文件
  8. hello.ts添加到src
  9. 添加tsconfig.json文件,并确保:
    • "src/**/*"添加到"include"
    • 将依赖项和您自己的类型添加到"paths"
    • 添加"outDir": "dist"以将JS文件放置在已知位置
    • dist目录添加到.gitignore,以便编译后的文件不在git中
    • 添加与.gitignore中的内容相同的内容,但不添加中的dist中的.npmignore
      (否则,您将不会发布最重要的文件,请参见下文)
    • 添加"declaration": true,以便您生成*.d.ts个文件
  10. "main": "dist/hello.js"中添加package.json(注意后缀“ js”)
  11. "types": "dist/hello.d.ts"中添加package.json(注意后缀“ ts”)
  12. "build": "tsc"添加到package.json(注意冗余文件,请参见下文)
  13. 使用npm login登录(您不应该一直登录-参见:Now Pushing Malware: NPM package dev logins slurped by hacked tool popular with coders
  14. 使用npm run build编译项目
  15. 使用npm publish发布软件包
    • 获得npm ERR! publish Failed PUT 401后,您需要使用npm login登录
    • 当您收到npm ERR! publish Failed PUT 403时,您的软件包可能“与现有软件包太相似”-尝试在package.json中重命名它,重命名存储库并将所有lik更新为自述文件,然后发出itp。在package.json中
  16. 使用npm logout从npm注销
  17. 查看您的~/.npmrc并确保没有剩下的像这样的东西:
    • //registry.npmjs.org/:_authToken=...

使用ts-node

在其他项目中使用库
  1. 创建一个新目录
  2. 使用package.json创建一个npm init文件
    • (以便您可以在本地为新程序安装依赖项)
  3. 使用npm install node-ts-hello
  4. 安装我们的库
  5. (可选)使用npm install typescript ts-node安装ts-node
    • (除非已全局安装)
  6. 添加hi.ts文件,该文件使用以下内容导入我们的库:
    • import { hello } from 'node-ts-hello';
    • hello('TS');
  7. 使用npx ts-node hi.ts(如果ts-node是本地安装的)或ts-node hi.ts(如果ts-node是全局安装的)运行的
    • 如果遇到错误,请参见下文

潜在问题:我对上述内容进行了一些简化,here中描述了创建该库的实际过程。

使用Deno创建和使用TypeScript库

这是我现在在以下示例项目上正在做的事情:

https://github.com/rsp/deno-hello

创建库:

  1. 在GitHub上创建存储库
  2. hello.ts放入仓库

使用库:

  1. 使用以下内容创建文件hi.ts
    • import { hello } from 'https://raw.githubusercontent.com/rsp/deno-hello/master/hello.ts';
    • hello('TS');
  2. 使用deno run hi.ts
  3. 运行程序

第一次运行将打印:

$ deno run hi.ts 
Compiling file:///Users/rsp/talks/deno/hello-deno-test/hi.ts
Downloading https://raw.githubusercontent.com/rsp/deno-hello/master/hello.ts
Compiling https://raw.githubusercontent.com/rsp/deno-hello/master/hello.ts
Hello, TS!

第二次运行:

$ deno run hi.ts 
Hello, TS!

如果您更改hi.ts,它将被重新编译,但是依赖项将不会再次下载:

$ deno run hi.ts 
Compiling file:///Users/rsp/talks/deno/hello-deno-test/hi.ts
Hello, TS!

(请注意,touch hi.ts是不够的,您需要进行实际更改,因为Deno会检查文件校验和,而不是时间戳。)

速度

ts-node

从上面的示例中启动hi.ts的ts节点版本的速度:

$ time npx ts-node hi.ts 
Hello, TS!

real    0m0.904s
user    0m1.300s
sys     0m0.083s

这是在依赖项已经安装并且运行几次之后,以确保所有兑现都有效。 差不多一秒钟。

Deno

从上面的示例中启动hi.ts的Deno版本的速度:

$ time deno run hi.ts 
Hello, TS!

real    0m0.028s
user    0m0.010s
sys     0m0.015s

这也是在已经安装了依赖项之后,并且运行了几次以确保所有兑现都有效之后。

速度提高了32倍以上。

摘要

应该将Deno与Node进行比较,而不是与ts-node进行比较,因为Deno是全新的运行时,而ts-node是Node的模块,因此使用ts-node运行的程序确实使用Node运行时

这是一个非常年轻的项目,但已经吸引了很多人。它没有Node那样多的文档或库,但它意味着它可能是参与其中的最佳时机,因为当它变得更流行时,我认为由于很多原因,这将超出此答案的范围。像Node一样,将需要在市场上拥有丰富经验的人。

程序启动速度已经非常令人印象深刻,我希望在那里能有更多的改进。

使用单个文件而不需要像package.jsonnode_modules这样的配置的开发速度以及可以直接从URL导入依赖项(例如在前端)的开发速度将使它可以在最终用户代码和库的另一种方式。我们将看到它在实践中如何工作,但看起来已经很有希望。

答案 1 :(得分:7)

ts-node是基于Node的,而Deno是一个完全不同的新服务器端运行时,其API,模块系统,安全模型等方面的设计有所变化(这反映了ES6之后的发展)。另外,TypeScript编译器直接存在于单个Deno可执行文件内部(通过V8快照),因此启动时间应该较短。

答案 2 :(得分:3)

我认为 @rsp 已经发布了有关Deno的详细信息。

我想在此处提出一些要点,以便其他人可以轻松地关注关键区别:

  • 语言-Deno基于RUST语言-Rust是一种多范式编程语言,专注于性能和安全性,尤其是安全并发。 Rust在语法上类似于C ++,但是在不使用垃圾回收的情况下提供了内存安全性

  • 运行时-Deno也依赖V8引擎。

  • 安全性 —对Node.js的普遍批评是,一旦节点应用程序运行,它就可以轻松访问文件系统或网络等。 虽然Deno要求用户许可以允许使用诸如网络,文件系统等资源。

  • NPM?-Deno完全不依赖NPM,而是通过URL导入库。

示例:

> import { serve } from "https://deno.land/std/http/server.ts";

我们要使用的所有库都先下载然后缓存。

  • 窗口对象-好消息是,现在我们可以在Deno中使用Window对象,而Node.js中不提供。 Window Object具有丰富的API,可以在Deno中为开发提供很多帮助。
  • 导入-Deno使用ES6导入将模块注入文件中。
  • 打字稿-Deno完全支持打字稿。