上個月看到 Automerge 出了 2.0 版的消息:「Automerge 2.0」,Automerge 這個套件可以幫你處理複雜的 CRDT 結構 (Conflict-free replicated data type)。
可以看到 Automerge 在 2.0 之後的效能改善不少,可以跟 yjs 比較了:
所以練了一下手測界面怎麼用,另外也看一下 conflict 時的處理方式。
這邊先產生 hello, world.
,然後做了三個操作,第一個是把開頭的 h
改成 H
;第二個是把 world
改成 test
;第三個是把 world
改成 example
:
(() => { const Automerge = require('@automerge/automerge'); let doc1 = Automerge.init(); doc1 = Automerge.change(doc1, 'Init', doc => { doc.text = new Automerge.Text(); doc.text.insertAt(0, 'h', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '.'); }); let doc2 = Automerge.clone(doc1); let doc3 = Automerge.clone(doc1); doc1 = Automerge.change(doc1, 'Capitalize', doc => { doc.text.deleteAt(0); doc.text.insertAt(0, 'H'); }); doc2 = Automerge.change(doc2, 'world => test', doc => { delete doc.text.deleteAt(7, 5); doc.text.insertAt(7, 'test'); }); doc3 = Automerge.change(doc3, 'world => example', doc => { delete doc.text.deleteAt(7, 5); doc.text.insertAt(7, 'example'); }); let finalDoc = Automerge.merge(doc1, doc2); finalDoc = Automerge.merge(finalDoc, doc3); console.log(finalDoc); })();
這樣最後會產生出 Hello, testexample.
:
{ text: Text { elems: [ 'H', 'e', 'l', 'l', 'o', ',', ' ', 't', 'e', 's', 't', 'e', 'x', 'a', 'm', 'p', 'l', 'e', '.' ] } }
這結果看起來還行。
只能說以前要是有這些 library 就好了,當初在 KKBOX 做雲端歌單自己搞半天...