牙齿,节点它是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.tsmain_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 rundeno testdeno bench
不支持类型规范,也不支持语言服务器、deno vendordeno infodeno 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 包目前需要 envread 权限,但将来不需要。

未来我们将增加对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 组件将返回动态呈现的结果以响应请求。

ssr.jsx
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 调用并获得了显着的性能提升,但这种优化仅适用于数字类型。
在此版本中,还支持 u64i64pointerbuffer 类型。
因此,许多 FFI 模块现在具有类似原生的性能。

【Deno】「やっぱnpmをサポートするわ」 → 10日後「サポートしたわ」

新的缓冲类型

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

相关文章: