Contribute to this guide

guide更新至 CKEditor 5 v32.x

更新 CKEditor 5 安装时,请确保 所有软件包的版本一致,以避免错误。

对于自定义版本,您可以尝试删除 package-lock.jsonyarn.lock 文件(如果适用)并重新安装所有软件包,然后再重建编辑器。为了获得最佳效果,请确保使用最新的软件包版本。

# 更新至 CKEditor 5 v32.0.0

发布于 2022 年 1 月 31 日。

有关 32.0.0 版本中引入的所有更改,请参阅 CKEditor 5 v32.0.0 的发布说明

以下是升级到 CKEditor 5 v32.0.0 时需要注意的最重要的更改。

# Node.js 最低版本提升至 14.x

Node.js 12 将于 2022 年 4 月 结束长期支持。因此,从 v32.0.0 开始,CKEditor 5 所需的 Node.js 最低版本将为 14。

# ListStyle 插件现已弃用

由于引入了新的 列表属性,以前使用的 ListStyle 插件已过时,因为它被 ListProperties 插件取代。请参考 列表功能安装指南,了解如何处理升级。

# 修订历史

修订历史功能已适应即将推出的实时编辑集成支持。不幸的是,这为异步集成引入了几个重大更改。您可以在下面找到迁移说明。我们还建议您重新阅读 修订历史集成指南

如果在迁移到 CKEditor 5 v32.0.0 时遇到任何问题,请联系我们的 支持团队

# 修订数据

修订模型已更改,以及存储在数据库中的属性列表。以下是更改摘要

  • 添加了新的属性 #fromVersion#toVersion,需要将其存储在您的数据库中。对于现有修订,将这些属性的值设置为 0
  • 初始修订的修订 ID 将设置为文档 ID 或 'initial' 值。确保您要么设置 collaboration.channelId 配置变量,要么允许存储具有相同 ID(在不同文档中)的多个修订。
  • Revision#isLocked 属性已被删除,因为它不再需要。您可以将其从存储在数据库中的修订中删除。
  • Revision#data 属性已重命名为 #diffData。重命名存储在数据库中的修订的此属性。

调整您的集成,以便修订数据正确保存到您的数据库中

# 修订历史适配器

适配器接口已更改

RevisionHistoryAdapter#getRevisions() 方法已删除。您需要直接在适配器中获取和添加修订数据

/* Before v32.0.0 */
class RevisionHistoryIntegration extends Plugin {
    init() {
        const revisionHistory = editor.plugins.get( 'RevisionHistory' );

        // ...

        revisionHistory.adapter = {
            getRevisions: () => {
                return this._getRevisions();
            }
            // ...
        };
    }

    _getRevisions() {
        // An example of an asynchronous call to the database
        // that fetches the revisions data for the document.
        // Do not return the `diffData` property for these revisions!
        return fetch( /* ... */ ).then( /* ... */ );
    }
}
/* After v32.0.0 */
class RevisionHistoryIntegration extends Plugin {
    async init() {
        const revisionHistory = editor.plugins.get( 'RevisionHistory' );

        // ...

        revisionHistory.adapter = {
            // ...
        };

        const revisionsData = await this._getRevisions();

        for ( const revisionData of revisionsData ) {
            revisionHistory.addRevisionData( revisionData );
        }
    }

    _getRevisions() {
        return fetch( /* ... */ ).then( /* ... */ );
    }
}

请记住,您仍然可以在网页源代码中直接传递修订数据 (revisionsData),而不是进行异步调用。

适配器方法 #addRevision()#updateRevision() 已被删除,取而代之的是 #updateRevisions(),需要实现此方法。新方法在单个请求中更新和/或保存一个或多个修订。输入参数是包含修订数据的对象数组。这些可能是新修订或现有修订。每个对象都包含一个修订 ID,应检查此 ID 以验证给定修订是否已存在于您的数据库中。对于新修订,数据对象包含所有修订数据。对于现有修订,只传递更新的属性

/* Before v32.0.0 */
const revisionHistory = editor.plugins.get( 'RevisionHistory' );

revisionHistory.adapter = {
    // ...
    addRevision: ( revisionData ) => {
        // `revisionData` contains the data for a new revision.
        // Make an asynchronous call to you backend that will save the revision.
        return fetch( /* ... */ );
    },
    updateRevision: ( revisionData ) => {
        // `revisionData` contains updated data for an existing revision.
        // Make an asynchronous call to you backend that will update the revision.
        return fetch( /* ... */ );
    }
};
/* After v32.0.0 */
const revisionHistory = editor.plugins.get( 'RevisionHistory' );

revisionHistory.adapter = {
    // ...
    updateRevisions: ( revisionsData ) => {
        // `revisionsData` contains one or multiple
        // revision data objects for new and/or updated revisions.
        //
        // Make one asynchronous call to your backend that will update all the revisions.
        return fetch( /* ... */ );
    }
};

# 修订历史 API 和自动保存集成

RevisionTracker#updateRevision() 方法已删除,取而代之的是 #update()#saveRevision()

以前,#updateRevision() 可以更新最新的修订或创建新的修订(如果最新的修订先前已被锁定)。现在,修订生命周期 已简化,不再需要“锁定”。#updateRevision() 实用程序已拆分为两个更“精确”的方法,这些方法更清楚地传达了其使用的结果。我们相信新方法更容易理解。

/* Before v32.0.0 */
const revisionTracker = editor.plugins.get( 'RevisionTracker' );

// Update the most recent revision with the newest document changes:
revisionTracker.updateRevision();
// Lock the most recent revision so that new changes cannot be added to it:
revisionTracker.updateRevision( { name: 'My revision', isLocked: true } );
// New changes would be added to a new revision
// (with or without specifying the revision name):
revisionTracker.updateRevision();
// Naming revision automatically locked it.
revisionTracker.updateRevision( { name: 'Another revision' } );
/* After v32.0.0 */
const revisionTracker = editor.plugins.get( 'RevisionTracker' );

// Update the most recent revision with the unsaved document changes:
revisionTracker.update();
// Save all unsaved changes as a new revision:
revisionTracker.saveRevision( { name: 'My revision' } );
// After some time, new changes can be added as unsaved changes or as a new revision:
revisionTracker.update();
revisionTracker.saveRevision( { name: 'Another revision' } );

这些方法可能已在您的自动保存集成中使用。请参考文档,查看更新后的 自动保存集成示例