【问题标题】:deno vs ts-node : what's the differencedeno vs ts-node:有什么区别
【发布时间】:2019-04-24 23:17:00
【问题描述】:

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

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

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

【问题讨论】:

  • 预计在遥远的将来会在 Deno 中进行优化。

标签: node.js ts-node deno


【解决方案1】:

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 via 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 包中或与 @987654342 分开安装) @命名空间)。

德诺

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 运行时相同(因为它在后台)
  • 您可以使用 Node API
  • 您可以使用所有内置的 Node 模块
  • 您可以使用来自 npm 的模块
  • 您可以使用相对路径import 文件(通常不带.ts 后缀)
  • 您可以在node_modules 中使用npm(或yarn)安装的依赖项import

德诺

  • 您的代码与在 Node 中的工作方式不同(因为它不是使用 Node 运行的)
  • 你使用 Deno API
  • 您可以使用 Deno 内置模块
  • 您可以使用其他可用的 Deno 模块
  • 您可以使用相对路径import 文件(始终使用.ts 后缀!)
  • 您可以直接从网络上import 网址(不需要npm install

示例

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

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

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

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

创建库:

  1. 在 npm 上找到一个免费的名称(不再足够,见下文)
  2. 在 GitHub 上创建存储库
  3. npm init 创建package.json
  4. 使用npm install typescript 安装 TypeScript 编译器
  5. 决定是否将 package-lock.json 保留在 repo 中(有利有弊)
  6. 创建一个src 目录,用于保存 TypeScript 文件
  7. hello.ts 添加到src
  8. 添加tsconfig.json 文件并确保:
  • "src/**/*" 添加到"include"
  • 将依赖项和您自己的类型添加到"paths"
  • 添加"outDir": "dist" 将JS文件放在已知位置
  • dist目录添加到.gitignore,这样编译后的文件就不会在git中了
  • .gitignore 中添加相同的内容,但在.npmignore没有 dist
    (否则您将不会发布最重要的文件,请参见下文)
  • 添加"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发布包
  • 当您获得npm ERR! publish Failed PUT 401 时,您需要使用npm login 登录
  • 当您收到npm ERR! publish Failed PUT 403 时,您的包可能“与现有包太相似” - 尝试在 package.json 中重命名它,重命名 repo 并将所有喜欢的内容更新为自述文件,发布它。在 package.json 中
  1. 使用npm logout 从 npm 注销
  2. 请查看您的 ~/.npmrc 并确保您没有留下类似的东西:
  • //registry.npmjs.org/:_authToken=...

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

  1. 创建一个新目录
  2. npm init 创建一个package.json 文件
  • (以便您可以在本地为新程序安装依赖项)
  1. 使用npm install node-ts-hello 安装我们的库
  2. 可选安装带有npm install typescript ts-node的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. 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 一样。

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

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

【讨论】:

  • Deno 是节点不知道的。
  • 你对 2020 年的 deno 有什么看法?会是下一个 Node/Go 吗?
  • 所以你通过http请求导入这个import { hello } from 'https://raw.githubusercontent.com/rsp/deno-hello/master/hello.ts';??疯狂的。版本控制呢?我的意思是他们可以在链接中添加/v.1.1.1,但您不认为这效率低吗?
  • ohh 这里说deno.land/std/manual.md#comparison-to-nodejs 你可以使用文件路径。
  • “程序的启动速度已经非常令人印象深刻,我期待那里有更多的改进。”为什么你这么想?添加功能和修复错误通常会增加代码的复杂性,并使代码保持快速变得更加困难。此外,100ms以下的启动时间已经相当不错了,我怀疑他们会花很多时间来让它更快。由于层数较少,它可能仍会比 ts-node 更快,但我预计它不会比现在更快。
【解决方案2】:

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

【讨论】:

    【解决方案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";
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-16
      • 1970-01-01
      • 2018-12-29
      • 2011-05-23
      • 1970-01-01
      • 2019-09-03
      • 2014-08-28
      相关资源
      最近更新 更多