CKEditor 使用总结

1,462 阅读2分钟

背景

项目中需要新增系统说明功能,需要使用富文本编辑框实现系统说明的实时修改,选择了较为成熟的前端富文本解决方案CKEditor来实现。

CKEditor4与CKEditor5 比较

CKEditor5将富文本编辑框的几乎所有功能做了模块化分解,其特点总结如下:

使用方式优点缺点
下载源码,然后进行定制化配置 ,编译后将编译后的代码引入项目中不需要单独编译,不影响原有项目编译速度代码需要单独维护,且如果需要更改配置,需要重新编译打包
引入项目中方便修改配置需要更改原项目的webpack配置,并影响打包效率

除此之外,CKEditor5 版本最不方便的地方在于getData获取的表单不带有样式,不能直接显示,需要放在容器中才能自动继承容器中的样式。

CKEditor4给我的感觉就是文档更为详细,更容易入手,而且几乎所有功能只需要做配置,缺点可能是因为没有做模块化分离,更能代码上更为臃肿。

CKEditor5 使用总结

图片上传

需要自定义图片上传方法,并且如果上传失败,需要清除已经上传的图片

class UploadAdapter {
  constructor(loader, editor) {
    this.loader = loader;
    this.editor = editor;
    this.oldValue = editor.getData();
  }
  upload() {
    return new Promise((resolve, reject) => {
      const data = new FormData();
      data.append('upload', this.loader.file);
      data.append('allowSize', 10); //允许图片上传的大小/兆
      fetch({
        path: '/help/uploadImg',
        method: 'POST',
        postData: data,
        success: function (res) {
          resolve({
            default: res.url
          });
        },
        error: (res) => {
          this.editor.setData(this.oldValue);
          handleError({ message: res.message });
          reject(res.message);
        }
      });
    });
  }
  abort() {}
}
export default UploadAdapter;

CKEditor4 使用总结

高度适配

height:
            window.innerWidth > 1560
              ? window.innerHeight - 175
              : window.innerHeight - 205,

说明,因为上面的编辑框没有做两行,因此在1560分辨率以下会变成两行

多语言适配

直接使用language进行配置,需要注意切换语言需要重新渲染整个CKEditor组件

内容显示

<div
      style={{ height: window.innerHeight - 150 }}
      className='ckeditor-con'
      dangerouslySetInnerHTML={{ __html: data }}
    ></div>

超出内容显示滚动条

  .ckeditor-con {
    margin: 20px;
    overflow-y: auto;
  }

解决Token认证问题

需要在请求头部设置token的相关信息,并且将withCredentials设置为true(凭据信息(cookie、HTTP认证及客户端SSL证明等)),代码如下所示:

<CKEditor
    onfileUploadRequest={(evt) => {
      var fileLoader = evt.data.fileLoader,
        configXhrHeaders = {
          Authorization: getToken()
        },
        header;
      if (configXhrHeaders) {
        for (header in configXhrHeaders) {
          fileLoader.xhr.setRequestHeader(header, configXhrHeaders[header]);
        }
      }
      fileLoader.xhr.withCredentials = true;
    }}
    config={{...}}
/>