如何将 CKEditor 5 的自定义构建与 React 和 Vite 结合使用?

Pat*_*nny 5 ckeditor5 ckeditor5-react vite

在过去的几个月里,我一直在使用 Create React App 构建我的应用程序。

但是,Ionic 现在支持 Vite,我正在尝试将我的应用程序从 CRA 迁移到 Vite。

最初,我制作了一个CKEditor 5 Custom Build并将其设置在 React 应用程序中,如下所示:

import React from 'react';
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore  Ckeditor does not supply TypeScript typings.
import { CKEditor } from '@ckeditor/ckeditor5-react';
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore  Ckeditor does not supply TypeScript typings.
import Editor from 'ckeditor5-custom-build/build/ckeditor';
Run Code Online (Sandbox Code Playgroud)

在构建我的应用程序之前,我构建了自定义 CKEditor,如下所示:

cd ckeditor5; npm run build

CKEditor 构建命令是webpack --mode production.

现在,配置完Vite后,当我运行时npm run build,出现以下错误:

'default' 不是由 ckeditor5/build/ckeditor.js 导出,而是由 src/components/contentTypeCard/CKEditorInput.tsx 导入

CKEditor 问题队列中有一个关于缺乏有关 Vite 问题的文档的线程,但没有特别说明如何解决此问题。

我尝试过的

我尝试在开发模式( )下构建 CKEditorwebpack --mode development并检查ckeditor.js文件以尝试导出编辑器,但该文件有超过 100,000 行代码,我完全迷失了。

Boh*_*nko 5

就我而言:

“反应”:“18.2.0”,“vite”:“2.9.10”,

这是我找到的解决方案

包.json

"ckeditor5-custom-build": "file:libs/ckeditor5",
Run Code Online (Sandbox Code Playgroud)

vite.config.ts

export default defineConfig(() => {
  return {
    plugins: [react()],
    optimizeDeps: {
      include: ['ckeditor5-custom-build'],
    },
    build: {
      commonjsOptions: { exclude: ['ckeditor5-custom-build'], include: [] },
    },
  };
});
Run Code Online (Sandbox Code Playgroud)

RichTextEditor.tsx

import { CKEditor, CKEditorProps } from '@ckeditor/ckeditor5-react';
import Editor from 'ckeditor5-custom-build';

export function RichTextEditor({
  defaultValue,
  ...props
}: RichTextEditorProps) {
  return (
    <EditorContainer>
      <CKEditor editor={Editor} data={defaultValue || ''} {...props} />
    </EditorContainer>
  );
}
Run Code Online (Sandbox Code Playgroud)

vite 4.4.8 更新:

"vite": "4.4.8",

vite.config.ts

import commonjs from "vite-plugin-commonjs";

export default defineConfig(() => {
  return {
    plugins: [
      react(),
      commonjs({
        filter(id) {
          if (["libs/ckeditor5/build/ckeditor.js"].includes(id)) {
            return true;
          }
        },
      }),
    ],
    optimizeDeps: {
      include: ["ckeditor5-custom-build"],
    },
    build: {
      commonjsOptions: { exclude: ["ckeditor5-custom-build"] },
    },
  };
});

Run Code Online (Sandbox Code Playgroud)