开发一个在线代码对比工具

标签: 开发 在线 代码 | 发表时间:2022-07-23 09:32 | 作者:狂奔滴小马
出处:https://juejin.cn/frontend

highlight: monokai

我正在参加「创意开发 投稿大赛」详情请看: 掘金创意开发大赛来了!

前言

在开发过程中,我们经常需要用到代码对比,对比下代码是否一致,有哪些改动,方便我们可以查看问题,今天我们就来说实现下,其实很简单,不需要后端,纯前端就可以实现。

Monaco Editor

Monaco Editor 是 VS Code 中使用的开源代码编辑器, 拥有代码高亮和代码自动补全的功能,并且内置了一个 Diff Editor。

官网 Diff editor

官网就有一个 Diff Editor 的演示,我们要开发的就是在这个基础之上,加上语言切换的功能,让这个 Diff Editor 拥有内置云语言的语法高亮。

TypeScript, JavaScript, CSS, LESS, SCSS, JSON, HTML、XML, PHP, C#, C++, Razor, Markdown, Diff, Java, VB, CoffeeScript, Handlebars, Batch, Pug, F#, Lua, Powershell, Python, Ruby, SASS, R, Objective-C

官网罗列了这些语言,但远不止于此。

马上掘金

代码片段 使用 monaco-editor 创建一个简单的代码编辑器

代码片段 使用 monaco-editor 创建一个简单的 Diff 编辑器

Monaco Editor 有 2 种加载方式,分别是 amd 和 esm,也就是 RequirejsES Modules。马上掘金中使用的是 requirejs

技术栈选择

我准备把常用的工具做成一个工具网站,所以我选择使用 next.js,并且可以使用 vercel 免费持续部署。

关于 Monaco Editor 在 next.js 中的配置,之前有介绍过,大家可以看这篇文章 《在 Next.js 中使用 Monaco Editor》

实现 Diff Editor

  import type { editor as MonacoEditor } from "monaco-editor";
import { useEffect, useRef, useState } from "react";
import * as monaco from "monaco-editor";

export default function TextDiffPage() {
 const editorContainer = useRef<HTMLDivElement | null>(null);
 const [language, setLanguage] = useState("text");
 const [inlineView, setInlineView] = useState(false);

 const [diffEditor, setDiffEditor] =
   useState<MonacoEditor.IStandaloneDiffEditor | null>(null);

 const createModel = (
   value: string,
   language: string,
   type: "original" | "modified"
 ) => {
   return monaco.editor.createModel(value, language);
 };

 const initEditor = async () => {
   const originalModel = createModel(`Hello World`, language, "original");
   const modifiedModel = createModel(`Goodbye World`, language, "modified");
   const editor = monaco.editor.createDiffEditor(editorContainer.current, {
     minimap: { enabled: false },
     theme: "vs-dark",
     renderSideBySide: !inlineView,
     originalEditable: true,
   });
   editor.setModel({
     original: originalModel,
     modified: modifiedModel,
   });

   setDiffEditor(editor);
 };

 useEffect(() => {
   initEditor();
   return () => {
     if (diffEditor) diffEditor.dispose();
   };
 }, []);

 useEffect(() => {
   if (diffEditor) {
     diffEditor.updateOptions({
       renderSideBySide: !inlineView,
     });
   }
 }, [inlineView]);

 return (
   <div className="h-screen flex flex-col">
     <header className="h-16 border-b dark:border-neutral-800 flex-shrink-0 flex items-center px-3 space-x-5">
       <label className="space-x-1 flex items-center">
         <input
           type="checkbox"
           checked={inlineView}
           onChange={(e) => setInlineView(e.target.checked)}
         />
         <span>Inline diff</span>
       </label>
     </header>
     <div ref={editorContainer} className="h-full"></div>
   </div>
 );
}

上述代码很简单,可能有同学对 createModel 方法比较疑惑,为什么是 Model ?好比 Monaco Editor 是一个容器,容器可以设置 Model、切换 Model,比如 vscode 中,每打开一个文件就是一个 Model,文件切换就是切换 model,每个文件都有状态,比如光标位置,历史记录等,这些状态都存在 model 中,这样就不会因为文件切换而状态混淆。

  // typescript 禁用类型检查
monaco.languages.typescript.typescriptDefaults.setDiagnosticsOptions({
  noSemanticValidation: true,
  noSyntaxValidation: false,
});

// typescript jsx 格式使用 React 语法解析
monaco.languages.typescript.typescriptDefaults.setCompilerOptions({
  jsx: monaco.languages.typescript.JsxEmit.React,
});

对与一些 typescript 的语法校验我们可以选择关闭,jsx 不支持,可以设置为 react 语法支持。

最后

最后我的工具网站也开源了,包含一些前端常用工具,还可以在线刷面试题。

