deno 编译支持 npm 包

随着我们继续 Deno 2 的开发之旅,这个次要版本主要侧重于提高与 npm 和 Node.js 的兼容性,提高整体生活质量和开发人员体验,并为未来的性能增强奠定基础。

此版本中最重要的更新包括三个备受期待的功能:

除了上述功能外,还有许多其他值得一提的改进和错误修复:

deno compile 支持 npm 包

自从 v1.6, deno compile 允许您将项目编译成单个二进制可执行文件。 由于多种原因,这种发展已被证明是重要的,因为它使开发人员能够:

  • 在所有主要平台上分发和执行二进制文件,无需安装 Deno 或依赖项
  • 在可执行文件中包含资产以提高可移植性
  • 使用单个二进制文件简化部署
  • 实现更快的启动时间

从那以后,我们一直在做 deno compile 更有用,通过
添加对网络工作者和动态导入的支持,以及今天,通过支持 npm 包。

这是一个创建单个二进制可执行文件的示例 cowsay:

$ cat main.ts
import { say } from "npm:cowsay@1.5.0";
console.log(say({ text: "Hello from Deno!" }));

$ deno compile --allow-read main.ts
$ ./main
 __________________
< Hello from Deno! >
 ------------------
           ^__^
           (oo)_______
            (__)       )/
                ||----w |
                ||     ||

cowsay 是一个简单的例子,但你可以使用 deno compile 有更复杂的项目。 咱们试试吧 vite:

$ deno compile --allow-read --allow-write --allow-env --allow-net npm:vite
$ ./vite
  ➜  Local:   http://localhost:5173/
  ➜  Network: use --host to expose
  ➜  press h to show help

或者可能 eslint

$ deno compile --allow-read --allow-write --allow-env --allow-net npm:eslint
$ cat .eslintrc.js
module.exports = {
    "env": {
        "es2021": true,
        "node": true
    },
    "extends": "eslint:recommended",
    "overrides": [
    ],
    "parserOptions": {
        "ecmaVersion": "latest",
        "sourceType": "module"
    },
    "rules": {
    }
}

$ cat foo.js
function foo() {
}

$ ./eslint
/dev/foo.js
  1:10  error  'foo' is defined but never used  no-unused-vars

✖ 1 problem (1 error, 0 warnings)

使用之间的区别 deno compile 创建一个 eslint 二进制和
npm install -g eslint 是 Deno 包 eslint 及其所有依赖项和配置以及实际 deno 可执行。 这意味着生成的可执行文件确保其依赖项不会被意外更改,并继续以相同的方式工作,而不会受到系统上其他依赖项的干扰。 此外,我们的测试表明二进制文件来自 deno compile 往往比使用本地缓存的依赖项执行相同的程序启动更快。

还有更多工作需要改进 deno compile,包括最小化总二进制大小,我们打算在即将发布的版本中解决这个问题。

你有具体的反馈意见吗 deno compile
让我们知道.

全局支持 deno.json 和 CLI 标志

球体 现在在配置文件中支持 deno.json, deno task和用于指定文件的 CLI 参数。 glob 语法是跨平台的,因此您可以放心地在 Windows、macOS 和 Linux 上使用它。

deno.json, 您可以使用 * 匹配路径中任意数量的字符,
? 匹配单个字符,和 ** 匹配任意数量的目录:

{
  "fmt": {
    "include": ["data/example?.txt"],
    "exclude": ["testdata/**/*.ts"]
  }
}

您还可以使用 glob 模式作为 CLI 参数. 这是上面的例子,但是使用 deno fmt:

$ deno fmt --exclude="testdata/**/*.ts" "data/example?.txt"

⚠️ 请注意,我们将 glob 放在引号中以防止 shell 扩展它。

deno task,除了上面的glob语法,你还可以使用方括号来匹配一个范围的字符:

{
  "task": {
    "files": "echo **/*.ts",
    "data": "echo data[0-9].txt"
  }
}

带有 IP 地址的 TLS 证书

最想要的功能之一终于来了。 您现在可以使用包含 IP 地址的 TLS 证书。

报价 rustls 团队:

这对于经常使用 IP 地址而不是域名的 Kubernetes pod 以及需要服务器 IP 地址以避免对名称解析的循环依赖的 HTTPS/TLS 上的 DNS 非常有用。

在 Deno v1.34 中,任何使用 TLS 的 API 都可以使用 IP 地址。 例如:

const resp = await fetch("https://1.1.1.1");
console.log(await resp.text());

配置文件改进

排除所有子命令的文件或文件夹

