研发协作
项目使用 MapLibre GL JS,想迁移到…
把基于 MapLibre GL JS 的地图应用迁移到 Mapbox GL JS,重点处理包名、导入、access token、样式 URL 和插件替换。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
项目使用 MapLibre GL JS,特定
解决思路
- 在 mapbox.com 注册 Mapbox 账号。
- 从 Mapbox 账号 dashboard 获取 access token。
- 查看 Mapbox 定价,确认免费层包含 50,000 map loads/month。
- 记录 token,public token 以 pk. 开头。
- 运行 npm uninstall maplibre-gl 移除 MapLibre。
- 运行 npm install mapbox-gl 安装 Mapbox。
- 将 import maplibregl from 'maplibre-gl'; 改为 import mapboxgl from 'mapbox-gl';。
- 将 import 'maplibre-gl/dist/maplibre-gl.css'; 改为 import 'mapbox-gl/dist/mapbox-gl.css';。
- CDN 场景将 <script src='https://unpkg.com/maplibre-gl@3.0.0/dist/maplibre-gl.js'></script> 替换为 <script src='https://api.mapbox.com/mapbox-gl-js/v3.0.0/mapbox-gl.js'></script>。
- CDN 场景将 <link href='https://unpkg.com/maplibre-gl@3.0.0/dist/maplibre-gl.css' rel='stylesheet' /> 替换为 <link href='https://api.mapbox.com/mapbox-gl-js/v3.0.0/mapbox-gl.css' rel='stylesheet' />。
- 在创建地图之前设置 mapboxgl.accessToken = 'pk.your_mapbox_access_token';。
- Token 使用环境变量:process.env.VITE_MAPBOX_TOKEN 或 process.env.NEXT_PUBLIC_MAPBOX_TOKEN。
- 在 Mapbox dashboard 为 token 添加 URL restrictions。
- 客户端代码使用 public token(pk.*)。
- 不要将 token 提交到 git;把 token 放入 .env,并将 .env 加入 .gitignore。
- 如果 token 泄露,轮换 token。
- 将 new maplibregl.Map({...}) 改为 new mapboxgl.Map({...}),保留 container、center、zoom 等参数。
- 将 style 从 MapLibre demo/custom URL 改为 Mapbox 样式,例如 mapbox://styles/mapbox/standard。
- 可使用内置样式 mapbox://styles/mapbox/standard(Mapbox Standard,默认)。
- 可使用内置样式 mapbox://styles/mapbox/standard-satellite。
- 可使用内置样式 mapbox://styles/mapbox/streets-v12。
- 可使用内置样式 mapbox://styles/mapbox/satellite-v9。
- 可使用内置样式 mapbox://styles/mapbox/satellite-streets-v12。
- 可使用内置样式 mapbox://styles/mapbox/outdoors-v12。
- 可使用内置样式 mapbox://styles/mapbox/light-v11。
- 可使用内置样式 mapbox://styles/mapbox/dark-v11。
- 可使用内置样式 mapbox://styles/mapbox/navigation-day-v1。
- 可使用内置样式 mapbox://styles/mapbox/navigation-night-v1。
- 自定义样式使用 mapbox://styles/your-username/your-style-id,可在 Mapbox Studio 创建。
- 将所有 maplibregl 引用替换为 mapboxgl。
- Marker 使用 new mapboxgl.Marker().setLngLat([-122.4194, 37.7749]).setPopup(new mapboxgl.Popup().setText('San Francisco')).addTo(map);。
- Controls 使用 map.addControl(new mapboxgl.NavigationControl(), 'top-right');、new mapboxgl.GeolocateControl()、new mapboxgl.FullscreenControl()、new mapboxgl.ScaleControl()。
- 若使用 @maplibre/maplibre-gl-geocoder,替换为 @mapbox/mapbox-gl-geocoder。
- 若使用 @maplibre/maplibre-gl-draw,替换为 @mapbox/mapbox-gl-draw。
- 若使用 maplibre-gl-compare,替换为 mapbox-gl-compare。
- 对所有 @maplibre/* 或 maplibre-gl-* 插件,检查并替换为 Mapbox 对应版本。
- Geocoder 替换示例:import MapboxGeocoder from '@mapbox/mapbox-gl-geocoder';,addControl 时传入 accessToken: mapboxgl.accessToken、mapboxgl: mapboxgl、countries: 'us'、language: 'en'。
- 注意 countries 和 language 会改变返回哪些结果,不只是过滤/显示;countries 会排除列表外结果,language 会影响结果评分和首位排序,需沿用原 MapLibre geocoder 的区域/语言限制。
- 其余地图代码保持不变:map.on('load')、addSource、addLayer 等无需修改。
- 事件处理保持不变:map.on('click', 'points-layer', (e) => { ... }) 等。
- 地图方法保持不变:map.setCenter([lng, lat])、map.setZoom(12)、map.fitBounds(bounds)、map.flyTo({ center: [lng, lat], zoom: 14 }) 等。
- Marker/Popup、Layer/Source、GeoJSON、自定义样式和表达式、Controls 等 API 100% 兼容,无需修改。
- 修复 'A valid Mapbox access token is required to use Mapbox GL':在创建 map 之前设置 mapboxgl.accessToken。
- 修复 token 硬编码在源码:改用 process.env.VITE_MAPBOX_TOKEN,在 .env 写 VITE_MAPBOX_TOKEN=pk.your_token,并 echo '.env' >> .gitignore。
- 修复错误 Style URL 格式:不要用 https://demotiles.maplibre.org/style.json,改用 mapbox://styles/mapbox/streets-v12 等 Mapbox 样式 URL。
- 修复插件兼容:将 import MaplibreGeocoder from '@maplibre/maplibre-gl-geocoder'; 改为 import MapboxGeocoder from '@mapbox/mapbox-gl-geocoder';。
- 修复 CDN URL:使用 https://api.mapbox.com/mapbox-gl-js/v3.0.0/mapbox-gl.js 和对应 CSS。
- 执行检查清单:创建 Mapbox 账号并获取 access token。
- 执行检查清单:npm install mapbox-gl,并移除 maplibre-gl。
- 执行检查清单:更新 imports 和 CSS imports。
- 执行检查清单:添加 token,设置 mapboxgl.accessToken = 'pk.xxx'。
- 执行检查清单:使用环境变量存储 token。
- 执行检查清单:更新 style URL 为 mapbox://styles/mapbox/streets-v12。
- 执行检查清单:替换所有 maplibregl. 为 mapboxgl.。
- 执行检查清单:安装 Mapbox 版本插件(如果使用)。
- 执行检查清单:在 dashboard 配置 token URL restrictions。
- 执行检查清单:测试所有功能,验证地图加载和交互正常。
- 执行检查清单:在 Mapbox dashboard 设置计费提醒。
- 执行检查清单:更新文档,记录团队 token 设置。
- 执行检查清单:将 .env 加入 .gitignore,确保 tokens 未提交。
- 如需详细信息,加载 references/api-compatibility.md、references/exclusive-features.md、references/why-mapbox.md。
- 可参考相关技能:mapbox-web-integration-patterns、mapbox-web-performance-patterns、mapbox-token-security、mapbox-google-maps-migration。
适用边界 · 注意事项
- 必须保持 BSD 3-Clause 开源许可、不能接受 Mapbox GL JS v2+ 专有许可的项目。
- 没有 Mapbox 账号/access token,或不愿承担 Mapbox 定价、用量计费与数据合规要求的项目。
- 已深度依赖 MapLibre 专属插件或自托管瓦片源,且迁移收益不足以抵消引入 Mapbox 供应商依赖的项目。