本文由 FilCloud 編譯整理
訂閱英文原版 :https://blog.ipfs.io/2020-02-13-js-ipfs-0-41/
亮點
一個巨大的飛躍
非同步等待和非同步可迭代
我們已經完成了對 js-ipfs 內部構件 HU 的巨大重構,切換到使用 Promises 和async/ await over Callbacks 以及使用非同步可迭代物件,而不是 Node.js Streams 和 Pull Streams。好吧,我說謊,實際上不只是 js-ipfs 內部,而是整個堆疊,包括 libp2p,IPLD 和多格式,您可以稱其為完全重寫,但是,您知道,我們不喜歡吹牛。
請注意-此版本對核心 API 進行了重大更改,因此,請參考下面的“ API 更改 ”部分以獲取所有資訊。
這是一次漫長而激動的旅程,但是這種重構為消費者,貢獻者和核心開發人員帶來了許多難以置信的即時和未來收益,使所有工作和努力都值得。總結一下,我們已經:
預設情況下切換到流式 API 以減少記憶體壓力
透過刪除緩衝,Node.js 和 Pull Stream API 減少了 API 表面積
減少了程式碼庫中的程式碼量和我們所依賴的依賴項數量(用於較小的瀏覽器包和更快的安裝時間)
切換到使用非同步可迭代物件以流式傳輸資料以幫助使流式傳輸更易於訪問
切換為使用async/,await這樣我們將獲得更好的錯誤堆疊跟蹤並提高了可讀性和可維護性
在 JavaScript 中使用async/ await在生態系統中獲得了廣泛的關注,並且正迅速成為編寫慣用JS的實際方法。我們希望 js-ipfs 與時俱進,並透過使用現代 JS 功能,技術和做法繼續對貢獻者有吸引力。進行這些更改的主要想法是使程式碼比以往更容易貢獻,更易於理解,更易於維護並且更快,更小。
這個變化是如此之大,如此之重要,我們寫了整篇部落格文章來解釋這些變化背後的動機。
為了您的觀看樂趣,我們還對該重構進行了一些統計:
從我們的 27 個直接依賴項中刪除了 package.json
我們的瀏覽器捆綁包中減少了 214 個模組
155 KB較輕的瀏覽器捆綁(unpkg.com/[email protected] VS unpkg.com/[email protected]) -這是小 18% !
124 KB較輕的ipfs-http-client瀏覽器捆綁(unpkg.com/[email protected] VS unpkg.com/[email protected]) -這是小 60%!
淨刪除約 2,600 行程式碼
從ipfs-http-client(net)刪除了約 360 行程式碼
CI執行時間縮短約 10 分鐘
…而且其中許多統計資訊僅適用於 js-ipfs 和 js-ipfs-http-client-冰山一角!對於 IPFS,libp2p,IPLD 和多格式之間的 60-70 之間的依賴關係,我們看到了與此類似的更改。
UnixFS v1.5
事實證明,對於包管理器來說,保留檔案後設資料(尤其是上次修改時間 mtime)非常重要。檔案 mtime 允許他們選擇性地僅同步已更改的資料。到目前為止,如果要在 IPFS 上託管大型資料集(如程式包管理器的儲存庫),將很難進行更新。
“那永久網呢?” 這絕對不會阻止軟體包管理器儲存庫的特定快照永久可用。後設資料僅使差異能夠匯入,而不是整個。因此,當我說“難以更新”時,就像我在那裡所做的那樣,我的意思是緩慢和/或不可能。當您擁有 TB 級(或更多)軟體包資料並且有人釋出了一個新軟體包時,只更改了很小一部分就再次匯入所有內容是很不方便的。檔案確實可以很好地指示發生了什麼變化,因此您現在就可以在 IPFS 中使用它!
例如,在將檔案新增到IPFS時,有兩個jsipfs add允許mode和mtime保留的新選項:
$ jsipfs add -r --preserve-mtime --preserve-mode ~/Desktop/gif
added QmT6WX9McZyx5ZoisRgpsjYKDBWnYpMnBLpfAgjW5kavBA gif/yesthisisdog.jpg
added QmXMrFfZ9zHLZKN7xP2dX76YFFhvBJsQkd4fLnTDkyR31Q gif
除了新選項buuut之外,沒有什麼大的變化,現在當您列出目錄內容 Mode 和 Mtime 資訊時:
$ jsipfs ls QmXMrFfZ9zHLZKN7xP2dX76YFFhvBJsQkd4fLnTDkyR31Q -v
Mode Mtime Hash Size Name
-rw-r--r-- Apr 16, 2018, 12:20:33 PM GMT+1 QmT6WX9McZyx5ZoisRgpsjYKDBWnYpMnBLpfAgjW5kavBA 87779 yesthisisdog.jpg
持久儲存該檔案 mode 也非常有效,因為它開啟了以前不可能的 NFS 型別用例。想象一下, node_modules 目錄由 IPFS 支援並安裝在檔案系統上-該檔案 mode 將允許其中的所有 node_modules/.bin 檔案按照您的期望執行。
關於這一切的最酷的事情是它完全向後相容。僅當您選擇加入後設資料時,給定檔案/目錄的 CID 才會更改,否則 CID 保持不變。
有大量更改,為輸入和輸出的 CLI,HTTP 和核心 API 新增了後設資料功能。還有兩個新的 MFS 命令 touch,chmod 它們允許您隨時更改後設資料!
有關所有新 UnixFS v1.5 內容的詳細資訊,請參見下面的“ API 更改”部分。
API變更
核心API
此版本中有重大且重大的核心API更改。請參閱遷移指南。
IPFS不是可以例項化使用的類IPFS.create。IPFS節點例項不是事件發射器。
如果設定為,init傳遞給的選項IPFS.create現在將不執行任何初始化步驟false。以前,如果儲存庫已經存在,它將被初始化。這已不再是這種情況。如果您希望初始化節點,但僅在儲存庫存在的情況下,則傳遞init: { allowNew: false }給建構函式。
例項.ready屬性已刪除。請IPFS.create改用。
IPFS.createNode已被刪除,請IPFS.create改用。
任何API方法均不再支援回撥。請使用諸如callbackifyAPI方法之類的實用程式,該實用程式返回Promises來模擬以前的行為。有關更多資訊,請參見遷移指南。
委派的對等和內容路由模組不再作為核心的一部分包括在內(但如果從命令列啟動js-ipfs守護程式,則仍然可用)。如果您希望使用委託路由並在Node.js或瀏覽器中以程式設計方式建立節點,則必須npm install libp2p-delegated-content-routing和/或在中npm install libp2p-delegated-peer-routing提供它們的配置例項options.libp2p。有關更多說明,請參見模組儲存庫:
add 現在返回非同步可迭代。
add現在接受輸入的mode和mtime選項,以允許為新增的檔案設定模式和mtime後設資料。有關更多資訊,請參見核心介面文件。
add結果現在包含一個cid屬性(一個CID例項),而不是一個字串hash屬性。
add結果現在包括mode和mtime屬性(如果已設定)。
addReadableStream,addPullStream已被刪除。請參閱遷移指南以獲取更多資訊。
addFromStream已被刪除。使用add代替。
addFromFs已被刪除。請使用匯出的globSource實用程式並將結果傳遞給add。有關更多詳細資訊和示例,請參見glob源文件。
addFromURL已被刪除。請使用匯出的urlSource實用程式並將結果傳遞給add。有關更多詳細資訊和示例,請參見URL源文件。
bitswap.stat結果已更改- wantlist值現在是CID例項的陣列,peers現在是string[]對等ID的一個。
bitswap.wantlist現在返回一個CID例項陣列。
block.rm 現在返回非同步可迭代。
block.rm現在產生的物件{ cid: CID, error: Error }。
block.stat結果現在包含一個cid屬性(其值為CID例項)而不是一個key屬性。
dht.findProvs,dht.provide,dht.put和dht.query現在所有的非同步迭代返回。
dht.findPeer,dht.findProvs,dht.provide,dht.put和dht.query現在產量/返回一個物件{ id: string, addrs: Multiaddr[] },而不是一個的PeerInfo例項(或多個)。
added files.chmod已新增。有關資訊,請參見核心介面文件。
files.flush現在返回已重新整理路徑的根CID(/預設情況下)
files.lsPullStream並files.lsReadableStream已被刪除。請參閱遷移指南以獲取更多資訊。
files.ls 現在返回非同步可迭代。
files.ls結果現在包含一個cid屬性(其值為CID例項)而不是一個hash屬性。
files.ls結果現在包括mode和mtime屬性(如果已設定)。有關更多資訊,請參見核心介面文件。
files.ls不再需要long(核心)選項-預設情況下,您將接收所有資料。
files.mkdir現在接受mode和mtime選項以允許設定模式和mtime後設資料。有關更多資訊,請參見核心介面文件。
files.readPullStream並files.readReadableStream已被刪除。請參閱遷移指南以獲取更多資訊。
files.read 現在返回非同步可迭代。
files.stat結果現在包含一個cid屬性(其值為CID例項)而不是一個hash屬性。
files.stat結果現在包括mode和mtime屬性(如果已設定)。有關更多資訊,請參見核心介面文件。
added files.touch已新增。有關資訊,請參見核心介面文件。
files.write現在接受mode和mtime選項以允許設定模式和mtime後設資料。有關更多資訊,請參見核心介面文件。
get現在返回非同步可迭代。content從迭代器產生的物件的屬性值現在是一個非同步可迭代的BufferList物件。
id結果已更改,該addresses屬性現在為Multiaddr[]
name.resolve現在返回非同步可迭代。當發現這些值時,它會產生越來越精確的解析值,直到從法定人數16中選擇出最佳值為止。“最佳”解析值是迭代器生成的最後一項。如果您只對這個最佳價值感興趣,可以it-last像這樣提取它:
const last = require()
await last(ipfs.name.resolve())object.get現在接受一個timeout選項。TimeoutError如果在超時視窗內未收到任何資料,將導致該方法丟擲。可以將其作為a number或a 傳遞string。如果number傳遞了a,則將其解釋為毫秒;如果傳遞了字串,則將其解釋為人類可讀的duration。
ls 現在返回非同步可迭代。
ls結果現在包含一個cid屬性(其值為CID例項)而不是一個hash屬性。
ls結果現在包括mode和mtime屬性(如果已設定)。有關更多資訊,請參見核心介面文件。
pin.add結果現在包含一個cid屬性(一個CID例項),而不是一個字串hash屬性。
pin.add現在接受一個timeout選項。TimeoutError如果在超時視窗內未收到任何資料,將導致該方法丟擲。可以將其作為a number或a 傳遞string。如果number傳遞了a,則將其解釋為毫秒;如果傳遞了字串,則將其解釋為人類可讀的duration。
pin.ls 現在返回非同步可迭代。
pin.ls結果現在包含一個cid屬性(一個CID例項),而不是一個字串hash屬性。
pin.rm結果現在包含一個cid屬性(一個CID例項),而不是一個字串hash屬性。
ping 現在返回非同步可迭代。
refs而refs.local現在非同步迭代返回。
refs現在接受一個timeout選項。TimeoutError如果在超時視窗內未收到任何資料,將導致該方法丟擲。可以將其作為a number或a 傳遞string。如果number傳遞了a,則將其解釋為毫秒;如果傳遞了字串,則將其解釋為人類可讀的duration。
repo.gc 現在返回非同步可迭代。
stats.bw 現在返回非同步可迭代。
swarm.peers現在返回一個物件陣列,其peer屬性為string,而不是PeerId例項。
swarm.addrs現在返回物件陣列,{ id: string, addrs: Multiaddr[] }而不是PeerInfo例項。
HTTP API
/api/v0/add現在支援以下附加多頭,允許mode和mtime後設資料,對單個檔案進行設定:
mode 檔案模式以應用於建立的UnixFS條目 [string]
mtime 在Unix紀元之前或之後的修改時間(以秒為單位),以應用於建立的UnixFS條目 [number]
mtime-nsecs 修改時間分數(以納秒為單位) [number]
/api/v0/add現在返回檔案Mode,Mtime並且MtimeNsecs如果集。
/api/v0/file/ls已被刪除,請/api/v0/ls改用。
added /api/v0/files/chmod已新增,並且支援以下查詢字串args:
arg 要應用模式的檔案的路徑 [string]
mode 檔案模式適用 [string]
/api/v0/files/ls現在返回檔案Mode,Mtime並且MtimeNsecs如果集。
/api/v0/files/mkdir現在支援支援以下附加查詢字串args:
mode 檔案模式適用 [string]
mtime 修改時間(以Unix紀元為準)之前或之後的秒數 [number]
/api/v0/files/stat現在返回檔案Mode,Mtime並且MtimeNsecs如果集。
added /api/v0/files/touch已新增,並且支援以下查詢字串args:
arg 要應用模式的檔案的路徑 [string]
mtime 修改時間(以Unix紀元為準)之前或之後的秒數 [number]
/api/v0/files/write現在支援以下其他多部分標題:
mode 檔案模式以應用於建立的UnixFS條目 [string]
mtime 在Unix紀元之前或之後的修改時間(以秒為單位),以應用於建立的UnixFS條目 [number]
/api/v0/ls現在返回檔案Mode,Mtime並且MtimeNsecs如果集。
命令列介面
jsipfs add [file...]現在支援以下標誌,以尊重和應用mode以及mtime後設資料從檔案系統中新增或明確設定它們的檔案:
--preserve-mode 自動將許可權應用於從檔案系統建立的UnixFS條目 [boolean] [default: false]
--preserve-mtime 自動將修改時間應用於從檔案系統建立的UnixFS條目 [boolean] [default: false]
--mode 檔案模式以應用於建立的UnixFS條目 [string]
--mtime 在Unix紀元之前或之後的修改時間(以秒為單位),以應用於建立的UnixFS條目 [number]
--mtime-nsecs 修改時間分數(以納秒為單位) [number]
jsipfs file ls已被刪除,請jsipfs ls改用。
added jsipfs files chmod [mode] [path]已新增。
jsipfs files ls現在將列印檔案mode和mtime。
jsipfs files mkdir現在支援以下標誌:
--mode 檔案模式以應用於建立的UnixFS條目 [string]
--mtime 在Unix紀元之前或之後的修改時間(以秒為單位),以應用於建立的UnixFS條目 [number]
jsipfs files stat現在將列印檔案mode和mtime。
jsipfs files touch [path]已新增,並支援以下標誌:
--mtime 在Unix紀元之前或之後的修改時間(以秒為單位),以應用於建立的UnixFS條目 [number]
jsipfs files write現在支援以下標誌:
--mode 檔案模式以應用於建立的UnixFS條目 [string]
--mtime 在Unix紀元之前或之後的修改時間(以秒為單位),以應用於建立的UnixFS條目 [number]
jsipfs ls現在將列印檔案mode和mtime。
其他變化
libp2p已升級到0.27,其中還包括對其核心API的重大更改。請參閱發行公告以獲取更多資訊:
多地址中對等ID 的協議名稱已從“ ipfs”更改為“ p2p”。線路上的資料沒有任何更改,但是當將多位地址轉換為字串時可以看到此更改。
參與貢獻
您想為IPFS專案做貢獻,又不知道如何做嗎?好吧,有幾個地方可以開始使用:
檢查 js-ipfs 儲存庫中 help wanted 標籤的問題
加入IPFS All Hands,自我介紹,並讓我們知道您想在哪裡做出貢獻-https://github.com/ipfs/team-mgmt/#weekly-ipfs-all-hands
用 IPFS 破解並向我們展示您的成就!All Hands 呼叫也是演示的理想場所,請加入並向我們展示您的構建內容
透過 https://discuss.ipfs.io/加入討論,並幫助使用者找到答案。
加入🚀 IPFS 核心實施每週同步🛰,並參與其中!
你有問題嗎?
最好的地方要問你關於 IPFS 的問題,它是如何工作的,哪些是你可以用它做的是在 discuss.ipfs.io。我們也可以在#ipfsFreenode 上的頻道上找到。