以前,如果您希望 Deno 忽略每个子命令的文件或文件夹,则必须重复指定它:

{
  "fmt": {
    "exclude": ["target/"]
  },
  "lint": {
    "exclude": ["target/"]
  },
  "test": {
    "exclude": ["target/"]
  },
  "bench": {
    "exclude": ["target/"]
  }
}

从此版本开始,您可以使用顶级 exclude 财产:

{
  "exclude": ["target/"]
}

谢谢至 @围巾005 用于实现此功能。

See also  Freddie Flintoff 的 Top Gear 恐怖撞车没有安全气囊

nodeModulesDir 财产

A nodeModulesDir 现在可以在 deno.json 用于显式启用或禁用 Deno 使用的文件 node_modules 目录。

{
  "nodeModulesDir": true
}

如果您将 Deno 与 package.json 一起使用,并且 node_modules 目录,建议启用此设置,因为它将提供更好的体验。 例如,启用它后,Deno 的语言服务器将使用本地
node_modules 用于缓存和解析包的目录。

语言服务器改进

deno 1.33 在语言服务器中引入了文档预加载,它会在初始化时预加载工作区中的模块,以便 Deno 了解它们及其内容。

在某些情况下,默认的 1000 个文件系统条目限制要么太少要么太多,因此现在可以通过设置 deno.documentPreloadLimit
财产。

{
  "deno.enable": true,
  "deno.documentPreloadLimit": 2000
}

此外,语言服务器的内部 TypeScript isolate 的默认最大内存限制增加到 3GB,以匹配 VS Code 默认的 TypeScript。 最后,这个限制可以通过在 VSCode 扩展中配置
deno.maxTsServerMemory:

{
  "deno.enable": true,
  "deno.maxTsServerMemory": 3072
}

Deno API 更改

Deno.serve()

上个月,我们暗示我们计划稳定 Deno.serve() 应用程序接口。 然而,经过深思熟虑,我们决定将稳定期再推迟一个月,以使该 API 更加向前兼容。

的签名 Deno.serve() 已更改为返回一个实例
Deno.Server 代替 Promise. Deno.Server 有一个 finished
那是一个财产 Promise,它在服务器关闭时解决(使用
AbortSignal). 这为以编程方式控制服务器提供了更大的灵活性。

const ac = new AbortController();
const server = Deno.serve(
  { signal: ac.signal },
  (_req) => new Response("Hello world"),
);
setTimeout(() => {
  ac.abort();
}, 1000);
await server.finished;
console.log("Server has shut down");

此外, Deno.Serverref()unref() 方法。 您可以使用这些方法来控制服务器是否应该让进程保持活动状态。

Deno.createHttpClient()

这个不稳定的 API 现在公开了一些选项,允许更好地控制创建的客户端:

const client = Deno.createHttpClient({
  
  poolMaxIdlePerHost: 10,

  
  
  poolIdleTimeout: 10_000,

  
  http1: false,

  
  http2: true,
});

const resp = await fetch("...", { client });

Deno.FileInfo

Deno.FileInfo 界面现在包括以下新字段:

  • Deno.FileInfo.isBlockDevice
  • Deno.FileInfo.isCharDevice
  • Deno.FileInfo.isFifo
  • Deno.FileInfo.isSocket

这些字段在 Linux 和 macOS 上可用。 在 Windows 上,它们总是 null.

谢谢至 田川弘隆 为贡献。

改进 npm 和节点兼容性

npm 支持还有其他一些显着改进:

  • deno vendor 处理 npm 说明符,遇到它们时将不再出错。
  • deno taskprepost 从类似于 npm 的 package.json 文件执行脚本时存在的脚本。 谢谢
    马文·哈格迈斯特 用于实现此功能。

我们还填充了一些内置的 Node.js API:

  • crypto.createDiffieHellman
  • crypto.createDiffieHellmanGroup
  • http.Server.unref
  • Module.runMain
  • performance.markResourceTiming
  • process.release
  • worker_threads

此外,以下 N-API 符号现在可以正常工作:

  • napi_async_init
  • napi_async_destroy
  • napi_add_finalizer

V8 11.5 和 TypeScript 5.0.4

最后,Deno v1.34 附带了 V8 11.5 和 TypeScript 5.0.4。

看一眼 迪诺 KV,我们的全球分布式数据库
Deno 部署,现在处于测试阶段

1685019595
#deno #编译支持 #npm #包
2023-05-25 10:16:00

Leave a Reply

Your email address will not be published. Required fields are marked *

近期新闻​

编辑精选​