我正在做一个相对较大的typescript项目,我使用ts-node来运行 node 测试和示例.据我所知,ts-node将编译ts个文件到js个文件并执行.

最近我听说了大约deno,这是一个typescript运行时.我在typescript中try 了几个例子,它使用ts-node.我用deno运行了这个示例,控制台中打印了许多编译消息,然后执行代码.后来我发现/username/.deno里有缓存文件.我不觉得denots-node

似乎denots-node都将使用缓存编译和运行.他们之间有什么区别?

推荐答案

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

创建库:

  1. 在npm上找到一个免费的名字(不够了,见下文)
  2. 在GitHub上创建回购协议
  3. npm init创造package.json
  4. 使用npm install typescript安装TypeScript编译器
  5. 决定是否在回购协议中保留package-lock.json(有利弊)
  6. 创建一个src目录,在其中保存TypeScript文件
  7. hello.tssrc
  8. 添加tsconfig.json个文件,并确保:
  • "src/**/*""include"
  • 将依赖项和您自己的类型添加到"paths"
  • 添加"outDir": "dist"以将JS文件放在已知位置
  • dist目录添加到.gitignore,这样编译的文件就不在git中了
  • 添加与.gitignore中相同的内容,但在.npmignore中添加without dist
  • 添加"declaration": true,这样就生成了*.d.ts个文件
  1. package.json中添加"main": "dist/hello.js"(注意"js"后缀)
  2. package.json中添加"types": "dist/hello.d.ts"(注意"ts"后缀)
  3. "build": "tsc"添加到package.json(注意冗余文件,见下文)
  4. 使用npm login登录(你不应该一直登录-参见:Now Pushing Malware: NPM package dev logins slurped by hacked tool popular with coders)
  5. npm run build来编译这个项目
  6. 发布包含npm publish
  • 当你拿到npm ERR! publish Failed PUT 401分时,你需要用npm login登录
  • 当你得到npm ERR! publish Failed PUT 403个包时,你的包可能"与现有包太相似"——试着在包中重命名它.json,重命名回购协议,并将所有LIK更新为自述文件,发布itp.打包的.json
  1. 使用npm logout从npm注销
  2. 看看你的~/.npmrc,确保你没有剩下这样的东西:
  • //registry.npmjs.org/:_authToken=...

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

  1. 创建一个新目录
  2. npm init创建一个package.json文件
  • (以便您可以在本地为新程序安装依赖项)
  1. npm install node-ts-hello个安装我们的库
  2. 可选安装带有npm install typescript ts node 个端口的ts node
  • (除非在全局安装)
  1. 添加hi.ts个导入我们的库的文件:
  • import { hello } from 'node-ts-hello';
  • hello('TS');
  1. 使用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

创建库:

  1. 在GitHub上创建回购协议
  2. 在回购中投入hello.ts英镑

使用库:

  1. 创建一个包含以下内容的文件hi.ts:
  • import { hello } from 'https://raw.githubusercontent.com/rsp/deno-hello/master/hello.ts';
  • hello('TS');
  1. 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.jsonnode_modules)的开发速度,以及直接从URL(如前端)导入依赖项的可能性,将使最终用户代码和库以不同的方式工作成为可能.我们将看到这一切在实践中是如何运作的,但看起来已经很有希望了.

Node.js相关问答推荐

使用NodeJS输出检索Base64图像的网络报废

在Android Studio中react 本机构建失败:未正确检测到Node.js版本

Playwright - 无法在 img 标签中使用 file:// 访问本地文件

函数声明中的异步在没有等待的函数中做什么?

尽管 tsconfig 中提供了正确的路径,但仍出现找不到模块错误

如何配置 Nginx React 和 Express

为什么当我使用waitForSelector时 Puppeteer 导致我的测试套件挂起 30 秒,即使我在页面和浏览器上调用关闭?

为什么 FastAPI 需要 Web 服务器(即 Nginx)而不是 Express API?

处理 UTC 日期和future

React Native:执行 com.android.build.gradle.internal.tasks.Workers$ActionFacade 时发生故障

从数据库读取数据并将其作为可下载的 zip 文件发送

Pug - 包括带有include关键字的c代码

baseurl64 缓冲区解码

如何在 node.js 环境中从 WebAssembly (Rust) 调用异步 JavaScript 导入函数?

等价于 Node.js 的 Rails 控制台

在多个文件 node.js 之间共享和修改变量

使用 Node.JS,如何按时间顺序获取文件列表?

node.js 中存储的模块变量在什么范围内?

请求新页面时如何将 AngularJS 路由与 Express (Node.js) 一起使用?

promise 回调返回promise