deno vs ts-node:有什么区别

deno vs ts-node : what's the difference

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

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

似乎 denots-node 都可以编译并且 运行 使用缓存。它们有什么区别?

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

TL;DR

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

另一方面,

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

Deno 很快。见下文。

Deno 和 ts-node 的相似之处

  • 它们都运行 TypeScript 代码
  • 它们都在 Linux、Mac 和 Windows 上 运行(但 ts-node 也在 SmartOS 和 AIX 上)
  • 他们都使用 Google V8 JavaScript 引擎(ts-node via node 在后台使用)

Deno 和 ts-node 的区别

ts-节点

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

Deno

  • 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

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

人气

GitHub:

堆栈溢出:

图书馆

ts-节点

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

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

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

Deno

https://deno.land/x/ and 56 libraries and tools on https://github.com/denolib/awesome-deno#modules上有1256个第三方模块(我没查是否都一样)

Deno 库只是 TypeScript 文件。

安装差异

ts-节点

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

Deno

你的代码差异

ts-节点

  • 您的代码的工作方式与使用 tsc 和 运行 使用 node 进行转译一样(因为它在幕后)
  • 你可以使用节点API
  • 您可以使用所有内置的 Node 模块
  • 你可以使用来自 npm 的模块
  • 你可以import文件使用相对路径(通常没有.ts后缀)
  • 您可以 importnode_modules
  • 中使用 npm(或 yarn)安装的依赖项

Deno

  • 您的代码与在 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. 上创建存储库
  4. npm init
  5. 创建 package.json
  6. 使用 npm install typescript
  7. 安装 TypeScript 编译器
  8. 决定是否将 package-lock.json 保留在回购协议中(有利有弊)
  9. 创建一个 src 目录,您将在其中保存 TypeScript 文件
  10. hello.ts 添加到 src
  11. 添加 tsconfig.json 文件并确保:
  • "src/**/*" 添加到 "include"
  • 将依赖项和您自己的类型添加到 "paths"
  • 添加"outDir": "dist"将JS文件放在已知的地方
  • dist目录添加到.gitignore,这样编译后的文件就不会在git
  • 添加与 .gitignore 相同的内容,但 没有 dist .npmignore
    (否则你不会发布最重要的文件,见下文)
  • 添加 "declaration": true 以便生成 *.d.ts 个文件
  1. package.json中添加"main": "dist/hello.js"(注意“js”后缀)
  2. package.json中添加"types": "dist/hello.d.ts"(注意“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
  7. 发布包
  • 当您获得 npm ERR! publish Failed PUT 401 时,您需要使用 npm login
  • 登录
  • 当你得到 npm ERR! publish Failed PUT 403 时,你的包可能“与现有包太相似” - 尝试在 package.json 中重命名它,重命名 repo 并将所有链接更新为自述文件,发布 itp。在 package.json
  1. 使用 npm logout
  2. 从 npm 注销
  3. 看看你的 ~/.npmrc 并确保你没有留下这样的东西:
  • //registry.npmjs.org/:_authToken=...

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

  1. 创建一个新目录
  2. npm init
  3. 创建一个 package.json 文件
  • (以便您可以在本地为您的新程序安装依赖项)
  1. 使用 npm install node-ts-hello
  2. 安装我们的库
  3. 可选择使用 npm install typescript ts-node
  4. 安装 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 是全局安装的)
  • 如果您遇到错误,请参阅下文

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

通过 Deno 创建和使用 TypeScript 库

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

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

正在创建库:

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

使用库:

  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

这是在依赖项已经安装之后,并且在 运行ning 几次以确保所有缓存工作之后。 快一秒了。

Deno

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

$ time deno run hi.ts 
Hello, TS!

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

这也是在依赖项已经安装之后,并且在 运行ning 几次以确保所有缓存工作之后。

速度提升超过 32 倍。

总结

Deno 应该更多地与 Node 进行比较,而不是与 ts-node 进行比较,因为 Deno 是一个全新的 运行time,而 ts-node 是 Node 的一个模块,因此您的程序 运行 with ts-node 真正使用节点 运行time.

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

程序启动速度已经非常可观,我希望在那里有更多改进。

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

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

我想把一些关键点放在这里,以便其他人可以轻松地将目光放在关键区别上:

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

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

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

  • NPM?- Deno 根本不依赖 NPM,而是通过 URL.[=11 导入我们的库=]

示例:

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

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

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