ckeditor5开发

node v22.13.0
pnpm 9.5.0

快速入门

初始化

pnpm init

在这里插入图片描述

安装依赖包

pnpm add @ckeditor/ckeditor5-build-classic --registry http://registry.npm.taobao.org

pnpm add -D vite --registry http://registry.npm.taobao.org

编写代码

修改package.json

"type": "module",
"scripts": {
  "dev": "vite",
  "build": "vite build",
  "preview": "vite preview"
},

新建vite.config.js

import { defineConfig } from 'vite'

export default defineConfig({
    server:{
        host: '127.0.0.1',
        port: 3000,
    }
})

src下新建index.js

import ClassicEditor from "@ckeditor/ckeditor5-build-classic";

ClassicEditor
    .create(document.querySelector('#editor'),{
        licenseKey:'GPL',
    })
    .then(editor => {
        window.editor = editor;
    })
    .catch(error => {
        console.error('There was a problem initializing the editor.', error);
    });

新建index.html

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>CKEditor5</title>
    <style>
        html, body {
            width: 100%;
            height: 100%;
            overflow: hidden;
        }
        .editor-container {
            width: 100%;
            height: 100%;
        }
        #editor{
            width: 100%;
            height: 90%;
        }
    </style>
</head>
<body>
<div class="editor-container">
    <textarea id="editor"></textarea>
</div>
<script type="module" src="/src/index.js"></script>
</body>
</html>

运行

pnpm run dev

结果
在这里插入图片描述

自定义tabbar以及安装需要的组件

新建package.json

{
  "name": "study03",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "build": "webpack --mode production"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@ckeditor/ckeditor5-adapter-ckfinder": "44.1.0",
    "@ckeditor/ckeditor5-alignment": "^44.1.0",
    "@ckeditor/ckeditor5-autoformat": "44.1.0",
    "@ckeditor/ckeditor5-basic-styles": "44.1.0",
    "@ckeditor/ckeditor5-block-quote": "44.1.0",
    "@ckeditor/ckeditor5-ckbox": "44.1.0",
    "@ckeditor/ckeditor5-ckfinder": "44.1.0",
    "@ckeditor/ckeditor5-cloud-services": "44.1.0",
    "@ckeditor/ckeditor5-easy-image": "44.1.0",
    "@ckeditor/ckeditor5-editor-classic": "44.1.0",
    "@ckeditor/ckeditor5-essentials": "44.1.0",
    "@ckeditor/ckeditor5-heading": "44.1.0",
    "@ckeditor/ckeditor5-image": "44.1.0",
    "@ckeditor/ckeditor5-indent": "44.1.0",
    "@ckeditor/ckeditor5-link": "44.1.0",
    "@ckeditor/ckeditor5-list": "44.1.0",
    "@ckeditor/ckeditor5-media-embed": "44.1.0",
    "@ckeditor/ckeditor5-paragraph": "44.1.0",
    "@ckeditor/ckeditor5-paste-from-office": "44.1.0",
    "@ckeditor/ckeditor5-table": "44.1.0",
    "@ckeditor/ckeditor5-typing": "44.1.0"
  },
  "devDependencies": {
    "@ckeditor/ckeditor5-core": "44.1.0",
    "@ckeditor/ckeditor5-dev-translations": "^45.0.0",
    "@ckeditor/ckeditor5-dev-utils": "^45.0.0",
    "@ckeditor/ckeditor5-theme-lark": "44.1.0",
    "css-loader": "5.2.7",
    "esbuild-loader": "4.2.2",
    "postcss-loader": "4.3.0",
    "raw-loader": "4.0.2",
    "style-loader": "3.1.0",
    "terser-webpack-plugin": "^5.0.0",
    "typescript": "5.0.4",
    "webpack": "^5.94.0",
    "webpack-cli": "^5.1.4"
  }
}

pnpm install --registry http://registry.npm.taobao.org
# pnpm add @ckeditor/ckeditor5-alignment --registry http://registry.npm.taobao.org

新建tsconfig.json

{
  "compilerOptions": {
    "types": [],
    "lib": [
      "ES2019", // Must match the "target"
      "ES2020.String",
      "DOM",
      "DOM.Iterable"
    ],
    "noImplicitAny": true,
    "noImplicitOverride": true,
    "strict": true,
    "module": "es6",
    "target": "es2019",
    "sourceMap": true,
    "allowJs": true,
    "moduleResolution": "node",
    "skipLibCheck": true,
    "allowSyntheticDefaultImports": true
  },
  "include": [
    "src/*"
  ]
}

新建webpack.config.mjs

/**
 * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
 * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
 */

/* eslint-env node */

import path from 'path';
import module from 'module';
import { fileURLToPath } from 'url';
import webpack from 'webpack';
import { bundler, loaders } from '@ckeditor/ckeditor5-dev-utils';
import { CKEditorTranslationsPlugin } from '@ckeditor/ckeditor5-dev-translations';
import TerserPlugin from 'terser-webpack-plugin';

const require = module.createRequire( import.meta.url );
const __filename = fileURLToPath( import.meta.url );
const __dirname = path.dirname( __filename );

