Github https://github.com/securingsincity/react-ace
在线预览 https://securingsincity.github.io/react-ace
react-ace 是Ace 的react 封装版本

  1. yarn add react-ace
  • enableBasicAutocompletion 普通自动完成,可选类型(true/false)
  • enableLiveAutocompletion 实时自动完成,可选类型(true/false)
  • enableSnippets 代码自动补全,可选类型(true/false)
  • onLoad:加载完成后执行的函数,第一个参数是编辑器的实例
  • 支持代码 diff对比

AceEditor

image.png

  1. import React, { useState, useEffect, forwardRef } from 'react';
  2. import { string, bool, number, func } from 'prop-types';
  3. import cls from 'classnames';
  4. import { isEqual, noop } from 'lodash';
  5. import AceEditor from 'react-ace'; // 488.kb gzip 132k
  6. // 引入 mode
  7. import "ace-builds/src-noconflict/mode-json";
  8. // 引入 theme
  9. import "ace-builds/src-noconflict/theme-github";
  10. // 如果要代码提示,这个必须引入!!!
  11. import "ace-builds/src-noconflict/ext-language_tools";
  12. const EditorRef = forwardRef(Editor);
  13. export default EditorRef;
  14. EditorRef.propTypes = {
  15. onChange: func,
  16. mode: string,
  17. theme: string,
  18. showGutter: bool,
  19. tabSize: number,
  20. };
  21. EditorRef.defaultProps = {
  22. onChange: noop,
  23. mode: 'json', // 解析和代码突出显示的语言
  24. theme: 'github',
  25. showGutter: true, // false隐藏行号
  26. tabSize: 2,
  27. }
  28. function Editor(props, ref){
  29. const {
  30. value,
  31. onChange,
  32. className,
  33. ...rest
  34. } = props;
  35. const [state, setState] = useState();
  36. useEffect(() => {
  37. if (isEqual(value, state)) return;
  38. setState(value ?? undefined);
  39. }, [value]);
  40. function handleChange(values){
  41. setState(values);
  42. onChange(values);
  43. }
  44. return (
  45. <AceEditor
  46. ref={ref}
  47. value={state}
  48. className={cls('full', className)}
  49. onChange={handleChange}
  50. wrapEnabled // 换行
  51. highlightActiveLine // 突出活动线
  52. readOnly // 只读,禁止编辑
  53. debounceChangePeriod={60} // onChange事件的抖动延迟
  54. style={{ backgroundColor: 'rgba(245,245,245,0.7)'}}
  55. editorProps={{ $blockScrolling: true }}
  56. // 设置编辑器格式化和代码提示
  57. setOptions={{
  58. enableBasicAutocompletion: true, // 代码基本提示
  59. enableLiveAutocompletion: true, // 代码智能提示
  60. enableSnippets: true, // 显示代码片段
  61. showLineNumbers: true, // 显示行号
  62. useWorker: false,
  63. tabSize: 2,
  64. }}
  65. // annotations={
  66. // [{row: 0, column: 2, type: 'error', text: '手动设置错误' }]
  67. // }
  68. {...rest}
  69. />
  70. );
  71. }

mode

mode & theme文档 https://github.com/securingsincity/react-ace/blob/master/docs/Modes.md
默认支持常见的 16中语言,常用的 mode

  • html,css
  • json
  • javascript,typescript,jsx
  • sql
    1. [
    2. "csharp","css","elixir",
    3. "golang","handlebars","html",
    4. "java","javascript","json",
    5. "markdown","mysql","python",
    6. "ruby","sass","typescript",
    7. "xml"
    8. ]

theme

默认支持 10种主题,常用的主题有

  • github,solarized_light 亮色
  • monokai,solarized_dark 暗色
    1. [
    2. "github","kuroir","monokai",
    3. "solarized_dark","solarized_light","terminal",
    4. "textmate","tomorrow","twilight",
    5. "xcode"
    6. ]

AceEditor事件

Ace参数及事件 https://github.com/securingsincity/react-ace/blob/master/docs/Ace.md

  1. onLoad 编辑器加载时调用。第一个参数是编辑器的实例 ace
  2. onBeforeLoad 编辑器加载之前调用。第一个参数是的实例ace
  3. onChange 文档改变,有2个参数,每个编辑器的值和事件
  4. onCopy 编辑器copy事件触发,将文本作为参数传递
  5. onPaste 编辑器paste事件触发,将文本作为参数传递
  6. onSelectionChange 编辑器selectionChange事件触发
    1. 将Selection作为第一个参数传递,事件作为第二个参数传递
  7. onCursorChange 编辑器changeCursor事件触发
    1. 将Selection作为第一个参数传递,事件作为第二个参数传递
  8. onFocus 编辑器focus事件触发
  9. onBlur 编辑器blur事件触发
  10. onInput 编辑器input事件触发
  11. onScroll 编辑器scroll事件触发

onPaste 粘贴

onCopy 复制

getCompletions 自定义代码段

  1. const completers = [
  2. {
  3. name: 'name',
  4. value: 'one',
  5. score: 100,
  6. meta: '手动添加1'
  7. },
  8. {
  9. name: 'name',
  10. value: 'two',
  11. score: 100,
  12. meta: '手动添加2'
  13. }
  14. ];
  15. complete(editor) {
  16. const snippet = {
  17. getCompletions: (callback) => {
  18. callback(null, completers);
  19. }
  20. }
  21. //向编辑器中添加自动补全列表
  22. editor.completers.push(snippet);
  23. }

DiffEditor 代码对比

https://github.com/securingsincity/react-ace/blob/master/docs/Diff.md

AceEditor 常见问题

webpack-resolver 打包问题

加上 webpack-resolver 打包后, 40.1MB
文件被拆分成一个个小文件

  1. import AceEditor from 'react-ace';
  2. // import 'ace-builds/webpack-resolver';
  3. import 'ace-builds/src-noconflict/mode-json';

未捕获的DOMException:无法在’WorkerGlobalScope’上执行’importScripts’
http://localhost:9000/worker-html.js'上的脚本无法加载
https://github.com/securingsincity/react-ace/issues/725
解决:setOptions={{ useWorker: false }}

react-ace参考:react-ace实现代码编辑
https://www.jianshu.com/p/cc9f5eb87aa2