# 日報(2023-08-25) 相対パスの .. を解決するライブラリ

# 背景

相対 URL を処理しようと思うと .. ぐらいならまあ先頭文字列を見ればいいとしても ../.. とか ../../.. とかになってきてしかも base URL が uedasoft.com/aa とかそもそも .. の数より浅かったりなんて色々と考えてるといちいちめんどくさく、サービスの運用を絶対パスに制限しとけばいいかとサボってたのですが、データが増えてくるとやっぱり相対パスで手短に書けそうなのを絶対パスで書くのがめんどくさく、ちょっと真面目に考えなきゃなと反省したのが昨日の事で

# URL()

そもそもそんなことをしてくれるライブラリとか無いだろうと勝手に思ってたのですが、もしかしたらなんか見つかるかもと思って .. 相対パス 展開 とかで検索したらNER さん (opens new window)このブログ (opens new window) が見つかって、あ、あったんだ

この javascript のURL() (opens new window)、ただの関数じゃなくて、なんと URL クラスのコンストラクタなんですね fetch API とかで引数に渡す URL はいつも当たり前のように文字列を渡してたので URLクラス?なにそれ?と思って fetch API の parameter (opens new window) を確認してみたら、ほんとだ URL クラスも使えたんだと

# ResolveReference

go だとどうするんだろうと思ってググると見つかったのが、プロフィールが柴犬の写真だけで名前がわからない方のこのブログ (opens new window) で、net/url モジュールの ResolveReference (opens new window) ってメンバ関数があって、これで以下のように base URL に対して相対パスを渡して絶対パスにできるみたいです

	u, err := url.Parse("../../..//search?q=dotnet")
	if err != nil {
		log.Fatal(err)
	}
	base, err := url.Parse("http://example.com/directory/")
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(base.ResolveReference(u))

# ファイルのパスだと?

URL は js も go もライブラリがあるんだとわかって、また一つ賢くなったなとよろこんでたのですが、じゃあファイルのパスだとどうなんだろうと思ってさらにググると

# path/filepath の Join()

go だと Join() (opens new window) というのがあるんですね、逆引きGolang さんのサイトだとそのほかに現在のディレクトリを基準に解決してくれる Abs() とか、逆に分解してくれる Rel() とかとまとめて (opens new window) 例示してくださっていて便利でした

# path.join([...paths])

js だと Node の join (opens new window) が使えるんですね

# 感想

ライブラリなんかなくて自分でなんとかしなければいけないんだろうと勝手に思い込んでたのですが、ググってみると世の中なんでもあるもんなんですね 今後はめんどくさがらずになんでもググろうと思った次第です


Last Updated: 2024/11/26 23:09:42