gpt4 book ai didi

node.js - deno vs ts Node : what's the difference

转载 作者:行者123 更新时间:2023-12-02 10:40:10 24 4
gpt4 key购买 nike

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

最近,我听说了deno,这是一个 typescript 运行时。我在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-node也可以在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版本是14.15.0
  • npm于2010年发布,Node LTS中包含的版本为6.14.8
  • ts-node于2015年发布,最新版本是9.0.0

  • 天野
    Deno本身是一个运行时,因此不使用其他任何东西:
  • Deno于2018年发布,最新版本是1.5.2 check latest version here

  • 人气度
    的GitHub:
  • nodejs/node
  • TypeStrong/ts-node
  • denoland/deno

  • 堆栈溢出:
  • Questions tagged 'node.js':358,962
  • Questions tagged 'typescript':132,043
  • Questions tagged 'ts-node':199
  • Questions tagged 'deno':320

  • 图书馆
    ts节点
    您可以使用npm上所有可用的Node库
    (目前,npm上有955,263个软件包,并非全部用于Node,但数量仍然很多)
    npm上可用的Node库,即使它们最初是用TypeScript编写的,通常也会以 *.d.ts文件(包含在npm包中或与 @types命名空间分开安装)中以附加类型定义的形式移植到JavaScript的形式发布。
    天野
    https://deno.land/x/上有1256个第三方模块,而 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模块,并将212个文件中的44MB放入node_modules


  • 天野
  • 您下载一个二进制文件
  • https://github.com/denoland/deno/releases
  • 在Mac和Linux上,v0.3.6的未压缩二进制文件分别约为47MB和41MB(在Windows上)


  • 您的代码差异
    ts节点
  • 您的代码的工作原理与使用tsc转译并使用node运行(因为它在幕后)相同
  • 您可以使用Node API
  • 您可以使用所有内置的Node模块
  • 您可以使用npm的模块
  • 您可以使用相对路径(通常不带import后缀)来.ts文件
  • 您可以importnpmyarn安装的node_modules(或import)安装的依赖项

    天野
  • 您的代码与Node中的代码不同(因为它未与Node一起运行)
  • 您使用Deno API
  • 您可以使用Deno内置模块
  • 您可以使用可用的其他Deno模块
  • 您可以使用相对路径(始终带有.ts后缀!)来import文件
  • 您可以直接从Web上npm install URL(无需package.json)

  • 例子
    这是发布并使用TypeScript编写的最小库的示例。
    使用Node和ts-node创建和使用TypeScript库
    这就是我现在在以下示例项目中正在做的事情:
    https://github.com/rsp/node-ts-hello
    创建库:
  • 找到一个在npm上免费的名称(不再足够,请参见下文)
  • 在GitHub上创建存储库
  • npm init创建npm install typescript
  • 使用package-lock.json来安装TypeScript编译器
  • 决定是否在存储库中保留src(有优缺点)
  • 创建一个hello.ts目录,您将在其中保存TypeScript文件
  • src添加到tsconfig.json
  • 添加"src/**/*"文件并确保:
  • "include"添加到"paths"
  • 将依赖项和您自己的类型添加到"outDir": "dist"
  • 添加dist以将JS文件放置在已知位置
  • .gitignore目录添加到.gitignore中,以便编译后的文件不在git
  • 添加与dist中相同的内容,但中没有.npmignore中的 "declaration": true(否则,您将不会发布最重要的文件,请参见下文)
  • 添加*.d.ts,以便您生成
  • "main": "dist/hello.js"文件
  • package.json中添加"types": "dist/hello.d.ts"(注意后缀“js”)
  • package.json中添加"build": "tsc"(注意后缀“ts”)
  • package.json添加到npm login(注意冗余文件,请参见下文)
  • 使用npm run build登录(您不应该一直登录-参见:Now Pushing Malware: NPM package dev logins slurped by hacked tool popular with coders)
  • 使用npm publish编译项目
  • 使用npm ERR! publish Failed PUT 401发布软件包
  • 当您获得npm login时,您需要使用npm ERR! publish Failed PUT 403登录
  • 当您获得npm logout时,您的程序包可能“与现有程序包太相似”-尝试在package.json中重命名它,重命名存储库并将所有lik更新为自述文件,然后发出itp。在package.json中

  • 使用 ~/.npmrc 从npm退出
  • 查看您的//registry.npmjs.org/:_authToken=...,并确保您没有像这样的东西:
  • ts-node

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

  • 潜在问题:我将上述内容简化了一些,我创建该库的实际过程描述为 here
    使用Deno创建和使用TypeScript库
    这就是我现在在以下示例项目中正在做的事情:
    https://github.com/rsp/deno-hello
    创建库:
  • 在GitHub上创建存储库
  • hi.ts放入 repo


  • 使用库:
  • 使用以下内容创建文件import { hello } from 'https://raw.githubusercontent.com/rsp/deno-hello/master/hello.ts';:
  • hello('TS');
  • deno run hi.ts
  • 使用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!
    如果更改 touch hi.ts,它将重新编译,但是依赖项将不会再次下载:
    $ deno run hi.ts 
    Compiling file:///Users/rsp/talks/deno/hello-deno-test/hi.ts
    Hello, TS!
    (请注意, hi.ts是不够的,您需要进行实际更改,因为Deno会检查文件校验和,而不是时间戳。)
    速度
    ts节点
    从上面的示例中启动 hi.ts的ts节点版本的速度:
    $ time npx ts-node hi.ts 
    Hello, TS!

    real 0m0.904s
    user 0m1.300s
    sys 0m0.083s
    这是在已经安装了依赖项之后,并且在运行了几次之后以确保所有缓存都能正常工作。
    差不多一秒钟。
    天野
    从上面的示例中启动 ts-node的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的模块,因此使用 package.json运行的程序实际上使用Node运行时。
    这是一个非常年轻的项目,但已经吸引了很多人。它没有Node那样多的文档或库,但是这意味着它是参与其中的最佳时机,因为当它变得更流行时,我认为由于很多原因,这超出了此答案的范围,人们像Node一样,市场上将需要已经有使用它经验的人。
    程序启动速度已经非常令人印象深刻,我希望在那里能有更多的改进。
    使用单个文件而不需要像 node_modules或ojit_code这样的配置的开发速度以及可以直接从URL导入依赖项(例如在前端)的开发速度,将使最终用户代码和图书馆。我们将看到它在实践中是如何工作的,但看起来已经很有希望。

    关于node.js - deno vs ts Node : what's the difference,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53428120/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com