我正在处理一个相对较大的打字稿项目,正在使用ts-node来运行节点测试和示例。 据我了解,ts-node会将ts文件编译为js文件并执行。
最近,我听说了deno,这是一个打字稿运行时。 我在typescript中尝试了一些示例,该示例使用ts-node可以工作。 我使用deno运行示例,控制台中印有许多编译消息,然后执行代码。 后来我发现/username/.deno中有缓存文件。 我不认为deno的执行速度快于ts-node
看来deno和ts-node都将使用缓存进行编译和运行。 它们之间有什么区别?
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和ts-node的相似之处
它们都运行TypeScript代码
它们都可以在Linux,Mac和Windows上运行(但ts节点也可以在SmartOS和AIX上运行)
它们都使用Google V8 JavaScript引擎(ts-node通过其在后台使用的节点)
好的。
Deno和ts-node的差异
ts节点
ts-node是一个Node.js模块
它是用Node.js编写的
它与npm一起安装
它使用TypeScript编译器作为对等依赖项
它安装自己的依赖项
作为运行时,它使用使用libuv用C ++编写的Node
好的。
天野
deno是一个独立的可执行文件
它不使用Node.js
它作为一个二进制文件分发
它包含TypeScript编译器作为V8快照
它没有依赖性
它是使用Tokio用Rust编写的运行时
好的。
到期
ts节点
ts-node依赖于Node.js运行时,因此可以将其包含在此处:
好的。
Node.js于2009年发布,最新的LTS版本是10.15.3
npm于2010年发布,Node LTS中包含的版本为6.4.1
ts-node于2015年发布,最新版本是8.0.3
好的。
天野
Deno本身是一个运行时,因此不使用其他任何东西:
好的。
Deno于2018年发布,最新版本是1.0请在此处查看最新版本
好的。
人气度
的GitHub:
好的。
nodejs /节点
类型强/ ts-node
denoland / deno
好的。
堆栈溢出:
好的。
标记为``node.js''的问题:270,111
标记为``打字稿''的问题:78,592
被标记为" ts-node"的问题:94
标记为" deno"的问题:9
好的。
图书馆
ts节点
您可以使用npm上所有可用的Node库
好的。
(目前,npm上有955,263个软件包,并非全部用于Node,但数量仍然很多)
好的。
npm上可用的Node库,即使它们最初是用TypeScript编写的,也通常以转换为JavaScript的形式发布,并在*.d.ts文件中包含附加的类型定义(包含在npm包中或与@types命名空间分开安装) 。
好的。
天野
https://deno.land/x/上有55个第三方模块,而https://github.com/denolib/awesome-deno#modules上有56个库和工具(我没有检查是否全部相同) )
好的。
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模块并将44MB的212个文件放入node_modules
好的。
好的。
天野
您下载一个二进制文件
https://github.com/denoland/deno/releases
在Mac和Linux上,v0.3.6的未压缩二进制文件分别约为47MB和41MB
好的。
好的。
您的代码差异
ts节点
您的代码的工作方式与使用tsc进行编译并使用node运行的方式相同(因为它在内部)
您可以使用Node API
您可以使用所有内置的Node模块
您可以使用npm中的模块
您可以使用相对路径import文件(通常不带.ts后缀)
您可以import在node_modules中随npm(或yarn)安装的依赖项
好的。
天野
您的代码与Node中的代码工作方式不同(因为它未与Node一起运行)
您使用Deno API
您可以使用Deno内置模块
您可以使用其他可用的Deno模块
您可以使用相对路径import文件(始终带有.ts后缀!)
您可以直接从Web上import个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中相同的内容,但在.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登录(您不应该一直登录-请参阅:正在推送恶意软件:NPM软件包开发人员登录受到编码人员欢迎的黑客入侵工具的s毁)
用npm run build编译项目
使用npm publish发布软件包
当您获得npm ERR! publish Failed PUT 401时,您需要使用npm login登录
当您得到npm ERR! publish Failed PUT 403时,您的软件包可能"与现有软件包太相似"-尝试在package.json中重命名它,重命名存储库,并将所有lik更新为自述文件,然后发出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是全局安装的)运行它
如果遇到错误,请参见下文
好的。
潜在问题:我将上述内容简化了一些,此处介绍了创建该库的实际过程。
好的。
使用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运行程序
第一次运行将打印:
好的。
1 2 3 4 5
| $ 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! |
第二次运行:
好的。
1 2
| $ deno run hi.ts
Hello, TS! |
如果更改hi.ts,它将重新编译,但依赖项将不会再次下载:
好的。
1 2 3
| $ 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节点版本的速度:
好的。
1 2 3 4 5 6
| $ time npx ts-node hi.ts
Hello, TS!
real 0m0.904s
user 0m1.300s
sys 0m0.083s |
这是在已经安装了依赖项之后,并且在运行了几次之后以确保所有缓存都能正常工作。
差不多一秒钟。
好的。
天野
从上面的示例中启动hi.ts的Deno版本的速度:
好的。
1 2 3 4 5 6
| $ 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导入依赖项(例如在前端)的可能性,将使得最终可以以不同的方式工作用户代码和库。我们将看到它在实践中是如何工作的,但看起来已经很有希望。
好的。
好。
-
Deno是节点不知道的东西。
-
感谢广泛的比较。有一个小错字,上面写着"现金"而不是"缓存"。
-
您如何看待2020年的deno?会是下一个Node / Go吗?
-
所以您通过http请求导入此import { hello } from https:raw.githubusercontent.comrspdeno-hellomasterhel lo.ts;?疯。那版本控制呢?我的意思是他们可以在链接中添加v.1.1.1,但是您不认为这样效率不高吗?
-
哦,这里是deno.land/std/manual.md#comparison-to-nodejs,您可以使用文件路径。
-
"程序启动速度已经非常可观,我希望在那里能有更多的改进。"为什么你这么想?添加功能和修复错误通常会增加代码的复杂性,并使保持代码快速变得更加困难。此外,启动时间还不到100毫秒,这已经相当不错了,我怀疑他们会花费很多时间来使其更快。由于层数较少,它可能仍会比ts-node更快,但我不希望它会比现在更快。
-
肯定确实有潜在的版本问题@aRtoo!提醒Go ...上一次我使用它时,社区最终发明了自己的包装管理器!
ts-node是基于Node的,而Deno是完全不同的新服务器端运行时,其API,模块系统,安全模型等方面的设计有所变化(这反映了ES6之后的发展)。另外,TypeScript编译器直接位于单个Deno可执行文件内部(通过V8快照),因此启动时间应更短。
我认为@rsp已经发布了有关Deno的详细信息。
我想在这里提出一些关键点,以便其他人可以轻松地关注关键差异: