我有一个打字脚本的Next.js项目.我从官方的document个结果中引用了以下内容.

BundledEditor.jsx:

// ** https://www.tiny.cloud/docs/tinymce/6/react-pm-bundle/ **//
import { Editor } from '@tinymce/tinymce-react'

// remove ssr, otherwise will cause ReferenceError:未定义导航器

// TinyMCE so the global var exists
// eslint-disable-next-line no-unused-vars
import tinymce from 'tinymce/tinymce'

// DOM model
import 'tinymce/models/dom/model'

// Theme
import 'tinymce/themes/silver'

// Toolbar icons
import 'tinymce/icons/default'

// Editor styles
import 'tinymce/skins/ui/oxide/skin.min.css'

// importing the plugin js.
// if you use a plugin that is not listed here the editor will fail to load
import 'tinymce/plugins/advlist'
import 'tinymce/plugins/anchor'
import 'tinymce/plugins/autolink'
import 'tinymce/plugins/autoresize'
import 'tinymce/plugins/autosave'
import 'tinymce/plugins/charmap'
import 'tinymce/plugins/code'
import 'tinymce/plugins/codesample'
import 'tinymce/plugins/directionality'
import 'tinymce/plugins/emoticons'
import 'tinymce/plugins/fullscreen'
import 'tinymce/plugins/help'
import 'tinymce/plugins/image'
import 'tinymce/plugins/importcss'
import 'tinymce/plugins/insertdatetime'
import 'tinymce/plugins/link'
import 'tinymce/plugins/lists'
import 'tinymce/plugins/media'
import 'tinymce/plugins/nonbreaking'
import 'tinymce/plugins/pagebreak'
import 'tinymce/plugins/preview'
import 'tinymce/plugins/quickbars'
import 'tinymce/plugins/save'
import 'tinymce/plugins/searchreplace'
import 'tinymce/plugins/table'
import 'tinymce/plugins/template'
import 'tinymce/plugins/visualblocks'
import 'tinymce/plugins/visualchars'
import 'tinymce/plugins/wordcount'

// importing plugin resources
import 'tinymce/plugins/emoticons/js/emojis'

// Content styles, including inline UI like fake cursors
/* eslint import/no-webpack-loader-syntax: off */
// import contentCss from 'tinymce/skins/content/dark/content.css'

import contentCss from '!!raw-loader!tinymce/skins/content/default/content.min.css'
import contentUiCss from '!!raw-loader!tinymce/skins/ui/oxide/content.min.css'

export default function BundledEditor(props) {
  const { init, ...rest } = props

  // note that skin and content_css is disabled to avoid the normal
  // loading process and is instead loaded as a string via content_style
  return (
    <Editor
      init={{
        ...init,
        skin: false,
        content_css: false,
        content_style: [contentCss, contentUiCss, init.content_style || ''].join('\n')
      }}
      {...rest}
    />
  )
}

我只是将其导入到其他文件中,如下所示:

import BundledEditor from './BundledEditor';

它可以工作,但如果刷新,页面将显示以下错误:

ReferenceError:未定义导航器

因此,我将导入方式更改为:

// remove ssr, otherwise will cause ReferenceError:未定义导航器

const BundledEditor = dynamic(() => import('../BundledEditor'), {
  ssr: false
})

然后解决这个问题.

但当我try 输入yarn build来判断项目时.

它显示错误:

info  - Collecting page data ...ReferenceError:未定义导航器
    at /Users/motogod19/4iDPS/Sphere/sphere-brand-dev/node_modules/tinymce/tinymce.js:961:23
    at Object.<anonymous> (/Users/motogod19/4iDPS/Sphere/sphere-brand-dev/node_modules/tinymce/tinymce.js:31525:3)
    at Module._compile (node:internal/modules/cjs/loader:1254:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1308:10)
    at Module.load (node:internal/modules/cjs/loader:1117:32)
    at Module._load (node:internal/modules/cjs/loader:958:12)
    at Module.require (node:internal/modules/cjs/loader:1141:19)
    at require (node:internal/modules/cjs/helpers:110:18)
    at 3868 (/Users/motogod19/4iDPS/Sphere/sphere-brand-dev/.next/server/pages/apps/campaign/BundledEditor.js:28:33)
    at __webpack_require__ (/Users/motogod19/4iDPS/Sphere/sphere-brand-dev/.next/server/webpack-runtime.js:25:42)

> Build error occurred
Error: Failed to collect page data for /apps/campaign/BundledEditor

我对Next.js不熟悉,有什么动态导入要做吗?

推荐答案

navigator is not defined意味着您Bundle 了服务器端的代码,而服务器端没有与浏览器相关的API.您需要为客户端(也就是为浏览器)Bundle .

