nuxt中引入tinymce编辑器

本文介绍如何在Nuxt.js项目中集成Tinymce富文本编辑器,实现服务端渲染与客户端编辑的完美结合,同时详细配置了编辑器的各项功能,包括中文语言包、图片上传处理及多种插件的使用。
起因

Nuxt.js是一个服务端渲染框架。在一开始项目中使用的是quill.js编辑器,因其支持服务端渲染,但后期其功能过于少,故选择了非常强大的tinymce编辑器。

本文首发于: http://zhanghaoran.ren

正文
  • 安装tinymce
npm i @tinymce/tinymce-vue tinymce  -s
  • 在~/static/目录下创建tinymce文件夹,下载完tinymce后在node_modules 中找到 tinymce/skins目录,将其复制到static/tinymce目录。

  • 下载中文语言包
    下载解压后,把langs文件夹放到~/static/tinymce/下。
    zhanghaoran前端

  • 在~/components/下创建 tinymceEditor.vue文件。

template

<template>
    <client-only>
        <editor id="tinymce" v-model="contents" :init="init"></editor>
     </client-only>
</template>

script

	import editor from '@tinymce/tinymce-vue';
    import toolbar from "./toobar";		// toolbar
    import plugins from "./plugins";	// plugins
    import {imageHost} from "../../../plugins/host";

    let tinymce;
	// 在客户端环境下引入
    if (process.client) {
        tinymce = require('tinymce/tinymce');
        require('tinymce/themes/silver');
        require('tinymce/icons/default');
        require('tinymce/plugins/image');// 插入上传图片插件
        require('tinymce/plugins/media');// 插入视频插件
        require('tinymce/plugins/table');// 插入表格插件
        require('tinymce/plugins/lists');// 列表插件
        require('tinymce/plugins/link');//超链接插件
        require('tinymce/plugins/wordcount');// 字数统计插件
        // require('tinymce/plugins/emoticons');// 插入表情插件
        require('tinymce/plugins/fullscreen');
        require('tinymce/plugins/code');
        require('tinymce/plugins/paste');
        require('tinymce/plugins/advlist');
        require('tinymce/plugins/autolink');
        require('tinymce/plugins/autosave');
        require('tinymce/plugins/codesample');
        require('tinymce/plugins/colorpicker');
        require('tinymce/plugins/contextmenu');
        require(
在使用 Nuxt 框架引入富文本编辑器(如 Quill、TinyMCEVue 富文本组件)时,常见的报错包括 `document is not defined`、`window is not defined`、或模块无法正确导入等问题。这些错误通常出现在 SSR(服务端渲染)过程中,因为服务端没有浏览器环境(即没有 `window` 和 `document` 对象),而某些富文本编辑器依赖于这些全局对象。 ### 常见问题及解决方案 #### 1. `Document / Window is not defined` 这是最常见的问题之一,尤其是在使用依赖 DOM 的第三方富文本编辑器时[^1]。例如,`vue2Editor`、`quill` 等库在初始化时会访问 `window` 或 `document`,而在 SSR 阶段这些变量并不可用。 **解决方案:** - **仅在客户端加载组件** 可以通过 `process.client` 判断当前是否为客户端环境,从而延迟加载富文本编辑器组件: ```javascript if (process.client) { // 引入富文本编辑器 } ``` - **使用动态导入(Dynamic Import)与异步加载** 在页面或组件中使用 `asyncData` 或 `mounted` 生命周期钩子中动态导入富文本编辑器: ```javascript export default { data() { return { editor: null } }, mounted() { import('vue2-editor').then(module => { this.editor = module.Vue2Editor }) } } ``` - **局部注册插件** 创建一个插件文件并在 `nuxt.config.js` 中配置只在客户端加载该插件[^3]: ```javascript // plugins/vue-quill-editor.js import Vue from 'vue' import VueQuillEditor from 'vue-quill-editor/dist/ssr' Vue.use(VueQuillEditor) ``` 然后在 `nuxt.config.js` 中添加: ```javascript export default { plugins: [ { src: '~/plugins/vue-quill-editor', mode: 'client' } ] } ``` #### 2. 模块未找到或无法导入(如 JSON Editor) 有时会遇到类似 `[vite] Error when evaluating SSR module ... failed to import "jsoneditor"` 的错误[^2],这通常是由于模块的导出方式不兼容 SSR 所致。 **解决方案:** - **使用默认导出方式** 确保你导入的模块具有默认导出(`export default`),否则需要手动包装成默认导出: ```javascript // json-editor-wrapper.js import * as JsonEditor from 'jsoneditor' export default JsonEditor ``` 然后在组件中使用: ```javascript import JsonEditor from '@/plugins/json-editor-wrapper' ``` - **检查构建工具配置** 如果使用 Vite 构建项目,确保 `vite.config.js` 中配置了正确的别名和插件支持。 #### 3. 组件未定义或未正确注册 如果控制台提示 `render function or template not defined in component: anonymous`,说明组件未被正确导入或注册。 **解决方案:** - **确保组件正确导入并注册** ```vue <script> import { Vue2Editor } from 'vue2-editor' export default { components: { Vue2Editor } } </script> ``` - **检查命名导出与默认导出差异** 若模块只有命名导出(named exports),需明确指定: ```javascript import { myNamedFunction } from '@/utils' ``` 若期望默认导出但模块未提供,应手动封装: ```javascript // utils-wrapper.js export default from '@/utils' ``` --- ### 总结 在 Nuxt引入富文本编辑器时,关键在于区分 SSR 与 CSR 的执行环境,并采用动态导入、插件按需加载等策略避免对 `window` 或 `document` 的直接依赖。此外,还需注意模块导出方式和组件注册流程,确保编译与运行时行为一致。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值