55

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

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

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

4

3 回答 3

102

TL;博士

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

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

德诺很快。见下文。

Deno 和 ts 节点的相似之处

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

Deno 和 ts 节点的区别

ts节点

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

德诺

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

到期

ts节点

ts-node 依赖于 Node.js 运行时,因此在此处包含它是公平的:

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

德诺

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

人气

GitHub:

堆栈溢出:

图书馆

ts节点

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

(目前 npm 上有 955,263 个包,不是所有的 Node 包,但仍然很多)

在 npm 上可用的 Node 库,即使它们最初是用 TypeScript 编写的,通常也会以转换为 JavaScript 的形式发布,并在*.d.ts文件中附加类型定义(包含在 npm 包中或与命名空间分开安装@types)。

德诺

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

Deno 库只是 TypeScript 文件。

安装差异

ts节点

  • 你安装 Node.js
  • 您安装typescriptts-node使用它们的依赖项npm
    • npm install typescript ts-node
    • 它安装了 10 个 npm 模块并将 44MB 的 212 个文件放入node_modules

德诺

您的代码差异

ts节点

  • tsc您的代码的工作方式与编译和运行的代码相同node(因为它在引擎盖下)
  • 您可以使用节点 API
  • 你可以使用所有内置的 Node 模块
  • 你可以使用来自 npm 的模块
  • 您可以import使用相对路径文件(通常不带.ts后缀)
  • 您可以使用(或)import安装的依赖项npmyarnnode_modules

德诺

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

例子

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

使用 Node 和 ts-node 创建和使用 TypeScript 库

这就是我现在正在做的一个示例项目:

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

创建库:

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

在其他项目中使用该库ts-node

  1. 创建一个新目录
  2. 创建一个package.json文件npm init
  • (以便您可以在本地为您的新程序安装依赖项)
  1. 安装我们的库npm install node-ts-hello
  2. 可选地安装 ts-nodenpm install typescript ts-node
  • (除非它是全局安装的)
  1. 添加hi.ts导入我们库的文件:
  • import { hello } from 'node-ts-hello';
  • hello('TS');
  1. 运行它npx ts-node hi.ts(如果 ts-node 安装在本地)或ts-node hi.ts(如果 ts-node 安装在全局)
  • 如果出现错误,请参见下文

潜在问题:我稍微简化了上面的内容,这里描述了我创建该库的实际过程。

使用 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');
  1. 运行你的程序deno run hi.ts

第一次运行将打印:

$ 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节点

hi.ts从上面的例子中我们启动ts-node版本的速度:

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

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

这是在已安装依赖项并运行多次以确保所有缓存正常工作之后。差不多一秒钟。

德诺

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.js 一样。

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

使用单个文件而不需要配置的开发速度,package.json或者node_modules直接从 URL 导入依赖项的可能性(如在前端),将使最终用户代码和库以不同的方式工作成为可能. 我们将看到这一切在实践中是如何运作的,但它看起来已经很有希望了。

于 2019-04-10T09:58:49.940 回答
14

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

于 2018-12-05T06:18:29.693 回答
4

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

我想在这里提出一些关键点,以便其他人可以轻松地关注关键差异:

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

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

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

  • 新PM?- Deno 根本不依赖 NPM,而是通过 URL 导入我们的库。

例子:

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

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

  • Window 对象- 好消息是现在我们可以在 Deno 中使用 Window 对象,这在 Node.js 中是不可用的。Window Object 有很多丰富的 API,对 Deno 的开发有很大帮助。
  • 导入- Deno 使用 ES6 导入在文件中注入模块。
  • Typescript - Deno 完全支持 typescript。
于 2020-06-04T05:06:41.383 回答