一尘不染

deno vs ts-node:有什么区别

node.js

我正在从事一个相对较大的打字稿项目,正在ts-node用于运行节点测试和示例。据我了解,ts-nodets文件编译为js文件并执行。

最近,我听说了deno,这是一个打字稿运行时。我在typescript中尝试了一些示例,该示例可以使用ts- node。我使用来运行示例deno,控制台中印有许多编译消息,然后执行代码。后来我发现中有缓存文件/username/.deno。我觉得deno执行速度不会比ts- node

这似乎都denots-node编译和使用高速缓存运行。它们之间有什么区别?


阅读 435

收藏
2020-07-07

共1个答案

一尘不染

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 node

  • ts-node是一个Node.js模块
  • 它是用Node.js编写的
  • 它与npm一起安装
  • 它使用TypeScript编译器作为对等依赖项
  • 它安装自己的依赖项
  • 作为运行时,它使用使用libuv用C ++编写的Node

deno

  • deno是一个独立的可执行文件
  • 它不使用Node.js
  • 它作为一个二进制文件分发
  • 它包含TypeScript编译器作为V8快照
  • 它没有依赖性
  • 它是使用Tokio用Rust编写的运行时

Maturity

ts-node

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本身是一个运行时,因此不使用其他任何东西:

人气度

GitHub:

Libraries

ts-node

您可以使用npm上所有可用的Node库

(目前,npm上有955,263个软件包,并非全部用于Node,但数量仍然很多)

npm上可用的Node库,即使它们最初是用TypeScript编写的,也通常以转换为JavaScript的形式发布,并在*.d.ts文件中包含附加的类型定义(包含在npm包中或与@types名称空间分开安装)。

天野

有55个第三方模块https://deno.land/x/和56个库和工具上https://github.com/denolib/awesome-deno#modules(我没有检查,如果一切都是一样的)

Deno库只是TypeScript文件。

安装差异

ts node

  • 您安装Node.js
  • 您安装typescriptts-node与他们的依赖关系npm
    • npm install typescript ts-node
    • 它安装了10个npm模块,并将44MB的212个文件放入 node_modules

deno

您的代码差异

ts node

  • 您的代码的工作方式与经过编译tsc和运行的代码相同node(因为它在后台)
  • 您可以使用Node API
  • 您可以使用所有内置的Node模块
  • 您可以使用npm中的模块
  • 您可以import使用相对路径(通常不带.ts后缀)来归档
  • 您可以import在中使用npm(或yarn)安装的依赖项node_modules

Deno

  • 您的代码与Node中的代码工作方式不同(因为它未与Node一起运行)
  • 您使用Deno API
  • 您可以使用Deno内置模块
  • 您可以使用其他可用的Deno模块
  • 您可以import使用相对路径(总是带.ts后缀!)来归档
  • 您可以import直接从网络获取网址(无需npm install

例子

这是发布并使用TypeScript编写的最小库的示例。

使用Node和ts-node创建和使用TypeScript库

这就是我现在在以下示例项目中正在做的事情:

https://github.com/rsp/node-ts-hello

创建库:

  1. 查找一个在npm上免费的名称(不再足够,请参见下文)
  2. 在GitHub上创建仓库
  3. 创建package.jsonnpm init
  4. 用以下命令安装TypeScript编译器 npm install typescript
  5. 决定您是否保留package-lock.json回购协议(有优缺点)
  6. 创建一个src目录,您将在其中保存TypeScript文件
  7. 添加hello.tssrc
  8. 添加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(您不应该一直登录-请参阅:现在推送恶意软件:NPM软件包开发人员登录受编码器欢迎的黑客入侵的原因
    • 用…编译项目 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注销 npm logout
    • 看到您的~/.npmrc并确保您没有剩下的像这样的东西:
    • //registry.npmjs.org/:_authToken=...

在其他项目中使用库 ts-node

  1. 创建一个新目录
  2. 用创建package.json文件npm init
    • (以便您可以在本地为新程序安装依赖项)
  3. 用以下命令安装我们的库 npm install node-ts-hello
  4. 可选地安装ts-node与 npm install typescript ts-node
    • (除非已全局安装)
  5. 添加使用以下hi.ts命令导入我们的库的文件:
    • import { hello } from 'node-ts-hello';
    • hello('TS');
  6. 使用npx ts-node hi.ts(如果ts-node是本地安装的)或ts-node hi.ts(如果ts-node是全局安装的)运行它
    • 如果遇到错误,请参见下文

潜在问题:我将上述内容简化了一些,此处介绍了创建该库的实际过程。

使用Deno创建和使用TypeScript库

这就是我现在在以下示例项目中正在做的事情:

https://github.com/rsp/deno-hello

创建库:

  1. 在GitHub上创建仓库
  2. 放入hello.ts回购

使用库:

  1. 创建一个hi.ts包含以下内容的文件:
    • import { hello } from 'https://raw.githubusercontent.com/rsp/deno-hello/master/hello.ts';
    • hello('TS');
  2. 使用以下命令运行程序 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会检查文件校验和,而不是时间戳。)

Speed

ts-node

hi.ts从上面的示例启动ts节点版本的速度:

$ time npx ts-node hi.ts 
Hello, TS!

real    0m0.904s
user    0m1.300s
sys     0m0.083s

这是在已经安装了依赖项之后,并且在运行了几次之后以确保所有缓存都能正常工作。差不多一秒钟。

hi.ts

hi.ts从上面的示例中启动我们的Deno版本的速度:

$ time deno run hi.ts 
Hello, TS!

real    0m0.028s
user    0m0.010s
sys     0m0.015s

这也是在已经安装了依赖项之后以及在运行了几次以确保所有缓存都能正常工作之后。

速度提高了32倍以上。

摘要

与Deno相比,应该将Deno与Node进行更多的比较,ts-node因为Deno是一个全新的运行时,而它ts- node是Node的模块,因此您的程序ts-node实际上使用Node运行时来运行。

这是一个非常年轻的项目,但已经吸引了很多人。它没有Node那样多的文档或库,但这意味着它可能是参与其中的最佳时机,因为当它变得更流行时,我认为由于许多原因,这超出了此答案的范围,像Node一样,将需要在市场上拥有丰富经验的人。

程序启动速度已经非常令人印象深刻,我希望在那里能有更多的改进。

使用而无需像配置单个文件的开发速度package.jsonnode_modules一起的可能性,以直接导入相依从的网址(例如在前端),将有可能对工作既为最终用户代码和库以不同的方式。我们将看到它在实践中是如何工作的,但看起来已经很有希望。

2020-07-07