小喵的在线共享编辑器

小喵的唠叨话:写这篇博客的初衷是因为看到了室友电脑面试的时候,面试官要求在线写代码。然后就想到,如果两个人能够在同一个页面进行编辑工作,不就能更方便的调试代码了吗?(PS.懂linux的screen或tmux的可以绕道了。)代码十分简单,在一个月前就写完了,只是一直没有时间写博客说明一下。

原博客地址:http://www.miaoerduo.com/nodejs/小喵的在线共享编辑器.html

心急的同学可以在 http://editor.miaoerduo.com/?doc=demo 先预览一下效果。打开页面两次,进行编辑工作时会发现两边的页面做出了同样的修改。

github:https://github.com/miaoerduo/shared-editor 欢迎forkstar

那么,实现一个这样的在线的共享编辑器需要哪些工作呢?我们下面一点一点的说明。

一、写在前面

熟悉Linux的同学都知道screen和tmux这两个工具。通常我们可以使用他们来执行一些长时间的任务,也可以使用他们的共享终端的功能。在结对编程中,这是很有效的一个工具。

本文要实现的,是和上述两个工具类似的共享编辑器。要说优点的话,可能就是更亲民一些,打开网页就能使用。很适合远程帮女票看个代码啥的(好像很多公司里面会截断websocket,这样就没法用了)。

实现一个这样的编辑器,主要有两个部分。编辑器和同步数据的服务端。下面我们依次介绍。

二、在线编辑器

首先,我们需要一个好看的编辑器。调研了一下,找到了ACE这个编辑器,网址是 https://ace.c9.io ,简单的了解了一下这个编辑器,发现居然连Github用的都是这个编辑器!看来我们选择这个编辑器是没错的啦。

使用起来也异常的简单,官方的Demo如下:

<!DOCTYPE html>
<html lang="en">
<head>
<title>ACE in Action</title>
<style type="text/css" media="screen">
#editor {
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
}
</style>
</head>
<body>

<div id="editor">function foo(items) {
    var x = "All this is syntax highlighted";
    return x;
}</div>

<script src="/ace-builds/src-noconflict/ace.js" type="text/javascript" charset="utf-8"></script>
<script>
    var editor = ace.edit("editor");
    editor.setTheme("ace/theme/monokai");
    editor.getSession().setMode("ace/mode/javascript");
</script>
</body>
</html>

上面的script中的src可能需要换成可以访问的链接。之后就能预览到编辑器的效果。大致和前面小喵的效果类似。

具体的其他的用法可以在官网中查到,这里小喵就不着重介绍了。

三、消息同步机制

选择好合适的编辑器之后,我们需要做的就是消息通信的功能了。

这里主要有四种情况:

1. 文档同步。当用户修改文档的时候,其修改的部分必须同步到所有的阅读改文档的用户。这里只同步修改的部分,因为每次都同步整个文档,那么会很消耗带宽(总不能输入一个 "hello world"都同步十几次文档吧)。

