Repository navigation
maps-core 0.6.0 / maplibre-gl v6 への追従と v6.0.0-pre.4 - #519
Conversation
maps-core 0.6.0 の peerDependencies が maplibre-gl ^6.0.0 になったため、 embed がバンドルする maplibre-gl を 6.11.2 へ上げます。maplibre-gl は embed の直接依存であり maps-core も参照するので、重複インストールが 起きていないことを npm ls maplibre-gl で確認済みです(1 コピー)。 maplibre-gl v6 は worker を import.meta.url 基準の実 URL として解決 しますが、embed の webpack 出力は library.type: 'umd' なので import.meta.url はビルド時にビルドマシンの file:/// パスへ置換されます。 maplibre はこれを https? でないと判断して worker URL を空文字へ フォールバックするため、例外もコンソールエラーも出ないまま地図だけが 表示されなくなります。 embed は「1 ファイルを置くだけで動く」ことが利点なので、worker を別 ファイルとして配るのではなく、esbuild で自己完結する 1 ファイルへ束ねて DefinePlugin でバンドルへ文字列として埋め込み、実行時に Blob URL 化して setWorkerUrl() へ渡します(maps-core の vite.umd.config.ts / src/umd.ts と同じ方式)。このため worker は blob: から起動し、CSP のあるページでは worker-src blob: が必要になります。dist/embed.js は gzip で約 297 KB → 456 KB になりました。 あわせて: - maplibre の .mjs に限り parser.url を無効化。v6 は到達しない フォールバック経路で new URL(expr, import.meta.url) を使っており、 webpack がこれを解決できない asset 参照として Critical dependency を 警告し dist ディレクトリの context module を作るため。css-loader が 生成する new URL() を巻き込まないよう .mjs に限定している。 - src/testability.test.ts のデフォルトインポートを名前空間インポートへ。 maplibre-gl v6 にデフォルトエクスポートは無い。 - worker が実際に登録されていることを確かめる E2E を追加。この失敗は 無言で起きるため、明示的に見張る必要がある。 - README に CSP の注意と、embed/core が import 時に worker 登録という 副作用を持つことを追記。 maps-core 0.6.0 は ESM-only(main と exports.require を廃止)ですが、 webpack が exports.import を解決するため影響はありませんでした。 Refs #518
dependabot の #498 は lock から @noble/hashes@2.2.0 を落としており、 npm ci が EUSAGE (package.json と package-lock.json が out of sync) で 落ちるため取り込めない。同等の更新を手で入れ直す。 - jsdom ^20.0.3 -> ^29.1.1 - webpack-dev-server ^4.11.1 -> ^5.2.6 - 推移的依存として webpack 5.102.1 -> 5.111.1、vite / postcss / js-yaml / flatted / follow-redirects / shell-quote / fast-uri / protocol-buffers-schema が #498 の目標値以上へ。jsdom 20 由来の @tootallnate/once は消滅。 あわせて esbuild を ^0.27.7 から ^0.28.2 へ。0.27.7 は GHSA 対象 (esbuild の開発サーバーの任意ファイル読み取り、Windows のみ) で、 0.28.2 は影響範囲外。vite 配下と dedupe され 1 コピーのまま。 脆弱性は 36 件から 3 件へ。残りは webpack-dev-server -> sockjs -> uuid で、最新の 5.2.6 でも上流に修正が無い。開発時のみの依存で 配布物には含まれない。 webpack-dev-server v5 は破壊的メジャーだが、docs/webpack.config.js が 使う static / open / port はそのまま有効で設定変更は不要だった。 lock の生成には npm 11 を使っている。npm 10.9.4 の arborist は vitest ^4.1.1 の peer 解決で必ず落ちるため (edgesOut の TypeError。 vitest だけの最小 package.json でも再現する npm 側のバグ)、lock を 再生成できない。npm ci はこのバグの影響を受けないので、CI と同じ npm 10.9.4 で npm ci が通ることは確認済み。 Refs #498
|
Navigate logical layers of code changes, visualize relationships, and explore their blast radius. No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Repository: geolonia/coderabbit/.coderabbit.yaml Review profile: CHILL Plan: Essentials Run ID: ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (12)
Included review availability: This review used your included allowance. 4 included reviews remain after this review. Your included PR review attempts over the past 7 days set your current allowance at 5 reviews per hour. 📝 WalkthroughWalkthroughMapLibre GL JSをv6.11.2に更新し、workerをUMDバンドルに埋め込む処理を追加しました。ブラウザー実行時にworkerをBlob URLとして登録します。CSP要件を説明し、UMD出力での動作をテストします。 ChangesUMD worker対応
Priority: ➖ Normal Change: Bug fix Merge Risk: ⚪ Minimal · up to The UMD worker setup matches MapLibre v6’s loading behavior. No identified issue prevents merging after normal checks. 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
Full details: Out of Scope Changes checkExplanation
Comment |
yuiseki
left a comment
There was a problem hiding this comment.
手元で動作確認しました。LGTM です 🙌
installMaplibreWorker() を no-op にして E2E が 14 本落ちることを実測してから検知用のテストを足している点、無言で壊れる種類の不具合への向き合い方としてとても良いと思いました。
確認したこと
npm ci / tsc --noEmit / npm run lint / npm test(15 passed)/ npx playwright test --workers=1(20 passed)はすべて green でした。
E2E はタイルをモックしているので、本番ビルドを静的配信して実タイルでも確認しています。
| ページ | 結果 |
|---|---|
index.html |
worker URL が blob: で登録され、1,180 地物を描画 |
pmtiles.html |
PMTiles レイヤーで 1,029 地物を描画 |
embed-core.js を単体読込して GeoloniaMap を生成 |
1,328 地物を描画、window.geolonia は未設定のまま |
CSP worker-src 'self' blob: |
描画される |
CSP worker-src 'self' |
worker 起動がブロックされ地図が出ない |
CSP の挙動は README の記述どおりでした。
Closes #518
Refs #498
maps-core 0.6.0 の
peerDependenciesがmaplibre-gl: ^6.0.0になったことへの追従です。あわせて、npm ciが落ちて取り込めない dependabot の #498 相当のセキュリティ更新も手で入れ直しています。1. 依存の更新
@geolonia/maps-core^0.5.1→^0.6.0maplibre-gl5.19.0→6.11.2(従来どおり固定)maplibre-glは embed の直接依存であると同時に maps-core も参照するため、issue で警告されていた二重インストールが起きていないことを確認しています。2. UMD 出力での worker 問題
issue が「最も踏みやすい罠」としていた箇所です。まず再現を取りました。バンプ直後のビルドは成功しますが、出力にはこれが埋まっていました。
library.type: 'umd'ではimport.meta.urlがビルド時にビルドマシンのファイルパスへ置換され、maplibre はそれをhttps?:でないと判断して worker URL を空文字へフォールバックします。例外もコンソールエラーも出ず、地図だけが出ません。embed は「1 ファイルを置くだけで動く」ことが利点なので、worker を別ファイルとして配るのではなく maps-core と同じ方式を webpack へ移植しました。
webpack.config.jsのbundleMaplibreWorkerSource()が esbuild で worker をmaplibre-gl-shared.mjsごと自己完結する 1 ファイルへ束ね、DefinePluginで文字列として埋め込むsrc/lib/maplibre-worker.tsが実行時に Blob URL 化してsetWorkerUrl()へ渡すembed.ts/embed-core.tsの両エントリから呼ぶ(どちらも独立した UMD バンドルなので両方必要)この E2E が本当に壊れを検知するか確認しました
installMaplibreWorker()を一時的に no-op にして全スイートを回したところ 14 本が落ち、戻すと 20 本 green でした。無言で壊れる種類の不具合なので、検知力を実測しています。さらに worker が Blob URL として登録されていることを直接見るe2e/umd-worker.spec.tsを 1 本追加しました(#512 / maps-core#112 と同じ趣旨です)。判断したこと
途中、
import.meta.urlをDefinePluginで潰してビルドマシンの絶対パスの混入を消そうとしましたが、css-loader が生成するnew URL(..., import.meta.url)を巻き込んで地図が完全に起動しなくなりました(Failed to construct 'URL': Invalid base URL)。撤回しています。同じ理由で、Critical dependency 警告を消すparser: { url: false }は maplibre の.mjsだけにスコープしました。結果として、到達しないフォールバック経路にビルドマシンの絶対パスが残ります。実害はありませんが、消そうとすると上記の副作用があるため今回は触っていません。
3. その他 issue の項目
src/testability.test.tsのデフォルトインポートを名前空間インポートへ(v6 にデフォルトエクスポートは無い)exports.importを解決するため影響なし(確認済み)worker-src blob:)と、embed/coreが import 時に worker 登録という副作用を持つことを追記4. #498 相当のセキュリティ更新
dependabot の #498 は lock から
@noble/hashes@2.2.0が落ちておりnpm ciがEUSAGEで落ちるため、同等の更新を手で入れ直しました。このブランチで追加した
esbuildも^0.27.7→^0.28.2にしています。0.27.7 は GHSA 対象(esbuild の開発サーバーの任意ファイル読み取り、Windows のみ)で、0.28.2 は範囲外です。vite 配下と dedupe され 1 コピーのままです。脆弱性は 36 件 → 3 件。残る 3 件は
webpack-dev-server → sockjs → uuidで、最新の 5.2.6 でも上流に修正がありません。開発時のみの依存で配布物には含まれません。webpack-dev-server v5 は破壊的メジャーですが、
docs/webpack.config.jsが使うstatic/open/portはそのまま有効で設定変更は不要でした。lock の生成に npm 11 を使っています
npm 10.9.4 の arborist は
vitest ^4.1.1の peer 解決で必ず落ちます。{"devDependencies":{"vitest":"^4.1.1"}}だけの package.json でも再現する npm 側のバグで、npm 11 では解消しています。npm ciはこのバグの影響を受けないため CI は通りますが、ローカルでnpm install/npm updateする人は踏みます(このリポジトリは npm のバージョンを固定していないので、Node 22 同梱の npm 10 が使われます)。別途対応するか検討いただければと思います。5. 影響
window.geolonia経由で maplibre の API を直接触っている場合は v6 の変更点の確認が必要ですblob:から起動するため、CSP を設定しているページではworker-src blob:が必要ですdist/embed.jsが gzip で約 297 KB → 455 KB(maps-core の 408 → 536 KB と同傾向)6. 検証
すべて green です。
npm ci(CI と同じ npm 10.9.4)tsc --noEmitnpm run lintnpm run test— 15 passednpm run build— Critical dependency 警告なし。残るのはサイズ警告のみnpx playwright test --workers=1— 20 passed(CI と同じ直列実行)E2E はローカルで
fullyParallelだとcleanup.spec.tsなどが散発的に落ちますが、**master でも同様(むしろ master の方が頻度が高い)**で、この変更とは無関係です。CI はworkers: 1+retries: 2です。Summary by CodeRabbit
worker-src blob:の許可が必要です。/coreの読み込み時に行われる処理と、ブラウザー外ではworkerの登録がスキップされることをREADMEに追記しました。@geolonia/maps-coreを0.6.0に更新しました。6.0.0-pre.4に更新しました。