ReferenceError: navigator is not defined using ReactJS on Ruby on Rails server side rendering

ReferenceError: navigator is not defined using ReactJS on Ruby on Rails server side rendering

我在 Rails 应用程序上使用 webpack 编译我的 ReactJS 客户端,在 Rails 上使用 ReactJS。我创建了一个 React 组件,它按照

中的建议导入 ckeditor

@ckeditor5安装配置完成后,客户端编译完成。但是当我在 localhost:3000 上浏览网站时,服务器端呈现在每个页面上都失败并出现此错误:

ReferenceError: navigator is not defined

这是回溯:

Object../node_modules/@ckeditor/ckeditor5-utils/src/env.js ((execjs):121221:17)
__webpack_require__ ((execjs):55:30)
Object../node_modules/@ckeditor/ckeditor5-utils/src/keyboard.js ((execjs):121652:12)
__webpack_require__ ((execjs):55:30)
Object../node_modules/@ckeditor/ckeditor5-engine/src/view/uielement.js ((execjs):90071:17)
__webpack_require__ ((execjs):55:30)
Object../node_modules/@ckeditor/ckeditor5-engine/src/view/writer.js ((execjs):90991:18)
__webpack_require__ ((execjs):55:30)
Object../node_modules/@ckeditor/ckeditor5-engine/src/view/view.js ((execjs):90336:15)
__webpack_require__ ((execjs):55:30)

我的 webpack 编译以单个块退出

不知道怎么解决。

CKEditor 被设计为 运行 在浏览器上,因为它是一个 Javascript 库。如您所知,Rails 上的 React 集成了 Rails 和 (server rendering of) React 前端框架。因此,通过 Server-Side Rendering,您的 React 组件首先在服务器上呈现为 HTML。

Webpack 捆绑模块,它首先提供给服务器,然后提供给浏览器。所以 ckeditor 库对于服务器来说是陌生的,因为它是一个 JS 库。因此, navigator is not defined 被抛出。 但是 ckeditor 考虑到客户端呈现时工作正常,因为模块直接提供给浏览器。

由于用例最少,服务器上有一些与 运行 兼容的所见即所得编辑器。据我所知,您可以使用 codemirror-node 作为替代方案,这将在 Node 上 运行。