Mapbox GL JS 3.25.0:ESM 命名导出与 accessToken 迁移实战

2026-06-18 46 预计阅读时间: 1 分钟
来源: oschina.net AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:6 分钟

Mapbox GL JS 3.25.0 带来了两项破坏性变更:ESM 入口点改为命名导出,全局 accessToken 被替换为构造选项 MapaccessToken。这两处改动看似不大,却直接影响现有项目的打包体积和初始化方式——升级前不搞清楚,地图直接白屏。

ESM 入口点:从默认导出走向命名导出

旧版本中,ESM 入口点是一个默认导出对象,打包工具很难判断哪些成员被实际使用,只能把整个包塞进产物。3.25.0 把 ESM 入口点改为命名导出:

// 旧写法——打包工具无法静态分析,全量引入
import mapboxgl from 'mapbox-gl';
mapboxgl.Map;
mapboxgl.NavigationControl;
// 新写法——命名导出,打包工具可按需移除未使用代码
import * as mapboxgl from 'mapbox-gl/esm';
// 或更精确地只拿需要的
import { Map, NavigationControl } from 'mapbox-gl/esm';

关键收益:现代打包工具(Rollup、Vite、webpack 5 的 tree-shaking)现在有机会在编译期识别并剔除你没用到的导出成员。不过官方也坦诚——由于库内部仍有大量动态引用,大部分代码块暂时还无法被静态删除,这次改动只是迈出了第一步。

如果你的项目用 CommonJS 方式引入(require('mapbox-gl')),这次 ESM 变更不影响你,但长远来看,切换到命名导出是更健康的方向。

accessToken 退役,MapaccessToken 接棒

过去十多年,Mapbox 的标准做法是把 token 挂到全局对象上:

mapboxgl.accessToken = 'pk.your_token_here';
new mapboxgl.Map({ container: 'map' });

3.25.0 正式废弃了这个全局属性,改为在 Map 构造选项中传入:

import { Map } from 'mapbox-gl/esm';

const map = new Map({
  container: 'map',
  MapaccessToken: 'pk.your_token_here',
  style: 'mapbox://styles/mapbox/streets-v12',
  center: [116.4, 39.9],
  zoom: 10
});

这样做的好处是 token 与实例绑定,不再污染全局空间。在微前端或多地图实例场景下,不同实例可以用不同 token,互不干扰。旧的全局赋值方式在当前版本仍能运行,但会在控制台打出废弃警告,后续版本将彻底移除。

迁移实操:一份可跑的最小示例

下面是一个用 Vite + Mapbox GL JS 3.25.0 的最小项目,可以直接复制运行:

mkdir mapbox-325-demo && cd mapbox-325-demo
npm create vite@latest -- --template vanilla
npm install mapbox-gl@3.25.0

index.html 改为:

<!DOCTYPE html>
<html lang="zh">
<head>
  <meta charset="UTF-8" />
  <title>Mapbox 3.25 Demo</title>
  <style>
    body { margin: 0; }
    #map { width: 100vw; height: 100vh; }
  </style>
</head>
<body>
  <div id="map"></div>
  <script type="module" src="/main.js"></script>
</body>
</html>

main.js 写成:

import { Map, NavigationControl } from 'mapbox-gl/esm';
import 'mapbox-gl/dist/mapbox-gl.css';

// ⚠️ 把下面替换为你自己的 Mapbox 公开 token
const TOKEN = 'pk.your_real_token_here';

const map = new Map({
  container: 'map',
  MapaccessToken: TOKEN,
  style: 'mapbox://styles/mapbox/streets-v12',
  center: [116.397, 39.908], // 北京
  zoom: 11
});

map.addControl(new NavigationControl(), 'top-right');

启动:

npm run dev

浏览器打开后应能看到北京城区街道地图,右上角有缩放控件。如果白屏,先检查 token 是否有效、网络是否可达 Mapbox CDN。

升级前的检查清单

  • 排查旧导入方式:全局搜索 import mapboxgl from 'mapbox-gl'require('mapbox-gl'),逐个改为命名导出或 import * as mapboxgl from 'mapbox-gl/esm'
  • 排查 accessToken 赋值:搜索 mapboxgl.accessToken =,替换为构造选项 MapaccessToken。如果多处创建地图,每处都要传。
  • 留意 CSS 引入路径:样式文件 mapbox-gl/dist/mapbox-gl.css 不受此次变更影响,照旧引入即可。
  • 验证打包产物体积:升级后用打包工具的 analyze 插件对比产物大小。这次改动对体积的削减可能有限,但后续版本会持续改善。
  • 关注控制台废弃警告:3.25.0 仍兼容旧写法但会打警告,看到警告说明还有遗漏的迁移点。

这次升级的破坏面不算大,但两项改动都指向同一个方向——让 Mapbox GL JS 更适合现代前端工具链的静态分析和按需裁剪。如果你还在用旧版全局 token + 默认导出,现在就是动手的时机。


相关推荐