前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何在网页实现 TypeScript 编辑器?

如何在网页实现 TypeScript 编辑器?

作者头像
神说要有光zxg
发布于 2024-04-30 07:54:44
发布于 2024-04-30 07:54:44
43200
代码可运行
举报
运行总次数:0
代码可运行

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

比如在线执行代码的 playground:

或者在线面试:

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

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

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

我们来试试看。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npx create-vite

创建个 vite + react 的项目。

安装依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install

npm install @monaco-editor/react

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

去掉 main.tsx 里的 index.css

然后在 App.tsx 用一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import MonacoEditor from '@monaco-editor/react'

export default function App() {

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

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

跑下开发服务:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm run dev

试下看:

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

但是有报错:

jsx 语法不知道怎么处理。

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

怎么改呢?

这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import MonacoEditor, { OnMount } from '@monaco-editor/react'

export default function App() {

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

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

}

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

onMount 的时候,设置 ts 的 compilerOptions。

这里设置 jsx 为 preserve,也就是输入 <div> 输出 <div>,保留原样。

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import * as fs from 'fs';

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

就可以这样引入了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import fs from 'fs';

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

还有一个错误:

没有 lodash 的类型定义。

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

我们也要支持下。

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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,
    logger: console,
    delegate: {
      receivedFile: (code, path) => {
        console.log('自动下载的包', path);
        onDownloadFile(code, path);
      }
    },
  })

  return ata;
}

安装用到的包:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install --save @typescript/ata -f 

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

然后在 mount 的时候调用下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const ata = createATA((code, path) => {
    monaco.languages.typescript.typescriptDefaults.addExtraLib(code, `file://${path}`)
})

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

ata(editor.getValue());

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

看下效果:

有类型了!

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

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

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

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

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

scrollBeyondLastLine 是到了最后一行之后依然可以滚动一屏,关闭后就不会了。

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

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

theme 是修改主题。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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,
          }
        }
    }
  />

好多了。

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

默认 cmd(windows 下是 ctrl) + j 没有处理。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyJ, () => {
    editor.getAction('editor.action.formatDocument')?.run()
});

试下效果:

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

打印下就知道了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 个:

用到再搜就行。

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

总结

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

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

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

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

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

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

为啥要研究这个呢?

因为我最近在开发 react playground,在左侧写代码,然后实时编译在右侧预览:

这是我小册 《React 通关秘籍》的一个项目,感兴趣的话可以上车一起做。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-04-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 神光的编程秘籍 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
读论文系列:Object Detection NIPS2015 Faster RCNN
转载请注明作者:梦里茶 Faster RCNN在Fast RCNN上更进一步,将Region Proposal也用神经网络来做,如果说Fast RCNN的最大贡献是ROI pooling layer和Multi task,那么RPN(Region Proposal Networks)就是Faster RCNN的最大亮点了。使用RPN产生的proposals比selective search要少很多(300vs2000),因此也一定程度上减少了后面detection的计算量。 Introduction Fa
梦里茶
2018/03/30
6570
R-FCN、Mask RCNN、YoLo、SSD、FPN、RetinaNet…你都掌握了吗?一文总结目标识别必备经典模型(二)
 机器之心专栏 本专栏由机器之心SOTA!模型资源站出品,每周日于机器之心公众号持续更新。 本专栏将逐一盘点自然语言处理、计算机视觉等领域下的常见任务,并对在这些任务上取得过 SOTA 的经典模型逐一详解。前往 SOTA!模型资源站(sota.jiqizhixin.com)即可获取本文中包含的模型实现代码、预训练模型及 API 等资源。 本文将分 3 期进行连载,共介绍 17 个在目标检测任务上曾取得 SOTA 的经典模型。 第 1 期:R-CNN、SPP-Net、Fast R-CNN、Faster R-C