这个问题是因为tinymce不支持SSR(从https://github.com/tinymce/tinymce/issues/3709开始很明显)


由于您使用的是Next.js 13和pages路由,请将您的BundleEditor.jsx更改为以下值:

// ** https://www.tiny.cloud/docs/tinymce/6/react-pm-bundle/ **//
import React from 'react';

import { Editor } from '@tinymce/tinymce-react';

if (typeof window !== 'undefined') {
    require('tinymce/tinymce');
    require('tinymce/models/dom/model');
    require('tinymce/themes/silver');
    require('tinymce/icons/default');
    require('tinymce/plugins/advlist');
    require('tinymce/plugins/anchor');
    require('tinymce/plugins/autolink');
    require('tinymce/plugins/autoresize');
    require('tinymce/plugins/autosave');
    require('tinymce/plugins/charmap');
    require('tinymce/plugins/code');
    require('tinymce/plugins/codesample');
    require('tinymce/plugins/directionality');
    require('tinymce/plugins/emoticons');
    require('tinymce/plugins/fullscreen');
    require('tinymce/plugins/help');
    require('tinymce/plugins/image');
    require('tinymce/plugins/importcss');
    require('tinymce/plugins/insertdatetime');
    require('tinymce/plugins/link');
    require('tinymce/plugins/lists');
    require('tinymce/plugins/media');
    require('tinymce/plugins/nonbreaking');
    require('tinymce/plugins/pagebreak');
    require('tinymce/plugins/preview');
    require('tinymce/plugins/quickbars');
    require('tinymce/plugins/save');
    require('tinymce/plugins/searchreplace');
    require('tinymce/plugins/table');
    require('tinymce/plugins/template');
    require('tinymce/plugins/visualblocks');
    require('tinymce/plugins/visualchars');
    require('tinymce/plugins/wordcount');
    require('tinymce/plugins/emoticons/js/emojis')
}

// Editor styles
import 'tinymce/skins/ui/oxide/skin.min.css';

// Content styles, including inline UI like fake cursors
/* eslint import/no-webpack-loader-syntax: off */
// import contentCss from 'tinymce/skins/content/dark/content.css'

import contentCss from '!!raw-loader!tinymce/skins/content/default/content.min.css';
import contentUiCss from '!!raw-loader!tinymce/skins/ui/oxide/content.min.css';

export default function BundledEditor(props) {
    const { init, ...rest } = props;

    // note that skin and content_css is disabled to avoid the normal
    // loading process and is instead loaded as a string via content_style
    return (
        <Editor
            init={{
                ...init,
                skin: false,
                content_css: false,
                content_style: [contentCss, contentUiCss, init?.content_style || ''].join('\n'),
            }}
            {...rest}
        />
    );
}

npm run devnpm run build都工作得很好.

$ npm run build

> testmce@0.1.0 build
> next build

- info Linting and checking validity of types  
- info Creating an optimized production build  
- info Compiled successfully
- info Collecting page data  
- info Generating static pages (4/4)
- info Finalizing page optimization  

Route (pages)                              Size     First Load JS
┌ ○ /                                      3.39 kB        80.3 kB
├   └ css/00a586533d958f8e.css             1.73 kB
├   /_app                                  0 B            76.9 kB
├ ○ /404                                   182 B          77.1 kB
├ λ /api/hello                             0 B            76.9 kB
└ ○ /BundledEditor                         473 kB          550 kB
    └ css/3191dae2698bb014.css             11.8 kB
+ First Load JS shared by all              77.6 kB
  ├ chunks/framework-63157d71ad419e09.js   45.2 kB
  ├ chunks/main-c6c319de9f7d0316.js        29.4 kB
  ├ chunks/pages/_app-5fbdfbcdfb555d2f.js  296 B
  ├ chunks/webpack-1f3c29ac3f0dceed.js     2.06 kB
  └ css/876d048b5dab7c28.css               706 B

λ  (Server)  server-side renders at runtime (uses getInitialProps or getServerSideProps)
○  (Static)  automatically rendered as static HTML (uses no initial props)

Reactjs相关问答推荐

如何使用mui为可重复使用的react 按钮应用不同的风格

导致类型错误的调度不是函数";

ReferenceError:未在Redux组件中定义窗口

根据另一个Select中的选定值更改Select中的值

如何在重新图表中更改悬停时的条形填充 colored颜色 ?

生成Reaction Vite应用程序的停靠容器时无法识别环境变量

在新屏幕上显示照片时出现问题-react

React-React中是否完全支持基于类的组件?

使用以Jest 的方式返回 Promise 的方法来模拟可构造的 API 类时出现问题

Yup.number().integer() 不将 1.0 视为小数,如何解决这个问题?

如何在 React 中停止嵌套 Link 和 Button 组件的事件传播?

未处理的拒绝 (TypeError):无法读取未定义的属性(读取协议)

在 React 的父级中多次调用子级时从子级获取数据到父级

无法读取未定义的react native 的属性参数

刷新页面时状态改变问题

谁能根据经验提供有关 useEffect 挂钩的更多信息

如何定制 React 热 toastr ?

Select MenuItem 时 Material-ui 不更改样式

react / firebase 基地.如何在我的项目中保存更新的数据?

可以'读取未定义的属性(读取'路径')