概述

TinyMCE 从版本 4 到版本 8.0 经历了重大演进,引入了主要架构变更、现代 UI 改进、性能增强和更好的安全性。本综合指南概述了从 TinyMCE v4 升级到 v8.0 所需的关键破坏性变更、推荐的迁移操作步骤和顶级配置调整。

本指南提供了从 TinyMCE 4 到 TinyMCE 8 的完整迁移路径,在一个综合文档中涵盖了版本 5、6、7 和 8 的所有变更。

关键变更

UI 主题和皮肤

  • 已移除:modern、lightgray 和 mobile 主题/皮肤。

  • 新增:带有 oxide 皮肤的 silver 主题(支持浅色和深色变体)。请参阅 customize-ui。

  • 影响:自定义 v4 皮肤/主题与 v8.0 不兼容,必须使用 oxide 皮肤结构重写。

示例:
tinymce.init({
  selector: "textarea",
  skin: "oxide-dark",
  content_css: "dark",
});

插件生态系统

TinyMCE 插件生态系统在版本 5、6 和 7 中进行了重大重组,一些插件被移除、合并到 TinyMCE 核心中,或重新归类为高级功能。以下细分明确了每个受影响插件的状态。

  • 已移除的插件(自 TinyMCE 6.0 起不再可用):

    • bbcode,legacyoutput:在 5.9.0 中已弃用。在 6.0 中移除。

    • imagetools:在 6.0 中移除。由高级 Enhanced Image Editing 功能取代,可通过 TinyMCE 6.0 中引入的 editimage 插件使用。

  • 集成到 TinyMCE 核心中:

    • paste,hr,noneditable,table,print,colorpicker 和 contextmenu:这些插件已被吸收到 TinyMCE 核心中,不再需要单独安装。请参阅 Copy and Paste,Non-editable Content,Table 和 Context Menu 获取更多信息。

    • textcolor:在 6.0 中作为单独插件被移除。文本颜色功能现在通过 forecolor 和 backcolor 工具栏按钮成为 TinyMCE 核心的一部分,无需额外插件即可使用。

    • contextmenu:在版本 5.0 中弃用,随后上下文菜单功能集成到 TinyMCE 核心编辑器中。在版本 6.0 中移除。欲了解更多信息,请参阅 contextmenu 文档。

    • tabfocus:在 6.0 中移除。现在通过浏览器和 TinyMCE 核心处理 Tab 键导航。

  • 现仅限高级版:

    • fullpage:在 6.0 中移除。由高级 Full Page HTML 插件(fullpagehtml)取代。

    • tableofcontents:以前作为开源 toc 插件提供。重命名为 tableofcontents,现在作为高级插件提供。请参阅 Table of Contents 获取更多信息。

    • spellchecker:在 5.9.0 中弃用。在 6.0 中移除。

    • advtemplate:取代用于高级模板用例的 template 插件。

    • template:在 7.0 中移除。由高级 Templates 插件取代。

插件迁移提示

  • contextmenu(在 v6 中移除):

  • bbcode(在 v6 中移除):

    • 如果需要 BBCode 支持,请实现自定义解析或服务器端处理。

  • fullpage(在 v8 中现为高级版):

    • 使用高级 Full Page HTML 插件(fullpagehtml)进行完整 HTML 文档编辑。

  • template(在 v7 中移除):

    • 使用高级 advtemplate 插件或实现自定义模态对话框。

  • textcolor(在 v6 中集成到核心):

    • 文本颜色功能现已内置于 TinyMCE core 中。请使用 forecolor 和 backcolor 工具栏按钮,无需额外插件即可使用。

  • imagetools:(在 v6 中已移除):

工具栏和菜单名称变更

如果您使用过以下工具栏按钮或菜单选项,其名称在 TinyMCE 各主要版本中已发生变更。完整的迁移详情请参阅各版本的发布说明。

