麻辣GIS微信平台

更多 GIS 干货

微信关注不错过

patch-package,让GIS前端开发告别依赖库 "卡脖子"

作为 GIS 前端开发,日常要跟各种庞大的图形学库打交道:OpenLayers, Leaflet, Mapbox GL JS, Cesium, Turf.js... 这些库动辄几万行代码。不知道大家开发的时候有没有遇到需要修改node_modules中的源码这种情况,比如小编之前的老项目中用到了 OpenLayers 6.x 版本,用到的第三方插件早就不更新了。这时候如果使用新版的插件就要升级 OpenLayers 版本,对于一个已经交付多年的项目来说,这基本是不可能的工作量。

传统的解决方案

如何解决这种问题呢?有很多刚开始接触GIS开发的新手会去直接改 node_modules 里的代码。但这种方法的弊端很明显:本地跑通了,别人一拉代码 npm install,Bug 又回来了;CI/CD 构建的时候直接报错。

另外一种方法,小编常用,就是把整个库下载下来,改完发布一个私有包。但这要求公司有自己的私有NPM仓库,根据小编所知不是所有的公司都有这种基础设施,比如小编所在的公司虽然有私有NPM仓库,但需要申请各种权限,所以小编一般将改动的代码放在一个git仓库,并使用npm + git方式引入到代码仓库。

npm i https://github.com/user_name/node_project_name

更优雅的patch-package

最近小编又遇到了问题,但总用NPM + Git方式引入的库,还是觉得有些麻烦,毕竟每次还是需要去新建仓库,还要配置拉取权限等等。这种问题不可能小编自己遇到,结果一找果然发现了更优雅的解决方案:patch-package

如何使用?

假设项目中使用 Mapbox GL JS 加载 UTM 投影(EPSG:32650)的矢量瓦片,发现缩放级别 10 以上时,POI 标签会偏离要素中心点。排查后定位到mapbox-gl.js中投影转换的坐标计算错误,我们使用 patch-package 应该怎么做?

第一步:安装 patch-package

npm install patch-package --save-dev
# 或者使用 yarn
yarn add patch-package postinstall-postinstall

注:使用 yarn 的同学最好加上 postinstall-postinstall,这是为了确保兼容性。

第二步:直接修改 node_modules

找到项目中node_modules/mapbox-gl/dist/mapbox-gl.js,定位到投影转换相关代码(比如搜索projectToScreen方法),修复坐标计算逻辑:

// 原错误代码(简化示例)
const projected = this.projection.project(coords);
const x = projected.x * this.scale;
const y = projected.y * this.scale;

// 修复后代码(添加UTM投影偏移补偿)
const projected = this.projection.project(coords);
const x = projected.x * this.scale - (this.projection.isUTM ? 10 : 0);
const y = projected.y * this.scale - (this.projection.isUTM ? 5 : 0);

第三步:生成补丁文件

npx patch-package mapbox-gl

执行后会在项目根目录生成patches/mapbox-gl+2.9.1.patch文件,这个文件记录了你的代码修改,一定要提交到 Git 仓库!

第四步:使用补丁

在package.json中添加postinstall脚本,确保每次npm install或yarn install时自动应用补丁:

{
  "scripts": {
    "postinstall": "patch-package" // 新增这行
  }
}

团队其他成员拉取代码后,只需执行npm install,补丁就会自动应用到node_modules中,无需额外操作~

总结

虽然 patch-package 可以解决这个问题,但小编建议不到迫不得已,还是不能滥用,否则会导致代码越来越难以维护。只有在原npm已经停止维护或者紧急上线的时候使用,另外使用的时候一定要注意锁版本,避免出现版本冲突。

你在 GIS 项目中遇到过哪些依赖库坑?欢迎在评论区分享你的解决方案!

相关阅读

麻辣GIS-Sailor

作者:

GIS爱好者,学GIS,更爱玩GIS。

声明

1.本文所分享的所有需要用户下载使用的内容(包括但不限于软件、数据、图片)来自于网络或者麻辣GIS粉丝自行分享,版权归该下载资源的合法拥有者所有,如有侵权请第一时间联系本站删除。

2.下载内容仅限个人学习使用,请切勿用作商用等其他用途,否则后果自负。

手机阅读
公众号关注
知识星球
手机阅读
麻辣GIS微信公众号关注
最新GIS干货
关注麻辣GIS知识星球
私享圈子
没有下文

留言板(小编看到第一时间回复)