网站首页 > 知识剖析 正文
大家好,很高兴又见面了,我是"高级前端?进阶?",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力。
什么是 ShareJS
Collaborative editing in any app
ShareJS 是一个小型服务器和客户端库,允许通过 OT 同时编辑任何类型的内容。服务器在 NodeJS 上运行,客户端在 NodeJS 或 Web 浏览器中运行。ShareJS 目前支持对纯文本和任意 JSON 数据进行操作转换。
在浏览器支持方面 ShareJS 也非常给力,目前支持几乎所有主流浏览器,低至 IE5.5(尽管新版本尚未测试 IE 支持)。
目前 ShareJS 在 Github 通过 MIT 协议开源,有超过 5k 的 star、是一个值得关注的前端开源项目。
如何使用 ShareJS
首先需要安装相应依赖:
npm install share
要开始使用 ShareJS 服务器 API,开发者需要做 2 件事:
- 确定要将数据存储在何处,比如:使用 livesdb 内存存储
- 确定客户端和服务器的通信方式,最简单的解决方案是使用 browserchannel。
下面是创建 ShareJS 服务器实例:
var livedb = require('livedb');
var sharejs = require('share');
var backend = livedb.client(livedb.memory());
var share = require('share').server.createClient({backend: backend});
// 方法称为 createClient,因为是数据库的客户端
服务器公开了一个 share.listen(stream) 方法 ,开发者可以使用与客户端通信的 Node.js 流调用该方法。 下面是使用 browserchannel 的示例:
var Duplex = require('stream').Duplex;
var browserChannel = require('browserchannel').server
var share = require('share').server.createClient({backend: ...});
var app = require('express')();
app.use(browserChannel({webserver: webserver}, function(client) {
var stream = new Duplex({objectMode: true});
stream._read = function() {};
stream._write = function(chunk, encoding, callback) {
if (client.state !== 'closed') {
client.send(chunk);
}
callback();
};
client.on('message', function(data) {
stream.push(data);
});
client.on('close', function(reason) {
stream.push(null);
stream.emit('close');
});
stream.on('end', function() {
client.close();
});
// 将流给 sharejs
return share.listen(stream);
}));
客户端需要一个类似 websocket 的会话对象来进行通信。如果需要,也可以使用普通的 websocket:
var ws = new WebSocket('ws://' + window.location.host);
var share = new sharejs.Connection(ws);
如果决定使用 browserchannel,只需告诉 browserchannel 重新连接,其内部会处理好一切:
var socket = new BCSocket(null, {reconnect: true});
var share = new sharejs.Connection(socket);
更多关于 ShareJS 的用法和示例可以参考文末资料,本文不再过多展开。
参考资料
https://github.com/josephg/ShareJS
https://github.com/share/sharedb
https://pubuzhixing.medium.com/exploration-of-collaborative-editing-technology-b2f4c41c31ff
https://ckeditor.com/blog/lessons-learned-from-creating-a-rich-text-editor-with-real-time-collaboration/
- 上一篇: 记一次服务器入侵事件的应急响应
- 下一篇: location.origin 兼容性处理
猜你喜欢
- 2024-11-22 只用一行代码快速收集H5聊天用户体验数据——附赠告警机器人
- 2024-11-22 js实现超级链接从新标签打开?
- 2024-11-22 SpringBoot+WebSocket实现简单的数据推送
- 2024-11-22 防止网页被嵌入框架的代码「转」
- 2024-11-22 如何在浏览器中启动Exe文件?
- 2024-11-22 从零开始开发一个实时博客
- 2024-11-22 简单分析实现运维利器---webssh终端libl
- 2024-11-22 如何开发跨框架的组件
- 2024-11-22 location.origin 兼容性处理
- 2024-11-22 记一次服务器入侵事件的应急响应
- 最近发表
- 标签列表
-
- xml (46)
- css animation (57)
- array_slice (60)
- htmlspecialchars (54)
- position: absolute (54)
- datediff函数 (47)
- array_pop (49)
- jsmap (52)
- toggleclass (43)
- console.time (63)
- .sql (41)
- ahref (40)
- js json.parse (59)
- html复选框 (60)
- css 透明 (44)
- css 颜色 (47)
- php replace (41)
- css nth-child (48)
- min-height (40)
- xml schema (44)
- css 最后一个元素 (46)
- location.origin (44)
- table border (49)
- html tr (40)
- video controls (49)