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
- 您安装
typescript
并ts-node
使用它们的依赖项npm
npm install typescript ts-node
- 它安装了 10 个 npm 模块并将 44MB 的 212 个文件放入
node_modules
德诺
您的代码差异
ts节点
tsc
您的代码的工作方式与编译和运行的代码相同node
(因为它在引擎盖下)
- 您可以使用节点 API
- 你可以使用所有内置的 Node 模块
- 你可以使用来自 npm 的模块
- 您可以
import
使用相对路径文件(通常不带.ts
后缀)
- 您可以使用(或)
import
安装的依赖项npm
yarn
node_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
创建库:
- 在 npm 上找到一个免费的名称(不再足够,见下文)
- 在 GitHub 上创建仓库
- 创建
package.json
与npm init
- 安装 TypeScript 编译器
npm install typescript
- 决定你是否保留
package-lock.json
在回购中(有利有弊)
- 创建一个
src
存放 TypeScript 文件的目录
- 添加
hello.ts
到src
- 添加
tsconfig.json
文件并确保:
- 添加
"src/**/*"
到"include"
- 将依赖项和您自己的类型添加到
"paths"
- 添加
"outDir": "dist"
以将 JS 文件放在已知位置
- 将
dist
目录添加到,.gitignore
以便编译的文件不在 git 中
- 添加与 in 相同
.gitignore
但不 dist
添加in .npmignore
(否则您将不会发布最重要的文件,见下文)
- 添加
"declaration": true
所以你有*.d.ts
文件生成
- 添加
"main": "dist/hello.js"
(package.json
注意“js”后缀)
- 添加
"types": "dist/hello.d.ts"
(package.json
注意“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 注销
npm logout
- 看看你的
~/.npmrc
,确保你没有这样的东西:
//registry.npmjs.org/:_authToken=...
在其他项目中使用该库ts-node
- 创建一个新目录
- 创建一个
package.json
文件npm init
- 安装我们的库
npm install node-ts-hello
- 可选地安装 ts-node
npm install typescript 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 安装在全局)
潜在问题:我稍微简化了上面的内容,这里描述了我创建该库的实际过程。
使用 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.js 一样。
程序启动速度已经非常令人印象深刻,我希望那里有更多改进。
使用单个文件而不需要配置的开发速度,package.json
或者node_modules
直接从 URL 导入依赖项的可能性(如在前端),将使最终用户代码和库以不同的方式工作成为可能. 我们将看到这一切在实践中是如何运作的,但它看起来已经很有希望了。