Deno 1.30 업데이트 내용

Deno 1.30가 아래와 같이 새로운 기능과 변경 사항이 포함되어 나왔습니다.

  1. 내장 Node.js 모듈 지원
  2. deno.json에 import map 지원
  3. Deno API 변경
  4. deno fmt에서 세미콜론 구성을 지원

Deno가 이미 설치되어 있는 경우 1.30으로 업그레이드하여 사용할 수 있습니다.

deno upgrade

Deno를 설치하지 않았을 경우 설치 후 사용할 수 있습니다.

# MacOS and Linux
curl -fsSL https://deno.land/x/install/install.sh | sh

# Windows
iwr https://deno.land/x/install/install.ps1 -useb | iex

여기에서 더 많은 설치 옵션을 확인할 수 있습니다.

내장 Node.js 모듈 지원

Deno에서 npm 패키지는 이미 Deno의 Node.js 호환성 계층을 통해 fs, path, process 등과 같은 내장 Node.js 모듈에 액세스할 수 있었습니다.

이번 릴리스에서 내장 모듈들은 node: 지정자 통해 Deno 코드로 노출됩니다.

import { readFileSync } from "node:fs";

console.log(readFileSync("deno.json", { encoding: "utf8" }));

import map 없이 지정자(예: imprt { readFileSync } from "fs";)를 통한 가져오기는 지원되지 않습니다. 이 작업을 수행하려고 할 때 구조 분해 할당자가 import map에서 찾을 수 없는 Node.js 내장 모듈과 일치하면 Deno가 node: 로 import를 했는지 오류 메시지를 출력합니다. 또한 LSP는 node: 지정자로 업데이트할 수 있는 빠른 해결책을 제공합니다.

Take note that importing via a bare specifier (ex. import { readFileSync } from "fs";) without an import map is not supported. If you attempt to do so and the bare specifier matches a Node.js built-in module not found in an import map, Deno will provide a helpful error message asking if you meant to import with the node: prefix. Additionally the LSP provides a quick fix to update to a node: specifier.

node_specifiers_lsp_quick_fix.png

If you are using code both with Deno and Node.js, the node: scheme will work in both runtimes and it's recommended to update to them for your Node.js code anyway.

**deno.json**에 import map 지원

이 내용은 구성 파일에 대한 주요 기능을 제공합니다. 이제 deno.json 파일에서 import map을 직접 사용할 수 있습니다. 이전 버전에서는 import map 파일에 대한 경로와 함께 importMap 키를 지정하여 import map 파일을 찾을 위치를 Deno에 알릴 수 있었습니다. 많은 사용자가 유용하다고 생각했지만 이 방식은 두 개의 config 파일이 존재하게 되었습니다. config 파일 간소화를 위해 이제 하나의 config 파일에서 importsscopes 키를 지정할 수 있으며, Deno는 이것들을 자동으로 import map으로 처리합니다.

예시:

{
  "imports": {
    "std/": "https://deno.land/std@0.174.0/"
  }
}

이러면 std를 다음 스크립트처럼 작동시킬 수 있습니다.

import { assertEquals } from "std/testing/assert.ts";

assertEquals(1, 2);

Node/npm, LSP fixes

This release includes over 25 bug fixes related to the npm functionality and Node-API. Additionally, the LSP continues to be improved with over 10 bug fixes. See Releases for a full list.

Deno API 변경

Changes to stable APIs:

  1. Deno.permissions APIs get synchronous counter-parts:

    Deno.permissions.querySync({ name: "read", path: "./log.txt" });
    Deno.permissions.revokeSync({ name: "read", path: "./log.txt" });
    Deno.permissions.requestSync({ name: "read", path: "./log.txt" });

Thanks to Asher Gomez for implementing this feature.

  1. Deno.writeFile() and Deno.writeTextFile() now accept a ReadableStream for the second parameter.

    const stream = new ReadableStream({
      pull(controller) {
        controller.enqueue(new Uint8Array([1]));
        controller.enqueue(new Uint8Array([2]));
        controller.close();
      },
    });
    
    await Deno.writeFile("/tmp/test.txt", stream);
    
    assertEquals(
    	Deno.readFileSync(filename),
    	new Uint8Array([1, 2])
    );
  2. Deno.env.has(name) API가 새롭게 추가되었습니다.

    Deno.env.set("TEST_VAR", "A");
    
    assert(Deno.env.has("TEST_VAR"));
    
    Deno.env.delete("TEST_VAR");
    
    assert(!Deno.env.has("TEST_VAR"));
  3. Deno.Seeker API gets support for bigint offsets.

    You can now use the bigint type as an argument to the Seeker interface:

    const file = await Deno.open("./log.txt");
    const cursor = await file.seek(150n, Deno.SeekMode.Start);
  4. Test steps can be functions:

    Previously, using the test steps API required the first argument of the test step to be a name or test definition:

    Deno.test("my test", async (t) => {
      const success = await t.step("step1", async () => {
        await t.step(function inner1() {});
        await t.step(function inner1() {});
      });
    
      if (!success) throw new Error("Expected the step to return true.");
    });

    Starting with this release, the first argument can also be a named function:

    Deno.test("my test", async (t) => {
      const success = await t.step(async function step1() {
        await t.step(function inner1() {});
        await t.step(function inner1() {});
      });
      if (!success) throw new Error("Expected the step to return true.");
    });

API stabilizations:

Deno.Listener.ref() and Deno.Listener.unref() are now stable. The --unstable flag is no longer required to use these APIs.

Changes to unstable APIs:

  1. In new Deno.Command({}).spawn(), the default value for the stdin option was changed to "inherit" - meaning that if you don't configure this option specifically, standard input will be inherited from the parent process.

  2. Deno.dlopen adds support for passing structs by value:

    const Rect = ["f64", "f64", "f64", "f64"];
    const dylib = Deno.dlopen("./dylib.so", {
      make_rect: {
        parameters: ["f64", "f64", "f64", "f64"],
        result: { struct: Rect },
      },
    });
    const rect_sync = dylib.symbols.make_rect(10, 20, 100, 200);
    
    assertInstanceOf(rect_sync, Uint8Array);
    assertEquals(rect_sync.length, 4 * 8);
    assertEquals(
    	Array.from(new Float64Array(rect_sync.buffer)),
    	[10, 20, 100, 200]
    );

    Thank you to @DjDeveloperr and Aapo Alasuutari for implementing this feature.

New unstable APIs:

This release adds 3 new APIs:

  1. Deno.osUptime() (requires -allow-sys=osUptime permission)
  2. Deno.Conn.ref()
  3. Deno.Conn.unref()

These APIs require the --unstable flag, but we plan to stabilize them in the next release.

Thank you to Kamil Ogórek for implementing this feature.

Deno.core 삭제

Deno.core 는 삭제되었습니다. Deno.core 는 안정성을 보장하지 않는 개인 API였습니다. 이 업데이트는 사용자들에게 큰 피해를 미치지 않을 것입니다.

deno fmt에서 세미콜론 구성을 지원

deno fmt에 대해 오랫동안 지속적으로 요청된 기능은 세미콜론 없이 형식을 지정할 수 있는 기능이었습니다.

이제 --options-no-semicolons 플래그를 사용하거나 Deno 구성 파일의 fmt 구성에서 "semiColons": false를 추가하여 이 작업을 수행할 수 있습니다.

{
  "fmt": {
    "options": {
      "semiColons": false
    }
  }
}

cover.svg