TinyMCE 5 → TinyMCE 6:

  • formatselect → blocks (工具栏项)

  • blockformats → blocks (菜单项)

  • styleselect → styles (工具栏项)

  • formats → styles (菜单项)

  • fontselect → fontfamily (工具栏项)

  • fontformats → fontfamily (菜单项)

  • fontsizeselect → fontsize (工具栏项)

  • fontsizes → fontsize (菜单项)

  • imagetools → editimage (插件及相关工具栏项)

  • toc → tableofcontents (插件、菜单项和工具栏项)

  • tocupdate → tableofcontentsupdate (工具栏项)

TinyMCE 6 → TinyMCE 7:

  • InsertOrderedList 和 InsertUnorderedList 命令已从 TinyMCE core 中移除,现由 Lists 插件提供。

  • 默认文本模式触发器已更新为在按下 Space 而非 Enter 时激活。新增 trigger 属性用于配置块级文本模式行为。

TinyMCE 7 → TinyMCE 8:

  • 多个 API 方法已被弃用或移除(详情见下方 API Changes 部分)

  • 许可证密钥系统已更新,采用新的格式要求

  • DOMPurify 内容净化已得到加强

更多详情请参阅 最新发布说明。

请始终查阅最新的插件文档:plugins,以获取最新的可用性信息和迁移指南。
工具栏变更示例:
tinymce.init({
  selector: "textarea",
  toolbar: "undo redo | forecolor backcolor | bold italic | alignleft aligncenter alignright alignjustify",
  plugins: ["lists link image table code"]
});

内容结构

  • 已移除:forced_root_block: false。

    • 要求:所有编辑器内容必须包含在块级元素中(例如 <p>)。更多信息请参阅 forced_root_block。

示例:
tinymce.init({
  selector: "textarea",
  forced_root_block: "p"
});

配置变更

  • 在 TinyMCE 6.0 中已移除:旧版移动端主题已被移除,但仍可通过 mobile 选项支持移动端特定配置。

  • TinyMCE 7.0 中的默认变更:

  • TinyMCE 7.0 中的新增选项:

  • TinyMCE 8.0 中的新增选项:

    • 增强的许可证密钥系统,采用新的格式要求

    • 更严格的 DOMPurify 内容净化,默认启用 SAFE_FOR_XML

    • 新增 crossorigin 配置选项,用于跨域资源加载

示例:
tinymce.init({
  selector: "textarea",
  toolbar: "undo redo | blocks | bold italic | alignleft aligncenter alignright alignjustify | outdent indent | removeformat",
  toolbar_mode: "floating",
  // TinyMCE 8.0 自托管时必需
  license_key: "T8LK:...", // 需要新格式
  // 安全选项现在在 TinyMCE 7.0 中默认启用
  sandbox_iframes: true,
  convert_unsafe_embeds: true,
  // 可选:从 iframe 沙盒中排除特定域
  sandbox_iframes_exclusions: ["youtube.com", "vimeo.com"],
  // 可访问性改进,现在默认启用
  highlight_on_focus: true,
  // TinyMCE 8.0 新增:跨域资源加载
  crossorigin: (url, resourceType) => 'anonymous'
});

许可变更(GPL v2+ 和商业许可)

  • 旧许可:TinyMCE 4 采用 LGPL 2.1 许可。

  • 新许可:TinyMCE 8.0 采用 GPL v2+ 或商业许可。

  • 影响:如果自托管 TinyMCE,License key 选项是编辑器配置的一部分,为必需项。如果您从云端加载 TinyMCE,则此要求不适用。

TinyMCE 8 中的 License Key 系统更新

TinyMCE 8 引入了新的 license key 系统,需要立即关注:

  • 新格式:商业许可的 license key 现在使用前缀 T8LK:,带有高级功能的 GPL 许可使用 GPL+T8LK:

  • 强制要求:自托管部署现在需要一个有效的 license key;如果没有,编辑器将被设置为 readonly

  • License Key Manager:自托管的商业部署需要新的 License Key Manager 插件

