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
- 您安装
typescript 和ts-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
创建库:
- 在 npm 上找到一个免费的名称(不再足够,见下文)
- 在 GitHub 上创建存储库
- 用
npm init 创建package.json
- 使用
npm install typescript 安装 TypeScript 编译器
- 决定是否将
package-lock.json 保留在 repo 中(有利有弊)
- 创建一个
src 目录,用于保存 TypeScript 文件
- 将
hello.ts 添加到src
- 添加
tsconfig.json 文件并确保:
- 将
"src/**/*" 添加到"include"
- 将依赖项和您自己的类型添加到
"paths"
- 添加
"outDir": "dist" 将JS文件放在已知位置
- 将
dist目录添加到.gitignore,这样编译后的文件就不会在git中了
- 在
.gitignore 中添加相同的内容,但在.npmignore 中没有 dist
(否则您将不会发布最重要的文件,请参见下文)
- 添加
"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 并将所有喜欢的内容更新为自述文件,发布它。在 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 放入仓库
使用库:
- 创建一个文件
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
这是在已安装依赖项并运行多次以确保所有缓存正常工作之后。
差不多一秒钟。
德诺
从上面的例子中启动我们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.json 或 node_modules 这样的配置的开发速度,以及直接从 URL 导入依赖项的可能性(比如在前端),这将使得以不同的方式工作成为可能用于最终用户代码和库。我们将看到这一切在实践中是如何运作的,但它看起来已经很有希望了。