TL;DR
德诺更像Node而不是ts Node,也就是说,它是一个基于V8的JS运行时.与Node不同,德诺包含TypeScript编译器.德诺不是Node/npm生态系统的一部分.
另一方面,ts node 是一个 node .使用TypeScript编译器传输TypeScript代码并在 node 中运行的js模块.ts node 是node/npm生态系统的一部分.
德诺跑得很快.见下文.
德诺 and ts node similarities
- 它们都运行类型脚本代码
- 它们都在Linux、Mac和Windows上运行(但ts node也在SmartOS和AIX上运行)
- 它们都使用Google V8 JavaScript引擎(ts node 通过引擎盖下使用的 node )
德诺 and ts node differences
ts node
- ts node 是一个 node .js模块
- 它是用Node编写的.js
- 它安装了npm
- 它使用TypeScript编译器作为对等依赖项
- 它安装自己的依赖项
- 作为运行时,它使用的是用LIBV编写的C++ node .
德诺
- deno是一个独立的可执行文件
- 它不使用Node.js
- 它作为一个二进制文件分发
- 它包含作为V8快照的TypeScript编译器
- 它没有依赖性
- 这是一个使用Tokio用Rust编写的运行时
Maturity
ts node
ts node 依赖于该 node .js运行时,因此在此处包含它是公平的:
- node .js于2009年发布,最新的LTS版本是14.15.0
- npm于2010年发布, node LTS中包含的版本为6.14.8
- ts node于2015年发布,最新版本为9.0.0
德诺
德诺本身就是一个运行时,所以它不使用其他任何东西:
Popularity
github:
堆栈溢出:
Libraries
ts node
您可以使用npm上提供的所有 node 库
(目前npm上有955263个软件包,并非所有都是针对Node的,但仍然很多)
npm上可用的 node 库(即使它们最初是用TypeScript编写的)通常以传输到JavaScript的形式发布,并在*.d.ts
个文件中包含额外的类型定义(包括在npm包中或与@types
命名空间分开安装).
德诺
https://deno.land/x/上有1256个第三方模块,https://github.com/denolib/awesome-deno#modules上有56个库和工具(我没有判断它们是否都相同)
德诺库只是类型脚本文件.
Installation difference
ts node
- 您可以安装Node.js
- you install
typescript
and ts node
with their dependencies with npm
npm install typescript ts node
- 它安装10个npm模块,将212个文件中的44MB放入
node_modules
个文件中
德诺
Your code differences
ts node
- 您的代码的工作原理与使用
tsc
传输和使用node
运行的代码相同(因为它在引擎盖下)
- 您可以使用 node API
- 您可以使用所有内置 node 模块
- 您可以使用npm中的模块
- 可以使用相对路径创建
import
个文件(通常没有.ts
后缀)
- 您可以在
node_modules
中安装npm
(或yarn
)个依赖项
德诺
- 您的代码与Node中的工作原理不同(因为它不是与Node一起运行的)
- 您可以使用德诺 API
- 您可以使用德诺内置模块
- 您可以使用其他可用的德诺模块
- 您可以使用相对路径创建
import
个文件(始终带有.ts
后缀!)
- 你可以直接从网上下载
import
个URL(不需要npm install
个)
Examples
下面是一个发布用TypeScript编写的最小库并使用它的示例.
Creating and using a TypeScript library with Node and ts node
这就是我现在正在做的一个示例项目:
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
中相同的内容,但在.npmignore
中添加without 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
个包时,你的包可能"与现有包太相似"——试着在包中重命名它.json,重命名回购协议,并将所有LIK更新为自述文件,发布itp.打包的.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.
Creating and using a TypeScript library with 德诺
这就是我现在正在做的一个示例项目:
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
不够,您需要进行实际更改,因为德诺判断的是文件校验和,而不是时间戳.)
Speed
ts node
从以上示例可以看出,启动我们hi.ts
的ts node 版本的速度:
$ time npx ts node hi.ts
Hello, TS!
real 0m0.904s
user 0m1.300s
sys 0m0.083s
这是在已经安装了依赖项并运行了几次以确保所有缓存工作之后.
德诺
从上面的例子可以看出,我们hi.ts
的德诺版本的启动速度:
$ time deno run hi.ts
Hello, TS!
real 0m0.028s
user 0m0.010s
sys 0m0.015s
这也是在已经安装了依赖项并运行了几次以确保所有缓存工作之后.
速度提升超过32倍.
Summary
德诺应该更多地与Node进行比较,而不是与ts node
进行比较,因为德诺是一个全新的运行时,而ts node
是Node的一个模块,所以使用ts node
运行的程序实际上使用了Node运行时.
这是一个非常年轻的项目,但已经有了很大的吸引力.它没有Node那么多的文档或库,但这意味着它可能是参与其中的最佳时机,因为当它变得更受欢迎时,我认为它会因为许多超出本答案范围的原因,在市场上需要已经有过Node经验的人,就像Node一样.
该项目的启动速度已经非常令人印象深刻,我预计会有更多的改进.
使用单个文件而不需要配置(如package.json
或node_modules
)的开发速度,以及直接从URL(如前端)导入依赖项的可能性,将使最终用户代码和库以不同的方式工作成为可能.我们将看到这一切在实践中是如何运作的,但看起来已经很有希望了.