以下流程将帮助您使用 Webpack 和 ES6+ 语法 打包 .zip 版本的 TinyMCE。此流程假定用户已具备 Webpack 和 ES6+ 语法 的使用经验。以下步骤提供了一个使用 Webpack 打包基本 TinyMCE 配置的可运行示例。

要求

本指南需要以下内容:

  • Node.js 和 NPM

  • 如何使用 Webpack 的基础知识

流程

  1. 下载并解压最新版 TinyMCE:

  2. 将以下依赖项添加到项目中。

  3. 创建一个新的源文件,用于从 TinyMCE 导入所需组件并配置编辑器。

    示例 src/editor.js

    /* 导入 TinyMCE */
    import tinymce from '../tinymce/js/tinymce/tinymce';
    
    /* 需要默认图标。之后,如果有需要,可以导入自定义图标 */
    import '../tinymce/js/tinymce/icons/default/icons';
    
    /* 所需的 TinyMCE 组件 */
    import '../tinymce/js/tinymce/themes/silver/theme';
    import '../tinymce/js/tinymce/models/dom/model';
    
    /* 导入默认皮肤 (oxide)。如果需要,可以替换为自定义皮肤。 */
    import '../tinymce/js/tinymce/skins/ui/oxide/skin.css';
    
    /* 导入插件 */
    import '../tinymce/js/tinymce/plugins/advlist';
    import '../tinymce/js/tinymce/plugins/code';
    import '../tinymce/js/tinymce/plugins/emoticons';
    import '../tinymce/js/tinymce/plugins/emoticons/js/emojis';
    import '../tinymce/js/tinymce/plugins/link';
    import '../tinymce/js/tinymce/plugins/lists';
    import '../tinymce/js/tinymce/plugins/table';
    import '../tinymce/js/tinymce/plugins/help';
    import '../tinymce/js/tinymce/plugins/help/js/i18n/keynav/en';
    
    /* 内容 UI CSS 是必需的(使用默认的 oxide 皮肤) */
    import contentUiSkinCss from '../tinymce/js/tinymce/skins/ui/oxide/content.css';
    
    /* 默认内容 CSS 可以更改或替换为适合编辑器内容的 CSS。 */
    import contentCss from '../tinymce/js/tinymce/skins/content/default/content.css';
    
    /* 初始化 TinyMCE */
    export function render () {
      tinymce.init({
        selector: 'textarea#editor',
        license_key: 'gpl',
        plugins: 'advlist code emoticons link lists table help',
        toolbar: 'bold italic | bullist numlist | link emoticons',
        skin: false,
        content_css: false,
        content_style: contentUiSkinCss.toString() + '\n' + contentCss.toString()
      });
    };
    gpl 许可证密钥用于在 GNU 通用公共许可证 (GPL) 下自托管 TinyMCE。如需使用商业许可证,或要包含高级插件,请将 gpl 替换为有效的许可证密钥。有关详细信息,请参阅 设置许可证。
  4. 更新项目的 Webpack 配置以加载 TinyMCE CSS 并优化 TinyMCE 资源。

    示例 webpack.config.js

    const path = require('path');
    const MiniCssExtractPlugin = require('mini-css-extract-plugin');
    const HtmlWebpackPlugin = require('html-webpack-plugin');
    
    module.exports = {
      mode: 'development',
      entry: './src/index.js',
      resolve: {
        extensions: ['.js']
      },
      plugins: [
        new MiniCssExtractPlugin(),
        new HtmlWebpackPlugin({
          title: 'TinyMCE Webpack Demo',
          meta: { viewport: 'width=device-width, initial-scale=1' }
        }),
      ],
      module: {
        rules: [
          {
            test: /skin\.css$/i,
            use: [ MiniCssExtractPlugin.loader, 'css-loader' ],
          },
          {
            test: /content\.css$/i,
            use: [ 'css-loader' ],
          },
        ],
      },
      optimization: {
        splitChunks: {
          chunks: 'all',
          cacheGroups: {
            tinymceVendor: {
              test: /[\\/](tinymce)[\\/](.*js|.*skin.css)|[\\/]plugins[\\/]/,
              name: 'tinymce'
            },
          },
        }
      },
      output: {
        filename: '[name].js',
        path: path.resolve(__dirname, 'public'),
        clean: true,
      },
    };
  5. 将 TinyMCE 资源和配置添加到项目中,并提供一个目标元素用于初始化编辑器。

    示例 src/index.js

    import * as editor from './editor';
    
    const heading = () => {
      const element = document.createElement('h1');
      element.innerText = 'TinyMCE Webpack demo';
      return element;
    };
    
    const editorArea = () => {
      const element = document.createElement('textarea');
      element.id = 'editor';
      return element;
    };
    
    const parent = document.createElement('p');
    parent.appendChild(editorArea());
    document.body.appendChild(heading());
    document.body.appendChild(parent);
    
    editor.render();
  6. 运行 Webpack 以测试 bundle,例如:

    webpack --config webpack.config.js

    如果 Webpack 运行成功,请检查编辑器是否在应用程序中加载。如果 Webpack 失败,请查看任何错误并检查此过程中的配置更改;在将 TinyMCE 打包到现有项目时,可能需要调整以解决冲突或其他问题。

后续步骤

有关以下内容的信息: