2021/10/19にChrome 95の正式版がリリースされました。
新機能の一つとして、URLPatternのビルトイン対応があります。
本記事ではURLPatternの概要と使い方について簡単に説明します。
URLについてのパターンオブジェクトを作成し、そのパターンを用いて以下の処理を行う機能を持っています。
test()
与えられたURLがパターンにマッチするかどうか判定するexec()
与えられたURLをパターンのマッチ部分ごとに分解した結果を取得する
これらの機能が有効な場面としては以下が挙げられます。
- WebAPIやSPAにおけるURLルーティング
- Service Workerのスコープ指定
このような処理を行う場合、通常は正規表現パターンを自作するか、 path-to-regexpのようなライブラリを使うかといった選択肢になると思います。
実のところ、URLPatternはpath-to-regexpをベースにしています。
それもあってかほぼ同等の文法が使用できるため、馴染みのある方は難なく使えるでしょう。
path-to-regexpはexpressjsやreact-routerなどのメジャーなnpmパッケージでも使われており、そのことからもURLパターンマッチング機能の有用性が窺えます。
今回は全てのURLにマッチするURLPatternを作成し、exec()で分解した結果を示します。
const url = 'https://developer.chrome.com/blog/new-in-chrome-95/#urlpattern';
const pattern = new URLPattern({
protocol: '*',
hostname: '*',
pathname: '*',
search: '*',
hash: '*',
});
const result = pattern.exec(url);
// コンソール出力
console.log(JSON.stringify(result, null, 4));コンソール出力は以下の通りになりました。
対象URLの要素に含まれていない項目もいくつか見られます。
{
"hash": {
"groups": {
"0": "urlpattern"
},
"input": "urlpattern"
},
"hostname": {
"groups": {
"0": "developer.chrome.com"
},
"input": "developer.chrome.com"
},
"inputs": [
"https://developer.chrome.com/blog/new-in-chrome-95/#urlpattern"
],
"password": {
"groups": {
"0": ""
},
"input": ""
},
"pathname": {
"groups": {
"0": "/blog/new-in-chrome-95/"
},
"input": "/blog/new-in-chrome-95/"
},
"port": {
"groups": {
"0": ""
},
"input": ""
},
"protocol": {
"groups": {
"0": "https"
},
"input": "https"
},
"search": {
"groups": {
"0": ""
},
"input": ""
},
"username": {
"groups": {
"0": ""
},
"input": ""
}
}
各種ブラウザのURLPatternへの対応状況ですが、現時点では最新版のChrome、Edge、Opera(以上デスクトップ)、Chrome Android、Deno(Node.jsに類するJavaScriptランタイム)のみ対応となっています。
その他のブラウザやNode.js環境はビルトイン対応していないため、現状で利用する場合はPolyfillライブラリの導入がほぼ必須となるでしょう。


URLのパターンマッチング・パースを行う機会は少なくありませんが、URLの正規表現は複雑になりがちです。
今回取り扱ったようにChromeがURLPatternビルトイン対応の先駆けとなって、他のブラウザ・環境でも対応が進むことを期待しています。






