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

sxkk20082年前知识分享322

前言

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

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="flex h-screen flex-col">
      <header className="flex h-16 flex-shrink-0 items-center space-x-5 border-b px-3 dark:border-neutral-800">
        <label className="flex items-center space-x-1">
          <input
            type="checkbox"
            checked={inlineView}
            onChange={(e) => setInlineView(e.target.checked)}
          />
          <span>Inline diffspan>
        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 语法支持。

最后

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

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

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

相关文章

AI智能识别将革新世界,助力人类进步

AI智能识别将革新世界,助力人类进步

  AI智能识别技术的迅速发展将在各个领域带来深远的影响。从医疗保健到交通运输,从金融领域到商业应用,AI智能识别正在成为引领创新的关键技术。本文将探讨AI智能识别技术的应用...

AI智能绘画:创造美学与技术的新境界

AI智能绘画:创造美学与技术的新境界

  随着人工智能技术的不断发展,AI智能绘画在当今艺术领域中已经越来越普遍,成为了艺术创作的一种新方式。 在这篇文章中,我们将探讨AI智能绘画的概念、发展历程和对当今艺术...

AI技术库为企业打通数字化转型的新路径

AI技术库为企业打通数字化转型的新路径

  随着科技的不断进步,人工智能(AI)已经成为了各个行业中的一个热门话题。而在企业中,怎样利用这些AI技术来推动数字化转型是一个需要亟待解决的问题。在这篇文章中,我们将探讨...

https://retor.hr/

https://sedeblockchain.com/

https://dnaprojecten.nl/

web design trend 2023 example 1 https://nationalstudentshow.com/

https://anakaric.com/

https://yaremenko.design/

https://www.landa.as/es/

web design trend 2023 example https://selectedbase.com/

CSS First

在过去,我们通常依靠 JavaScript 来创造网站的视觉效果。但从那时起,CSS 已经发展到可以做很多复杂的事情,而这些事情是 JavaScript 无法做到的。三维变换、过滤器和新的 CSS 功能,如:选择器(has)、容器查询(@container)和层叠层(@layer),将使许多有趣的网页设计纯粹依靠 CSS 来实现。

因此,从今年开始,我们将看到网站减少对 JavaScript 的依赖来创造视觉效果。

https://redstapler.co/cool-css-text-light-effect-5-minutes-tutorial/

https://redstapler.co/3d-infinity-effect-css-tutorial/

https://codepen.io/seyedi/pen/zYoeLEv

3d transparent video https://redstapler.co/create-3d-effect-on-website-using-transparent-video-background/

2023 web 设计趋势

翻译一篇文章原文链接:https://redstapler.co/web-design-trends-2023/作者:TK在过去的一年里,我们在网页设计领域看到了很多令人兴奋的发展。而在这篇文章中,我...

低碳行动:为可持续未来而改变

低碳行动:为可持续未来而改变

  在当今世界范围内,环境问题的严重性和紧迫性已经引起了全球范围内的广泛关注。随着气候变化的加剧和自然资源的不断减少,低碳行动成为了一个迫在眉睫的议题。低碳行动旨在减少人类活...

百度物联网:打造智慧连接的未来

百度物联网:打造智慧连接的未来

  随着物联网技术的不断进步与普及,人们的生活已经逐渐发生了翻天覆地的变化。在这个信息时代,物联网无疑是连接一切的重要支点。而作为中国顶尖的科技公司之一,百度在物联网领域的布...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。