Skip to content

构建与开发

本页提供 Leaflet 开发环境、构建系统、测试框架和开发工作流的概述。它涵盖了贡献者构建 Leaflet 或从源代码构建所需的基本工具、流程和命令。

关于 CI/CD 流水线和自动化工作流的详细信息,请参阅 构建系统与 CI/CD。关于贡献指南和代码风格要求,请参阅 贡献指南

开发环境搭建

Leaflet 需要 Node.js(CI 中使用版本 24)和 npm 进行开发。构建系统使用现代 ES 模块,除了 Node.js 外不需要额外的全局工具。

初始设置

# 克隆仓库
git clone https://github.com/Leaflet/Leaflet.git
cd Leaflet

# 安装依赖
npm install

# 构建库
npm run build

关键依赖

依赖用途配置
rollupJavaScript 打包器build/rollup-config.js1-75
eslint代码检查eslint.config.js1-126
karma测试运行器package.json19-30
mocha + chai测试框架package.json17-28
terser代码压缩package.json10
leafdocAPI 文档package.json26

源代码组织

Leaflet 源代码在 src/ 目录下组织成模块化结构,每个主要子系统位于其自己的子目录中。

SVG
100%

模块入口点

主入口点 src/Leaflet.js1-24 从子目录重新导出所有公共 API:

  • control/ - UI 控件(缩放、归属、图层)
  • core/ - 基类(ClassEventedUtil
  • dom/ - DOM 工具和事件处理
  • geometry/ - 几何基元(PointBoundsTransformation
  • geo/ - 地理基元(LatLngLatLngBoundsCRS
  • layer/ - 所有图层类型(瓦片、矢量、标记等)
  • map/ - Map 类和处理器

构建流程概述

Leaflet 使用 Rollup 作为其打包器,从 ES 模块源代码创建多种输出格式。构建过程生成四个 JavaScript 包以及 CSS 和图像资源。

构建配置

Rollup 配置 build/rollup-config.js1-75 定义:

输入: build/rollup-config.js51

input: './src/Leaflet.js'

输出格式:

文件格式特性用途
dist/leaflet-src.jsESMSourcemap, 未压缩开发(NPM 主导出)
dist/leaflet.jsESM压缩, sourcemap生产 ESM
dist/leaflet-global-src.jsUMD全局 L, sourcemap开发(浏览器)
dist/leaflet-global.jsUMD全局 L, 压缩生产(CDN)

静态资源:

staticAssetsPlugin build/rollup-config.js16-24 将这些文件复制到 dist/

  • leaflet.css
  • images/logo.svg
  • images/layers.svg
  • images/marker-icon.svg
  • images/marker-shadow.svg

NPM 脚本

SVG
100%

关键命令:

测试框架

Leaflet 使用 Karma 作为测试运行器,Mocha 作为测试框架,Chai 用于断言。测试位于 spec/ 目录中。

测试执行流程

SVG
100%

浏览器测试

测试通过 Karma 启动器在多个浏览器中运行 package.json20-29

  • Chrome / ChromeHeadless(默认)
  • Firefox / FirefoxHeadless
  • FirefoxRetina(devicePixelRatio=2 的 Firefox)
  • SafariNative(仅 macOS)

运行测试:

# 默认(Chrome headless)
npm test

# 特定浏览器
npm test -- --browsers Firefox

# 带覆盖率
npm run coverage

# 持续运行(监听模式)
npm test -- --no-single-run

服务端渲染测试

Leaflet 在 Node.js 和 Deno 环境中验证 SSR 兼容性 .github/workflows/main.yml94-121

  • spec/ssr/ssr_node.js - Node.js SSR 测试
  • spec/ssr/ssr_deno.js - Deno SSR 测试

开发工作流

典型的开发工作流涉及更改源文件、在监听模式下运行构建,以及在浏览器中测试。

交互式开发循环

SVG
100%

监听模式开发

对于活跃开发,使用监听模式 CONTRIBUTING.md113-118

  1. 启动构建监听:npm run watch
  2. debug/ 目录中打开调试页面
  3. src/ 中编辑源文件
  4. 重新加载浏览器查看更改

调试页面自动加载带 sourcemap 的 dist/leaflet-src.js,使调试变得简单。

Git 预提交钩子

Leaflet 使用 Husky 在提交前自动运行检查 package.json60

# 通过 husky 配置
npm run lint  # 在 git commit 时自动运行

跳过钩子(用于 WIP 提交):

git commit -m "WIP" --no-verify

质量保证

Leaflet 通过多个在本地和 CI 中运行的自动化检查来强制执行代码质量。

检查配置

ESLint 使用 eslint.config.js1-126 强制执行代码风格:

配置用途
eslint-config-mourner基础代码风格
@eslint/cssCSS 检查
eslint-plugin-import-xES 模块导入
eslint-plugin-baseline-js浏览器兼容性
@mapbox/eslint-plugin-script-tagsMarkdown 代码块

关键规则:

包大小监控

Bundlemon .bundlemonrc.json1-24 强制执行大小限制:

文件最大大小(gzip)
dist/leaflet.js40 KB
dist/leaflet.css3.2 KB

包大小检查在 CI 中运行 .github/workflows/main.yml70-93 并在 Pull Request 上报告状态。

完整性哈希生成

build/integrity.js 脚本 build/integrity.js1-38 为 CDN 分发生成 SHA-256 完整性哈希:

npm run docs  # 生成文档 AND 更新完整性哈希

这会更新 docs/_config.yml 中以下文件的哈希:

  • leaflet.js
  • leaflet-src.js
  • leaflet-global.js
  • leaflet-global-src.js
  • leaflet.css

包分发

Leaflet 通过多个渠道分发,每个渠道有特定的文件格式。

NPM 包

package.json37-44 导出:

{
  "exports": {
    ".": "./dist/leaflet-src.js",
    "./styles.css": "./dist/leaflet.css"
  },
  "type": "module"
}

包含的文件: package.json42-48

  • dist/ - 构建文件
  • src/ - 源代码
  • CHANGELOG.md

安装:

npm install leaflet

导入:

import * as L from 'leaflet';
import 'leaflet/styles.css';

CDN 分发

UMD 构建(leaflet-global.jsleaflet-global-src.js)通过 jsDelivr 优化用于 CDN,带有完整性哈希用于子资源完整性(SRI)验证。

GitHub Releases

CI 自动将开发快照发布到 GitHub Releases .github/workflows/main.yml164-191

  • 标签:dev
  • 包括 dist/leaflet.zip,包含所有构建文件

开发环境矩阵

Leaflet 在多个操作系统和浏览器上进行测试以确保兼容性。

CI 环境矩阵

操作系统测试的浏览器
UbuntuChrome, Firefox, Firefox (Retina)
macOSChrome, SafariNative
WindowsChrome

所有平台使用 Node.js 24 .github/workflows/main.yml6

必需工具

工具用途版本
Node.js构建系统24
npm包管理器(与 Node 捆绑)
Ruby文档服务器参见 docs/.ruby-version
Chrome/Firefox测试最新

相关文档

  • 构建系统与 CI/CD - 详细的 CI/CD 流水线、GitHub Actions 工作流、自动化测试矩阵和发布流程
  • 贡献指南 - 代码风格要求、PR 工作流、分支管理和提交约定