【一抹骚】预览器

86 阅读2分钟

渲染引擎

最近新项目架构重置,需要统一用渲染引擎实现。所谓的渲染引擎,我理解其实就是一个解释器。将后端返回的页面数据,按照固定规则跟前端组件关联起来,最终渲染出用户看到的页面。而且,它很强,基本可以包揽页面上的所有元素的展示,所有交互的实现等。同时也将页面的控制权完全交给了后端。这样的最大好处,就是灵活,快速,统一,稳定。

举个例子:你有两个相似的页面要实现。

传统开发模式:可能需要你复制之前的页面组件,复制样式,复制接口,调整样式,新功能引入新组件等。

渲染引擎模式:只需要复制个obj,并且obj所有数据都是高内聚,低耦合。实现一个页面搞出了拼图🧩的感觉,像玩游戏。

图片

预览器

组件是前端的,解释也是前端,只有数据放后端,后端怎么改???有种给了一整个榴莲给别人,却不给任何开榴莲的工具似的,只能眼巴巴看着的感觉。所以我搞了一版预览器,项目比较急,现阶段够用即可。目前主要用于渲染引擎预览,但实际它支持的是所有页面,包括传统的页面。只要你有这样的需求场景:改变页面数据,同步展示改变后的页面效果。

图片

图片

上面的示例中数据obj有上千行,确实大,改动确实会麻烦,可能多加个逗号“,”都会导致报错。图片

这个也正是预览器的价值所在,而且前后端双收益。不妨设想几个改动场景:

后端:改动文案,图片,链接等。后端可直接更改并预览效果,如果报错,左侧编辑器也会提示。确定后直接应用即可。

前端:我们至少避免了项目启动的时间,也减少与后端沟通的时间成本。

技术点

编辑器:jsoneditor
数据交互:postMessage

// 预览页面
  useEffect(() => {
  // iframeEle 为预览窗口dom, useRef
  // editorEle 为编辑器dom, useRef

    // 初始化编辑器
    const options = {
      mode: 'code',
      onChange: () => {
        if (iframeEle.current) {
          const wn = iframeEle.current.contentWindow;
          wn.postMessage('这里是编辑器改变后,需要发送给iframe的数据', 'iframe的origin');
        }
      },
    };
    const editor = new JSONEditor(editorEle.current, options);

    return () => {
      editor.destroy();
    };
  }, []);
// 调试页面
  useEffect(() => {
  // 跨域交互数据
    const receiveMsg = (e) => {
      // 限制域名
      if (e.origin !== '预览页面的origin') {
        return;
      }
      // 拿到数据后进行数据更新
      const { data, source, origin } = e;
    };

    window.addEventListener('message', receiveMsg, false);
    return () => {
      window.removeEventListener('message', receiveMsg, false);
    };
  }, []);

【本文所涉及的数据,均为测试数据,禁止另作他用,谢谢大家配合】

最新发布尽在公众号:小火球烧屁股