如果对你有帮助,可以随手点个赞,这对我真的很重要。

以上就是本文全部内容,希望这篇文章对大家有所帮助,也可以参考我往期的文章或者在评论区交流你的想法和心得,欢迎一起探索前端。

相关 [开发 在线 代码] 推荐:

开发一个在线代码对比工具

- - 掘金 前端
我正在参加「创意开发 投稿大赛」详情请看: 掘金创意开发大赛来了. 在开发过程中,我们经常需要用到代码对比,对比下代码是否一致,有哪些改动,方便我们可以查看问题,今天我们就来说实现下,其实很简单,不需要后端,纯前端就可以实现. Monaco Editor 是 VS Code 中使用的开源代码编辑器, 拥有代码高亮和代码自动补全的功能,并且内置了一个 Diff Editor.

用httpclient开发的在线自动抢订火车票系统(已上传源代码)

- - ITeye论坛最新精华讨论帖
前两天女友要在线订火车在票,一直都没有办法订到票,最后没办法,便给她写了个自动抢票的脚本,可周边的朋友听她说通过软件订到票了,都先后向她要软件,可原来的脚本只是基于控制台输入,这样给别人也没法用,兴趣一起,就花了一天的时间做了个WEB界面,然后分享给朋友用. 这个是登录界面,要使用前先设置一下常用的邮箱和登录密码,自动抢票过程中,如需要再输入登录验证码和订单验证码,或订单成功时,将通过此email通知您,建议使用qq邮箱,这样只要您在电脑时开打QQ,收到邮件时,qq会弹出窗口通知您,您可以即时响应.

java代码开发规范

- - BlogJava_首页
格式规范:                                                                      .       1、TAB空格的数量. 编辑器上的TAB空格数量统一取值为4.       2、换行, 每行120字符.       3、if语句的嵌套层数3层以内   .

Coderun – 在线运行代码 | 小众软件 > 在线应用

- guoan - 小众软件 - Appinn
Coderun 是一个在线的 IDE 编辑器,支持 C# 、 .Net 、 JavaScript 和 PHP 等语言,可以在线新建、编辑、运行、调试代码,也支持代码的上传和打包下载. 官方网站 | 来自小众软件. ©2011 root for 小众软件 | 原文链接 | 1 留言 | 加入我们 | 投稿 | 订阅指南.

Android Native 代码开发学习笔记

- iDesperadO - WindStorm
本文提供排版更佳的PDF版本下载. JNI,全称Java Native Interface,是用于让运行在JVM中的Java代码和运行在JVM外的Native代码(主要是C或者C++)沟通的桥梁. 代码编写者即可以使用JNI从Java的程序中调用Native代码,又可以从Native程序中调用Java代码.

开发中统计代码量

- - 开源软件 - ITeye博客
开发中我们想知道到底有多少代码. throw new RuntimeException("异常");. sum1++;//不包括注释换行. sum3++;//包括注释,换行. * 程序名称:java代码行数统计软件. * 说明:支持 整个工程的代码行数统计. out.println("共有 " +sum[5]+" 个类" );.

再谈低代码开发平台(200727)

- - 人月神话的BLOG
今天准备谈下快速开发平台和低代码开发平台方面的内容. 对于快速开发平台在10年前我关注的比较多,当时也是属于快速开发平台的狂热者,也试图去构建一个完整的包括了对象建模,数据建模,流程建模,规则建模,界面建模的完整快速开发平台. 但是最近几年这方面的关注比较少,只在16年对开源的基于元数据驱动的EOVA平台进行了简单试用,在去年对JEPaas平台进行了简单试用.

低代码开发脚手架 citrus-vuetify

- - OSCHINA 社区最新软件

[下载]谷歌电吉他源代码和在线演示

- Zhenbo Xu - cnBeta.COM
为了纪念电吉他之父莱斯・保罗(Les Paul,1915年6月9日-2009年8月13日)诞辰96周年,Google Doodle又出神作,首页的Logo被设计成一个电吉他形,并且鼠标滑过会弹出美妙的音乐,当你按下键盘图标时,还可以直接用键盘弹奏这个“电吉他”. 弹了几下,发现自己很有音乐天赋呢,于是决定保存下来,永久收藏.

5个优秀的在线调试代码网站

- - CSDN博客推荐文章
对于编程开发的人来说,有个快速测试代码的地方是非常方便重要的,这里,我们收集了5个很好用的在线调试网站. 是一款简单的在线 IDE 编辑器服务,你只需要把代码粘贴进去就可以编译运行了,连工程也不需要新建,而且 codepad 支持的语言达到了9种,支持的语言有:C,C++,D,Haskell,Lua,OCaml,PHP,Perl,Plain Text,Python,Ruby,Scheme,Tcl.