Closed3

fresh で "Uncaught ReferenceError: Deno is not defined" が出たとき

nikogolinikogoli

version は、fresh: "1.1.4"esm.sh: "v111"Deno: 1.31.1

状況

fresh において[1]モジュールを https://esm.sh 経由で読み込んだ時、"Deno is not defined" のエラーが出る

import * as PIXI from "https://esm.sh/pixi.js@7.2.2"

脚注
  1. 実際は「クライアントで処理される script においてモジュールを https://esm.sh 経由で読み込んだとき」に発生する問題で、fresh に限定されない ↩︎

nikogolinikogoli

原因

「モジュール自体に問題がある」/「モジュール自体には問題はない」の、2つの可能性がある

モジュール自体に問題があるとき

ここ ↓ で言われているように、server 用のコードが混入しているため
https://github.com/denoland/fresh/issues/774#issuecomment-1449363992

モジュール自体には問題はないとき

今回のエラーはこっちのケース
上の画像でエラーの発生箇所となっている constants.ts のアドレスは、以下のようになっている

"https://deno.land/std@0.177.0/node/internal_binding/constants.ts"

std/node以下のモジュールが読み込まれていることから、エラーの原因は以下のように推測される

  • esm.shが、対象のモジュールと一緒に「npm系モジュールを処理する deno の標準ライブラリ」をインポートさせている
  • この「npm系モジュールを処理するライブラリ」はクライアントでの利用を想定していない(= 利用できない)
  • 結果、esm.sh 経由のインポートにおいて、意図せずクライアントで処理できないコードが混入している
nikogolinikogoli

対策

モジュール自体に問題があるとき

モジュールを修正する

モジュール自体には問題はないとき

esm.sh に deno用のインポートでないことを伝え、不要な std/node のインポートを回避する

具体的には、以下の issue コメントにあるように esm.sh の ESBuild Options の指定 https://esm.sh/~~~~?target=*** を (デフォルトの deno から) es2022 に変更する。

// import * as PIXI from "https://esm.sh/pixi.js@7.2.2"
//                             ↓                   ______________
import * as PIXI from "https://esm.sh/pixi.js@7.2.2?target=es2022"

https://github.com/denoland/fresh/issues/988#issuecomment-1384287130

このスクラップは2023/03/23にクローズされました