关于node.js:deno vs ts-node:有什么区别

deno vs ts-node : what's the difference

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

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

看来denots-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 /节点GitHub stars
  • 类型强/ ts-node GitHub stars
  • denoland / deno GitHub stars
  • 好的。

    堆栈溢出:

    好的。

  • 标记为``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
  • 好的。

  • 您安装typescriptts-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后缀)
  • 您可以importnode_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.jsonnode_modules这样的配置的开发速度,以及可以直接从URL导入依赖项(例如在前端)的可能性,将使得最终可以以不同的方式工作用户代码和库。我们将看到它在实践中是如何工作的,但看起来已经很有希望。

    好的。

    好。


    ts-node是基于Node的,而Deno是完全不同的新服务器端运行时,其API,模块系统,安全模型等方面的设计有所变化(这反映了ES6之后的发展)。另外,TypeScript编译器直接位于单个Deno可执行文件内部(通过V8快照),因此启动时间应更短。


    我认为@rsp已经发布了有关Deno的详细信息。

    我想在这里提出一些关键点,以便其他人可以轻松地关注关键差异:

    • 语言-Deno基于RUST语言-Rust是一种专注于性能和安全性(尤其是安全并发性)的多范式编程语言。 Rust在语法上类似于C ++,但是在不使用垃圾回收的情况下提供了内存安全性

    • 运行时-Deno也依赖V8引擎。

    • 安全性—对Node.js的普遍批评是,一旦节点应用程序运行,它就可以轻松访问文件系统或网络等。
      虽然Deno要求用户许可以允许使用诸如网络,文件系统等资源。
    • NPM吗?-Deno完全不依赖NPM,而是通过URL导入库。

      例:

      import { serve } from"https://deno.land/std/http/server.ts";

      我们要使用的所有库都先下载然后缓存。

    • Windows对象-好消息是,现在我们可以在Deno中使用Windows对象,而Node.js中没有该对象。
      Wisnows对象具有很多丰富的API,这些API可以在Deno中为开发提供很多帮助。
    • 导入-Deno使用ES6导入将模块注入文件中。
    • 打字稿-Deno完全支持打字稿。