成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

patch-package 實現原理:如何保存恢復 node_modules 下的代碼改動?

開發 前端
patches 文件的生成是在臨時目錄生成 package.json,下載依賴,生成一個 commit,然后把改動的代碼復制過去,兩者做 gif diff,就可以生成 patches 文件。

有時候我們需要修改 node_modules 下的一些代碼,但是 node_modules 不會提交到 git 倉庫,改動保存不下來,怎么辦呢?

這時候可以用 patch-package 這個工具。

比如我對 node_modules 下的 acorn 代碼做了一些修改:

加了一個 a.js 的文件:

圖片

在項目目錄下執行 npx patch-package acorn 之后,就會生成這樣一個目錄:

圖片

在 patches 目錄下的 xx.patch 文件里記錄著對這個包的改動。

這個 patches 目錄是可以提交到 git 倉庫的,然后再次把項目拉下來的時候,執行下 npx patch-package 就會應用這次改動。

可以把它配到 postintsll 里,每次安裝完依賴自動跑。

圖片

這樣能保證每次拉取下來的代碼都包含了對 node_modules 的改動。

如何使用我們學會了,那它是怎么實現的呢?

探究它的實現原理要分為兩各方面,一個是 patches 文件怎么生成的,一個是 patches 文件怎么被應用的。

patches 文件怎么生成的

看 patches 文件的內容就能看出來這是 git 的 diff:

圖片

確實,patch-package 就是依賴 git diff 實現的 patches 文件生成。

首先 patch-package 會創建一個臨時目錄:

圖片

然后在這個目錄寫入一個 package.json 文件,dependencies 就是命令行參數指定的包名:

圖片

我們去這個目錄看一下:

圖片

確實,是有這樣一個 package.json 的。

然后它會在這個目錄下執行 yarn install 或者 npm install(patch-package 現在不支持 pnpm):

圖片

圖片

之后就進行 git 的 init、add、commit,生成一個基礎的 commit。

圖片

然后把現在 node_modules 目錄下的這個被修改過的包復制過去:

圖片

之后再 git add,然后執行 git diff,就能拿到改動的 diff:

圖片

這不就是 patches 文件的內容么:

圖片

然后寫到 patches 目錄即可

圖片

patches 文件的生成還是挺簡單的,就是在臨時目錄下創建了一個基礎 commit,然后把新的內容復制過去,通過 git diff 生成的 patches 內容。

那應用 patches 的內容是怎么實現的呢?

patches 如何被應用的?

我又對 acorn 目錄下的文件做了些修改,生成的 patches 文件是包含了增刪改的:

圖片

圖片

圖片

patches 文件里記錄了對哪幾行做了新增,哪幾行做了刪除,哪幾行做了修改。

如果人工應用這個 patches 文件的話,不就是找到對應文件的對應行數,做反向的操作就可以了么?

沒錯,patch-package 也是這樣實現的,不過是自動進行的:

它讀取 patches 文件之后會進行 parse:

圖片

這個 parse 的實現就是對每一行的字符串做判斷,進行不同的處理:

圖片

最終能得到一個包含 diff 信息的對象,包含了對什么文件的哪些行做了什么修改:

圖片

之后對不同的類型做不同的操作就可以了:

圖片

這樣就把 patches 文件里的改動應用到了 node_modules 下的包里。

總結

當我們需要對 node_modules 下的代碼做改動的時候,可以通過 patch-package xxx 生成 patches 文件,它可以被提交到 git 倉庫,然后再拉下來的代碼就可以通過 patch-package 來應用改動。

實現原理要分為兩部分來看:

patches 文件的生成是在臨時目錄生成 package.json,下載依賴,生成一個 commit,然后把改動的代碼復制過去,兩者做 gif diff,就可以生成 patches 文件。

patches 文件的應用則是 patch-package 自己實現了它的 parse,拿到對什么文件的哪些行做什么修改的信息,之后根據不同做類型做不同的文件操作就可以了。

整體看下來,這個小工具的原理還是挺清晰的,不過 parse patch 文件那部分還是有些麻煩的,當你需要解析 git diff 信息的時候,也可以參考下它的實現。

責任編輯:武曉燕 來源: 神光的編程秘籍
相關推薦

2022-09-19 13:57:24

文件前端代碼

2020-07-16 14:00:38

node_module文件前端

2025-07-02 04:55:00

2022-06-14 09:04:55

前端npm

2025-02-05 08:54:36

rimrafNode.js工具

2021-09-03 08:21:20

前端代碼模塊

2025-03-04 07:30:00

開發前端Node.js

2017-11-01 15:13:49

TensorFlow神經網絡深度學習

2021-11-16 19:37:03

緩存

2024-06-05 08:42:24

2023-12-07 08:07:47

Node流程代碼

2019-10-08 11:10:18

React自動保存前端

2014-05-14 00:50:18

JoyentNode

2018-12-27 10:00:37

Windows10Office文檔

2022-01-17 07:50:37

Linux Patch項目

2017-10-23 10:13:18

IO底層虛擬

2015-12-11 11:39:15

.net代碼

2015-12-11 11:49:19

java

2024-08-19 02:35:00

模型量化深度學習

2021-11-06 18:40:27

js底層模塊
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩国产一区二区三区 | 成人精品鲁一区一区二区 | 91.色| 色资源在线视频 | 亚洲一区二区三区四区五区中文 | 福利色导航 | 黄视频欧美 | 无码一区二区三区视频 | 99精品国产一区二区青青牛奶 | 中文av字幕| 国产精品久久久久久久午夜 | 国产精品免费一区二区 | 欧美激情一区 | 日中文字幕在线 | 成人国产精品入口免费视频 | 97av视频| 国产精品有限公司 | 99精品欧美一区二区蜜桃免费 | 国产精品久久久久久婷婷天堂 | 欧美精品一区二区三区四区 在线 | 精品日韩一区二区 | 麻豆精品久久 | 日日操av| 中文字幕一级 | 久久久激情视频 | 亚洲视频在线观看一区二区三区 | 欧美精品一二区 | 波多野结衣一区二区三区 | 精品国产乱码久久久久久88av | 五月天综合影院 | 亚洲精品av在线 | 日韩欧美国产精品一区 | 欧美性极品xxxx做受 | 国产精品日韩欧美一区二区三区 | 国产成视频在线观看 | 久久亚洲一区二区三 | 欧美一级二级在线观看 | 精品国产一区二区三区久久影院 | 久久一区精品 | 欧美美女一区二区 | 成人精品国产一区二区4080 |