我正在处理一个相对较大的打字稿项目,正在使用ts-node
来运行节点测试和示例。据我了解,ts-node
会将ts
文件编译为js
文件并执行。
最近我听说deno
,这是一个打字稿运行时。我尝试了一些使用ts-node
的打字稿示例。我使用deno
来运行示例,控制台中印有许多编译消息,然后执行代码。后来我发现/username/.deno
中有缓存文件。我觉得deno
的执行速度不比ts-node
似乎deno
和ts-node
都将使用缓存进行编译和运行。它们之间有什么区别?
答案 0 :(得分:14)
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依赖于Node.js运行时,因此可以将其包含在此处:
Deno本身就是一个运行时,因此它不使用其他任何东西:
GitHub:
堆栈溢出:
您可以使用npm上所有可用的Node库
(目前npm上有955,263个程序包,不是全部用于Node,但仍然很多)
npm上可用的Node库,即使它们最初是用TypeScript编写的,通常也会以*.d.ts
文件(包含在npm软件包中或与安装成@types
命名空间)。
https://deno.land/x/上有55个第三方模块,https://github.com/denolib/awesome-deno#modules上有56个库和工具(我没有检查是否全部相同)
Deno库只是TypeScript文件。
typescript
和ts-node
及其与npm
的依赖关系
npm install typescript ts-node
node_modules
tsc
进行编译并使用node
运行的代码相同(因为它在幕后)import
后缀.ts
文件import
npm
中yarn
(或node_modules
)安装的依赖项import
后缀.ts
文件import
个URL(不需要npm install
)这里是发布用TypeScript编写的最小库并使用它的示例。
这是我现在在以下示例项目上正在做的事情:
https://github.com/rsp/node-ts-hello
创建库:
package.json
创建npm init
npm install typescript
package-lock.json
保留在回购协议中(各有利弊)src
目录,您将在其中保存TypeScript文件hello.ts
添加到src
tsconfig.json
文件,并确保:
"src/**/*"
添加到"include"
"paths"
"outDir": "dist"
以将JS文件放置在已知位置dist
目录添加到.gitignore
,以便编译后的文件不在git中.gitignore
中的内容相同的内容,但不添加中的dist
中的.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
登录(您不应该一直登录-参见:Now Pushing Malware: NPM package dev logins slurped by hacked tool popular with coders)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
package.json
创建一个npm init
文件
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是全局安装的)运行的
潜在问题:我对上述内容进行了一些简化,here中描述了创建该库的实际过程。
这是我现在在以下示例项目上正在做的事情:
https://github.com/rsp/deno-hello
创建库:
hello.ts
放入仓库使用库:
hi.ts
:
import { hello } from 'https://raw.githubusercontent.com/rsp/deno-hello/master/hello.ts';
hello('TS');
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会检查文件校验和,而不是时间戳。)
从上面的示例中启动hi.ts
的ts节点版本的速度:
$ time npx ts-node hi.ts
Hello, TS!
real 0m0.904s
user 0m1.300s
sys 0m0.083s
这是在依赖项已经安装并且运行几次之后,以确保所有兑现都有效。 差不多一秒钟。
从上面的示例中启动hi.ts
的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的模块,因此使用ts-node
运行的程序确实使用Node运行时
这是一个非常年轻的项目,但已经吸引了很多人。它没有Node那样多的文档或库,但它意味着它可能是参与其中的最佳时机,因为当它变得更流行时,我认为由于很多原因,这将超出此答案的范围。像Node一样,将需要在市场上拥有丰富经验的人。
程序启动速度已经非常令人印象深刻,我希望在那里能有更多的改进。
使用单个文件而不需要像package.json
或node_modules
这样的配置的开发速度以及可以直接从URL导入依赖项(例如在前端)的开发速度将使它可以在最终用户代码和库的另一种方式。我们将看到它在实践中如何工作,但看起来已经很有希望。
答案 1 :(得分:7)
答案 2 :(得分:3)
我认为 @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";
我们要使用的所有库都先下载然后缓存。