Deno関連のコードを読んでいたときに出てきた import.meta.main
が気になったので、import.meta.url、Deno.mainModule含め調べてみた。
目次
- 目次
- そもそもimport.metaとは?
- Denoで利用されるimport.metaについて
- import.meta.mainの挙動を調べる
- import .meta.urlの挙動を調べる
- Deno.mainModuleの挙動を調べる
そもそもimport.metaとは?
import.meta
自体はECMAScriptとして定義されている機能で、import
オブジェクトの meta
プロパティのように思えるが、ここでの import
は実際にはオブジェクトではないらしい。
ちなみに日本語でかなり詳細に説明されている記事を見つけたので貼っておく。
(ただし書かれた時期が2年以上前なので、そこのところだけ頭に入れておいたほうが良さそうです。)
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が表示される。