精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Yjs + Quill:快速實現支持協同編輯的富文本編輯器

開源
Y.js 是一個支持 協同編輯的開源庫。只要我們將自己的數據轉換為 Y.js 提供的 Y.Array、Y.Map 類型,Y.js 就會自動幫我們做數據的一致性處理和同步。

大家好,我是前端西瓜哥,這次來看看 Yjs 如何幫助我們實現協同編輯能力的。

Y.js 是一個支持 協同編輯 的開源庫。只要我們將自己的數據轉換為 Y.js 提供的 Y.ArrayY.Map 類型,Y.js 就會自動幫我們做數據的一致性處理和同步。

一致性問題

協同編輯一個很棘手的問題是:多個用戶同時編輯產生的沖突要怎么處理,如何保證一致性?

比如兩個用戶同時往一個文本的末尾加上不同的字符,最終誰的字符在前,誰的字符在后?

圖片

目前業界有兩種方案,一個是 OT (Operational transformation)算法,是比較主流的一種解法。流行的開源解決方案是 ShareDB。

它的核心在于 Transform(轉換):服務端接收兩個客戶端的對同一版本數據的原子操作行為,轉換出它們各自要做的不同操作,然后傳遞給各個客戶端并應用,最終讓它們的內容是一致的。

圖片

另一種是 CRDT(Conflict-free Replicated Data Type),中文就是 “無沖突復制數據類型”,主要被應用在分布式系統中,即可以不需要中心化服務器。流行的開源方案是 Yjs。

但 CRDT 需要傳輸更多的數據,有不小的內存和性能開銷,且相比 OT 被提出地更晚,學術研究相對較少,所以一開始算不上是主流。

然而隨著 Yjs 的出現并做了不少性能優化,CRDT 方案也逐漸流行了起來,越來越多新的協同工具選擇使用 Yjs 來作為數據一致性的解決方案。

Yjs 是基于操作的 CRDT,其原理簡單來說,就是記錄所有用戶的操作,這些操作會拼接到一個雙向鏈表中,并通過通用的算法保證確定的順序,最后所有客戶端都能得到相同的一條鏈表,最后得到的數據自然也是一致的。

Yjs + Quill:打造協同工具

我們來寫個 demo 感受一下 Yjs 的強大之處。

先用 vite 搭個普通的不帶框架的腳手架,這里我用的 pnpm,其他包管理工具也行。

pnpm create vite

項目名為 yjs-quill-demo,選擇 Vanilla(不用框架的意思),然后選擇 JavaScript(如果你熟悉 TS,也可以選 TS)

接著是進入文件夾,安裝依賴,并運行。

cd yjs-quill-demo
pnpm install
pnpm run dev

打開瀏覽器輸入控制臺輸出的鏈接,可以看到:

圖片

下面我們來安裝依賴。

首先是開源編輯器 quill 和它的插件 quill-cursors。這個插件可以展示一些其他用戶的光標的狀態。

pnpm add quill quill-cursors

將 mian.js 文件原來的內容刪除,加上下面內容:

import Quill from 'quill';
import QuillCursors from 'quill-cursors';
import 'quill/dist/quill.snow.css'; // 使用了 snow 主題色

// 使用 cursors 插件
Quill.register('modules/cursors', QuillCursors);

const quill = new Quill(document.querySelector('#app'), {
  modules: {
    cursors: true,
    toolbar: [
      [{ header: [1, 2, false] }],
      ['bold', 'italic', 'underline'],
      ['image', 'code-block'],
    ],
    history: {
      userOnly: true, // 用戶自己實現歷史記錄
    },
  },
  placeholder: '前端西瓜哥...',
  theme: 'snow',
});

效果:

圖片

下面我們就要引入 Yjs,給 quill 加上協同編輯功能。

Yjs 官方提供了 y-quill 庫,通過它可以將 quill 數據模型和 Yjs 數據模型進行綁定。

pnpm add yjs y-quill

追加 Yjs 相關邏輯:

import * as Y from 'yjs';
import { QuillBinding } from 'y-quill';
// ...

const ydoc = new Y.Doc(); // y 文檔對象,保存需要共享的數據
const ytext = ydoc.getText('quill'); // 創建名為 quill 的 Text 對象
const binding = new QuillBinding(ytext, quill); // 數據模型綁定

