低代码平台实践——代码编辑器

前端的代码编辑器选型主要有monaco-editorCodeMirror两种,我司低代码实践中的代码编辑场景主要是函数设置,因此选择了更为轻量的CodeMirror。

CodeMirror使用

CodeMirror用法比较简单,核心代码如下(这里CodeMirror的版本是5.65)

kotlin 复制代码
import codemirror from 'codemirror';
import 'codemirror/lib/codemirror.css';
import 'codemirror/mode/javascript/javascript.js';

class CodeEditor extends React.Component<Props> {
  private ref = React.createRef<HTMLDivElement>();

  private editor: codemirror.Editor | undefined;

  setReadOnlyCodes = () => {
    const { editor } = this;
    if (editor) {
      const firstLine = editor.firstLine();
      const firstLineHandle = editor.getLineHandle(firstLine);
      const lastLine = editor.lastLine();
      editor.markText(
        { line: firstLine, ch: 0 },
        { line: firstLine, ch: firstLineHandle.text.length },
        { className: 'readonly' },
      );
      editor.markText(
        { line: lastLine, ch: 0 },
        { line: lastLine + 1, ch: 0 },
        { className: 'readonly' },
      );
    }
  };
  componentDidMount() {
    const { value = '' } = this.props;

    if (this.ref.current) {
      const editor = codemirror(this.ref.current, {
        lineWrapping: true,
        indentWithTabs: true,
        lineNumbers: true,
        matchBrackets: true,
        autofocus: true,
        extraKeys: { Tab: 'autocomplete' },
        hintOptions: {
          completeSingle: false,
          additionalContext: this.props.additionalContext || {},
        },
        mode: 'javascript',
        value,
      });
      editor.on('change', this.changeDelay);
      editor.on('inputRead', this.handleInputRead);
      editor.on('beforeChange', this.handleBeforeChange);
      this.editor = editor;
      this.setReadOnlyCodes();
    }
  }
  render() {
    return <div className="code-editor" ref={this.ref}></div>;
  }

}

语法提示、校验和转换

语法提示

CodeEditor自带js原生的语法提示

ini 复制代码
<div>
    <CodeEditor
    additionalContext={{env:{app:'',pageCode:''}}}
     value={currentCodes}
     onChange={(data)=>{
        setCurrentCodes(data)
        }
    }
     errorInfo={codeErr}
    />
    <Button type="primary" onClick={()=>{
        console.log(transferCodes(currentCodes))    
    }}>语法校验和转换</Button>
</div>

但自定义的对象,需要通过additionalContext声明结构。

语法校验和转换

语法转换可以使用@babel/standalone,

typescript 复制代码
import { transform } from '@babel/standalone';

export default function transformCode(code: string): string | undefined | null {
  return transform(code, { presets: ['env'] }).code;
}

核心代码如下

scss 复制代码
const useCodeTransfer = () => {
  const [errorInfo, setErrorInfo] = useState('');

  const transferCode = useCallback(
    (code) => {
      try {
        if (errorInfo) {
          setErrorInfo('');
        }
        return transfer(code);
      } catch (e: any) {
        setErrorInfo(e.message);
        throw e;
      }
    },
    [errorInfo],
  );

  return [transferCode, errorInfo, setErrorInfo];
};

转换前:

kotlin 复制代码
(env) => {
  const {app} = env
  return null;
}

转换后:

javascript 复制代码
"use strict";

(function (env) {
  var app = env.app;
  return null;
});

如果语法有问题,transform会抛出异常:

相关推荐
红迅低代码平台(redxun)10 小时前
生态开放度对决:是选择“全家桶”闭环,还是拥抱“最佳组合”开放平台?
低代码·ai开发平台·智能体开发平台·红迅软件·红迅ai低代码开发平台
低代码布道师1 天前
【教培管家】后台订单管理与预约确认
低代码·小程序·云开发
液态不合群1 天前
别被“低代码快速构AI”忽悠了!实操30+项目后,我扒出了底层真相
人工智能·低代码
yinmaisoft2 天前
JNPF 积分管理子系统,购物中心会员运营躺赢神器!
大数据·人工智能·低代码·开发工具
CORNERSTONE3652 天前
一款中后台方向的低代码可视化搭建平台
低代码·数据可视化
CORNERSTONE3652 天前
市面上“低代码开发平台”百花齐放,有没有什么优势比较突出的?
低代码
希艾席帝恩3 天前
低代码工具怎么选?我直接给你整理好了
人工智能·低代码·私有化部署·数字孪生·数字化转型
枝上棉蛮3 天前
2026免费低代码平台评测:从全功能永久免费到生态适配的选型指南
低代码·私有化部署·企业数字化转型·斑斑低代码·企业必备工具·简道云·宜搭
麦聪聊数据3 天前
数据库访问的“去密码化”革命:从堡垒机托管到 Web 平台
数据库·sql·安全·低代码
麟听科技3 天前
HarmonyOS 6.0+ PC端AI代码审计工具开发实战:静态分析与安全漏洞检测落地
人工智能·学习·安全·低代码·华为·harmonyos