欲了解更多详情,请参阅 7→8 迁移指南中的License Key 系统更新。

许可迁移清单:

  • 联系支持获取新的 TinyMCE 8.0 license key,或对开源版本使用 GPL

  • 为商业许可安装 license key manager 插件

  • 使用新的 license key 格式更新配置

  • 用新许可测试编辑器功能

  • 验证所有高级功能是否正常运行

示例:
tinymce.init({
  selector: "textarea",
  license_key: "T8LK:your-license-key" // 需要新格式
});

API 变更

几个 API 方法在版本 5-8 中已被弃用或移除。主要变更包括:

在 TinyMCE 8 中弃用

editor.selection.setContent

editor.selection.setContent API 已被弃用,并将在 TinyMCE 9 中移除。

影响:此变更通过合并插入方法简化了内容操作。

迁移步骤:

若要替换 editor.selection.setContent,请改用 editor.insertContent。新方法与 TinyMCE 中的其他内容操作方法更一致。

使用示例
// 在 TinyMCE 8 中已弃用,将在 9 中移除
editor.selection.setContent('<p>New content</p>');

// 推荐的替代方法
editor.insertContent('<p>New content</p>');

迁移清单:

  • 将所有 editor.selection.setContent 的实例替换为 editor.insertContent

  • 更新使用旧方法的自定义插件

  • 在编辑器实例中测试内容插入

fire() 方法

fire() 方法已被 dispatch() 取代,用于事件处理。为避免名称混淆,fire() 方法将在 TinyMCE 9 中移除。

// 在 TinyMCE 8 中已弃用,将在 9 中移除
// 旧的自定义事件调度方法
editor.fire('someEvent');

// 新的自定义事件调度方法
editor.dispatch('someEvent');

影响:此变更使 TinyMCE 与现代事件处理约定保持一致,使 API 对开发者更直观。

迁移清单:

  • 搜索代码库中所有使用 fire() 方法的地方

  • 将每个实例替换为 dispatch()

  • 审查并更新第三方插件

  • 测试所有自定义事件处理

editor.documentBaseUrl

未记录的 editor.documentBaseUrl 属性已被移除。

使用示例
// 在 TinyMCE 8 中已移除
console.log('documentBaseUrl', editor.documentBaseUrl);

// 改用此方法
console.log('documentBaseURI', editor.editorManager.documentBaseURI.getURI());
对所有 base URL 操作使用 editor.editorManager.documentBaseURI.getURI()。

影响:此变更通过移除与文档记录的 documentBaseURI 属性不一致的未记录 API,提高了 URL 处理的一致性。

迁移步骤:

要将 documentBaseUrl 的所有引用更新为新的 API,请将任何使用 editor.documentBaseUrl(或类似用法)的地方替换为 editor.editorManager.documentBaseURI.getURI()。documentBaseUrl 属性已被移除,现在正确的访问文档基 URL 的方式是通过 editorManager.documentBaseURI 属性,该属性是一个 URI 对象。然后你可以调用其 .getURI() 方法来获取 URL 的字符串值。

迁移清单:

  • 在代码库中搜索所有 editor.documentBaseUrl 的实例。

  • 将其替换为 tinymce.activeEditor.editorManager.documentBaseURI.getURI()(或者如果你有 editor 引用,则使用 editor.editorManager.documentBaseURI.getURI())。

skipFocus 与 skip_focus 的整合(v8)

在 TinyMCE 8.0 中,ToggleToolbarDrawer 命令的 skipFocus 和 skip_focus 选项已被整合为一个更一致的参数。有关更多信息,请参阅 可用命令。

影响:

  • 降低了 API 复杂性

  • 明确了预期行为

  • 需要更新命令调用

