经纬志
首页 / Leaflet / 使用示例

瓦片缓存

在内存里缓存已下载的瓦片图片,重复查看同一区域时不再发起网络请求。

Leaflet 1.9.4 · 更新 2026-10-28
源码与运行效果
运行效果

说明

缓存键是 getTileUrl(coords) 的完整地址,值是加载完成的 Image。命中时把图片画到 canvas 瓦片上,直接调用 done(null, tile);未命中时才 new Image 走网络。 瓦片图层返回 canvas 而不是 img,是因为 Image 对象不能同时挂在多个位置, 复制一份需要重新绘制。

redraw() 会丢弃现有瓦片并重新调用 createTile, 此时缓存里的图片被复用,命中数会明显上涨。清空缓存后再重绘, 所有块都会重新走网络,这组对比能直观看出缓存是否生效。

层次谁在缓存特点
浏览器 HTTP 缓存浏览器受响应头控制,同一个 URL 通常不会重复下载
Layer 内存缓存本例的 Map解码后的 Image 直接复用,可统计命中率,刷新页面即失效
离线包IndexedDB / Cache API跨会话保留,需自行管理版本与容量
瓦片保留keepBuffer只是不销毁 DOM 节点,不属于缓存策略

内存缓存没有上限时会持续增长,长时间运行的大屏会遇到内存压力。 给 Map 加一个简单淘汰策略(例如超过 400 块时删除最早插入的键), 或在切换视角时主动清理。缓存里存的是解码后的 Image, 只往 canvas 里画不会涉及跨域;要再读像素(导出、取色)才必须给图片加 crossOrigin 并确认服务端放行。