ok,接下來就是要接上服務端,實現數據傳輸了。服務的提供者,Yjs 稱為 provider,大概可以翻譯為 “供應者” 的意思。

Yjs 官方提供了幾種 Provider:WebRTC、WebSocket、Dat。

這里我們用比較常見的 WebSocket。

pnpm add y-websocket

代碼:

import { WebsocketProvider } from 'y-websocket';
// ...

// 連接到 websocket 服務端
const provider = new WebsocketProvider('wss://demos.yjs.dev', 'quill-demo-room', ydoc);
// 數據模型綁定,再額外綁上了光標對象
const binding = new QuillBinding(ytext, quill, provider.awareness);

這里的服務器用的是  Yjs 提供的 demo 體驗用的服務器,因為一些喜聞樂見的原因,可能會連不上這個服務器。

然后你會發現,如果在同一瀏覽器打開兩個 tab,沒連上服務也能做協同編輯。這是因為 Yjs 會優先通過瀏覽器的同 host 共享狀態的方式進行通信,然后才是網絡通信。所以最好是打開兩個不同的瀏覽器做調試。

我們驗證一下。

圖片

左邊兩個 tab 頁來自同一個瀏覽器,右邊則是另一個瀏覽器。

當修改被我限速為 1 KB/s 的 tab 的編輯器內容時,來自同一瀏覽器的另一個 tab 頁立刻發生了變更(證明通信走的是本地),而另一個瀏覽器的 tab 則慢得多(說明走的網絡通訊)。

我們也可以自己在本地起一個服務器,做法是:

HOST=localhost PORT=1234 npx y-websocket

對應著要改一下客戶端代碼中 ws 服務的地址:

const provider = new WebsocketProvider('ws://localhost:1234', 'quill-demo-room', ydoc);

完整代碼

import Quill from 'quill';
import QuillCursors from 'quill-cursors';
import 'quill/dist/quill.snow.css'; // 使用了 snow 主題色
import * as Y from 'yjs';
import { QuillBinding } from 'y-quill';
import { WebsocketProvider } from 'y-websocket';

// 使用 cursors 插件
Quill.register('modules/cursors', QuillCursors);

const quill = new Quill(document.querySelector('#app'), {
  modules: {
    cursors: true,
    toolbar: [
      [{ header: [1, 2, false] }],
      ['bold', 'italic', 'underline'],
      ['image', 'code-block'],
    ],
    history: {
      userOnly: true, // 用戶自己實現歷史記錄
    },
  },
  placeholder: '前端西瓜哥...',
  theme: 'snow',
});

const ydoc = new Y.Doc(); // y 文檔對象,保存需要共享的數據
const ytext = ydoc.getText('quill'); // 創建名為 quill 的 Text 對象
// 連接到 websocket 服務端
const provider = new WebsocketProvider('wss://demos.yjs.dev', 'quill-demo-room', ydoc); 
// 數據模型綁定,再綁上光標對象
const binding = new QuillBinding(ytext, quill, provider.awareness);

結尾

因為用了很多 Yjs 提供的模塊化的包,其實我們并沒有接觸到太多的實現細節,尤其是將數據綁定到 Yjs 提供的類型數據的實現。只能說是簡單體驗了 Yjs 配合 quill 實現協同編輯的效果。

責任編輯:姜華 來源: 前端西瓜哥
相關推薦

2022-02-15 09:00:18

Vue編輯器字符串

2023-04-17 11:03:52

富文本編輯器MTE

2017-07-27 20:21:06

iOSUITableView富文本編輯器

2013-11-18 10:08:56

工具免費編程工具

2016-09-23 20:30:54

Javascriptuiwebview富文本編輯器

2012-08-10 10:47:45

JavaScript

2022-03-11 08:00:49

編輯器框架Draft.js

2010-03-24 09:20:07

CentOS vi編輯

2018-01-05 14:48:03

前端JavaScript富文本編輯器

2020-12-23 22:25:11

Vi文本編輯器Unix

2022-04-13 07:38:50

富文本編輯器設置表格列寬

2025-05-28 02:02:00

2021-01-07 11:00:59

Sed文本編輯器Linux

2022-05-13 15:32:11

GNOME文本編輯器

2020-04-09 19:07:12

Vuetiptap前端

2009-12-09 10:27:03

VS 2005文本編輯

2022-01-18 09:35:36

GNOME編輯器Linux