示例:
// 旧方法(在 TinyMCE 8 中已弃用)
editor.execCommand('ToggleToolbarDrawer', false, { skipFocus: true });

// 新方法(推荐)
editor.execCommand('ToggleToolbarDrawer', false, null, { skip_focus: true });

迁移清单:

  • 定位所有使用 ToggleToolbarDrawer 命令的地方

  • 在命令选项中将 skipFocus 替换为 skip_focus

  • 更新任何使用此命令的自定义插件

  • 在更改后测试工具栏抽屉行为

已移除的方法

旧版 API 方法(在 v6 中移除)
  • editor.addButton、editor.addMenuItem、editor.windowManager.open(已由 editor.ui.registry.* API 替代)

迁移清单:

  • 将所有 editor.addButton 的实例替换为 editor.ui.registry.addButton

  • 将所有 editor.addMenuItem 的实例替换为 editor.ui.registry.addMenuItem

  • 将所有 editor.windowManager.open 的实例替换为 editor.windowManager.open

  • 更新使用旧方法的自定义插件

  • 在编辑器实例中测试按钮和菜单功能

自动补全器 ch 属性(在 v7 中移除)

ch 配置属性在 TinyMCE 7.0 中已被移除。请改用 trigger 属性。

// 旧方法(在 v7 中移除)
editor.ui.registry.addAutocompleter('myAutocompleter', {
  ch: '@',
  // ... 其他选项
});

// 新方法
editor.ui.registry.addAutocompleter('myAutocompleter', {
  trigger: '@',
  // ... 其他选项
});

迁移清单:

  • 在自动补全器配置中将 ch: '<string>' 替换为 trigger: '<string>'

  • 测试自动补全器功能

  • 更新任何自定义的自动补全器实现

remove_trailing_brs 属性(在 v7 中移除)

在 TinyMCE 7.0 中,remove_trailing_brs 设置已从 DomParser API 中移除,此前该设置在 TinyMCE 6.5 中已被弃用。有关 DomParser 的更多信息,请参阅 DomParser API。

影响:

  • DomParser 不再支持 remove_trailing_brs 选项

  • 这会影响自定义的 DomParser 配置

  • 可能会影响内容解析行为

迁移清单:

  • 从 DomParser 配置中移除 remove_trailing_brs

  • 测试内容解析行为

  • 更新任何自定义的 DomParser 实现

文本模式变更(v7)

TinyMCE 7.0 更新了 text_patterns 的默认行为,使其在用户按下 Space 键而非 Enter 键时应用格式。

影响:

  • 现在 Markdown 风格的格式会在按下 Space 键时触发

  • 可以通过配置 trigger: 'enter' 恢复之前的 Enter 键行为

  • 这会影响所有文本模式,包括标题、列表、引用块和水平线

迁移步骤:

  1. 测试现有的文本模式行为

  2. 如果需要 Enter 键触发,则更新配置

  3. 评估新 Space 键触发的用户体验

  4. 考虑更新关于文本模式行为的用户文档

示例:

// 默认 TinyMCE 7+ 行为(空格键触发)
tinymce.init({
  selector: "textarea",
  text_patterns: [
    { start: '#', format: 'h1', trigger: 'space' },
    { start: '##', format: 'h2', trigger: 'space' },
    { start: '1.', cmd: 'InsertOrderedList', trigger: 'space' },
    { start: '*', cmd: 'InsertUnorderedList', trigger: 'space' },
    { start: '>', cmd: 'mceBlockQuote', trigger: 'space' }
  ]
});

// 恢复之前的行为(回车键触发)
tinymce.init({
  selector: "textarea",
  text_patterns: [
    { start: '#', format: 'h1', trigger: 'enter' },
    { start: '##', format: 'h2', trigger: 'enter' },
    { start: '1.', cmd: 'InsertOrderedList', trigger: 'enter' },
    { start: '*', cmd: 'InsertUnorderedList', trigger: 'enter' },
    { start: '>', cmd: 'mceBlockQuote', trigger: 'enter' }
  ]
});

