Skip to content

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

个人网站:https://chensuiyi.me

我的名片

欢迎关注,广交朋友,共创未来。


Deno 正在狂飙。

Deno v2

看看自 v2.0.0 以来的版本发布时间。

  • 2024年10月09日,发布 v2.0.0
  • 2024年10月16日,发布 v2.0.1
  • 2024年10月17日,发布 v2.0.2
  • 2024年10月25日,发布 v2.0.3
  • 2024年10月29日,发布 v2.0.4
  • 2024年11月06日,发布 v2.0.5
  • 2024年11月05日,发布 v2.0.5
  • 2024年11月10日,发布 v2.0.6
  • 2024年11月21日,发布 v2.1.0

可以看到,自 v2 大版本发布以来,Deno 仿佛打了兴奋剂一样狂踩油门发版本。

而更新内容也确实令人眼前一亮,接下来,我们盘点一下,v2 发布以来的更新亮点。

全面兼容 Node.js

js
import * as os from 'node:os';
console.log(os.cpus());

使用 Node.js 内置 API。

js
import * as emoji from 'npm:node-emoji';

console.log(emoji.emojify(`:sauropod: :heart:  npm`));

使用 npm包

当然,不止这些,可以前往 Deno 官网文档查看兼容详情。

随易点评

如果说 v1 版本的 DenoNode.js雷锋雷峰塔 的关系。

那么 v2 版本的 DenoNode.js 就是 雷锋塔白蛇 我中有你的关系了。

移除大量全局 API

比如 Deno.FileDeno.copy()Deno.read[Sync]()Deno.write[Sync]() 等 API 已经在 v2 版本中全部移除了。

那么这些 API 到哪去了呢?通过标准库来按需导入了。

比如我们要创建一个文件,v2 的写法如下:

js
import { ensureFile, copy, ensureDir, move } from '@std/fs';

await ensureFile('./folder/targetFile.dat');
await ensureDir('./folder/subFolder');
await copy('./foo', './bar');
await move('./foo', './bar');

通过 @std/fs 标准库引入相关的函数,再使用即可。

同时可以看到,这些函数都非常人性化,我们可以直接指定多级目录或文件,如果该文件或目录不存在则会依次创建。

查看具体详情

随易点评

我个人比较喜欢这个改动,从内置移出,通过引入第三方标准库来使用,扩展性更好,这样可以更加专注地完善 Deno 核心。

注意,只是部分 API 从内置移到标准库了,Deno.readFile()Deno.readDir() 等还是在全局内置中。

可以直接导入 CJS 文件

js
// main.js
import './mod.cjs';
// mod.cjs
import * as path from 'node:path';
console.log(path.SEP);

随易点评

sindresorhus 大佬费劲倡导的 ESM 化终究还是敌不过历史包袱啊。

或许,完美本就是一种奢侈吧。

支持将目录或文件打包到可执行文件中

这是目前最喜欢的一个功能。

bash
deno-app
├── src
│   ├── data
│   │   └── 1.txt
│   └── main.js
└── deno.json

假设项目结构如上。

js
Deno.serve((_req) => {
    const dataDir = import.meta.dirname + '/data';
    const fileNames = Deno.readDirSync(dataDir).map((entry) => dataDir + '/' + entry.name);

    for (const fileName of fileNames) {
        console.log('Reading', fileName);
        console.log(Deno.readTextFileSync(fileName));
    }
    return new Response('Hello, World!');
});

这是入口文件 main.js 的代码,然后我们通过 deno compile -A --include src/data --output main src/main.js 生成 main.exe 可执行文件。

点击运行 main.exe,就可以读取 1.txt 文件中的内容了。

这是 v2.1.0 版本开始支持的功能,请注意自己的 Deno 版本。

随易点评

比起 Node.js 的单文件打包,Deno 仿佛已经超越了一个世纪。

Node.js 发布,直到 v20 版本,才开始支持单文件打包,而且功能还极其有限。

而现在,Deno 已经像 golang 一样,可以把文件和目录都打包到一个 exe 中了。

如果要分发一个单文件 Web 服务器,是极其方便的。

支持直接导入 wasm

js
const fs = require('fs/promises'); // 使用 fs/promises 模块
const { WebAssembly } = require('wasi'); // 对于更复杂的 WASI 应用

async function runWasm() {
    try {
        const wasmBuffer = await fs.readFile('add.wasm');
        const wasmModule = await WebAssembly.compile(wasmBuffer);
        const instance = await WebAssembly.instantiate(wasmModule, {
            // 如果你的 Wasm 模块需要导入,则在此处提供导入对象
            // 例如:wasi: new WebAssembly.WASI()  (对于 WASI 系统接口)
        });

        const addFunction = instance.exports.add; // 获取导出函数
        const result = addFunction(5, 3);
        console.log(`5 + 3 = ${result}`); // 输出 8
    } catch (error) {
        console.error('Error loading or running Wasm:', error);
    }
}

runWasm();

先来看看 Node.js 中的用法。

js
import { add } from './math.wasm';

console.log(add(1, 2));

再来看看 Deno 中的用法。

随易点评

或许还是因为历史包袱的原因,后来者在各方面都比前者有着更加优秀的设计和体验。

而前者,牵一发而动全身,所以只能在妥协中前进。

但是,正所谓成也萧何败也萧何,Node.js 最大的依仗就是其先发优势带来的巨大生态高位。

不过,目前 Deno 已经全面兼容 Node.js,谁能笑到最后,引领时代潮流,还有待进一步观察。

另外,这里推荐一下 moonbit(月兔) 编程语言,张宏波 老师设计,是一个用于云计算和边缘计算的 WebAssembly 端到端的编程语言工具链。

主要特点就是:

  • 生成比现有解决方案明显更小的 WASM 文件。
  • 更高的运行时性能。
  • 先进的编译时性能。
  • 简单且实用的数据导向语言设计。

如果你有生成 wasm 的需求,还是不要研究 rust 了,使用 moonbit 来生成 wasm,更轻快,体积更小,运行更快。

张宏波老师的知乎

张宏波老师的知乎

以上就是我认为比较亮点的功能了,其中 资源打包到exewasm支持 是最为喜欢的功能,我已经跃跃欲试了。

版本发布计划

最后呢,分享一下 Deno 的版本发布计划,自 v2 版本开始,Deno 开始学起 VSCode 来了,一个月发布一次小版本,比如 v2.0.0v2.1.0

每次的小版本呢,基本上都会有一些新功能,新特性。

而像 v2.0.1v2.0.2v2.0.3 这样的版本,主要是做一些修复工作。

发布计划

同时呢,Deno 也开始发布 长期支持版本 了,根据计划来看,v2.1v2.6 将是目前和后续的长期支持版本,会有 6 个月的支持。

下一个长期支持版本将在上一个长期支持版本结束时发布。

随易点评

非常看好 Deno,毕竟轻装上阵,少了很多包括设计,架构等方面的历史包袱。

同时,根据近两年来的一些动作,比如 jsr包管理内置kv数据库cron定时器deploy边缘部署 来看,发展潜力是巨大的。

Node.js 可能也预感到了危机,也开始借鉴一些 DenoBun 的设计,但是船大有点难调头啊。

比如我前段时间把 Node v20 升级到 Node v22 运行同一个项目就报错了,可能是有点心急了。

但是,我目前依旧会把 Node.js 作为我的主力环境,同时看好 Deno 前景,最后观望 Bun 的发展。

以上就是 前端记者陈随易 的报道啦,欢迎关注,及时获取一手信息~~。

何以解忧,唯有代码。不忘初心,方得始终。