1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DenoAdvent Calendar 2024

Day 13

esbuild-deno-loader を使ってみる

Last updated at Posted at 2024-12-12

esbuild-deno-loader という esbuild 向けのプラグインを使うと、Deno と互換なモジュール解決ルールで、プログラムをバンドルすることが出来ます。

使い道としては、例えば、Deno で動くように書いてあるツール/ライブラリなどを、esbuild-deno-loader でバンドルし、それをブラウザ、Node、Cloudflare Workers など、いろいろなランタイム上で使うというような使い道が考えられます。

筆者は、esbuild-deno-loader でバンドルしたコードを VSCode Extension のカスタムエディター WebView の中に読み込んで、Deno 用のライブラリなどに依存しつつ、カスタムエディタの UI を開発するという使い方をしています。

サンプルリポジトリ
https://github.com/kt3k/vscode-pixeledit

以下では、esbuild-deno-loader の基本的な使い方を紹介します。

import * as esbuild from "npm:esbuild@0.24";
import { denoPlugins } from "jsr:@luca/esbuild-deno-loader@0.11";
import { resolve } from "jsr:@std/path@1";

const result = await esbuild.build({
  plugins: [...denoPlugins({
    configPath: resolve("path/to/deno.json")
  })],
  entryPoints: ["入力ファイル.ts"],
  outfile: "./出力ファイル.js",
  bundle: true,
  format: "esm",
});

console.log(result.outputFiles);

esbuild.stop();

上記サンプルが基本的な使い方です。入力ファイル.ts出力ファイル.js の部分は適宜置き換えてください。

上のスクリプトを実行すると、入力ファイル.ts の内容がバンドルされて 出力ファイル.js として書き出されます。ファイル名が表すように、入力ファイルは TypeScript ですが、出力ファイルは JavaScript になることに注意してください。

denoPlugins() という呼び出しで、Deno 互換のリゾルバーとローダーが作成され、それを esbuild に渡しています。configPath というオプションに deno.json の絶対パスを渡していて、これを渡すことで import map の解決が出来るようになります (なお、configPath は絶対パスしか受け付けていないため、@std/path モジュールの resolve 関数で絶対に解決してから渡しています)。

Happy Isomorphic Coding!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?