迁移清单:

  • 测试空格键触发时现有的文本模式行为

  • 如果需要回车键触发,则更新配置

  • 评估新的空格键触发的用户体验

  • 更新关于文本模式行为的用户文档

Autocompleter 配置变更(v7)

自动补全器的 ch 配置属性已被移除。请改用 trigger 属性。

示例:

// 旧版 TinyMCE 6 配置
editor.ui.registry.addAutocompleter('myautocompleter', {
  ch: '@',
  minChars: 2,
  fetch: function(pattern) {
    return Promise.resolve(['item1', 'item2']);
  }
});

// 新版 TinyMCE 7+ 配置
editor.ui.registry.addAutocompleter('myautocompleter', {
  trigger: '@',
  minChars: 2,
  fetch: function(pattern) {
    return Promise.resolve(['item1', 'item2']);
  }
});

迁移清单:

  • 在自动补全器配置中,将 ch: '<string>' 替换为 trigger: '<string>'

  • 测试自动补全器功能

  • 更新任何自定义的自动补全器实现

force_hex_color 选项(v7 中已移除)

force_hex_color 选项已被移除。现在仅将绝对格式的 RGB 值(如 rgb(255, 255, 255))转换为 HEX 值。

文本模式变更(v7)

TinyMCE 7.0 更新了 text_patterns 的默认行为,使其在用户按下 空格键 时应用格式,而不是按下 回车键。

影响:

  • Markdown 风格的格式现在在按下空格键时触发

  • 可以通过配置 trigger: 'enter' 恢复之前回车键的行为

  • 这会影响所有文本模式,包括标题、列表、引用块和水平线

迁移步骤:

  1. 测试现有的文本模式行为

  2. 如果需要回车键触发,则更新配置

  3. 评估新的空格键触发的用户体验

  4. 考虑更新关于文本模式行为的用户文档

示例:

// 默认 TinyMCE 7+ 行为(空格键触发)
tinymce.init({
  selector: "textarea",
  text_patterns: [
    { start: '#', format: 'h1', trigger: 'space' },
    { start: '##', format: 'h2', trigger: 'space' },
    { start: '1.', cmd: 'InsertOrderedList', trigger: 'space' },
    { start: '*', cmd: 'InsertUnorderedList', trigger: 'space' },
    { start: '>', cmd: 'mceBlockQuote', trigger: 'space' }
  ]
});

// 恢复之前的行为(回车键触发)
tinymce.init({
  selector: "textarea",
  text_patterns: [
    { start: '#', format: 'h1', trigger: 'enter' },
    { start: '##', format: 'h2', trigger: 'enter' },
    { start: '1.', cmd: 'InsertOrderedList', trigger: 'enter' },
    { start: '*', cmd: 'InsertUnorderedList', trigger: 'enter' },
    { start: '>', cmd: 'mceBlockQuote', trigger: 'enter' }
  ]
});

在 TinyMCE 7.0 中,table_responsive_width 选项已被 table_sizing_mode 替代。

迁移清单:

  • 在您的配置中,将 table_responsive_width 替换为 table_sizing_mode

  • 更新选项值以匹配新的 API

  • 测试表格的响应式行为

示例:

// 旧版 TinyMCE 6 配置
tinymce.init({
  selector: "textarea",
  table_responsive_width: true
});

// 新版 TinyMCE 7+ 配置
tinymce.init({
  selector: "textarea",
  table_sizing_mode: "responsive"
});

有关完整的 API 迁移详情,请参阅 7→8 迁移指南中的 Core API Changes。

插件变更

移除 Template 插件(v7)

TinyMCE 7.0 中已移除开源的 Template 插件及相关配置选项。

建议使用 template 插件的客户升级到高级版 Templates 插件,该插件提供了增强的模板功能。有关 Templates 插件的更多信息,请参阅:Templates。

