前言
前端生态众多,开发中会用到各种各样的三方包。但是构建平台往往是统一的node版本,如果遇到构建机node版本太低,而某些三方包语法报错、或者某些三方库有bug的情况怎么办呢?
解决方案
1.升级构建环境的node版本
这种方式是彻底的解决方案,但是需要的成本比较高,可维护性也不高,所以一般有规模的生产环境一般不会这么干。
2.降低三方包版本
这是一种常见的解决方案,不过其过程非常劳民伤财,得找资料、多次尝试等,而且得牺牲很多高版本带来的特性,贸然降低版本有可能会造成其他问题。
3.通过patch-package来hack
这是一个工具包,用来hack本地node_modules中的内容,在每次下载npm包后,该工具又自动去修改其内容从而达到定点hack。这种方式是一种临时解决方案,在构建机版本未升级前,作为权宜之计是非常合适的。
patch-package使用方式
其官方地址:ds300/patch-package: Fix broken node modules instantly 🏃🏽?♀?💨
介绍一下使用方式:
首先安装它npm i patch-package ,然后给package.json中的script添加postinstall生命周期:
"scripts": {
+ "postinstall": "patch-package"
}
接下来可以修改本地node_modules中某个some-package中需要改动的内容,然后npx patch-package some-package 这个包。 再提交即可。
vim node_modules/some-package/brokenFile.js
npx patch-package some-package
git add patches/some-package+3.14.15.patch
git commit -m "fix brokenFile.js in some-package"
你会发现工程根目录有个patches文件,这里记录了你修改node_modules的改动记录。
需要注意的是,部分构建平台基于docker,设置了root权限,故而想要postinstall生命周期生成启动,需要在.npmrc中设置:
unsafe-perm = true
原理介绍
开发者在修改了本地node_modules后执行npx patch-package some-package,就是将修改的diff记录到根目录的patches文件夹下。
postinstall生命周期是npm自带的在npm install后执行的,故而在这个阶段,patch-package会把自己记录到patches的diff改动,修改到当前的node_modules中,完成hack。
|