上两篇文章讲解了CKEditor5的基本使用,本文主要讲解CKEditor的高级使用,包括自定义编辑栏插件、自定义上传图片、插件的详细配置。
博主用到的React框架是react-app-rewired+customize-cra配置,这一点和webpack有所不同,webpack的配置方式可以参照CKEditor5的官网配置,官网给出的配置是根据webpack来配置的,链接为:https://ckeditor.com/docs/ckeditor5/latest/builds/guides/integration/frameworks/react.html,本文就react-app-rewired+customize-cra进行讲解
这里主要讲解CKEditor5插件依赖下载
yarn add @ckeditor/ckeditor5-adapter-ckfinder@ckeditor/ckeditor5-autoformat@ckeditor/ckeditor5-basic-styles@ckeditor/ckeditor5-block-quote@ckeditor/ckeditor5-build-classic@ckeditor/ckeditor5-ckfinder@ckeditor/ckeditor5-code-block@ckeditor/ckeditor5-dev-webpack-plugin@ckeditor/ckeditor5-easy-image@ckeditor/ckeditor5-editor-classic@ckeditor/ckeditor5-essentials@ckeditor/ckeditor5-heading@ckeditor/ckeditor5-highlight@ckeditor/ckeditor5-indent@ckeditor/ckeditor5-link@ckeditor/ckeditor5-list@ckeditor/ckeditor5-media-embed@ckeditor/ckeditor5-paragraph@ckeditor/ckeditor5-paste-from-office@ckeditor/ckeditor5-react@ckeditor/ckeditor5-table@ckeditor/ckeditor5-theme-lark
const path = require('path')
const { styles } = require('@ckeditor/ckeditor5-dev-utils');
const CKEditorWebpackPlugin = require('@ckeditor/ckeditor5-dev-webpack-plugin');const {override,fixBabelImports,addLessLoader,addWebpackAlias,addWebpackModuleRule,addWebpackPlugin
} = require('customize-cra')module.exports = override(fixBabelImports('import', {libraryName: "antd", libraryDirectory: "lib",style: "css"}),addLessLoader({JavascriptEnabled: true,modifyVars: {"font-size-base": "12px","text-color": 'rgba(0, 0, 0, .85)',"btn-height-base": '24px',"input-height-base": '24px',"form-item-margin-bottom": '8px'}}),addWebpackAlias({'@': path.resolve(__dirname, 'src'),'components': path.resolve(__dirname, 'src/components'),'utils': path.resolve(__dirname, 'src/utils'),'views': path.resolve(__dirname, 'src/views'),'img': path.resolve(__dirname, 'src/img')}),addWebpackModuleRule({ test: /ckeditor5-[^/\\]+[/\\]theme[/\\]icons[/\\][^/\\]+\.svg$/, use: ['raw-loader'] }),addWebpackModuleRule({test: /ckeditor5-[^/\\]+[/\\]theme[/\\].+\.css$/,use: [{ loader: 'style-loader' },//{ loader: "css-loader" },{loader: 'postcss-loader',options: styles.getPostCssConfig({themeImporter: {themePath: require.resolve('@ckeditor/ckeditor5-theme-lark')},minify: true})}]}),addWebpackModuleRule({test: /\.html$/, use: ['html-loader']}),addWebpackPlugin(new CKEditorWebpackPlugin({//See https://ckeditor.com/docs/ckeditor5/latest/features/ui-language.htmllanguage: 'zh-cn'})))
这里不能直接使用@ckeditor/ckeditor5-build-classic这个包了,因为这个包已经包含了很多插件,我们需要加入的代码编辑器插件与其冲突,所以只能用@ckeditor/ckeditor5-editor-classic/src/classiceditor,然后把插件一个个加载
import React from 'react'
import CKEditor from '@ckeditor/ckeditor5-react';
import ClassicEditor from '@ckeditor/ckeditor5-editor-classic/src/classiceditor'
import Essentials from '@ckeditor/ckeditor5-essentials/src/essentials';
import UploadAdapter from '@ckeditor/ckeditor5-adapter-ckfinder/src/uploadadapter';
import Autoformat from '@ckeditor/ckeditor5-autoformat/src/autoformat';
import Bold from '@ckeditor/ckeditor5-basic-styles/src/bold';
import Italic from '@ckeditor/ckeditor5-basic-styles/src/italic';
import BlockQuote from '@ckeditor/ckeditor5-block-quote/src/blockquote';
import Heading from '@ckeditor/ckeditor5-heading/src/heading';
import Image from '@ckeditor/ckeditor5-image/src/image';
import ImageCaption from '@ckeditor/ckeditor5-image/src/imagecaption';
import ImageStyle from '@ckeditor/ckeditor5-image/src/imagestyle';
import ImageToolbar from '@ckeditor/ckeditor5-image/src/imagetoolbar';
import ImageUpload from '@ckeditor/ckeditor5-image/src/imageupload';
import Indent from '@ckeditor/ckeditor5-indent/src/indent';
import Link from '@ckeditor/ckeditor5-link/src/link';
import List from '@ckeditor/ckeditor5-list/src/list';
import Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph';
import PasteFromOffice from '@ckeditor/ckeditor5-paste-from-office/src/pastefromoffice';
import Table from '@ckeditor/ckeditor5-table/src/table';
import TableToolbar from '@ckeditor/ckeditor5-table/src/tabletoolbar';
import CodeBlock from '@ckeditor/ckeditor5-code-block/src/codeblock'
import Highlight from '@ckeditor/ckeditor5-highlight/src/highlight';
import ImageResize from '@ckeditor/ckeditor5-image/src/imageresize'import MyCustomUploadAdapterPlugin from './MyUploadAdapter'//图片上传插件,下一个章节会讲解export default class BCKEditor extends React.Component {constructor(props) {super(props)this.state = {}}render() {return (
}
自定义图片上传插件
这里用到的文件名为MyUploadAdapter.js,导出的方法为:MyCustomUploadAdapterPlugin,在上一个步骤的,extraPlugins已经配置
import { uploadFile } from '@/api'
import { message } from 'antd'export default function MyCustomUploadAdapterPlugin( editor ) {editor.plugins.get( 'FileRepository' ).createUploadAdapter = ( loader ) => {return new MyUploadAdapter( loader );};
}class MyUploadAdapter {constructor(loader) {this.loader = loader;}upload() {return this.loader.file.then(file => new Promise(async (resolve, reject) => {var data = new FormData();data.append("files", file);let res = await uploadFile(data); //axios上传图片的Actionif (res) {let { errno } = res;if (errno === 0) {resolve({ default: res.data[0] });
//res.data[0]为图片的URL,格式为http://127.0.0.1/image/1.jpg} else { reject(message) }} else {message.error('图片上传失败')}}));}abort() {console.log('暂停上传')}}
axios中uploadFile 方法
export function uploadFile(params) {return request.post('/file/upload', params, fileHeaders)
}
到这里了还需要添加SpringBoot后台上传依赖,具体Action代码为
&#64;PostMapping(value &#61; "/file/upload")public Map<String, Object> fileUpload(&#64;RequestParam(value &#61; "files") MultipartFile file, Model model,
HttpServletRequest request) {Map<String, Object> map &#61; new HashMap<String, Object>();List<String> list &#61; new ArrayList<String>();if (file.isEmpty()) {System.out.println("文件为空");}String fileName &#61; file.getOriginalFilename(); // 文件名String suffixName &#61; fileName.substring(fileName.lastIndexOf(".")); // 后缀名fileName &#61; UUID.randomUUID() &#43; suffixName; // 新文件名File dest &#61; new File(ApplicationAutoConfiguration.filePath &#43; fileName);if (!dest.getParentFile().exists()) {dest.getParentFile().mkdirs();}try {file.transferTo(dest);} catch (IOException e) {e.printStackTrace();}String prefix &#61; Utils.getUrlPrefix(domainName, port);String filename &#61; prefix &#43; ApplicationAutoConfiguration.filePrefix &#43; "/" &#43; fileName;//filename为文件的全路径&#xff0c;格式为http://127.0.0.1/images/1.jpglist.add(filename);map.put("errno", 0);map.put("data", list);return map;}
CKEditor5的编辑器高度是自动的&#xff0c;需要自己设置指定的高度&#xff0c;找到CKEditor5的css样式来修改&#xff0c;如下
.myckeditor .ck-editor__main{height: 500px;
}.myckeditor .ck-content{height: 500px;
}
CKEditor5是通过插件来进行菜单栏的配置和扩展&#xff0c;不能沿用原来的&#64;ckeditor/ckeditor5-build-classic&#xff0c;需要使用新的编辑器&#64;ckeditor/ckeditor5-editor-classic/src/classiceditor&#xff0c;并且把菜单的依赖插件一个个加载并且导入&#xff0c;比较重要的是webpack的配置以及自定义上传文件。今天的分析就到这里&#xff0c;遇到什么问题解决不了可以给我留言。