已移除的 Template 选项:

  • template_cdate_classes

  • template_cdate_format

  • template_mdate_classes

  • template_mdate_format

  • template_replace_values

  • template_preview_replace_values

  • template_selected_content_classes

迁移检查清单:

  • 如果使用了 template 插件,则从配置中移除它

  • 评估是否需要 premium Templates 插件 (advtemplate)

  • 移除上述所有与 template 相关的配置选项

  • 更新任何自定义模板实现

  • 如果迁移到 premium 插件,则测试模板功能

媒体 URL 解析器更改 (v7)

在 TinyMCE 6 及更早版本中,media_url_resolver 选项提供 resolve 和 reject 回调,而不是 Promise。在 TinyMCE 7 中,media_url_resolver 选项现在需要返回一个 Promise。

旧的实现回调的预期值
tinymce.init({
  selector: 'textarea',
  plugins: 'media',
  toolbar: 'media',
  media_url_resolver: (data, resolve, reject) => {
    if (data.url.indexOf('YOUR_SPECIAL_VIDEO_URL') !== -1) {
      const embedHtml = `<iframe src="${data.url}" width="400" height="400" ></iframe>`;
      resolve({ html: embedHtml });
    } else {
      resolve({ html: '' });
    }
  }
});
新的实现返回 Promise 的预期值
tinymce.init({
  selector: 'textarea',
  plugins: 'media',
  toolbar: 'media',
  media_url_resolver: (data) => {
    return new Promise((resolve) => {
      if (data.url.indexOf('YOUR_SPECIAL_VIDEO_URL') !== -1) {
        const embedHtml = `<iframe src="${data.url}" width="400" height="400" ></iframe>`;
        resolve({ html: embedHtml });
      } else {
        resolve({ html: '' });
      }
    });
  }
});

迁移检查清单:

  • 更新 media_url_resolver 实现以返回 Promise,而不是使用回调

  • 从解析器函数中移除 resolve 和 reject 回调参数

  • 使用更新后的解析器测试媒体嵌入功能

  • 更新任何自定义媒体 URL 解析器实现

UI 和 UX 更改

表格高度更改 (v7)

以前,TinyMCE 在调整表格行(例如在 table 元素、tr 元素和 td 元素上)的大小时会添加许多 height 样式。这会导致不必要的冗长 HTML 输出。

TinyMCE 7.0 通过以下几项更改解决了这个问题:

  • “单元格属性”对话框中已移除高度输入字段。现在,“行属性”对话框是更新行高的唯一方式。

  • 当使用调整大小手柄或“行属性”对话框调整表格大小时,现有 height 样式将从适用的 td/th 元素中移除,并且仅应用于 table 元素和 tr 元素。

TinyMCE 7.0 不提供任何回退机制以恢复到旧行为。

通知关闭按钮 (v7)

在 TinyMCE 的早期版本中,通知可以不显示关闭按钮(X)。可访问性是编辑器的重要组成部分,当通知中没有此按钮时,无法通过键盘导航关闭该通知。

从 TinyMCE 7.0 开始,closeButton 属性已从通知 API中移除,所有通知现在都会显示一个可见的 closeButton。这样可以允许使用 Tab 键关闭通知。

拆分按钮更改 (v8)

在 TinyMCE 8.0 中,拆分工具栏按钮现在渲染为两个不同的组件:一个用于主要操作,一个用于下拉箭头。

此结构更改会修改拆分按钮的 DOM 布局,并可能破坏依赖以前结构的自定义 CSS 规则。

影响:此更改仅影响使用自定义皮肤的集成者。

迁移指南:

