在牙齿,节点它是Node的作者利用Node的反射创建的一个运行时系统。
它比 Node 更快、更高效且易于使用。
然而,它不受欢迎的一大原因是npm不可用。
许多 Deno 用户很高兴从陈旧、非标准和怪异的包管理中解脱出来没错,但是寻找新图书馆需要时间和精力,因为过去的遗产无法使用。
Deno 也有可以使用各种注册表的优点,但我个人认为这是一个缺点。
到处搜索很麻烦,所以请把它们都放在一个地方。
这就是为什么在 2022/08/15毕竟它支持 npm官方发布了公告。
仅仅 10 天后的 2022/08/25对应于被宣布。
是的。
因此,以下适用发行说明这是一个介绍。
除了 npm 之外,还进行了各种更新。
Deno 1.25 发行说明
Deno1.25发布了以下新功能和更改:
・deno init 子命令
・实验性 npm 支持
・新的 HTTP 服务器 API
・启动时间的改善
・FFI API 改进
如果您已经安装了它,您可以使用以下命令对其进行升级。
deno upgrade
如果这是您第一次,请使用以下命令安装它。
# MacOS・Linux
curl -fsSL https://deno.land/x/install/install.sh | sh
# Windows
iwr https://deno.land/x/install/install.ps1 -useb | iex
更多细节这里.
deno init 子命令
使用 Deno 开始一个新项目非常容易。
只需准备一份文件。
无需配置文件,无需清单,无需构建脚本。
从其他生态系统移出的用户可能会觉得这种简单性令人困惑。
他们经常开始寻找一个垫脚石来创建正确的项目结构。
所以在这个版本中,我们添加了deno init 命令来准备一个基本的 Deno 项目。
$ deno init
✅ Project initialized
Run these commands to get started
deno run main.ts
deno test
$ deno run main.ts
Add 2 + 3 = 5
$ deno test
Check file:///dev/main_test.ts
running 1 test from main_test.ts
addTest ... ok (6ms)
ok | 1 passed | 0 failed (29ms)
该命令将生成两个文件main.ts 和main_test.ts。main.ts 有一个如何编写 Deno 程序的基本示例,main_test.ts 有一个如何为其编写测试的示例。
您还可以指定一个参数来初始化指定目录中的项目。
$ deno init my_deno_project
✅ Project initialized
Run these commands to get started
cd my_deno_project
deno run main.ts
deno test
对此功能有何反馈?问题请告诉我。
实验性 npm 支持
此版本增加了对 npm 的实验性支持。
请注意,此功能仍在开发中。
这是一项新功能,因此您可能会发现它不起作用的场景。
如果你发现问题问题请报告于
我们计划在未来的版本中改进兼容性和用户体验。
我认为最好用一个例子来说明这种行为。
// main.ts
import express from "npm:express";
const app = express();
app.get("/", function (req, res) {
res.send("Hello World");
});
app.listen(3000);
console.log("listening on http://localhost:3000/");
要包含 npm,请使用下面的说明符。
npm:<package-name>[@<version-requirement>][/<sub-path>]
之后,只需键入以下命令即可启动 express 服务器。
$ deno run --unstable --A main.ts
listening on http://localhost:3000/
您无需键入npm install 命令,也不会创建node_modules 目录。
此外,这些包具有与 Deno 相同的权限。
当前可能会请求不必要的权限,但将来它将仅是网络权限。
此说明符目前仅适用于 deno run、deno test 和 deno bench。
不支持类型规范,也不支持语言服务器、deno vendor、deno info、deno install。
您也可以使用以下格式直接从命令行运行 npm。
npm:<package-name>[@<version-requirement>][/<binary-name>]
这是一个执行示例。
$ deno run --unstable --allow-env --allow-read npm:cowsay@1.5.0 Hello there!
______________
< Hello there! >
--------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
$ deno run --unstable --allow-env --allow-read npm:cowsay@1.5.0/cowthink What to eat?
______________
( What to eat? )
--------------
o ^__^
o (oo)\_______
(__)\ )\/\
||----w |
|| ||
这个 npm 包目前需要 env 和 read 权限,但将来不需要。
未来我们将增加对deno install 和lockfile 的支持。
此功能仍处于试验阶段,需要启用 --unstable 选项。
新的 HTTP 服务器 API
Deno 1.25 引入了一个新的实验性 HTTP 服务器,旨在提供最佳性能。
基准比 Node 快 4 倍以上,比 Deno 现有服务器快 3 倍。
事实上,它是 Rust 的标准 HTTP 服务器。超比快 20%
新的Deno.serve()可以替代现有的std/httpserve(),所以我想std/http的用户会非常熟悉。
这是唯一的基本用法。
Deno.serve(() => new Response("Hello, world!"));
详细的文档是做 c。德诺范丁可以从
在下面的示例中,React 组件将返回动态呈现的结果以响应请求。
import * as React from "npm:react";
import { renderToReadableStream } from "npm:react-dom/server";
const App = () => (
<html>
<body>
<h1>Hello World</h1>
</body>
</html>
);
const options = {
headers: {
"Content-Type": "text/html",
},
};
Deno.serve(
{ port: 4500 },
async () => new Response(await renderToReadableStream(<App />), options),
);
此服务器目前仅支持HTTP/1.1。
我们计划在未来无缝支持HTTP/2。
还计划实现现有服务器中的其他功能,例如响应正文压缩。
这个新服务器不应该在生产中使用,但可以随意试用并对其进行基准测试。
此功能仍处于试验阶段,需要启用 --unstable 选项。
如果你发现一个错误问题请报告于
请继续关注有关新 HTTP 服务器性能的更深入的博客文章。
启动时间的改进
当 Deno 启动时,它会解析远程模块的依赖关系并缓存必要的文件。
对于大文件,这种分析可能需要很长时间,因此在 Deno 1.25 中,我们现在在后台缓存每个文件。
通过这个改动,你可以感觉到 Deno 1.25 显着提升了启动时间。
例如,ts_morph 依赖于 TypeScript 编译器,这个 JavaScript 文件是 10MB。
import { Project } from "https://deno.land/x/ts_morph@15.1.0/mod.ts";
console.log(Project);
在 1.25 之前,这段代码每次执行大约需要 1080 毫秒。
最新版本第二次后仅需225ms。
此外,还对内存使用进行了改进。
如果你测量它,你会发现内存使用量大大减少了。
FFI API 改进
仍然不稳定,外部函数接口添加了新功能并改进了性能。
快速 FFI 调用中的 Uint8Array 和 64 位数字
在 Deno1.2.4 中改进的 FFI 调用并获得了显着的性能提升,但这种优化仅适用于数字类型。
在此版本中,还支持 u64、i64、pointer、buffer 类型。
因此,许多 FFI 模块现在具有类似原生的性能。
新的缓冲类型
pointer 类型用于传递 TypedArray 作为参数。
此版本引入了buffer 类型以优化TypedArray 的性能。
const { symbols: { hash } } = Deno.dlopen("libtest.so", {
hash: {
parameters: ["buffer", "u32"],
result: "u32",
},
});
const u8 = new Uint8Array([1, 2, 3]);
hash(u8, u8.byteLength);
buffer 类型返回值与pointer 类型相同。pointer 类型不再接受 TypedArray 以鼓励使用新功能。
cpu: Apple M1
runtime: deno 1.24.0 (aarch64-apple-darwin)
file:///deno/test_ffi/tests/bench.js
hash() 180.77 ns/iter (176.22 ns … 195.53 ns) 181.3 ns 193.97 ns 195.35 ns
cpu: Apple M1
runtime: deno 1.25.0 (aarch64-apple-darwin)
file:///deno/test_ffi/tests/bench.js
hash() 56.01 ns/iter (55.43 ns … 62.43 ns) 56.03 ns 60.02 ns 61.33 ns
更新 Deno.UnsafePointerView API
Deno.UnsafePointerView 接口新增3个静态方法。
const ptr = symbols.get_hello();
// Cの文字列からJSの文字列にする
const string = Deno.UnsafePointerView.getCString(ptr);
// ゼロコピーでArrayBufferからpointerに
const arrayBuffer = Deno.UnsafePointerView.getArrayBuffer(ptr);
// コピー
const copy = new Uint8Array(32);
Deno.UnsafePointerView.copyInto(ptr, copy);
想法
什么是 3 倍,红人?
隐藏在 npm 的话题中,但性能提升也相当可观。
一直到现在都忽略了npm很久了,说很快就会支持,结果突然支持的势头很猛。
这种突如其来的变化和反应大概是包子我想知道是否触发了外观。
Bun 比 Node 快,比 Deno 快,并且支持 npm。
本来是个人开发,在不知道什么时候停止开发的情况下步入执行是相当困难的,但在那之后在成功筹集到 700 万美元资金后成立了这家公司看来,未来的发展很可能是稳定的。
这就是为什么我认为是时候支持 npm 了,这样新的 Bun 就不会被抓住了。
所以,从现在开始,你也可以将 npm 与 Deno 一起使用。
对于由于 npm 的瓶颈而无法迁移的项目,未来可能会选择 Deno。
原创声明:本文系作者授权爱码网发表,未经许可,不得转载;
原文地址:https://www.likecs.com/show-308627071.html