概述
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 中移除。使用
browser_spellcheck: true或高级 Spell Checker 插件。
advtemplate:取代用于高级模板用例的template插件。template:在 7.0 中移除。由高级 Templates 插件取代。
插件迁移提示
contextmenu(在 v6 中移除):使用浏览器原生上下文菜单或自定义逻辑。
考虑使用
editor.ui.registry.addContextMenu来执行自定义右键操作。欲了解更多信息,请参阅 Context menus。
bbcode(在 v6 中移除):如果需要 BBCode 支持,请实现自定义解析或服务器端处理。
fullpage(在 v8 中现为高级版):使用高级 Full Page HTML 插件(
fullpagehtml)进行完整 HTML 文档编辑。
template(在 v7 中移除):使用高级 advtemplate 插件或实现自定义模态对话框。
textcolor(在 v6 中集成到核心):文本颜色功能现已内置于 TinyMCE core 中。请使用
forecolor和backcolor工具栏按钮,无需额外插件即可使用。
imagetools:(在 v6 中已移除):请使用高级插件 Enhanced Image Editing 或 Image Optimizer Powered by Uploadcare 以获得图像编辑功能。
工具栏和菜单名称变更
如果您使用过以下工具栏按钮或菜单选项,其名称在 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 中的默认变更:
sandbox iframes:现默认为true(为 iframes 添加 sandbox 属性)convert_unsafe_embeds:现默认为true(将 object/embed 元素转换为更安全的替代方案)highlight_on_focus:现默认为true(为编辑器添加焦点轮廓)
TinyMCE 7.0 中的新增选项:
license_key:必须设置为gpl或有效的许可证密钥sandbox_iframes_exclusions:要从 iframe 沙箱中排除的 URL hosts 列表
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;如果没有,编辑器将被设置为
readonlyLicense 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 键行为这会影响所有文本模式,包括标题、列表、引用块和水平线
迁移步骤:
测试现有的文本模式行为
如果需要 Enter 键触发,则更新配置
评估新 Space 键触发的用户体验
考虑更新关于文本模式行为的用户文档
示例:
// 默认 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'恢复之前回车键的行为这会影响所有文本模式,包括标题、列表、引用块和水平线
迁移步骤:
测试现有的文本模式行为
如果需要回车键触发,则更新配置
评估新的空格键触发的用户体验
考虑更新关于文本模式行为的用户文档
示例:
// 默认 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_classestemplate_cdate_formattemplate_mdate_classestemplate_mdate_formattemplate_replace_valuestemplate_preview_replace_valuestemplate_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支持
迁移提示
备份与准备:升级前确保完成全面备份。
更新核心初始化:
更新
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 更新为新格式。
插件迁移:
从配置中移除已弃用的插件。
更新已重命名的插件(例如
spellchecker→tinymcespellchecker)。验证 premium plugins 的兼容性。
若使用商业许可,安装 License Key Manager addon。
自定义代码更新:
使用
editor.ui.registry.*API 重写自定义插件。替换 v4 API 方法,如
editor.addButton、editor.addMenuItem、editor.windowManager.open。更新 media embed 处理(
media_url_resolverAPI 变更)。替换已弃用的 API 方法(
editor.insertContent替换editor.selection.setContent,editor.dispatch()替换editor.fire()等)。
CSS 更新:
更新自定义样式以符合新的 Oxide 标准。尽管许多
.mce-*classes 已被.tox-*classes 替换,但部分.mce-*前缀仍在使用。请审查您的 CSS 以确保兼容性。若使用自定义 skins,更新 split button 的 CSS(TinyMCE 8 变更)。
测试与部署:
在生产部署前彻底测试更新后的配置。
验证 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 配置已审核
转换不安全嵌入的行为已测试