🔗

URL が有効か判定する URL.canParse() メソッド

2024/11/30に公開

課題

new URL() に URL として無効な(パースできない)文字列を渡すと例外が発生します。
例外を回避するためには try-catch で囲う必要がありました。

判定用関数
function canParse(url: string | URL, base?: string | URL): boolean {
  try {
    new URL(url, base);
    return true;
  } catch {
    return false;
  }
}

URL.canParse()

上記のような判定を行う URL.canParse() メソッドが追加されたようで主要な最新ブラウザでは使えるようになっています。
ただ、未対応のブラウザやバージョンが古い環境もまだあるので使用する場合は Polyfill を実装しておくとよさそうです。

https://developer.mozilla.org/ja/docs/Web/API/URL/canParse_static

if (URL.canParse(url)) {
  // ...
}

Polyfill

Polyfill とは代替実装のことです。

https://developer.mozilla.org/ja/docs/Glossary/Polyfill

以下のコードを最初の方に読み込まれるファイルに実装しておくと URL.canParse() がサポートされていないブラウザでも使えるようになります。
(SvelteKit だと Hooks あたりに実装しておくといいでしょう。)

if (!URL.canParse) {
  URL.canParse = (url: string | URL, base?: string | URL): boolean => {
    try {
      new URL(url, base);
      return true;
    } catch {
      return false;
    }
  };
}

補足

if ('canParse' in URL === false) で判定してもいいと思いますがエディタに赤線を引かれてしまったので !URL.canParse にしました。

ライブラリ

URL.canParse() を含め様々な Polyfill に対応しているライブラリもあるようなので必要あれば導入するのもいいかもしれません。

https://github.com/zloirock/core-js#url-and-urlsearchparams

Discussion