Contents
在了解這個專案前,可以先來了解一下 isomorphic javascript 這個技術名詞,根據維基百科的描述
Isomorphic JavaScript, also known as Universal JavaScript, describes JavaScript applications which run both on the client and the server.
Isomorphic JavaScript,也稱為通用 JavaScript,描述了可以同時在客戶端和伺服器上運行的JavaScript 應用程式。
所以根據這個描述,isomorphic-git 也就是可以同時在伺服器端和 Web 端上運行的 git !
isomorphic-git 是使用純粹的 JavaScript 實現 git 功能,適用於 node 和瀏覽器環境(包括WebWorkers 和ServiceWorkers [ 所以也支援 PWA ] )。 這意味著它可以用於讀取和寫入git儲存庫( repository ),以及像 Github 一樣從遠端 git 伺服器獲取和推送變更。這個專案也提供了一個 CLI 工具 – isogit 可以在桌面電腦和在伺服器端操作 git 儲存庫
開始使用
Isomorphic 的意思既然是在瀏覽器端和伺服器端都可以使用同樣的功能,可是我們都知道 git 是非常依賴檔案系統的 ,這在伺服器端是沒問題的,因為 nodejs 有實現檔案系統管理模組 fs ,可是在瀏覽器端並沒有 fs 模組?因此,isomorphic-git 不是依賴於 fs 模組,而是BYOFS(自帶檔案系統)。 在使用大多數 isomorphic-git 函數之前,需要通過外掛系統設置 fs 模組。
如果你只在 Node 中使用 isomorphic-git,則可以使用本機 fs 模組。
const git = require('isomorphic-git'); const fs = require('fs'); git.plugins.set('fs', fs)
如果你正在為瀏覽器編寫程式碼,則需要一些模擬 fs API 的東西。目前最完整的選項是BrowserFS。 與 Node相比,還有一個額外的設置步驟來配置 BrowserFS,如下所示:
<script src="https://unpkg.com/browserfs"></script> <script src="https://unpkg.com/isomorphic-git"></script> <script> BrowserFS.configure({ fs: "IndexedDB", options: {} }, function (err) { if (err) return console.log(err); window.fs = BrowserFS.BFSRequire("fs"); git.plugins.set('fs', window.fs); }); </script>
更詳細的使用可以參考線上文件
CORS 支援
不幸的是,由於默認情況 same-origin 策略,isomorphic-git 只能從與其運行的網頁相同的原點進行 clone。 這非常不方便,因為它意味著所有實際上的用途,clone 和 push repo 必須透過 proxy 完成。
為此,存在了 @ isomorphic-git / cors-proxy,你可以 clone 這個專案或是使用 npm install 來安裝。對於測試或小專案,你還可以使用https://cors.isomorphic-git.org – 由Clever Cloud贊助的免費 proxy 。
當成一個 npm 模組來使用
你可以使用 npm install 來安裝。
npm install --save isomorphic-git
在package.json中,你會看到實際上有4個不同的版本:
"main": "dist/for-node/", "browser": "dist/for-browserify/", "module": "dist/for-future/", "unpkg": "dist/bundle.umd.min.js",
這值得簡要解釋。
- “main”版本用於 node。
- “browser”版本適用於browserify。
- “module” 版本用於原生 ES6 module loader 功能完成時。
- “unpkg”版本是UMD版本。
isogit
CLI
Isomorphic-git 附帶一個簡單的 CLI 工具,名為 isogit,因為 isomorphic-git 名稱比較長要打比較多的字。 它實際上只是一個輕薄短小的 shell,可以將命令列參數轉換為等效的 JS API 指令。 因此,你應該能夠使用 CLI 運行任何目前或未來的 isomorphic-git 命令。
它使用 minimisted 來解析命令列選項,並打印出等效的 JS 命令並輸出為 JSON 格式。
CLI 比較像是為了快速測試 isomorphic-git,而不是真正意義上的 git CLI 替代品。
感想
如果你有使用 Javascript 開發的 Web 專案需要與 Git 做整合,無論是前端或是後端都可以使用這個程式庫做整合
這個專案讓我覺得最了不起的除了使用 Javascript 實現讀取 git repository 的功能,還有就是這個專案強調的 isomorphic 技術,這件事其實困難度蠻高的,例如這個專案的檔案系統管理就要特別再設計一個抽象層 API ,讓前端和後端都可以用同樣的介面
如果你的專案也需要類似的 isomorphic 設計,可以參考一下這個開源專案的架構與設計
發表迴響