整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

EOEditor 2022,所见即所得的网页编辑器

概十年前,亿速思维(ETSOO)发布了一款编辑器EOEditor,还注册了软件著作权证,在2018年发布了4.0 (还能在网上搜索到:https://www.onlinedown.net/soft/35767.htm)后就停止了更新,因为代码过于浮肿,没有吸收新的技术,也没有跟着潮流,做版本控制,问题越攒越多。公司后来的产品开发,采用了百度的UEditor(https://fex.baidu.com/ueditor/),使用过程中也发现一些问题,奈何不是自己的产品,改进很难,后来它也停更,做免费的组件产品,在哪个国家,哪个规模的企业,都很难。一切似乎又回到了起点。

2019年底来新西兰后,接触了很多新人新事,发现自己的技术底层逻辑,需要大面积迭代,花了很多时间,可以说是夜以继日的学习,重新刷新了HTML5/JavaScript/CSS 2, CSS3,重新学习了TypeScript,学习实践GIT版本控制,更新所有的技术知识点到最新版本,来重构亿速思维的底层技术框架,这个过程,一晃就将近3年。

过程很艰难,现在的结果看起来走到了正确的道路上,所有的脚本代码,全部使用了TypeScript,能形成Package的,只要不威胁公司核心机密,都尽可能发布到GitHub开源。今年3月,为了完成公司的技术拼图,决定重新这个编辑器,到今天基本完成第一个版本,耗时两个多月,GitHub:https://github.com/ETSOO/EOEditor,下面是界面截图。

EOEditor 2022界面截图

新版本的几个亮点:

  • 仅支持ES2019+的技术,不支持IE,面向未来。考虑过多的兼容性会积重难返。
  • 程序仅一个脚本文件,CDN支持,自定义网页标签,使用起来足够简单。
  • 界面简洁,但编辑器常见的功能已经包含。
  • 客户端图片编辑功能,让用户可以在本地编辑处理好图片,降低服务器处理成本。
  • 完全开源,MIT协议,不断迭代。

图片编辑器截图,可以直观看到一些基本功能:

图片编辑器效果

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

比如在线执行代码的 playground:

或者在线面试:

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

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

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

我们来试试看。

npx create-vite

创建个 vite + react 的项目。

安装依赖:

npm install

npm install @monaco-editor/react

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

去掉 main.tsx 里的 index.css

然后在 App.tsx 用一下:

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}
  />
}

跑下开发服务:

npm run dev

试下看:

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

但是有报错:

jsx 语法不知道怎么处理。

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

怎么改呢?

这样:

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 属性:

import * as fs from 'fs';

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

就可以这样引入了:

import fs from 'fs';

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

还有一个错误:

没有 lodash 的类型定义。

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

我们也要支持下。

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

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,
    logger: console,
    delegate: {
      receivedFile: (code, path) => {
        console.log('自动下载的包', path);
        onDownloadFile(code, path);
      }
    },
  })

  return ata;
}

安装用到的包:

npm install --save @typescript/ata -f 

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

然后在 mount 的时候调用下:

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 是修改主题。

return <MonacoEditor
      height={'100vh'}
      path={"guang.tsx"}
      language={"typescript"}
      onMount={handleEditorMount}
      theme: "vs-dark",
      value={code}
      options={
        {
          fontSize: 16,
          scrollBeyondLastLine: false,
          minimap: {
            enabled: false,
          },
          scrollbar: {
            verticalScrollbarSize: 6,
            horizontalScrollbarSize: 6,
          }
        }
    }
  />

好多了。

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

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

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

editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyJ, () => {
    editor.getAction('editor.action.formatDocument')?.run()
});

试下效果:

有同学可能问,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 个:

用到再搜就行。

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

总结

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

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

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

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

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

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



原文链接:https://juejin.cn/post/7361934843209777152

TML 编辑器推荐

可以使用专业的 HTML 编辑器来编辑 HTML,菜鸟教程为大家推荐几款常用的编辑器:

  • Notepad++:https://notepad-plus-plus.org/
  • Sublime Text:http://www.sublimetext.com/
  • VS Code:https://code.visualstudio.com/

你可以从以上软件的官网中下载对应的软件,按步骤安装即可。

接下来我们将为大家演示如何使用Notepad++工具来创建 HTML 文件,其他两个工具操作步骤类似。


Notepad++

Notepad++是 Windows操作系统下的一套文本编辑器(软件版权许可证: GPL),有完整的中文化接口及支持多国语言编写的功能(UTF8技术)。

步骤 1: 新建 HTML 文件

在 Notepad++ 安装完成后,选择" 文件(F)->新建(N) ",在新建的文件中输入以下代码:

<!DOCTYPE html><html><head><meta charset="utf-8"><title>菜鸟教程(runoob.com)</title></head><body> <h1>我的第一个标题</h1> <p>我的第一个段落。</p> </body></html>


步骤 2: 另存为 HTML 文件

然后选择" 文件(F)->另存为(A) ",文件名为 runoob.html:


当您保存 HTML 文件时,既可以使用 .htm 也可以使用 .html 扩展名。两者没有区别,完全根据您的喜好。

在一个容易记忆的文件夹中保存这个文件,比如 runoob

步骤 3: 在浏览器中运行这个 HTML 文件

启动您的浏览器,然后选择"文件"菜单的"打开文件"命令,或者直接在文件夹中双击您的 HTML 文件,

运行显示结果类似如下:


Notepad++ 和 Sublime Text 还可以配合 Emmet 插件来提高编码速度。Emmet 官网:http://emmet.io/