at backyard

Color my life with the chaos of trouble.

Denoで利用されるimport.meta.main や import.meta.url、Deno.mainModuleについて

Deno関連のコードを読んでいたときに出てきた import.meta.main が気になったので、import.meta.url、Deno.mainModule含め調べてみた。

目次

そもそもimport.metaとは?

import.meta 自体はECMAScriptとして定義されている機能で、importオブジェクトの metaプロパティのように思えるが、ここでの importは実際にはオブジェクトではないらしい。

developer.mozilla.org

ちなみに日本語でかなり詳細に説明されている記事を見つけたので貼っておく。
(ただし書かれた時期が2年以上前なので、そこのところだけ頭に入れておいたほうが良さそうです。)

qiita.com

Denoで利用されるimport.metaについて

そしてDenoでも import.metaを利用することができるのだが、そこで利用できるものの一つが import.meta.main ということになる。

https://deno.land/manual/examples/module_metadata

上のページの説明を参照する限り、3種類の Denoオリジナル(?)の import.meta プロパティを利用できるよう。

  • import.meta.main には boolean の値が格納されており、現在のモジュールがプログラムのエントリーポイントであるかどうかを true or false で教えてくれる
  • import.meta.urlには現在のモジュールのURLが文字列で格納されている
  • Deno.mainModuleにはメインモジュールのエントリーポイントのURL、つまりDenoランタイムによって呼び出されるモジュールが文字列で格納されている(というか、最後のは import.meta関係ない気もするが、ついでに書いておく)

import.meta.mainの挙動を調べる

とりあえず下記のような他愛もないサンプルコードを作成してみた。

// main.ts
import { say } from "./sub.ts";

say();

console.log("main: ", import.meta.main);
// sub.ts
export function say(): void {
  console.log("sub: ", import.meta.main);
}

そしてこれを実行すると下記のようになる。

deno run main.ts

実行結果

sub:  false
main:  true

エントリーポイントの場合のみ true になっているのがわかる。

import .meta.urlの挙動を調べる

上のサンプルコードと全く同じで、console.logの中だけ書き換えたものを用意した。

// main.ts
import { say } from "./sub.ts";

say();

console.log("main: ", import.meta.url);
// sub.ts
export function say(): void {
  console.log("sub: ", import.meta.url);
}

同じように実行する

deno run main.ts

実行結果

sub:  file:///Users/...省略.../sub.ts
main:  file:///Users/...省略.../main.ts

ファイルが格納されているフルパスが表示された。

Deno.mainModuleの挙動を調べる

最後は Deno.mainModule
同じようにサンプルコードを書き換える。

// main.ts
import { say } from "./sub.ts";

say();

console.log("main: ", Deno.mainModule); 
// sub.ts
export function say(): void {
  console.log("sub: ", Deno.mainModule);
}

Deno.mainModuleを利用する際には --allow-read をつけないとエラーになるようだったので下記のようにして実行。

deno run --allow-read main.ts

実行結果は下記の通り

sub:  file:///Users/...省略.../main.ts
main:  file:///Users/...省略.../main.ts

メインモジュールのフルパスが表示された。
上に書いた概要にも書いたが、メインモジュールのエントリーポイントのURLが表示される。