Deno v2.4发布,还能再次伟大吗?

0 阅读5分钟

大家好,我是农村程序员,独立开发者,行业观察员,前端之虎陈随易。

我会在这里分享关于 独立开发编程技术思考感悟 等内容,欢迎关注。

  • 个人网站 1️⃣:chensuiyi.me
  • 个人网站 2️⃣:me.yicode.tech
  • 技术群,搞钱群,闲聊群,自驾群,想入群的在我个人网站联系我。

如果你觉得本文有用,一键三连 (点赞评论转发),就是对我最大的支持~


往期文章:


请大家注意,这是我专门写技术资讯,行业热点的公众号,原来的公众号 陈随易 主要写一些独立开发,个人思考之类的。

那么话不多说,分享一下 Deno v2.4 版本都更新了什么内容。

支持在 bundle 和 compile 中导入 text 和 bytes

也就是支持以下 2 个写法:

import otherBytes from './other.ts' with { type: 'bytes' };
import otherText from './other.ts' with { type: 'text' };

这是现代 Web 标准语法,Deno 正在进一步与标准融合。

增强对 tsconfig 文件的检查

Deno 的类型检查工具 (deno check) 对 TypeScript 的 tsconfig.json 配置文件的支持有限,尤其是对于一些复杂的项目结构 (例如使用了项目引用 references、继承配置 extends、指定包含/排除文件的 include/exclude 等字段) 不完全兼容。

这导致:

  • 某些使用高级 tsconfig 特性的 TypeScript 项目在 Deno 下无法正确进行类型检查。
  • 用户无法充分利用 TypeScript 的项目组织和配置能力。
  • 某些必须依赖这些字段的第三方项目或 monorepo 工程无法顺利迁移或在 Deno 下开发。

本次更新,解决了 Deno 在类型检查时对 tsconfig 关键字段支持不全的问题,极大提升了 Deno 对复杂 TypeScript 项目的兼容性和用户体验,使其可以像 tsc 一样,支持项目引用、配置继承、文件包含/排除等高级功能。

deno run 命令添加了--coverage 参数

本次更新为 deno run 命令添加了 --coverage 标志。

当指定此标志时,它将在指定的目录中生成覆盖率配置文件 (默认为coverage)。

覆盖率目录也可以通过环境变量 DENO_COVERAGE_DIR 指定。

给 --unstable-sloppy-imports 提供别名 --sloppy-imports

看了这个 PR 下的讨论,说实话挺奇怪的,也就是说 --unstable-sloppy-imports 等于 --sloppy-imports

有人在该 PR 下评论:确定这不是在搞破坏?

为什么要让一个不稳定的参数提供一个看起来就是稳定的别名?嗯...确实奇怪。

deno serve 支持 onListen 回调函数

用法如下:

export default {
    onListen: () => {
        /* call me maybe */
    },
    fetch: () => new Response()
};

有哪些应用场景呢?

  • 知道选择了哪个端口 (当使用 --port 0 时很有用)
  • 动态设置 --location 以允许在自身上使用 fetch()
  • 监听后设置
  • 等等

支持。xml, 。svg 和。mustache 文件的格式化

本次更新,deno fmt 命令支持对 .xml.svg.mustache 文件的格式化。

删除 UTF-8 BOM 而不是保留它

本次更新,deno fmt 命令将会默认移除文件中的 utf-8 bom

添加 fs.glob、fs.globSync、fs.promises.glob

这是 Nodejs 在 Bun 的刺激下新增的函数,而当 Nodejs 带来这些函数后,Bun 和 Deno 又要增加这些函数的兼容性。

这可真是七伤拳啊,不过谁叫 Nodejs 如今依旧是老大呢。

稳定 OpenTelemetry 支持

简单来说,OpenTelemetry 帮助开发者和运维团队更方便地获取程序在运行时的各种观测数据,从而更好地分析系统健康状况、性能瓶颈和故障原因。

向 Deno.Command 添加分离选项

Node.js 可以通过 setsid() 在分离模式下运行子进程,但 Deno 似乎缺少这个功能

本次更新允许子进程在父进程退出后继续运行的能力,类似于 Node.js 中已有的功能。

使用 detached 参数设置为 true 即可。

支持在 Windows 上监听 ctrl+close

什么是 ctrl + close 呢?请注意,不是 ctrl + c 的全拼,而是按住 ctrl 的同时,用鼠标左键点击窗口的关闭按钮。

本次更新,deno 支持这个操作了。

使用工作区解析器解析主模块

当用户在包含 deno.json 配置文件的工作区中运行模块时,之前 Deno 不会使用工作区解析器 (workspace resolver) 来解析主入口模块,这可能导致导入映射 (import maps) 和其他工作区配置不被正确应用于主模块。

这个改进确保了当使用 deno run 命令时,主模块也会通过工作区解析器进行解析,使得工作区配置 (如导入映射、JSX 配置等) 能够正确地应用于入口模块,提供了更一致的模块解析行为。

这对于依赖工作区配置的项目来说是一个重要的改进,使得模块解析行为更加一致和可预测。

举个例子:

{
    "imports": { "foo.ts": "./bar.ts" }
}

假设你有一个名为 foo.ts 的文件,之前 deno run foo.ts 会运行 ./foo.ts,本次更新后,则会运行 ./bar.ts

Deno.execPath() 不再需要 --allow-read 权限

简而言之就是,老是设置权限太麻烦了,干脆不要了。

使 setImmediate 和 clearImmediate 成为全局变量

这 2 个方法是 js 标准,成为全局变量理所当然。

使 Buffer 和 global 可用作全局变量

同上。

添加 deno update 子命令

只是为了节省几个字符,因为它是 deno outdated --update 的别名。

好吧,我以为 Deno 要学 Bun 做包管理更新呢。

添加 DENO_AUTO_SERVE 环境变量

本次更新添加了 DENO_AUTO_SERVE 环境变量,当指定该变量时,如果入口点满足 Deno.ServeDefaultExport 接口,deno 的运行行为将类似于 deno serve

添加 DENO_COMPAT 环境变量

设置 DENO_COMPAT 环境变量后,可启用以下几个功能:

  • --unstable-bare-node-builtins
  • --unstable-detect-cjs
  • --unstable-sloppy-imports

稳定 --allow-net 子域名通配符

deno run --unstable-subdomain-wildcards --allow-net=*.github.com main.ts
# 👇
deno run --allow-net=*.github.com main.ts

子域名通配符已经稳定,可以不要 --unstable-subdomain-wildcards 选项了。


详细更新内容,请前往地址:github.com/denoland/de…