diff --git a/docs/web/CAP.png b/docs/web/CAP.png new file mode 100644 index 0000000..ca4f471 Binary files /dev/null and b/docs/web/CAP.png differ diff --git a/docs/web/协同编程探索.mm.md b/docs/web/协同编程探索.mm.md new file mode 100644 index 0000000..c6eb966 --- /dev/null +++ b/docs/web/协同编程探索.mm.md @@ -0,0 +1,138 @@ +--- +sidebar_position: 6 +--- + +# 面向前端的协同编程探索 + +低代码,无代码等概念已经不再新鲜。同时协同编程也会被经常提到。 + +虽然协同编程只是一个组合词 `协同` + `编程`,但是要做的事情远没有这么简单。 + +> 协同编程 +> +> - 编辑 —— 协同编辑 +> - 构建 —— 预置的构建方案 +> - 运行 —— 在目标环境运行 + +## 编辑 + +编辑在传统的编辑器的基础上要求更高,需要协同编辑。 + +- 离线编辑 + +### 编辑器 + +- prosemirror +- codemirror +- monaco-editor + +### 协同算法 + +- OT + - @codemirror/collab +- CRDT + - yjs + - automerge + +相关文章 + +偏向数学理论 + +https://www.zxch3n.com/crdt-intro/design-crdt/ + +偏向实现细节 + +https://zhuanlan.zhihu.com/p/265074361 + +### 多窗口库 + +- https://github.com/caplin/FlexLayout +- https://github.com/ticlo/rc-dock +- https://github.com/golden-layout/golden-layout +- https://github.com/nomcopter/react-mosaic +- https://github.com/idealjs/layout-manager + +## 构建 + +### 构建工具 + +- esbuild +- swc +- webpack https://github.com/webpack/playground 已过时 + +### 文件系统 + +- 虚拟文件系统 + - memfs + - memory + - filer + - indexdb + - memory + - unionfs +- 文件系统 + - FileSystem + - unionfs + +## 运行 + +- dynamic import + +- IIFE (Immediately Invoked Function Expression) + - iframe + +使用了 `构建` + `运行` 的平台 + +- codesandbox +- codepen +- stackblitz + + +## 既要也要的矛盾 + +- 离线优先 与 CAP + +传统分布式软件中分区容错性被看的很重要。离线优先也可以被视作分区容错的子集。 + +但是离线优先的设计带来了无法在协同编程中解决的问题。 + +### 场景 + +A B C 三人,P2P 协同编程。 + +存在一段错误的代码 + +```js +let = "A" + +username = "C" +``` + +当三人同时开始修复此问题时,A出现离线情况。 + +B C 二人协同修复得到的结果 + +```js +let username = "A" + +username = "C" +``` + +A 离线修复结果 + +```js +let username = "A" + +username = "C" +``` + +看上去 A 与 B C 是一致的。但是在 CRDT 与 OT 算法中,并不是。最终 A 恢复连接,得到的结果是 + +```js +let usernameusername = "A" + +username = "C" +``` + +对于协同编程来说,协同的好处是规避冲突。但是这种场景下,冲突被放大。 + +而这种情况在 git 的方案内,不会发生冲突。 \ No newline at end of file