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