2012-09-29 11:38:27

編程工具文本編輯器編程

2011-05-11 10:27:42

文本編輯器

2015-06-26 11:11:50

GitHub Ato文本編輯器
點贊
收藏

51CTO技術棧公眾號

欧美在线观看日本一区| 午夜精彩视频在线观看不卡| 国产精品网站入口| 香蕉久久久久久久| 91九色成人| 亚洲国产欧美在线人成| 久草一区二区| 中文字幕丰满人伦在线| 午夜久久免费观看| 精品乱人伦小说| 欧美三级午夜理伦三级| 992tv免费直播在线观看| 国内久久精品视频| 97视频在线看| 99国产精品免费| 大桥未久女教师av一区二区| 日韩欧美精品免费在线| 亚洲午夜精品久久| 人妻一区二区三区四区| 日本不卡视频在线| 久久久久久久电影一区| 欧美日韩高清丝袜| 欧美成年网站| 在线亚洲一区二区| 男人日女人的bb| 国产精品视频二区三区| 国内成人精品2018免费看| 68精品国产免费久久久久久婷婷| 国产黄色录像视频| 欧美网色网址| 欧美一级日韩免费不卡| 男人操女人逼免费视频| av中文天堂在线| 成人av网站在线观看免费| 午夜精品www| 夫妻性生活毛片| 蜜臀av免费一区二区三区| 欧美一区二区精品久久911| 久久国产午夜精品理论片最新版本| 国产一级片在线| 成人福利电影精品一区二区在线观看| 国产精品入口免费视| 日韩欧美中文字幕一区二区| 久久久久亚洲| 中文字幕视频在线免费欧美日韩综合在线看 | 无码人妻精品一区二区50| 91精品啪在线观看国产18| 欧美成人欧美edvon| 九色porny自拍| 欧美日韩亚洲国产| 天天免费综合色| 欧美大黑帍在线播放| 精品视频在线一区二区| 日本一区免费视频| 久久久99国产精品免费| 亚洲精品成av人片天堂无码| 精品一区二区三区免费| 国产精品久久久久久久av电影| 日韩字幕在线观看| 亚洲国产导航| 欧美极品欧美精品欧美视频| 亚洲波多野结衣| 色爱综合网欧美| 中文字幕综合在线| 久久久久久国产免费a片| 偷拍一区二区| 国产婷婷成人久久av免费高清| 老司机午夜免费福利| 国产精品美女午夜爽爽| 一本到不卡精品视频在线观看| 草草久久久无码国产专区| 9999热视频在线观看| 亚洲国产三级在线| 亚洲精品蜜桃久久久久久| 日韩免费影院| 亚洲成av人片一区二区三区 | 99青草视频在线播放视| 国产精品乱码一区二区三区软件 | 俺要去色综合狠狠| 一本一本久久a久久精品综合小说 一本一本久久a久久精品牛牛影视 | 国产丰满果冻videossex| 国产麻豆91精品| 91麻豆蜜桃| 黄色av小说在线观看| av电影在线观看完整版一区二区| 精品久久蜜桃| 久草在现在线| 国产日韩综合av| 一区二区三区四区不卡| www.在线视频| 亚洲二区在线视频| 国产精品宾馆在线精品酒店| 桃花岛成人影院| 欧美日韩一区二区三区免费看| 亚洲欧美日韩一级| 精品国产亚洲一区二区在线观看 | 国产伦精品一区二区三区视频网站| 午夜在线观看免费一区| 日韩av日韩在线观看| 人人草在线观看| 极品少妇xxxx偷拍精品少妇| www 成人av com| 天堂av在线资源| 日韩精品中文字幕视频在线| 水蜜桃在线免费观看| 中文av资源在线| 性做久久久久久免费观看| 爱福利视频一区二区| 欧美日韩国产综合视频在线观看中文| 三区精品视频观看| 欧美激情视频在线播放| 国产精品久久久久9999吃药| 青青草97国产精品麻豆| 日韩欧美亚洲国产精品字幕久久久| 亚洲精品一二三四| 老司机凹凸av亚洲导航| 亚洲一区二区精品| 91在线视频免费播放| 国产精品最新| 久久久成人精品| 欧美成人三级在线观看| 国语精品一区| 国产精品久久久久久久久久| av免费观看网址| 91首页免费视频| 在线播放 亚洲| 亚洲一区站长工具| 欧美精品aⅴ在线视频| 丝袜熟女一区二区三区| 欧美成人激情| 欧美一级大片在线免费观看| 亚洲图片小说视频| 91玉足脚交白嫩脚丫在线播放| 一卡二卡3卡四卡高清精品视频| caoporn视频在线| 欧美精品自拍偷拍| 亚洲 小说 欧美 激情 另类| 午夜久久美女| 91精品美女在线| 韩国中文免费在线视频| 亚洲国产欧美在线人成| 冲田杏梨av在线| 男人的天堂久久| 欧美成人免费小视频| 亚洲天堂aaa| 久久久影院官网| 日日噜噜夜夜狠狠久久丁香五月| 超碰caoporn久久| 狠狠躁夜夜躁久久躁别揉| 性xxxxxxxxx| 国产精品97| 国产精品在线看| 精品无人乱码| 色综合天天综合在线视频| 国产精品熟妇一区二区三区四区| 91精品国产麻豆国产在线观看| 国产成人综合亚洲| 免费黄网站在线观看| 欧美日韩国产中字| 国产中文字幕一区二区| 精品成人在线| 亚洲综合成人婷婷小说| 免费黄色在线观看| 欧美日韩成人综合天天影院| 夫妇交换中文字幕| 日本午夜一区二区| 日韩av电影免费在线观看| 色一区二区三区| 亚洲国产精品推荐| 奇米影视第四色777| 99久久精品国产观看| 久久视频这里有精品| 国产精品nxnn| 欧美激情免费视频| 欧美熟妇另类久久久久久不卡| 亚洲一区二区欧美日韩| 国产婷婷在线观看| 一本色道久久综合亚洲精品不卡 | 欧洲xxxxx| 蜜桃精品视频| 69视频在线播放| 国产三级在线| 欧美日韩国产大片| 欧美日韩在线国产| 成人综合在线视频| 久久国产精品视频在线观看| 国精一区二区| 亚洲www永久成人夜色| 精品精品导航| 日韩精品在线私人| 六月丁香婷婷综合| 国产精品视频一二| 在线一区二区不卡| 韩日在线一区| 欧美亚洲另类在线一区二区三区| 91国拍精品国产粉嫩亚洲一区 | 国产污视频在线| 欧美日韩国产成人在线免费| 国产一级片免费| 国产午夜亚洲精品羞羞网站| 波多野结衣免费观看| 日韩午夜高潮| 中文字幕乱码一区二区三区| 91久久精品无嫩草影院| 日本电影亚洲天堂| 成人无遮挡免费网站视频在线观看| 亚洲电影免费观看高清完整版在线| 一级成人黄色片| 日韩美女视频19| 给我看免费高清在线观看| 男人的j进女人的j一区| 黄色成人在线免费观看| 欧美**字幕| 91青青草免费观看| 欧美成人黑人| 久久99久久99精品免观看粉嫩| 欧美日本韩国一区二区| 欧美一级视频精品观看| 欧美一区二区三区四| 亚洲色图欧美激情| 中文字幕高清视频| 国产xxx精品视频大全| 日韩爱爱小视频| 亚洲巨乳在线| 欧美精品久久96人妻无码| 亚洲精品亚洲人成在线| 91av一区二区三区| 日韩成人亚洲| 97超级碰碰人国产在线观看| 成人免费黄色网页| 日韩成人在线电影网| 国产麻豆91视频| 欧洲日韩一区二区三区| 日韩人妻无码一区二区三区99| 最好看的中文字幕久久| 在线不卡av电影| www.成人网.com| 无需播放器的av| 一区二区高清| 91精品国产91久久久久麻豆 主演| 日韩精品第一区| 欧美日韩大片一区二区三区| baoyu135国产精品免费| 成人午夜黄色影院| 国产一区一一区高清不卡| 欧美亚洲国产视频| brazzers在线观看| 欧美成人亚洲成人| 国产精品久久久久久久龚玥菲| 日韩精品免费在线视频观看| 四虎在线视频免费观看| 精品不卡在线视频| 中文字幕一区二区三区波野结| 色欧美日韩亚洲| 日本熟女毛茸茸| 日韩欧美国产高清91| 欧美激情亚洲综合| 精品国产成人av| 欧美videossex极品| 欧美日韩国产专区| 亚洲另类在线观看| 日韩欧美福利视频| 无码日韩精品一区二区| 偷拍一区二区三区| 日本三级视频在线| 香蕉影视欧美成人| 国产一区二区三区影院| 精品成人av一区| 中文字幕亚洲高清| 色婷婷亚洲精品| 懂色av中文字幕| 欧美日韩一区二区在线观看| 国产一区二区三区三州| 欧美日韩在线观看一区二区| 91丨porny丨在线中文| 在线成人av网站| 99在线观看免费| 精品欧美久久久| 性xxxx视频播放免费| 亚洲少妇中文在线| 国产福利电影在线| 一本一本久久a久久精品牛牛影视| 黄色片视频在线观看| 一本色道久久综合狠狠躁篇怎么玩| 99riav在线| 欧美成人午夜免费视在线看片 | 偷拍精品福利视频导航| 日本一区二区三区www| 成人影视亚洲图片在线| 五月天av影院| 亚洲精品社区| 韩国日本美国免费毛片| 国产综合色在线视频区| 一级全黄裸体片| 久久综合色播五月| 欧日韩不卡视频| 亚洲美女屁股眼交3| 久久久久久天堂| 色综合久久久久久久| 国产孕妇孕交大片孕| 亚洲精品美女在线| 在线观看免费版| 国内精品400部情侣激情| 高清电影一区| 亚洲资源在线看| 一区二区三区韩国免费中文网站| 亚洲欧美国产不卡| 在线国产精品一区| 国产色视频在线播放| 成人国产精品免费| 久久精品三级视频| 亚洲高清在线精品| 中文字幕乱码无码人妻系列蜜桃| 日韩欧美在线1卡| 成人高清在线| 91国在线精品国内播放| 粉嫩一区二区三区在线观看| 国产在线欧美日韩| 国产精品久久久久9999赢消| 国产网站免费在线观看| 国内成人自拍视频| 五月天综合视频| 亚洲综合一区二区精品导航| 国产成人在线观看网站| 欧美亚洲国产一区二区三区va | 亚洲精品不卡在线| 国产美女福利在线| 国产成人精品视频| 91亚洲精品在看在线观看高清| 久久综合精品一区| 欧美国产日本| 亚洲一区二区福利视频| 91美女蜜桃在线| 日本一级淫片色费放| 制服丝袜成人动漫| 可以在线观看的av| 97人人模人人爽人人喊中文字| 日本超碰一区二区| 中文字幕乱码一区二区三区| 久久亚洲欧美| 自拍视频一区二区| 亚洲国产一区二区三区| 91精品国自产| 大量国产精品视频| 精品视频一区二区三区| 久久久久久久久影视| 国产精品一二三四| 久草视频在线免费看| 日韩欧美不卡一区| 好吊日av在线| 好吊色欧美一区二区三区| 一道本一区二区| 在线观看福利片| 欧美在线免费视屏| 日本不卡在线| 91精品黄色| 亚洲国产导航| 亚洲AV无码片久久精品| 欧美中文字幕一区二区三区| 蜜桃视频在线观看www社区| 成人在线中文字幕| 欧美日韩一区二区高清| 中文字幕乱视频| 91九色02白丝porn| 在线观看精品一区二区三区| 91欧美激情另类亚洲| 韩日在线一区| 成人性生交大免费看| 欧美日韩激情一区二区三区| www免费视频观看在线| 精品国产免费人成电影在线观... 精品国产免费久久久久久尖叫 | 精品国产一区二| 欧美国产日韩激情| 久久噜噜亚洲综合| 国产精品无码天天爽视频| 欧美激情a在线| 国产不卡av一区二区| 黄色免费网址大全| 一区二区三区免费在线观看| 五月天婷婷视频| 成人国产在线视频| 亚洲二区视频| 黑人と日本人の交わりビデオ| 日韩美女一区二区三区四区| 蜜臀国产一区| 日本道在线视频| 久久久精品日韩欧美| 国产三级漂亮女教师| 91wwwcom在线观看| 97视频精品| www.免费av| 91精品国产色综合久久不卡电影 | 粉嫩高清一区二区三区精品视频 | 91情侣在线视频| 日韩精品一卡二卡三卡四卡无卡| 麻豆明星ai换脸视频| 亚洲人成电影网站色www| 欧美欧美在线| 亚洲五月天综合| 精品动漫一区二区|