机器之心
2023/03/29
1.3K0
R-FCN、Mask RCNN、YoLo、SSD、FPN、RetinaNet…你都掌握了吗?一文总结目标识别必备经典模型(二)
SSD原理解读-从入门到精通「建议收藏」
当初写这篇博客的初衷只是记录自己学习SSD的一些心得体会,纯属学习笔记,后来由于工作上的需要,需要对小伙伴进行目标检测方面的培训,后来就基于这篇博客进行了扩展,逐渐演变成了现在的样子,本文力求从一个初学者的角度去讲述目标检测和SSD(但是需要你具备CNN的基础),尽量使用通俗的语言并结合图表的方式让更多初学者更容易理解SSD这个算法,但是一个人的时间精力有限,不可能深入理解SSD的每一个细节,加上表达能力也有限,自己理解了的东西不一定在文中能够说明白,文中有什么不妥的地方,欢迎大家批评指正,也欢迎留言一起交流讨论。
全栈程序员站长
2022/09/02
7290
SSD原理解读-从入门到精通「建议收藏」
SSD: Single Shot MultiBox Detector
本文提出了一个使用单一深度神经网络对图像中的目标进行检测的方法。本文的方法称为SSD,根据每个feature map位置不同的宽高比和尺度,将Bounding Box的输出离散为Bounding Box先验的集合。在预测时,网络产生置信度,认为每个先验对应感兴趣的目标,并对先验进行调整,以便更好地匹配目标的形状。此外,该网络结合了来自具有不同分辨率的多个特征图的预测,以自然地处理不同大小的目标。SSD模型相对于需要目标建议的方法(如R-CNN和MultiBox)是简单的,因为它完全抛弃了生成建议的步骤,并将所有计算封装在一个网络中。这使得SSD易于训练,并且易于集成到需要检测组件的系统中。在ILSVRC DET和PASCAL VOC数据集上的实验结果证实,SSD的性能与使用目标建议步骤的方法相当,但速度要快100-1000倍。与其他单阶段方法相比,SSD具有相似或更好的性能,为训练和推理提供了统一的框架。
狼啸风云
2019/08/18
2.2K0
SSD: Single Shot MultiBox Detector 深度学习笔记之SSD物体检测模型
算法概述 本文提出的SSD算法是一种直接预测目标类别和bounding box的多目标检测算法。 与faster rcnn相比,该算法没有生成 proposal 的过程,这就极大提高了检测速度。针对不同大小的目标检测,传统的做法是先将图像转换成不同大小(图像金字塔),然后分别检测,最后将结果综合起来(NMS)。 而SSD算法则利用不同卷积层的 feature map 进行综合也能达到同样的效果。算法的主网络结构是VGG16,将最后两个全连接层改成卷积层,并随后增加了4个卷积层来构造网络结构。对其中5种不
AI研习社
2018/03/19
1.7K0
SSD: Single Shot MultiBox Detector 深度学习笔记之SSD物体检测模型
读论文系列:Object Detection CVPR2016 YOLO
CVPR2016: You Only Look Once:Unified, Real-Time Object Detection 转载请注明作者:梦里茶 YOLO,You Only Look Once
梦里茶
2018/04/17
1K0
读论文系列:Object Detection CVPR2016 YOLO
从编程实现角度学习 Faster R-CNN(附极简实现)
Faster R-CNN 的极简实现: github: simple-faster-rcnn-pytorch(http://t.cn/RHCDoPv ) 本文插图地址(含五幅高清矢量图):draw.io(http://t.cn/RQzroe3 ) 1 概述 在目标检测领域, Faster R-CNN 表现出了极强的生命力, 虽然是 2015 年的论文(https://arxiv.org/abs/1506.01497),但它至今仍是许多目标检测算法的基础,这在日新月异的深度学习领域十分难得。Faster
AI研习社
2018/03/16
2.6K0
从编程实现角度学习 Faster R-CNN(附极简实现)
Object Detection系列(四) Faster R-CNN
本文介绍了Faster R-CNN目标检测算法及其实现,重点讲解了Faster R-CNN的算法原理和具体实现。
chaibubble
2018/01/08
9930
Object Detection系列(四) Faster R-CNN
最全综述 | 图像目标检测
图片分类任务我们已经熟悉了,就是算法对其中的对象进行分类。而今天我们要了解构建神经网络的另一个问题,即目标检测问题。这意味着,我们不仅要用算法判断图片中是不是一辆汽车, 还要在图片中标记出它的位置, 用边框或红色方框把汽车圈起来, 这就是目标检测问题。其中“定位”的意思是判断汽车在图片中的具体位置。
AI算法与图像处理
2019/07/11
1.4K0
最全综述 | 图像目标检测
MMDetection学习系列(2)——SSD深度探索与实战指南
目标检测是计算机视觉领域的一个重要任务,它旨在从图像中识别出感兴趣的目标,并确定它们的位置和大小。在众多目标检测算法中,SSD(Single Shot MultiBox Detector)以其高效和精确的性能,受到了广泛关注。本文将带你走进SSD目标检测算法,一起探索它的工作原理和实践应用。
CoovallyAIHub
2025/01/15
2090
MMDetection学习系列(2)——SSD深度探索与实战指南
目标检测算法之SSD
昨天介绍了特征金字塔网络用于目标检测,提升了多尺度目标检测的鲁棒性,今天开始讲讲One-Stage目标检测算法中SSD算法。这个算法是我平时做工程中最常用到的,严格来说平时最常用的是Mobilenet做Backbone的SSD算法,因为要考虑到实际部署的时候的速度要求,不过原理都一样。
BBuf
2019/12/09
1.7K0
【深度学习】深度图像检测算法总结与对比
一. R-CNN:Rich feature hierarchies for accurate object detection and semantic segmentation
黄博的机器学习圈子
2023/01/10
1.2K0
【深度学习】深度图像检测算法总结与对比
读论文系列:Object Detection ICCV2015 Fast RCNN
Fast RCNN是对RCNN的性能优化版本,在VGG16上,Fast R-CNN训练速度是RCNN的9倍, 测试速度是RCNN213倍;训练速度是SPP-net的3倍,测试速度是SPP-net的3倍,并且达到了更高的准确率,本文为您解读Fast RCNN。 Overview Fast rcnn直接从单张图的feature map中提取RoI对应的feature map,用卷积神经网络做分类,做bounding box regressor,不需要额外磁盘空间,避免重复计算,速度更快,准确率也更高。 Rela
梦里茶
2018/03/30
7950
深度学习500问——Chapter08:目标检测(4)
我们将对单次目标检测器(包括SSD系列和YOLO系列等算法)进行综述。我们将分析FPN以理解多尺度特征图如何提高准确率,特别是小目标的检测,其在单次检测器中的检测效果通常很差。然后我们将分析Focal loss和RetinaNet,看看它们是如何解决训练过程中的类别不平衡问题的。
JOYCE_Leo16
2024/05/04
3470
深度学习500问——Chapter08:目标检测(4)
目标检测(Object Detection)
目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标(物体),确定它们的类别和位置,是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具有挑战性的问题。
全栈程序员站长
2022/09/14
7.9K0
目标检测(Object Detection)
faster-rcnn原理介绍
本博客大部分参考http://blog.csdn.net/zy1034092330/article/details/62044941,其中夹杂着自己看论文的理解
全栈程序员站长
2022/11/09
5320
faster-rcnn原理介绍
目标检测系列之二(R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN)
目标检测系列之二(R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN)
Minerva
2020/05/25
1.3K0
深入浅出理解Faster R-CNN
。这个方法显然存在一些问题,比如当物体是不同大小有不同的宽高比,那训练一个效果很好的检测模型将会是非常复杂的(复杂的原因有两个,一个是如果整个图片很大,那么预测出的边界框坐标的绝对值变化很大,不容易拟合;第二个原因则是框的大小长宽都在变化,加大了我们的拟合难度)。另一个问题则是会存在一些无效的预测,比如当预测
CristianoC
2020/06/02
6420
fasterrcnn详解_faster RCNN
paper:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks Tensorflow-faster r-cnn github:Tensorflow Faster RCNN for Object Detection
全栈程序员站长
2022/11/10
1K0
fasterrcnn详解_faster RCNN
SSD源码解析
- SSD理论总结(SSD: Single Shot MultiBox Detector)
机器学习算法工程师
2018/07/27
3.6K0
SSD源码解析
相关推荐
读论文系列:Object Detection NIPS2015 Faster RCNN
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验