如果您的实现包含自定义皮肤,请执行以下步骤以确保兼容性:

  • 确认您的项目是否使用自定义皮肤。

  • 使用 TinyMCE 8.0 代码库重新构建您的自定义皮肤。有关说明,请参阅创建皮肤。

  • 更新您的拆分按钮使用方式以符合新结构,包括对 chevronTooltip 选项的支持。有关更新的配置详细信息,请参阅拆分工具栏按钮。

  • 测试编辑器中拆分按钮的渲染和交互以验证预期行为。

安全更改

沙盒 Iframe (v7)

在 TinyMCE 6.8.1 中,引入了sandbox iframes 编辑器选项,以允许在将 iframe 插入编辑器时默认对其进行沙盒处理。

在TinyMCE 7.0中,sandbox_iframes的默认值将从false更改为true,这意味着插入到编辑器中的所有iframe元素都将默认被赋予sandbox=""属性,从而阻止大多数操作,包括脚本执行和同源访问。这可能会破坏现有的编辑器内容或产生不期望的效果。

为了防止预期的iframe被沙盒化,我们建议将这些iframe的源域添加到新的sandbox_iframes_exclusions选项列表中,并在必要时将其包含在默认列表中。要防止所有iframe被沙盒化,请在编辑器配置中将sandbox_iframes选项设置为false。

转换不安全的嵌入元素(v7)

在TinyMCE 6.8.1中,引入了convert_unsafe_embeds编辑器选项,允许将object和embed元素默认转换为正确的元素,根据其MIME类型,在插入编辑器时自动转换。

在TinyMCE 7.0中,convert_unsafe_embeds的默认值将从false更改为true,这意味着所有object和embed标签在插入编辑器时都将自动转换为不同的元素。

以下是转换前后的示例。
<!-- 转换前 -->
<object type="video/mp4" data="https://sneak-preview.tiny.cloud/3adc27b5-bb2f-49f0-9ccc-72b7c48313b0/bad.mov"></object>

<!-- 转换后 -->
<video src="https://sneak-preview.tiny.cloud/3adc27b5-bb2f-49f0-9ccc-72b7c48313b0/bad.mov" controls="controls"></video>

DOMPurify更新(v8)

TinyMCE 8.0将DOMPurify依赖更新至3.2.6版本,并默认启用SAFE_FOR_XML标志。这是一项破坏性变更:此前在TinyMCE 7中能够通过清理的内容,现在可能会在清理过程中被移除或修改。

这一更改提高了安全性,并符合DOMPurify推荐的默认设置。然而,依赖此前较为宽松的清理行为的现有内容和集成可能会受到影响。

主要变更:

  • DOMPurify升级至3.2.6

  • SAFE_FOR_XML已启用 — 此设置强制更严格地处理注释和属性值,防止某些XSS攻击向量。

  • 对内容的影响 — 包含标签的HTML注释、Internet Explorer条件注释以及具有类HTML值的属性现在可能会在清理过程中被移除。此前允许的内容可能会被剥离。

迁移步骤:

  • 审查工作流程并测试此前依赖宽松清理行为的内容。

  • TinyMCE现在提供了内容过滤:allow_html_in_comments选项。启用此选项后,即使在清理已启用的情况下,注释中仍然可以包含HTML标签。

迁移清单:

  • 审查现有内容中包含标签的HTML注释

  • 使用DOMPurify 3.2.6测试内容清理行为

  • 如果注释被意外剥离,则更新内容工作流程

  • 如有需要(并具备安全意识),考虑启用allow_html_in_comments

  • 如使用,测试Internet Explorer条件注释

  • 验证具有类HTML值的属性是否被正确处理

使用allow_html_in_comments会增加XSS漏洞的风险。allow_html_in_comments不建议在生产环境中使用,除非你完全理解其影响并已采取适当的安全措施。

服务变更

Java Swing集成弃用(v8)

TinyMCE的Java Swing集成在TinyMCE 8.0中已被弃用,并将在2025年12月31日之后停止支持。

影响:使用Java Swing集成的客户需要在停止支持日期之前计划迁移到替代解决方案。