export default {
	devtool: 'source-map',
	performance: { hints: false },

	entry: path.resolve( __dirname, 'src', 'index.ts' ),

	output: {
		// The name under which the editor will be exported.
		library: 'ClassicEditor',

		path: path.resolve( __dirname, 'build' ),
		filename: 'ckeditor.js',
		libraryTarget: 'umd',
		libraryExport: 'default'
	},

	optimization: {
		minimizer: [
			new TerserPlugin( {
				terserOptions: {
					output: {
						// Preserve CKEditor 5 license comments.
						comments: /^!/
					}
				},
				extractComments: false
			} )
		]
	},

	plugins: [
		new CKEditorTranslationsPlugin( {
			// UI language. Language codes follow the https://en.wikipedia.org/wiki/ISO_639-1 format.
			// When changing the built-in language, remember to also change it in the editor's configuration (src/ckeditor.js).
			language: 'en',
			additionalLanguages: 'all'
		} ),
		new webpack.BannerPlugin( {
			banner: bundler.getLicenseBanner(),
			raw: true
		} )
	],

	module: {
		rules: [
			loaders.getIconsLoader( { matchExtensionOnly: true } ),
			loaders.getStylesLoader( {
				themePath: require.resolve( '@ckeditor/ckeditor5-theme-lark' ),
				minify: true
			} ),
			loaders.getTypeScriptLoader()
		]
	},

	resolve: {
		extensions: [ '.ts', '.js', '.json' ],
		extensionAlias: {
			'.js': [ '.js', '.ts' ]
		}
	}
};


src下新建index.ts

import { ClassicEditor as ClassicEditorBase } from '@ckeditor/ckeditor5-editor-classic';

import { Essentials } from '@ckeditor/ckeditor5-essentials';
import { CKFinderUploadAdapter } from '@ckeditor/ckeditor5-adapter-ckfinder';
import { Autoformat } from '@ckeditor/ckeditor5-autoformat';
import { Bold, Italic } from '@ckeditor/ckeditor5-basic-styles';
import { BlockQuote } from '@ckeditor/ckeditor5-block-quote';
import { CKBox } from '@ckeditor/ckeditor5-ckbox';
import { CKFinder } from '@ckeditor/ckeditor5-ckfinder';
import { EasyImage } from '@ckeditor/ckeditor5-easy-image';
import { Heading } from '@ckeditor/ckeditor5-heading';
import { Image, ImageCaption, ImageStyle, ImageToolbar, ImageUpload, PictureEditing } from '@ckeditor/ckeditor5-image';
import { Indent } from '@ckeditor/ckeditor5-indent';
import { Link } from '@ckeditor/ckeditor5-link';
import { List } from '@ckeditor/ckeditor5-list';
import { MediaEmbed } from '@ckeditor/ckeditor5-media-embed';
import { Paragraph } from '@ckeditor/ckeditor5-paragraph';
import { PasteFromOffice } from '@ckeditor/ckeditor5-paste-from-office';
import { Table, TableToolbar } from '@ckeditor/ckeditor5-table';
import { TextTransformation } from '@ckeditor/ckeditor5-typing';
import { CloudServices } from '@ckeditor/ckeditor5-cloud-services';

import Alignment from '@ckeditor/ckeditor5-alignment/src/alignment';

export default class ClassicEditor extends ClassicEditorBase {
    public static override builtinPlugins = [
        Essentials,
        CKFinderUploadAdapter,
        Autoformat,
        Bold,
        Italic,
        BlockQuote,
        CKBox,
        CKFinder,
        CloudServices,
        EasyImage,
        Heading,
        Image,
        ImageCaption,
        ImageStyle,
        ImageToolbar,
        ImageUpload,
        Indent,
        Link,
        List,
        MediaEmbed,
        Paragraph,
        PasteFromOffice,
        PictureEditing,
        Table,
        TableToolbar,
        TextTransformation,
        Alignment
    ];

    public static override defaultConfig = {
        toolbar: {
            items: [
                'undo', 'redo',
                '|', 'heading','alignment',
                '|', 'bold', 'italic',
                '|', 'link', 'uploadImage', 'insertTable', 'blockQuote', 'mediaEmbed',
                '|', 'bulletedList', 'numberedList', 'outdent', 'indent'
            ]
        },
        image: {
            toolbar: [
                'imageStyle:inline',
                'imageStyle:block',
                'imageStyle:side',
                '|',
                'toggleImageCaption',
                'imageTextAlternative'
            ]
        },
        table: {
            contentToolbar: [
                'tableColumn',
                'tableRow',
                'mergeTableCells'
            ]
        },
        // This value must be kept in sync with the language defined in webpack.config.js.
        language: 'en'
    };
}

打包

pnpm build

测试

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>CkEditor5</title>
    <style>
        * {
            padding: 0;
            margin: 0;
        }

        html,
        body{
            width: 100%;
            height: 100%;
            background: rgba(247, 247, 247, 1);
        }
        .editor-container {
            width: 100%;
            height: 100%;
        }
        #editor{
            width: 100%;
            height: 100%;
        }
    </style>
    </style>
</head>
<body>
<div class="editor-container">
    <textarea  id="editor">
        <p>Hello World!</p>
    </textarea>
</div>
<script src="../build/ckeditor.js"></script>
<script src="../build/translations/zh-cn.js"></script>
<script>
    ClassicEditor.create(document.querySelector('#editor'),{
        licenseKey:'GPL',
        language:'zh-cn',
    })
        .then(editor => {
            window.editor = editor;
        })
        .catch(error => {
            console.error('There was a problem initializing the editor.', error);
        });
</script>
</body>
</html>

在这里插入图片描述

参考

https://github.com/ckeditor/ckeditor5/tree/master/packages/ckeditor5-build-classic
https://blog.youkuaiyun.com/zz00008888/article/details/125737119
https://www.cnblogs.com/wisewrong/p/14325817.html
https://www.cnblogs.com/wp-leonard/p/17903768.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

假装我不帅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值