下图是一个示例(强势安利一下:https://www.processon.com 这个画图的工具)。用户1编辑了文档,文档更新的内容发送给了服务器,服务器将更新的内容组播到所有打开相同文档的用户(注意,这里不是广播,广播是向所有的用户发送),同时更新自己的远程备份。

图1 文档更新

2. 文档副本。当用户第一次访问已经存在的文档的时候。这个时候,该用户需要加载页面的所有的内容。因此我们的服务器端需要存放完整的文档的副本。

如下图,用户3打开了这个文档,这时候会请求服务器发送完整的文档信息。

图2 新增用户

3. 文档销毁。小喵这里的文档的内容是直接在内存中保存的。这样的好处是很方便,不需要额外的控制数据库啥的。但是弊端也很明显,虽然每个文档可能比较小,但如果文档创建的比较多,就会一直消耗内存。所以当没有用户使用文档的时候,需要删除文档,这样服务器端就需要保存一个引用计数。计数为0,就删除文档。

4. 冲突解决。考虑到网络可能会出现故障,用户在编辑文档之后,其他的用户可能并没有即使同步,这样就出现文档落后的情况。一个简单的策略就是,每次文档修改之后都返回一个时间戳,下一次修改文档的时候要将这个时间戳作为参数发送到服务器,如果时间戳不是最新的,那么就刷新整个文档。当然这个策略也有很多的不足之处,如果大家能有什么改进,烦请告诉小喵一下~

上面就是设计部分,具体实现的话,需要用到WebSocket技术,这是浏览器和服务器实时通信的一个很好的工具。WebSocket有很多语言的实现,小喵这里选择的是比较容易上手的socket.io

socket.io 不仅支持用户和服务器的点对点通信,还支持组播、广播的操作。简单的学习一下,就可以完成上面的设计。

这里,小喵也不在代码层面上解释实现了。感兴趣的同学可以看看小喵的github: https://github.com/miaoerduo/shared-editor 能够给小喵提交一些PR的话就更好了。

四、写在后面

终于写完这篇博客了,拖了快两个月了。之前迟迟没有动手的一个原因是比较忙,更多的可能因为自己有点懒,一直不想画解释原理的示意图。现在终于写完了,还是挺开心的。

这次的博客相比之前的,更多的是介绍设计的思路。反正代码都在github上了,大家可以随意食用~

希望能和大家一起进步!

转载请注明出处,谢谢~

时间: 2024-10-25 18:57:15

小喵的在线共享编辑器的相关文章

在线文本编辑器cheditor应用实例

CKEditor 即 FCKEDITOR . FCKeditor是目前最优秀的可见即可得网页编辑器之一,它采用JavaScript编写.具备功能强大.配置容易.跨浏览器.支持多种编程语言.开源等特点.它非常流行,互联网上很容易找到相关技术文档,国内许多WEB项目和大型网站均采用了FCKeditor. FCKeditor是一个专门使用在网页上属于开放源代码的所见即所得文字编辑器.它志于轻量化,不需要太复杂的安装步骤即可使用.它可和PHP.JavaScript.ASP.ASP.NET.ColdFus

好用的在线Markdown编辑器

Markdown 是一个 Web 上使用的文本到HTML的转换工具,可以通过简单.易读易写的文本格式生成结构化的HTML文档. Markdown具有很多优点: 1.写作中添加简单符号即完成排版,所见即所得.让你专注于文字而不是排版. 2.格式转换方便,Markdown 的文本你可以轻松转换为html.pdf等. 3.可以保存称纯文本 支持Markdown的编辑器太多,功能也不完全一致,有的是用来进行基本的写作,有的是用来写代码的,有的甚至只是博客平台配套的编辑器. 本文介绍一款由码工具网开发的在

在线代码编辑器CodeMirror简介

1.什么是Code Mirror 最近做一个项目需要在网页上实现一个代码编辑器,支持语法高亮.自动缩进.智能提示等功能.发现Code Mirror刚好满足所有需求.Code Mirror是由js写的一款插件,其功能非常强大,用来实现网页端代码编辑器非常方便.如果想看效果图,可移步到这里----CodeOnline,这是我做的一个小项目,其中代码编辑器的就是用Code Mirror实现的. 2.使用Code Mirror 下面我将演示如何使用Code Mirror搭建一个简易的代码编辑器,并对其常

微信小程序商城制作-共享链开发

微信小程序已经正式发布了一段时间,在互联网知名企业的带领下,众多中小企业也都在迅速涌入这个潜藏巨大商机的市场.其中有京东.去哪儿等热门小程序,大家也已经看了不少了.共享链平台开发:151-1222-4001(微/电)于此同时兄弟连就研发了三款小程序上线,并从中提取要点组织一套可以做微信小程序培训开发全栈班的课程体系,并由教学总监亲自授课.为了能让更多人有机会学习这个课程,针对有一定基础的开发工程师开设了线上课程,现在有几千人同时观看这个直播课,好评如潮.下边呢,我们不妨从一些已经上线并且非常实用

通达OA 小飞鱼工作流在线培训教程文件夹及意见征集

最近通达OA技术交流群有不少朋友反映说表单设计这块 改动样式的问题,这块须要html和css的改动.本来最近正好要在工作流这块准备做一个系列的课程,都是基础的设置主要是给刚接触工作流的朋友用的,大家有什么好的意见和建议请直接回复. 通达OA技术交流群:378591362 课程文件夹: 通达OA 小飞鱼工作流在线培训教程(一)HTML基础介绍 通达OA 小飞鱼工作流在线培训教程(二)HTML表格基础 通达OA 小飞鱼工作流在线培训教程(三)HTML字体与段落 通达OA 小飞鱼工作流在线培训教程(四

小喵iOS开发成长记:数据抓包

(萌神 哈比 镇楼) 上午和小组成员讨论后,决定选择做一款FM项目. 稍微分析后就开始着手抓包啦. 小喵使用的是Paros进行抓包的.需要工具:Paros软件,Java环境,手机(iPhone/Android),mac. Paros工具下载:Paros DownLoad 博文内容速览: 一. Java环境配置 二.打开Paros 三.设置parso的proxy 四.设置手机的proxy 五.抓取接口 一.Java环境配置 1.下载文件后,解压.打开 “JavaForOSX2014-001.dmg

小喵iOS开发成长记:项目开发规划索引

小喵近期在做一个小组项目.尽管还是小白,但小喵还是被赋予了组长这个“光荣”的职位. 酱紫开始了我的第一次带项目生涯--- 下面是此次项目的开发流程规划.当作一个目录用.在每个分支下遇到的问题或者研究了新的东西,都会设置索引点进去.所以大家可以收藏下篇博文哦--喵呜- 项目开发记录表 第一天 上午 (7月13日) 定项目,项目分工                                                                 第一天 下午 抓接口 (paros软件的

小喵成长术:如何视频学iOS(正确地姿势)

(小暹镇楼-其实我是猫(睡的和狗一般)) 小喵最近在做第二个项目,好忙的赶脚.突然发现自己想要学习的视频还有很多没看(MJ的视频)呢.挺悲催的.可是一想到一个视频N长,几个视频就是一天.我去,这一百多G的视频是不是要看死我去.小喵很想赶紧做完项目然后找工作的.而且小喵还在翻译一本iOS的书,哪有时间耗在这些视频上.難しいね. 一.为什么要? 不过小喵一直都是一个爱偷懒的好学生(偷懒的学生还是好学生?没天理了),小喵转念一想,我为啥要看这些视频呢? 1. 吸取视频里面的知识: 2. 作为日常学习的

java_tomcat_Server at localhost was unable to start within 45 seconds 小喵咪死活启动报错-二

错误:Server Tomcat v6.0 Server at localhost was unable to start within 45 seconds 错误提示就是我们限定了部署的时间导致的错误. 修改 workspace\.metadata\.plugins\org.eclipse.wst.server.core\servers.xml文件. 把其中的start-timeout="45" 改为  start-timeout="120" 或者更长,根据不同同