迁移清单:

  • 评估替代集成选项

  • 规划迁移时间线,在2025年12月31日之前完成

从Java WAR文件迁移到容器化服务(v8)

TinyMCE 8.0不再包含用于拼写检查器等后端服务的Java WAR文件。客户需要迁移到现代的Docker/OCI容器以进行自托管部署。

影响:这降低了基础设施的复杂性,并符合现代DevOps实践。

迁移清单:

  • 盘点当前的WAR文件部署情况

  • 审查环境的容器化需求

  • 规划迁移到容器化服务的时间线

  • 设置容器基础设施(Docker/Kubernetes)

  • 部署并测试容器化服务

  • 更新服务连接配置

  • 如仍需要旧版WAR文件,请联系Tiny支持

迁移提示

  1. 备份与准备:升级前确保完成全面备份。

  2. 更新核心初始化:

    • 更新 theme、skin 以反映新的 oxide theme 和 skin。

      • TinyMCE 4 中有多个可用 theme,包括 'modern'、'inlite' 和 'mobile'。这些 theme 在 TinyMCE 5 中已被移除,合并为一个名为 "Silver" 的单一响应式 theme。

    • 将 forced_root_block: false 选项更新为 forced_root_block: "p"。

    • 整合 toolbars。

    • 审查 v8.0 中安全设置的新增默认值。

    • 若为 self-hosting,将 license key 更新为新格式。

  3. 插件迁移:

    • 从配置中移除已弃用的插件。

    • 更新已重命名的插件(例如 spellchecker → tinymcespellchecker)。

    • 验证 premium plugins 的兼容性。

    • 若使用商业许可,安装 License Key Manager addon。

  4. 自定义代码更新:

  5. CSS 更新:

    • 更新自定义样式以符合新的 Oxide 标准。尽管许多 .mce-* classes 已被 .tox-* classes 替换,但部分 .mce-* 前缀仍在使用。请审查您的 CSS 以确保兼容性。

    • 若使用自定义 skins,更新 split button 的 CSS(TinyMCE 8 变更)。

  6. 测试与部署:

    • 在生产部署前彻底测试更新后的配置。

    • 验证 media、iframe 和内容安全设置。

    • 测试 license key 功能和 premium 特性。

    • 验证 DOMPurify 对您内容的清理行为。

附加资源

实用链接

为确保升级顺利,请查阅以下版本特定的迁移指南:

这些指南包含更深入的配置说明、插件替换方案和示例。

后续步骤

请务必仔细遵循迁移步骤,以避免常见的插件缺失、界面损坏和意外格式变化等问题。建议在最终部署前,在 staging 环境中运行更新后的 editor 以进行全面验证。

迁移清单

在生产环境部署前,请验证:

  • License key 已更新为新格式(T8LK: 前缀)

  • 已安装 License Key Manager addon(商业许可)

  • 所有已弃用的 API 方法均已替换(editor.selection.setContent、editor.fire() 等)

  • 自定义 skins 已针对 TinyMCE 8 兼容性重新构建

  • DOMPurify 的清理行为已针对您的内容进行测试

  • 如有需要,已配置跨域资源加载

  • 所有 premium 功能均正常工作

  • Media URL resolver 已更新为使用 Promises

  • Autocompleter 配置使用 trigger 而非 ch

  • 如有必要,Template 插件已替换为 premium Templates 插件

  • Language pack 文件已更新为 RFC5646 格式

  • Accessibility checker 配置已按照 W3C 标准更新

  • 构建过程中已移除空文件引用

  • 如适用,已规划 Java Swing 集成迁移

  • 已移除 Medical English 字典引用

  • WAR 文件部署已迁移至容器化服务

  • 针对自定义 skins,已更新 split button 的 CSS

  • 已测试 table 高度处理

  • 已验证通知关闭按钮的行为

  • 沙盒 iframe 配置已审核

  • 转换不安全嵌入的行为已测试