← 返回目录

7. 第三方插件接入与富文本

把这页想成"买家具组装":你不会自己打一个沙发,而是买现成的(插件),照着说明书(官方文档)拼起来。项目里 80% 的功能不用自己造轮子,直接接插件就行。接任何插件都是固定三步:看文档 → 引入资源 → 配置初始化,而且顺序绝对不能乱。本页上方那个能打字的编辑器,就是用真实 CDN 接进来的 wangEditor

7.1 先跑起来:wangEditor 富文本(真实插件)

编辑器内容变化时会实时显示这里的 HTML 源码。

这个编辑器就是通过 CDN 引入的 wangEditor 4.7.15——先引 JS,再"创建实例 → 配置 → create",和课件里的步骤一模一样。你可以在里面打字、加粗、插图片,下面会实时吐出对应的 HTML 源码。如果没联网加载失败,会显示提示文字,但代码讲解不受影响。

7.2 第三方插件接入三步法

步骤 做什么 核心要点
第一步:看文档 找官方文档,搞清楚用途、依赖、兼容性 先读"快速开始",别一上来就翻一堆配置项
第二步:引入资源 把插件的 CSS 和 JS 文件引进页面 顺序:CSS 在 JS 前面,依赖库在主库前面
第三步:配置/初始化 写 JS 配置,然后初始化插件 严格按官方文档的顺序初始化,不能自己乱调

为什么第一步一定要先看文档?因为每个插件的初始化方式都不一样,你光靠猜大概率接不上。官方文档的"快速开始"一般就是一个最小可运行例子,先把那个最小例子跑通,再往自己页面里搬,是最稳的接法。

7.3 按官方文档顺序初始化(最常见的坑)

// ❌ 错误:配置写在 create 之后,根本不生效 → 顺序写反了
const editor = new wangEditor(container);  // 先建实例
editor.create();                            // 马上就 create,把配置定格了
editor.config.menus = [...]; // ★ 太晚了!create 的时候配置已经定死了 → 这行根本不看

// ✅ 正确:先把配置都写好,最后再 create → 配置在前,create 在最后
const editor = new wangEditor(container);  // 先建实例
editor.config.menus = ["head", "bold", "italic", "image", "table"];  // 配菜单项
editor.config.uploadImgShowBase64 = true; // 图片用 base64 存
editor.create(); // ★ 最后一步才 create → 这时配置才被正式定格生效

这是接插件最磨人的一个坑:配置写在 create 之后,插件不会报错,但就是不生效。因为 create 那一步就把配置"定格"了,之后你再改 config,它已经不再看了。如果你发现"配置写了却没反应",八成是顺序写反了。

7.4 接入完整示例(本页编辑器就是这么接的)

<!-- 第二步:引入资源(CDN) -->  → 把插件的 JS 文件从 CDN 引进来
<
script src = "https://cdn.jsdelivr.net/npm/wangeditor@4.7.15/dist/wangEditor.min.js" > < /script>  → 这一行就是引入 wangEditor

  <
  div id = "editor-container" > < /div>  <!-- 一个空容器,插件会自己往里塞 -->  → 先放一个空的 div 当编辑器的窝

  <
  script >
  // 第三步:先配置,再初始化 → 顺序:先 config,最后 create
  const container = document.getElementById("editor-container");  // 拿到那个空容器
const editor = new window.wangEditor(container);  // 建编辑器实例,告诉它窝在哪

editor.config.menus = [   // 配工具栏要哪些按钮
  "head", "bold", "italic", "underline",
  "foreColor", "list", "justify", "image", "table"
];
editor.config.uploadImgShowBase64 = true; // 图片以 base64 存,不用后端 → 演示省事

let timer = null;         // 准备一个计时器做防抖
editor.config.onchange = function (html) {  // 编辑器内容一变就触发
  clearTimeout(timer);    // 先把上一次的计时器清掉
  timer = setTimeout(function () { // ★ 300ms 防抖,避免疯狂刷新 → 停手 300ms 后才真的刷一次
    document.getElementById("htmlView").innerHTML = html;  // 把最新 HTML 显示到下面
  }, 300);
};

editor.create(); // ★ 最后创建 → 配置都写好了,才让它真的长出来

// 获取 / 设置内容
editor.txt.html(); // 取 HTML → 不带参数就是读
editor.txt.html("<h2>预设内容</h2>"); // 设 HTML → 带参数就是写
<
/script>

两个小知识点:① onchange 里套一个 300ms 防抖clearTimeout + setTimeout),用户噼里啪啦打字时,不会每按一个键就刷新一次,而是停 300ms 才刷一次,性能好很多。② uploadImgShowBase64 让图片直接以内嵌 base64 存,演示时不需要后端上传接口。

7.5 Layui:纯 CSS 组件和 JS 模块是两种用法

类型 怎么用 例子
纯 CSS 组件 直接在 HTML 上写 class 就行 layui-btn、layui-input、layui-row
JS 交互模块 必须先 layui.use 加载 layer 弹窗、table 表格、form 表单
// 引入顺序:CSS 在 JS 前面 → 先样式后脚本
<
link rel = "stylesheet"
href = "layui.css" >   → 先引 layui 的样式文件
  <
  script src = "layui.js" > < /script>  → 再引 layui 的脚本文件

// JS 交互模块必须 layui.use 先加载,才能拿到 layer / form → 声明要用哪几个模块
layui.use(["layer", "form"], function () {  // 要用弹窗和表单,先加载它们
  let layer = layui.layer();   // 拿到弹窗模块
  let form = layui.form();     // 拿到表单模块
  layer.msg("Hello Layui!");   // 弹个提示试试
  form.render(); // ★ 动态生成的表单要调 render,不调不显示 → 新生成的表单元素要让它重新画一遍才出样式
});

注意 Layui 这种"按需加载"的插件:JS 模块不是引了 JS 文件就能直接用,必须 layui.use 声明一下你要用哪些模块,回调里才能拿到。动态生成的表单元素还要 form.render 重新渲染一次,不然样式出不来。

7.6 常见问题排查

现象 原因 怎么排查
xxx is not defined 没引入 / 引入顺序错了 检查 CDN 链接能不能打开、顺序对不对
插件没反应 初始化代码没执行(DOM 还没好就跑了) 确认代码写在 DOM 加载完成之后
样式错乱 CSS 和 JS 版本不配套 用同一版本的 CSS / JS
富文本没有工具栏 容器没宽高 / 样式问题 给容器设置宽高

7.7 实战:用在哪 / 常见坑 / 怎么解决

① 可能在什么地方用:后台文章/商品详情的富文本编辑器、弹窗(layer)、日期选择器、表格组件、图片裁剪——项目里凡是"看起来挺复杂"的现成功能,基本都能找插件接,不用自己从零写。

② 常见的问题:xxx is not defined(CDN 没引或顺序错);配置写了不生效(create 之后才改 config);插件初始化了却空白(容器没宽高,或 DOM 还没渲染就执行了初始化);版本乱了样式崩(CSS 和 JS 不是同一版本)。

③ 解决思路:打开 F12 → Console 看红字、Network 看 CDN 文件是不是加载成功(200 还是 404);配置不生效就把所有 config.xxx 移到 create 前面;空白就检查容器有没有宽高、初始化代码是不是写在了元素后面。永远先把官方"快速开始"的最小例子跑通。

一句话:接插件 = 看官方文档(先跑通快速开始)→ 引资源(CSS 先 JS 后)→ 按文档顺序初始化(先 config 后 create);顺序错了,它连报错都不给你报。