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
快
似乎 deno
和 ts-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,所以它不使用任何其他东西:
- Deno于2018年发布,最新版本为1.5.2check latest version here
人气
GitHub:
堆栈溢出:
- Questions tagged 'node.js': 358,962
- Questions tagged 'typescript': 132,043
- Questions tagged 'ts-node': 199
- Questions tagged 'deno': 320
图书馆
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
- https://nodejs.org/en/download/
- Mac 和 Linux 上的 v10(当前 LTS)在 4500 个文件中约为 65MB
- 您安装
typescript
和 ts-node
及其与 npm
的依赖关系
npm install typescript ts-node
- 它安装了 10 个 npm 模块并将 212 个文件中的 44MB 放入
node_modules
Deno
- 你下载了一个二进制文件
- https://github.com/denoland/deno/releases
- Mac 和 Linux 上 v0.3.6 的未压缩二进制文件在 Windows
上大约为 47MB 和 41MB
你的代码差异
ts-节点
- 您的代码的工作方式与使用
tsc
和 运行 使用 node
进行转译一样(因为它在幕后)
- 你可以使用节点API
- 您可以使用所有内置的 Node 模块
- 你可以使用来自 npm 的模块
- 你可以
import
文件使用相对路径(通常没有.ts
后缀)
- 您可以
import
在 node_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
正在创建库:
- 找一个在 npm 上免费的名字(不够了,见下文)
- 在 GitHub
上创建存储库
- 用
npm init
创建 package.json
- 使用
npm install typescript
安装 TypeScript 编译器
- 决定是否将
package-lock.json
保留在回购协议中(有利有弊)
- 创建一个
src
目录,您将在其中保存 TypeScript 文件
- 将
hello.ts
添加到 src
- 添加
tsconfig.json
文件并确保:
- 将
"src/**/*"
添加到 "include"
- 将依赖项和您自己的类型添加到
"paths"
- 添加
"outDir": "dist"
将JS文件放在已知的地方
- 将
dist
目录添加到.gitignore
,这样编译后的文件就不会在git
- 添加与
.gitignore
相同的内容,但 没有 dist
.npmignore
(否则你不会发布最重要的文件,见下文)
- 添加
"declaration": true
以便生成 *.d.ts
个文件
- 在
package.json
中添加"main": "dist/hello.js"
(注意“js”后缀)
- 在
package.json
中添加"types": "dist/hello.d.ts"
(注意“ts”后缀)
- 将
"build": "tsc"
添加到package.json
(注意冗余文件,见下文)
- 使用
npm login
登录(您不应一直登录 - 请参阅:Now Pushing Malware: NPM package dev logins slurped by hacked tool popular with coders)
- 用
npm run build
编译项目
- 使用
npm publish
发布包
- 当您获得
npm ERR! publish Failed PUT 401
时,您需要使用 npm login
登录
- 当你得到
npm ERR! publish Failed PUT 403
时,你的包可能“与现有包太相似” - 尝试在 package.json 中重命名它,重命名 repo 并将所有链接更新为自述文件,发布 itp。在 package.json
- 使用
npm logout
从 npm 注销
- 看看你的
~/.npmrc
并确保你没有留下这样的东西:
//registry.npmjs.org/:_authToken=...
在其他项目中使用库 ts-node
- 创建一个新目录
- 用
npm init
创建一个 package.json
文件
- (以便您可以在本地为您的新程序安装依赖项)
- 使用
npm install node-ts-hello
安装我们的库
- 可选择使用
npm install typescript ts-node
安装 ts-node
- (除非是全局安装)
- 添加
hi.ts
导入我们库的文件:
import { hello } from 'node-ts-hello';
hello('TS');
- 运行 它与
npx ts-node hi.ts
(如果 ts-node 是本地安装的)或 ts-node hi.ts
(如果 ts-node 是全局安装的)
- 如果您遇到错误,请参阅下文
潜在问题:我稍微简化了上面的内容,描述了我创建该库的实际过程here。
通过 Deno 创建和使用 TypeScript 库
这就是我现在正在做的示例项目:
https://github.com/rsp/deno-hello
正在创建库:
- 在 GitHub
上创建存储库
- 将
hello.ts
放入 repo
使用库:
- 创建文件
hi.ts
,内容如下:
import { hello } from 'https://raw.githubusercontent.com/rsp/deno-hello/master/hello.ts';
hello('TS');
- 运行 你的程序
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.json
或 node_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。
我正在做一个相对较大的打字稿项目,我正在使用 ts-node
到 运行 节点测试和示例。据我了解,ts-node
会将ts
个文件编译成js
个文件并执行。
最近听说deno
,这是一个打字稿运行时间。我在 typescript 中尝试了几个示例,它们使用 ts-node
工作。我用运行的例子deno
,控制台打印了很多编译信息,然后执行代码。后来我发现 /username/.deno
中有缓存文件。我不觉得 deno
执行速度比 ts-node
似乎 deno
和 ts-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,所以它不使用任何其他东西:
- Deno于2018年发布,最新版本为1.5.2check latest version here
人气
GitHub:
堆栈溢出:
- Questions tagged 'node.js': 358,962
- Questions tagged 'typescript': 132,043
- Questions tagged 'ts-node': 199
- Questions tagged 'deno': 320
图书馆
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
- https://nodejs.org/en/download/
- Mac 和 Linux 上的 v10(当前 LTS)在 4500 个文件中约为 65MB
- 您安装
typescript
和ts-node
及其与npm
的依赖关系npm install typescript ts-node
- 它安装了 10 个 npm 模块并将 212 个文件中的 44MB 放入
node_modules
Deno
- 你下载了一个二进制文件
- https://github.com/denoland/deno/releases
- Mac 和 Linux 上 v0.3.6 的未压缩二进制文件在 Windows 上大约为 47MB 和 41MB
你的代码差异
ts-节点
- 您的代码的工作方式与使用
tsc
和 运行 使用node
进行转译一样(因为它在幕后) - 你可以使用节点API
- 您可以使用所有内置的 Node 模块
- 你可以使用来自 npm 的模块
- 你可以
import
文件使用相对路径(通常没有.ts
后缀) - 您可以
import
在node_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
正在创建库:
- 找一个在 npm 上免费的名字(不够了,见下文)
- 在 GitHub 上创建存储库
- 用
npm init
创建 - 使用
npm install typescript
安装 TypeScript 编译器
- 决定是否将
package-lock.json
保留在回购协议中(有利有弊) - 创建一个
src
目录,您将在其中保存 TypeScript 文件 - 将
hello.ts
添加到src
- 添加
tsconfig.json
文件并确保:
package.json
- 将
"src/**/*"
添加到"include"
- 将依赖项和您自己的类型添加到
"paths"
- 添加
"outDir": "dist"
将JS文件放在已知的地方 - 将
dist
目录添加到.gitignore
,这样编译后的文件就不会在git - 添加与
.gitignore
相同的内容,但 没有dist
.npmignore
(否则你不会发布最重要的文件,见下文) - 添加
"declaration": true
以便生成*.d.ts
个文件
- 在
package.json
中添加"main": "dist/hello.js"
(注意“js”后缀) - 在
package.json
中添加"types": "dist/hello.d.ts"
(注意“ts”后缀) - 将
"build": "tsc"
添加到package.json
(注意冗余文件,见下文) - 使用
npm login
登录(您不应一直登录 - 请参阅:Now Pushing Malware: NPM package dev logins slurped by hacked tool popular with coders) - 用
npm run build
编译项目 - 使用
npm publish
发布包
- 当您获得
npm ERR! publish Failed PUT 401
时,您需要使用npm login
登录
- 当你得到
npm ERR! publish Failed PUT 403
时,你的包可能“与现有包太相似” - 尝试在 package.json 中重命名它,重命名 repo 并将所有链接更新为自述文件,发布 itp。在 package.json
- 使用
npm logout
从 npm 注销
- 看看你的
~/.npmrc
并确保你没有留下这样的东西:
//registry.npmjs.org/:_authToken=...
在其他项目中使用库 ts-node
- 创建一个新目录
- 用
npm init
创建一个
package.json
文件
- (以便您可以在本地为您的新程序安装依赖项)
- 使用
npm install node-ts-hello
安装我们的库
- 可选择使用
npm install typescript ts-node
安装 ts-node
- (除非是全局安装)
- 添加
hi.ts
导入我们库的文件:
import { hello } from 'node-ts-hello';
hello('TS');
- 运行 它与
npx ts-node hi.ts
(如果 ts-node 是本地安装的)或ts-node hi.ts
(如果 ts-node 是全局安装的)
- 如果您遇到错误,请参阅下文
潜在问题:我稍微简化了上面的内容,描述了我创建该库的实际过程here。
通过 Deno 创建和使用 TypeScript 库
这就是我现在正在做的示例项目:
https://github.com/rsp/deno-hello
正在创建库:
- 在 GitHub 上创建存储库
- 将
hello.ts
放入 repo
使用库:
- 创建文件
hi.ts
,内容如下:
import { hello } from 'https://raw.githubusercontent.com/rsp/deno-hello/master/hello.ts';
hello('TS');
- 运行 你的程序
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.json
或 node_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。