教你做个在线代码编辑器,体验堪比 VSCode!

有的需求需要在网页上写代码。

比如在线执行代码的 playground:

教你做个在线代码编辑器,体验堪比 VSCode!

或者在线面试:

教你做个在线代码编辑器,体验堪比 VSCode!

如果让你实现网页版 TypeScript 编辑器,你会如何做呢?

有的同学说,直接用微软的 monaco editor 呀:

教你做个在线代码编辑器,体验堪比 VSCode!

确实,直接用它就可以,但是有挺多地方需要处理的。

我们来试试看。

npx create-vite
教你做个在线代码编辑器,体验堪比 VSCode!

创建个 vite + react 的项目。

安装依赖:

npm install

npm install @monaco-editor/react

这里用 @monaco-editor/react 这个包,它把 monaco editor 封装成了 react 组件。

去掉 main.tsx 里的 index.css

教你做个在线代码编辑器,体验堪比 VSCode!

然后在 App.tsx 用一下:

import MonacoEditor from '@monaco-editor/react'

export default function App({

  const code = `import lodash from 'lodash';
function App() {
  return 
guang
  
}  
  `
;

  return MonacoEditor
      height={'100vh'}
      path={"guang.tsx"}
      language={"typescript"}
      value={code}
  />
}

跑下开发服务:

npm run dev

试下看:

教你做个在线代码编辑器,体验堪比 VSCode!

现在就可以在网页写 ts 代码了。

但是有报错:

教你做个在线代码编辑器,体验堪比 VSCode!

jsx 语法不知道怎么处理。

这里明显要改 typescript 的 tsconfig.json。

怎么改呢?

这样:

教你做个在线代码编辑器,体验堪比 VSCode!
import MonacoEditor, { OnMount } from '@monaco-editor/react'

export default function App({

  const code = `import lodash from 'lodash';
function App() {
  return 
guang
  
}  
  `
;

  const handleEditorMount: OnMount = (editor, monaco) => {
    monaco.languages.typescript.typescriptDefaults.setCompilerOptions({
        jsx: monaco.languages.typescript.JsxEmit.Preserve,
        esModuleInteroptrue,
    })

}

  return MonacoEditor
      height={'100vh'}
      path={"guang.tsx"}
      language={"typescript"}
      onMount={handleEditorMount}
      value={code}
  />
}

onMount 的时候,设置 ts 的 compilerOptions。

这里设置 jsx 为 preserve,也就是输入

输出

,保留原样。

如果设置为 react 会输出 React.createElement(“div”)。

再就是 esModuleInterop,这个也是 ts 常用配置。

默认 fs 要这么引入,因为它是 commonjs 的包,没有 default 属性:

import * as fs from 'fs';

设置 esModuleInterop 会在编译的时候自动加上 default 属性。

就可以这样引入了:

import fs from 'fs';

可以看到,现在 jsx 就不报错了:

教你做个在线代码编辑器,体验堪比 VSCode!

还有一个错误:

教你做个在线代码编辑器,体验堪比 VSCode!

没有 lodash 的类型定义。

教你做个在线代码编辑器,体验堪比 VSCode!

写 ts 代码没提示怎么行呢?

我们也要支持下。

这里用到 @typescript/ata 这个包:

教你做个在线代码编辑器,体验堪比 VSCode!

ata 是 automatic type acquisition 自动类型获取。

它可以传入源码,自动分析出需要的 ts 类型包,然后自动下载。

我们新建个 ./ata.ts,复制文档里的示例代码:

import { setupTypeAcquisition } from '@typescript/ata'
import typescriprt from 'typescript';

export function createATA(onDownloadFile: (code: string, path: string) => void{
  const ata = setupTypeAcquisition({
    projectName'my-ata',
    typescript: typescriprt,
    loggerconsole,
    delegate: {
      receivedFile(code, path) => {
        console.log('自动下载的包', path);
        onDownloadFile(code, path);
      }
    },
  })

  return ata;
}

安装用到的包:

npm install --save @typescript/ata -f 

这里就是用 ts 包去分析代码,然后自动下载用到的类型包,有个 receivedFile 的回调函数里可以拿到下载的代码和路径。

然后在 mount 的时候调用下:

教你做个在线代码编辑器,体验堪比 VSCode!
const ata = createATA((code, path) => {
    monaco.languages.typescript.typescriptDefaults.addExtraLib(code, `file://${path}`)
})

editor.onDidChangeModelContent(() => {
    ata(editor.getValue());
});

ata(editor.getValue());

就是最开始获取一次类型,然后内容改变之后获取一次类型,获取类型之后用 addExtraLib 添加到 ts 里。

看下效果:

教你做个在线代码编辑器,体验堪比 VSCode!
教你做个在线代码编辑器,体验堪比 VSCode!

有类型了!

写代码的时候用到的包也会动态去下载它的类型:

教你做个在线代码编辑器,体验堪比 VSCode!

比如我们用到了 ahooks,就会实时下载它的类型包然后应用。

这样,ts 的开发体验就有了。

再就是现在字体有点小,明明内容不多右边却有一个滚动条:

教你做个在线代码编辑器,体验堪比 VSCode!

这些改下 options 的配置就好了:

教你做个在线代码编辑器,体验堪比 VSCode!scrollBeyondLastLine 是到了最后一行之后依然可以滚动一屏,关闭后就不会了。

minimap 就是缩略图,关掉就没了。

scrollbar 是设置横向纵向滚动条宽度的。

theme 是修改主题。

return MonacoEditor
      height={'100vh'}
      path={"guang.tsx"}
      language={"typescript"}
      onMount={handleEditorMount}
      value={code}
      options={
        {
          fontSize: 16,
          
          scrollBeyondLastLine: false,
          minimap: {
            enabled: false,
          },
          scrollbar: {
            verticalScrollbarSize: 6,
            horizontalScrollbarSize: 6,
          }
        }
    }
  />
教你做个在线代码编辑器,体验堪比 VSCode!

好多了。

我们还可以添加快捷键的交互:

教你做个在线代码编辑器,体验堪比 VSCode!默认 cmd(windows 下是 ctrl) + j 没有处理。

我们可以 cmd + j 的时候格式化代码。

教你做个在线代码编辑器,体验堪比 VSCode!
editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyJ, () => {
    editor.getAction('editor.action.formatDocument')?.run()
});

试下效果:

教你做个在线代码编辑器,体验堪比 VSCode!

有同学可能问,monaco editor 还有哪些 action 呢?

打印下就知道了:

editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyJ, () => {
    // editor.getAction('editor.action.formatDocument')?.run()
    let actions = editor.getSupportedActions().map((a) => a.id);
    console.log(actions);
});

有 131 个:

教你做个在线代码编辑器,体验堪比 VSCode!

用到再搜就行。

这样,我们的网页版 TypeScript 编辑器就完成了。

总结

有的需求需要实现网页版编辑器,我们一般都用 monaco editor 来做。

今天我们基于 @monaco-editor/react 实现了 TypeScript 编辑器。

可以在 options 里配置滚动条、字体大小、主题等。

然后 onMount 里可以设置 compilerOptions,用 addCommand 添加快捷键等。

并且我们基于 @typescript/ata 实现了自动下载用到的 ts 类型的功能,它会扫描代码里的 import,然后自动下载类型,之后 addExtraLib 添加到 ts 里。

这样在网页里就有和 vscode 一样的 ts 编写体验了。


👇🏻 点击下方阅读原文,获取鱼皮往期编程干货。

往期推荐

我的新项目又来咯!

我们团队前端的自学经历,三本又怎样?

面对狗血小 Bug,我再也不慌了~

偷偷分享下我们公司的研发规范~

我们做的小工具,爆了!

大厂,是怎么提高研发效率的?

唉,新项目内测延期了。。我的一点思考

本内容观点仅代表发布作者本人观点立场,欣文网平台只做信息内容展示和存储。发布作者:全网转载,转转请注明出处:https://www.xinenw.com/6044.html

(0)
上一篇 2024年4月28日 17:28
下一篇 2024年4月28日 17:28

相关推荐

  • 《黑神话》六妹建模曝光,猪八戒的基因未免太强大了吧!

    前几天,《黑神话:悟空》3D负责人王琛(Wchen琛)在微博上分享了《黑神话》2021初版蜘蛛精三姐模型。 “蜘蛛精三姐,听说人气不高,2021初版,未使用扫描模型。” 玩家们看了之后直接杀疯了,这是配角?这是仅仅出场几分钟露面两三次的三妹?这明明就是主角脸啊!干嘛在游戏中不放上这个建模?后来想想也是,要是用三妹这么精致的建模,那不是把主角都给比下去了。 仅…

    2024年10月2日
    670
  • 从毕业照看大学生精神状态,也太领先了!路过的人一看一个不吱声

    点击蓝字| 关注我们 文|我是笑笑 又到了每年的毕业季,大家在学有所成后即将又要开启人生的新旅程,大中小学毕业年级的学生都会先后迎来自己的毕业季。 专属于毕业季的仪式就是同学们的毕业照了! 在拍毕业照这方面,大中小学生中不得不说大学生是最能整活的。 中小学到了快毕业的时候,学生虽然自由一些,但毕竟还在学校里,要遵守学校规定,像拍毕业照这样的事情,也得是班级里…

    2024年6月21日
    1950
  • 潘展乐线上采访太尴尬:体育新闻采访不宜过度娱乐化

    陶飞燕 安庆师范大学 ——2024年度红网“青椒评论”系列作品 北京时间8月5日晚,某电台主持对中国游泳队队员潘展乐进行连线采访。然而,几分钟的线上采访,大多围绕一些娱乐性问题展开,例如“游泳队身材颜值都很好,是需要一直在控制状态中吗”“你觉得接力四人组谁最帅”等。运动员只能尴尬回答,观众也觉得主持人采访过于八卦且不专业。 潘展乐是本届奥运会备受关注的运动员…

    2024年8月24日
    1110
  • 端午节迎坏消息?网传部分高校不让离校防止替高考,大学生哭笑不得

    点击蓝字| 关注我们 文|我是略略 过完五一,期待端午。快了快了,也就下下周了。端午节是好样的,毕竟不用调休。 六月只用上19天,就能拿全勤!这对打工人来说是喜闻乐见的。 对于大学生来说,放假是他们最为期待的事情了。 有的同学离家里比较远,平时很少回家,一般也就寒暑假和小长假才回家。 不回家,不是不想家。一是往返时间长,二是交通费不便宜,三是平时周末也有安排…

    2024年5月25日
    1990
  • 今年的“高考喊楼”可太燃了!北方网友的回复有点扎心:我没经历过

    点击蓝字| 关注我们 文|我是笑笑 转眼间又快到高考的时候了,虽已毕业多年,但在这个全民关注的日子里,还是不得已为高考生们祈福和加油。 这时的高三学子内心想必是非常复杂的,有对毕业季到来的喜悦之情,即将奔赴下一段旅途,高中三年的学习要画上一个句号。 还有的就是对高考最终之战要到来的紧张感,人生中最重要的考试之一了。 不能说高考就决定大家未来一辈子,但的的确确…

    2024年6月3日
    9590

联系我们

400-800-8888

在线咨询: QQ交谈

邮件A:xinenw@qq.com

邮箱B:xinenw@163.com

工作时间:周一至周五,8:30-23:30;周六周日10:30-18:30;节假日休息

关注微信