优化构建大小
默认情况下,CKEditor 5 包经过了良好的优化。大部分代码都是树状可摇动的,这意味着在构建过程中,大多数未使用的(或“死”)代码都会被删除。但是,您可以采取一些额外的步骤来进一步优化构建大小,因为默认的安装方法旨在尽可能地对开发人员友好,而不是为了生成尽可能小的构建。
构建大小优化只有在使用 npm 构建和模块捆绑程序时才有可能。CDN 构建无法以这种方式优化,因为它旨在包含所有插件、功能和样式。
# 如何优化构建大小
要优化构建大小,您只需要对导入编辑器、样式以及可选翻译的方式进行一些更改,与快速入门指南中所示的内容相比。您无需在编辑器配置中或使用编辑器的方式中进行任何更改。
# 代码导入
优化构建大小的第一步是只导入您需要的编辑器功能,因为在编辑器配置中添加更多插件会增加构建大小。
下一步是更改导入编辑器功能的方式。目前,您可能正在从以下包中导入它们
import { /* ... */ } from 'ckeditor5';
import { /* ... */ } from 'ckeditor5-premium-features';
这两个包导出了所有编辑器功能,并且大部分都是树状可摇动的。但是,即使未使用,某些代码也可能被添加到构建中。要确保未使用的代码未被导入,您可以直接从包含它们的包中导入编辑器功能。
例如,如果您使用经典编辑器类型以及粗体、斜体和表格功能,您可以像这样更改导入
- import { ClassicEditor, Bold, Italic and Table } from 'ckeditor5';
+ import { ClassicEditor } from '@ckeditor/ckeditor5-editor-classic/dist/index.js';
+ import { Bold, Italic } from '@ckeditor/ckeditor5-basic-styles/dist/index.js';
+ import { Table } from '@ckeditor/ckeditor5-table/dist/index.js';
请注意导入路径中的 /dist/index.js
部分。这对于确保从正确的文件导入编辑器函数非常重要。
要查找正确的包名称,请参阅查找单个包指南。或者,如果您使用的是带有 TypeScript 支持的 IDE,您可以使用 转到定义
功能查找包名称。
# 样式
目前,您可能导入以下一个或两个样式表,具体取决于您是否使用高级功能
import 'ckeditor5/ckeditor5.css';
import 'ckeditor5-premium-features/ckeditor5-premium-features.css';
此类导入很整洁,因为它们非常易读且易于理解。但是,这些样式表包含所有插件和功能的所有样式。如果您想减小构建大小,您可以只导入核心样式以及使用插件的样式。
首先,导入核心样式。它们都是编辑器正常工作所必需的
// Import the core styles.
import '@ckeditor/ckeditor5-theme-lark/dist/index.css';
import '@ckeditor/ckeditor5-clipboard/dist/index.css';
import '@ckeditor/ckeditor5-core/dist/index.css';
import '@ckeditor/ckeditor5-engine/dist/index.css';
import '@ckeditor/ckeditor5-enter/dist/index.css';
import '@ckeditor/ckeditor5-paragraph/dist/index.css';
import '@ckeditor/ckeditor5-select-all/dist/index.css';
import '@ckeditor/ckeditor5-typing/dist/index.css';
import '@ckeditor/ckeditor5-ui/dist/index.css';
import '@ckeditor/ckeditor5-undo/dist/index.css';
import '@ckeditor/ckeditor5-upload/dist/index.css';
import '@ckeditor/ckeditor5-utils/dist/index.css';
import '@ckeditor/ckeditor5-watchdog/dist/index.css';
import '@ckeditor/ckeditor5-widget/dist/index.css';
然后,导入您使用的插件的样式。例如,如果您使用粗体、斜体和表格功能,您可以只导入这些功能的样式
// Import the styles for the features that you use.
import '@ckeditor/ckeditor5-basic-styles/dist/index.css';
import '@ckeditor/ckeditor5-table/dist/index.css';
// ...
关于插件样式,经验法则是从您导入编辑器功能的所有单个包中导入样式。例如,如果您从 @ckeditor/ckeditor5-basic-styles/dist/index.js
导入粗体功能,您也应该导入 @ckeditor/ckeditor5-basic-styles/dist/index.css
。
您可能会注意到某些插件样式表是空的。这是故意的,因为某些插件现在没有样式,但将来可能会有。现在添加导入将确保您不会在发生这种情况时意外错过某些样式。导入空样式表不会增加构建大小。
如果您使用单独的编辑器和内容样式,如编辑器和内容样式指南中所述,您仍然可以在样式路径中添加 -content
和 -editor
后缀
// All styles
import '@ckeditor/ckeditor5-clipboard/dist/index.css';
// Content styles
import '@ckeditor/ckeditor5-clipboard/dist/index-content.css';
// Editor styles
import '@ckeditor/ckeditor5-clipboard/dist/index-editor.css';
# 翻译
默认情况下,编辑器附带美式英语翻译,因此如果您使用它,则无需导入任何其他翻译,从而减小了构建的大小。
但是,如果您需要支持其他语言,设置 UI 语言指南显示了如何导入其他翻译。
例如,如果您需要支持波兰语,您可以像这样导入波兰语翻译
import coreTranslations from 'ckeditor5/translations/pl.js';
import premiumFeaturesTranslations from 'ckeditor5-premium-features/translations/pl.js';
但是,与样式类似,这些文件包含所有插件和功能的翻译。如果您想减小构建大小,您可以只导入核心翻译以及您使用的插件的翻译。
首先,导入核心翻译。它们都是编辑器正常工作所必需的
// Import the core translations.
import clipboardTranslations from '@ckeditor/ckeditor5-clipboard/dist/translations/<LANGUAGE>.js';
import coreTranslations from '@ckeditor/ckeditor5-core/dist/translations/<LANGUAGE>.js';
import enterTranslations from '@ckeditor/ckeditor5-enter/dist/translations/<LANGUAGE>.js';
import selectAllTranslations from '@ckeditor/ckeditor5-select-all/dist/translations/<LANGUAGE>.js';
import uiTranslations from '@ckeditor/ckeditor5-ui/dist/translations/<LANGUAGE>.js';
import undoTranslations from '@ckeditor/ckeditor5-undo/dist/translations/<LANGUAGE>.js';
import uploadTranslations from '@ckeditor/ckeditor5-upload/dist/translations/<LANGUAGE>.js';
import widgetTranslations from '@ckeditor/ckeditor5-widget/dist/translations/<LANGUAGE>.js';
然后,导入您使用的插件的翻译。例如,如果您使用粗体、斜体和表格功能,您只需导入这些功能的翻译
// Import the translations for the features that you use.
import basicStylesTranslations from '@ckeditor/ckeditor5-basic-styles/dist/translations/<LANGUAGE>.js';
import tableTranslations from '@ckeditor/ckeditor5-table/dist/translations/<LANGUAGE>.js';
与样式一样,经验法则是从您导入编辑器功能的所有单个包中导入翻译。例如,如果您从 @ckeditor/ckeditor5-basic-styles/dist/index.js
包中导入粗体功能,您也应该从 @ckeditor/ckeditor5-basic-styles/translations/<LANGUAGE>.js
文件中导入翻译。
某些插件可能没有翻译。在这种情况下,您无需为它们导入翻译。
# 结果
让我们看看将上述优化应用于一个包含经典编辑器、免费和高级功能以及波兰语翻译的示例项目后,构建大小如何变化。
优化前的代码
import {
ClassicEditor,
Essentials,
CKFinderUploadAdapter,
Autoformat,
Bold,
Italic,
BlockQuote,
CKBox,
CKFinder,
EasyImage,
Heading,
Image,
ImageCaption,
ImageStyle,
ImageToolbar,
ImageUpload,
PictureEditing,
Indent,
Link,
List,
MediaEmbed,
Paragraph,
PasteFromOffice,
Table,
TableToolbar,
TextTransformation,
CloudServices,
Mention
} from 'ckeditor5';
import { CaseChange, SlashCommand } from 'ckeditor5-premium-features';
import coreTranslations from 'ckeditor5/translations/pl.js';
import commercialTranslations from 'ckeditor5-premium-features/translations/pl.js';
import 'ckeditor5/ckeditor5.css';
import 'ckeditor5-premium-features/ckeditor5-premium-features.css';
ClassicEditor.create( document.querySelector( '#editor' ), {
plugins: [
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,
Mention,
CaseChange,
SlashCommand
],
licenseKey: '<LICENSE_KEY>', // Replace this with your license key.
toolbar: {
items: [
'undo', 'redo',
'|', 'heading',
'|', 'bold', 'italic',
'|', 'link', 'uploadImage', 'insertTable', 'blockQuote', 'mediaEmbed',
'|', 'bulletedList', 'numberedList', 'outdent', 'indent', 'caseChange'
]
},
image: {
toolbar: [
'imageStyle:inline',
'imageStyle:block',
'imageStyle:side',
'|',
'toggleImageCaption',
'imageTextAlternative'
]
},
table: {
contentToolbar: [
'tableColumn',
'tableRow',
'mergeTableCells'
]
},
translations: [
coreTranslations,
commercialTranslations
],
language: 'pl'
} );
优化后的代码
import { ClassicEditor } from '@ckeditor/ckeditor5-editor-classic/dist/index.js';
import { Essentials } from '@ckeditor/ckeditor5-essentials/dist/index.js';
import { CKFinderUploadAdapter } from '@ckeditor/ckeditor5-adapter-ckfinder/dist/index.js';
import { Autoformat } from '@ckeditor/ckeditor5-autoformat/dist/index.js';
import { Bold, Italic } from '@ckeditor/ckeditor5-basic-styles/dist/index.js';
import { BlockQuote } from '@ckeditor/ckeditor5-block-quote/dist/index.js';
import { CKBox } from '@ckeditor/ckeditor5-ckbox/dist/index.js';
import { CKFinder } from '@ckeditor/ckeditor5-ckfinder/dist/index.js';
import { CloudServices } from '@ckeditor/ckeditor5-cloud-services/dist/index.js';
import { EasyImage } from '@ckeditor/ckeditor5-easy-image/dist/index.js';
import { Heading } from '@ckeditor/ckeditor5-heading/dist/index.js';
import { Image, ImageCaption, ImageStyle, ImageToolbar, ImageUpload, PictureEditing } from '@ckeditor/ckeditor5-image/dist/index.js';
import { Indent } from '@ckeditor/ckeditor5-indent/dist/index.js';
import { Link } from '@ckeditor/ckeditor5-link/dist/index.js';
import { List } from '@ckeditor/ckeditor5-list/dist/index.js';
import { MediaEmbed } from '@ckeditor/ckeditor5-media-embed/dist/index.js';
import { Paragraph } from '@ckeditor/ckeditor5-paragraph/dist/index.js';
import { PasteFromOffice } from '@ckeditor/ckeditor5-paste-from-office/dist/index.js';
import { Table, TableToolbar } from '@ckeditor/ckeditor5-table/dist/index.js';
import { TextTransformation } from '@ckeditor/ckeditor5-typing/dist/index.js';
import { Mention } from '@ckeditor/ckeditor5-mention/dist/index.js';
import { CaseChange } from '@ckeditor/ckeditor5-case-change/dist/index.js';
import { SlashCommand } from '@ckeditor/ckeditor5-slash-command/dist/index.js';
import clipboardTranslations from '@ckeditor/ckeditor5-clipboard/dist/translations/pl.js';
import coreTranslations from '@ckeditor/ckeditor5-core/dist/translations/pl.js';
import enterTranslations from '@ckeditor/ckeditor5-enter/dist/translations/pl.js';
import selectAllTranslations from '@ckeditor/ckeditor5-select-all/dist/translations/pl.js';
import uiTranslations from '@ckeditor/ckeditor5-ui/dist/translations/pl.js';
import undoTranslations from '@ckeditor/ckeditor5-undo/dist/translations/pl.js';
import uploadTranslations from '@ckeditor/ckeditor5-upload/dist/translations/pl.js';
import widgetTranslations from '@ckeditor/ckeditor5-widget/dist/translations/pl.js';
import autoformatTranslations from '@ckeditor/ckeditor5-autoformat/dist/translations/pl.js';
import basicStylesTranslations from '@ckeditor/ckeditor5-basic-styles/dist/translations/pl.js';
import blockQuoteTranslations from '@ckeditor/ckeditor5-block-quote/dist/translations/pl.js';
import ckboxTranslations from '@ckeditor/ckeditor5-ckbox/dist/translations/pl.js';
import ckfinderTranslations from '@ckeditor/ckeditor5-ckfinder/dist/translations/pl.js';
import headingTranslations from '@ckeditor/ckeditor5-heading/dist/translations/pl.js';
import imageTranslations from '@ckeditor/ckeditor5-image/dist/translations/pl.js';
import indentTranslations from '@ckeditor/ckeditor5-indent/dist/translations/pl.js';
import linkTranslations from '@ckeditor/ckeditor5-link/dist/translations/pl.js';
import listTranslations from '@ckeditor/ckeditor5-list/dist/translations/pl.js';
import mediaEmbedTranslations from '@ckeditor/ckeditor5-media-embed/dist/translations/pl.js';
import tableTranslations from '@ckeditor/ckeditor5-table/dist/translations/pl.js';
import caseChangeTranslations from '@ckeditor/ckeditor5-case-change/dist/translations/pl.js';
import slashCommandTranslations from '@ckeditor/ckeditor5-slash-command/dist/translations/pl.js';
import '@ckeditor/ckeditor5-theme-lark/dist/index.css';
import '@ckeditor/ckeditor5-clipboard/dist/index.css';
import '@ckeditor/ckeditor5-core/dist/index.css';
import '@ckeditor/ckeditor5-engine/dist/index.css';
import '@ckeditor/ckeditor5-enter/dist/index.css';
import '@ckeditor/ckeditor5-paragraph/dist/index.css';
import '@ckeditor/ckeditor5-select-all/dist/index.css';
import '@ckeditor/ckeditor5-typing/dist/index.css';
import '@ckeditor/ckeditor5-ui/dist/index.css';
import '@ckeditor/ckeditor5-undo/dist/index.css';
import '@ckeditor/ckeditor5-upload/dist/index.css';
import '@ckeditor/ckeditor5-utils/dist/index.css';
import '@ckeditor/ckeditor5-watchdog/dist/index.css';
import '@ckeditor/ckeditor5-widget/dist/index.css';
import '@ckeditor/ckeditor5-editor-classic/dist/index.css';
import '@ckeditor/ckeditor5-essentials/dist/index.css';
import '@ckeditor/ckeditor5-adapter-ckfinder/dist/index.css';
import '@ckeditor/ckeditor5-autoformat/dist/index.css';
import '@ckeditor/ckeditor5-basic-styles/dist/index.css';
import '@ckeditor/ckeditor5-block-quote/dist/index.css';
import '@ckeditor/ckeditor5-ckbox/dist/index.css';
import '@ckeditor/ckeditor5-ckfinder/dist/index.css';
import '@ckeditor/ckeditor5-cloud-services/dist/index.css';
import '@ckeditor/ckeditor5-easy-image/dist/index.css';
import '@ckeditor/ckeditor5-heading/dist/index.css';
import '@ckeditor/ckeditor5-image/dist/index.css';
import '@ckeditor/ckeditor5-indent/dist/index.css';
import '@ckeditor/ckeditor5-link/dist/index.css';
import '@ckeditor/ckeditor5-list/dist/index.css';
import '@ckeditor/ckeditor5-media-embed/dist/index.css';
import '@ckeditor/ckeditor5-paragraph/dist/index.css';
import '@ckeditor/ckeditor5-paste-from-office/dist/index.css';
import '@ckeditor/ckeditor5-table/dist/index.css';
import '@ckeditor/ckeditor5-typing/dist/index.css';
import '@ckeditor/ckeditor5-mention/dist/index.css';
import '@ckeditor/ckeditor5-case-change/dist/index.css';
import '@ckeditor/ckeditor5-slash-command/dist/index.css';
ClassicEditor.create( document.querySelector( '#editor' ), {
plugins: [
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,
Mention,
CaseChange,
SlashCommand
],
licenseKey: '<LICENSE_KEY>', // Replace this with your license key.
toolbar: {
items: [
'undo', 'redo',
'|', 'heading',
'|', 'bold', 'italic',
'|', 'link', 'uploadImage', 'insertTable', 'blockQuote', 'mediaEmbed',
'|', 'bulletedList', 'numberedList', 'outdent', 'indent', 'caseChange'
]
},
image: {
toolbar: [
'imageStyle:inline',
'imageStyle:block',
'imageStyle:side',
'|',
'toggleImageCaption',
'imageTextAlternative'
]
},
table: {
contentToolbar: [
'tableColumn',
'tableRow',
'mergeTableCells'
]
},
translations: [
clipboardTranslations,
coreTranslations,
enterTranslations,
selectAllTranslations,
uiTranslations,
undoTranslations,
uploadTranslations,
widgetTranslations,
autoformatTranslations,
basicStylesTranslations,
blockQuoteTranslations,
ckboxTranslations,
ckfinderTranslations,
headingTranslations,
imageTranslations,
indentTranslations,
linkTranslations,
listTranslations,
mediaEmbedTranslations,
tableTranslations,
caseChangeTranslations,
slashCommandTranslations,
],
language: 'pl'
} );
项目优化前后的构建大小如下所示
优化前 | 优化后 | 改进 | |
---|---|---|---|
JavaScript | 1,248.02 kB | 1,029.01 kB | -17.55% |
CSS | 340.45 kB | 172.84 kB | -49.23% |
压缩后的 JavaScript | 343.56 kB | 288.84 kB | -15.93% |
压缩后的 CSS | 46.16 kB | 28.71 kB | -37.80% |
由于上述优化,我们能够将总构建大小(JavaScript + CSS)减少 386.62 kB
(72.17 kB
压缩后),实际上使我们获得了原始大小的 ~75-80%。这些结果会根据您使用的功能而有所不同。
我们每天都在努力使我们的文档保持完整。您是否发现过时的信息?是否缺少某些内容?请通过我们的问题跟踪器报告。
随着版本 42.0.0 的发布,我们重写了大部分文档以反映新的导入路径和功能。感谢您的反馈,帮助我们确保其准确性和完整性。