此示例展示如何使用 TinyMCE React 组件,将 TinyMCE 从 .zip 包中自托管并打包到 React 应用程序中。

前提条件

此过程需要 Node.js(和 NPM)。

操作步骤

  1. 使用 Vite 和 React SWC 创建一个名为 tinymce-react-demo 的新 React 项目。

    # NPM 7+, extra double-dash is needed
    npm create vite@5 tinymce-react-demo -- --template react-swc
  2. 进入项目目录并安装 @tinymce/tinymce-react

    cd tinymce-react-demo && npm install @tinymce/tinymce-react
  3. 安装 script-loader 包。

    npm install script-loader
  4. 将 TinyMCE zip 中 tinymce/js 文件夹的内容解压到 src 文件夹。

  5. 在 +./eslint.config.js 文件中,将 'src/tinymce' 添加到 ignores 数组中。

    Diff of .eslint.config.js
    diff --git a/eslint.config.js b/eslint.config.js
    index 092408a..1ab8db4 100644
    --- a/eslint.config.js
    +++ b/eslint.config.js
    @@ -5,7 +5,7 @@ import reactRefresh from 'eslint-plugin-react-refresh'
     import tseslint from 'typescript-eslint'
    
     export default tseslint.config(
    -  { ignores: ['dist'] },
    +  { ignores: ['dist', 'src/tinymce'] },
       {
         extends: [js.configs.recommended, ...tseslint.configs.recommended],
         files: ['**/*.{ts,tsx}'],
  6. 安装 vite-plugin-commonjs 并更新 vite.config.ts 文件以启用对 CommonJS 模块的支持。

    import { defineConfig } from 'vite';
    import react from '@vitejs/plugin-react';
    import commonjs from 'vite-plugin-commonjs';
    
    // https://vite.dev/config/
    export default defineConfig({
      plugins: [react(), commonjs()],
    });
  7. 创建 ./src/BundledEditor.jsx 并包含以下代码片段:

    import { Editor } from '@tinymce/tinymce-react';
    // Ensure to import `tinymce` first as other components expect
    // a global variable `tinymce` to exist
    import './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';
    // Content styles, including inline UI like fake cursors
    import './tinymce/skins/content/default/content';
    import './tinymce/skins/ui/oxide/content';
    // Import plugins
    import './tinymce/plugins/anchor';
    import './tinymce/plugins/advlist';
    import './tinymce/plugins/autolink';
    import './tinymce/plugins/charmap';
    import './tinymce/plugins/code';
    import './tinymce/plugins/media';
    import './tinymce/plugins/visualblocks';
    import './tinymce/plugins/fullscreen';
    import './tinymce/plugins/insertdatetime';
    import './tinymce/plugins/preview';
    import './tinymce/plugins/help';
    // Include resources that a plugin lazy-loads at the run-time
    import './tinymce/plugins/help/js/i18n/keynav/en';
    import './tinymce/plugins/image';
    import './tinymce/plugins/link';
    import './tinymce/plugins/lists';
    import './tinymce/plugins/searchreplace';
    import './tinymce/plugins/table';
    import './tinymce/plugins/wordcount';
    
    export default function BundledEditor(props) {
      return (
        <Editor
          licenseKey='gpl'
          {...props}
        />
      );
    }
  8. 将带有配置的 BundleEditor 组件添加到 App.jsx 中。

    import { useRef } from 'react';
    import BundledEditor from './BundledEditor'
    import './App.css';
    
    export default function App() {
      const editorRef = useRef(null);
      const log = () => {
        if (editorRef.current) {
          console.log(editorRef.current.getContent());
        }
      };
      return (
        <>
          <BundledEditor
            onInit={(_evt, editor) => editorRef.current = editor}
            initialValue='<p>This is the initial content of the editor.</p>'
            init={{
              height: 500,
              menubar: false,
              plugins: [
                'advlist', 'autolink', 'lists', 'link', 'image', 'charmap',
                'anchor', 'searchreplace', 'visualblocks', 'code', 'fullscreen',
                'insertdatetime', 'media', 'table', 'preview', 'help', 'wordcount'
              ],
              toolbar: 'undo redo | blocks | ' +
                'bold italic forecolor | alignleft aligncenter ' +
                'alignright alignjustify | bullist numlist outdent indent | ' +
                'removeformat | help',
              content_style: 'body { font-family:Helvetica,Arial,sans-serif; font-size:14px }'
            }}
          />
          <button onClick={log}>Log editor content</button>
        </>
      );
    }
  9. 运行开发服务器以测试应用程序:

    npm run dev

其他资源