Vite で MapLibre v6 を使う
バンドラーの中では import.meta.url がワーカーファイルを確実に解決できないため、プロジェクトごとに一度だけ setWorkerUrl() を呼ぶ必要があります。Vite では ?worker&url クエリを使って、バンドル済みで自己完結したワーカーの URL を取得します。
import { Map, setWorkerUrl } from 'maplibre-gl';
import 'maplibre-gl/dist/maplibre-gl.css';
import workerUrl from 'maplibre-gl/dist/maplibre-gl-worker.mjs?worker&url';
setWorkerUrl(workerUrl);
const map = new Map({
});
単なる ?url ではなく ?worker&url を使ってください。dist のワーカーは隣接する maplibre-gl-shared.mjs を import しますが、?url は本番ビルドでワーカーファイルをそのまま出力し、隣接ファイルを含めません。その結果、ワーカーは最初の import で失敗し、ベクタータイルが一切読み込まれなくなります。?worker&url は Vite のワーカーパイプラインを通し、自己完結したチャンクを出力します。
さらにワークショップのテンプレートでは、Vite の依存関係の事前バンドルから MapLibre を除外しています。この処理の途中でワーカーのバンドルが失敗することがあるためです。
export default defineConfig({
plugins: [sveltekit()],
optimizeDeps: {
exclude: ['maplibre-gl']
}
});
これは上流の要求ではなく、このテンプレート独自の回避策です。設定なしで動くプロジェクトであれば不要です。
他のバンドラー
webpack 5 以降、rspack、rsbuild でも同じ setWorkerUrl() を、通常の URL を渡して呼びます: setWorkerUrl(new URL('maplibre-gl/dist/maplibre-gl-worker.mjs', import.meta.url).toString()); 変更点の全体は v5 から v6 への移行ガイド を参照してください。