✅ Deno 2.1 升级成为第一个长期支持发行版

作者:Deno 团队

译者:林语冰

资源:Deno 官方博客[1]

免责声明:活人翻译,略有删改,仅供粉丝参考!

00. 速览

Deno 团队官宣升级 2.1 版本[2],新版亮点如下:

  • LTS(长期支持版)
  • deno init --npm vite
  • deno compile 嵌入资源文件
  • deno task 优化
  • 支持一流的 Wasm(WebAssembly 类汇编语言)
  • Node 和 npm 兼容性优化
  • --allow-env 通配符
  • 优化排版和 lint
  • deno publish 覆写版本

01. 依赖管理

1.1 deno init

使用 npm create vite 是一种基于现有模板构建新项目的流行方案。

Deno 2.1 新增 deno init --npm 来启动新项目,类似与 npm init

1.2 deno outdated

Deno 2.1 新增 deno outdated 子命令来更新 JSR 和 npm 依赖,支持 --update--latest 等 flag:

注意,这个命令可以同时理解 deno.jsonpackage.json,并修改这两个文件。

默认情况下,它遵循配置文件中指定的语义化版本范围,但你可以使用 --latest flag 强制更新到最新版本。

1.3 deno publish

deno publish 现在支持 --set-version 来覆写 deno.json 中指定的模块版本:

02. LTS 发行版

Deno 每 6 周发布一个次版本更新,几乎每周发布一次补丁版。但是,过快的发布节奏使开发团队难以落地生产。

为了让团队更轻松地使用 Deno,Deno 2.1 成为 第一个 LTS 版本,即 Deno 2.1 分支会在接下来的六个月内获得重要的错误修复和性能改进。

03. 支持一流的 Wasm

Wasm[3] 是一个二进制编译目标,允许用其他语言写代码,并编译给浏览器。

Deno 2.1 简化了 Wasm 模块导入,更符合人体工程学,性能更棒。

以前手动加载 Wasm 模块需要指定 --allow-read--allow-net 权限:

Deno 能理解导出的 Wasm 模块,并检查它们的类型。

假设我们误用了了上述的 add() 函数:

04. deno compiler 嵌入资源文件

从 Deno 1.6 开始,deno compile 允许将项目编译为适用于主要平台的单个二进制可执行文件,无需安装 Deno 或依赖就能分发和执行。

deno compile 现在能够嵌入由编译程序读取的任意文件,使用 --include flag 指定要包含文件或目录:

然后你可以用与本地开发相同的方式读取它们:

请记住,你只能指定本地文件,不支持远程文件。

05. deno task

Deno 2.1 狠狠优化了 deno task,现在可以将任务编写为对象,通过 "description" 选项来添加描述信息:

5.1 任务依赖

Deno 任务现在可以具有依赖:

可以看到,运行 deno task serve 会先并行执行 build 等依赖任务,一旦全部成功完成,serve 任务就会被执行。

deno task 会处理依赖中的循环,并确保不会陷入死循环。

所谓"菱形依赖",指的是两个依赖项共享一个共同依赖,现在能被 Deno 正确理解,deno task 会确保多个其他任务依赖的任务能且仅能执行一次:

5.2 支持 workspace

通过添加 --filter--recursive flag,你现在可以使用 deno task 从 workspace 的所有或部分成员运行任务。

06. Node 和 npm 兼容性优化

6.1 更棒的 CJS 支持

Node 默认会将 .js 当做 CJS,除非最近的 package.json 指定了 "type": "esm"。Deno 则一直将所有文件视为 ESM。

为了更易运行或迁移现有代码库,Deno 现在会查找最近的 package.json 文件,且如果它们指定了 "type": "commonjs",Deno 会把文件当做 CJS:

CJS 模块的静态分析也优化了,很多时候无需 --allow-read 权限来执行 CJS 模块。

6.2 优化 Node 全局变量的支持

Deno 2.1 新增了 --unstable-node-globals flag,添加了以下的全局变量:

  • Buffer
  • global
  • setImmediate
  • clearImmediate

07. --allow-env 通配符

现在可以在 --allow-env-E flag 中指定后缀通配符,指定环境变量的访问"范围"。

为程序提供多个环境变量时,这些变量会按公共前缀分组,比如 DEV_ID 等。

在终端中指定这些变量可能很头大,因此 Deno 2.1 将其简化了:

这样,程序可以读写以 DEV_ 为前缀的所有环境变量。

我是大家的 林语冰 👨‍💻,欢迎持续 关注 我,随时了解海内外前端开发的最新情报。

谢谢的大家点赞、留言和友情转发,我们下期再见~👍

参考文献

1\] Deno 官方博客: [deno.com/blog/v2.1](https://link.juejin.cn?target=https%3A%2F%2Fdeno.com%2Fblog%2Fv2.1 "https://deno.com/blog/v2.1") \[2\] 2.1 版本: [github.com/denoland/de...](https://link.juejin.cn?target=https%3A%2F%2Fgithub.com%2Fdenoland%2Fdeno%2Freleases%2Ftag%2Fv2.1.0 "https://github.com/denoland/deno/releases/tag/v2.1.0") \[3\] Wasm: [webassembly.org](https://link.juejin.cn?target=https%3A%2F%2Fwebassembly.org "https://webassembly.org")

相关推荐
小码哥_常3 分钟前
Kotlin抽象类与接口:相爱相杀的编程“CP”
前端
evelynlab3 分钟前
Tapable学习
前端
进击的尘埃5 分钟前
Vue3 响应式原理:从 Proxy 到依赖收集,手撸一个迷你 reactivity
javascript
None32116 分钟前
【NestJs】基于Redlock装饰器分布式锁设计与实现
后端·node.js
willow17 分钟前
JavaScript数据类型整理1
javascript
LeeYaMaster17 分钟前
15个例子熟练异步框架 Zone.js
前端·angular.js
evelynlab20 分钟前
打包原理
前端
LeeYaMaster22 分钟前
20个例子掌握RxJS——第十一章实现 WebSocket 消息节流
javascript·angular.js
拳打南山敬老院1 小时前
Context 不是压缩出来的,而是设计出来的
前端·后端·aigc
用户3076752811271 小时前
💡 从"傻等"到"流淌":我在AI项目中实现流式输出的血泪史(附真实代码+深度解析)
前端