Pixso 开放文档
插件 API
官方工具集
  • 中文
  • English
插件 API
官方工具集
  • 中文
  • English
  • 插件 API

    • 简介
    • 预备知识
    • manifest
    • 开发指南
    • 更新日志
    • Plugin API 文档

      • 概述
      • 全局对象

        • pixso
        • pixso.ui
        • pixso.host
        • pixso.mouse
        • pixso.editor
        • pixso.keyboard
        • pixso.fieldset
        • pixso.viewport
        • pixso.vectorEditor
        • pixso.stickyToolbar
        • pixso.clientStorage
        • pixso.serverStorage
      • 节点类型

        • BooleanOperationNode
        • ComponentNode
        • ComponentSetNode
        • DocumentNode
        • EllipseNode
        • FrameNode
        • GroupNode
        • InstanceNode
        • LineNode
        • PageNode
        • PolygonNode
        • RectangleNode
        • SectionNode
        • SliceNode
        • StarNode
        • TextNode
        • VectorNode
      • 样式类型

        • PaintStyle
        • TextStyle
        • EffectStyle
        • GridStyle
      • 数据类型

        • Action
        • ArcData
        • BlendMode
        • CommandItem
        • ComponentProperties-Related
        • Constraints
        • DialogType
        • DocumentationLink
        • Effect
        • EmbedData
        • ExportSettings
        • FontName
        • Guide
        • HandleMirroring
        • HyperlinkTarget
        • Image
        • LayoutGrid
        • LetterSpacing
        • Library
        • LineHeight
        • NodeChangeProperty
        • OverflowDirection
        • Overlay
        • Paint
        • PublishStatus
        • Reaction
        • Rect-related
        • RGB & RGBA
        • StickyToolbar
        • StrokeCap
        • StrokeJoin
        • StyleChangeProperty
        • TextCase
        • TextDecoration
        • TextListOptions
        • ThemeType
        • ToolType
        • Transition
        • Trigger
        • Vector
    • Host API 文档

      • 概述
      • Host API
  • 服务端 API

    • OpenAPI 文档
    • OpenAPI 文档
    • 事件订阅
    • 事件订阅
  • 客户端 API

    • 简介
    • 唤醒客户端
    • Web API
    • 更新日志

开发指南

快速开始

  1. 使用@pixso/create-plugin 创建插件项目

运行 npm 命令快速开始你的插件:

npm init @pixso/plugin my-plugin

插件模板内置了 @pixso/plugin-typings 和 @pixso/plugin-cli ,降低项目搭建成本

  1. 启动本地插件项目的 dev-server
cd my-plugin
npm install
npm run dev

@pixso/plugin-cli 会为你的插件应用开启热更新

  1. 启动 Pixso 网页中的热更新监听

Pixso 网页端将会监听本地 dev-server 的固定端口

构建用户界面

本质上,构建用户界面与开发传统 Web 应用没有任何区别。你甚至可以使用现代 Web 框架,如 Vue、React 等等。以下示例使用原生技术构建用户界面。

<!DOCTYPE html>
<body>
  <div class="content">
    <div style="margin-bottom: 20px; color: #fff;">
      输入椭圆的数量:<input type="text" />
    </div>
    <button id="btn">创建</button>
  </div>
</body>

然后在 main.js 中编写 JavaScript 代码

// main.js
pixso.showUI(__html__); // 用于展示插件用户界面

与主线程之间的消息通信

以下为用户界面与主线程之间的消息通信方式

用户界面发送消息

<script>
  ...
  parent.postMessage({ pluginMessage: '这是一条消息' }, '*')
  ...
</script>

主线程脚本接收消息

pixso.ui.onmessage = (message) => {
  console.log("收到来自前端的消息", message);
};

主线程脚本发送消息

pixso.ui.postMessage(42);

用户界面接收消息

<script>
  ...
  onmessage = (event) => {
    console.log("收到来自主线程脚本的消息", event.data.pluginMessage)
  }
  ...
</script>

通过用户界面触发 drop 事件

插件支持使用消息通知来告知 Pixso 触发 drop 事件,在调用通知的时候,支持定义 drop 事件触发的位置及其他自定义参数值。

以下是在用户界面中触发 drop 事件的示例代码:

parent.postMessage({ pluginDrop: PluginDrop }, '*')

PluginDrop 的类型如下:

interface PluginDrop {
  // clientX 和 clientY 取至浏览器的鼠标事件,pixso 会根据这个坐标换算出对应画布坐标系中的坐标,并在 drop 事件参数中返回。
  clientX: number;
  clientY: number;
  items?: DropItem[];
  files?: File[];
  // 自定义附加数据
  dropMetadata?: any;
  // relativeToPluginCoordinates,默认为 false,clientX 和 clientY 被当做相对于 Pixso 页面来处理;值为 true 时,clientX 和 clientY 被当做相对于插件 iframe 来处理;
  relativeToPluginCoordinates?: boolean; // 可设置为 dragEvent.view === window
}

interface DropItem {
  type: string;
  data: string;
}

发送网络请求

在 Pixso 插件中发送网络请求的方法与在 Web 浏览器中运行的普通 JavaScript 基本一致,发送网络请求的 API 由浏览器提供,而非 Pixso 提供。

以下示例通过创建一个不可见的 <iframe> 来发送网络请求。

pixso.showUI(__html__)
pixso.ui.postMessage({ type: 'request' })

pixso.ui.onmessage = (msg) => {
  const text = pixso.createText()
  // 将文字图层展示于可视区域中
  text.x = pixso.viewport.center.x
  text.y = pixso.viewport.center.y

  pixso.loadFontAsync(text.textStyles[0].textStyle.fontName as FontName)
    .then(() => {
      text.characters = msg
      pixso.closePlugin()
    })
}

该不可见的 <iframe> 与其他用户界面一样,需要在 manifest.json 中引用 HTML 文件。在这里,我们只是简单地制定一个标准 XMLHttpRequest 并将结果返回给主线程。

<script>
  window.onmessage = async (event) => {
    if (event.data.type === "request") {
      const request = new XMLHttpRequest();
      request.open("GET", "http://jsonplaceholder.typicode.com/posts");
      request.responseType = "json";
      request.onload = () => {
        window.parent.postMessage(request.response[0].title, "*");
      };
      request.send();
    }
  };
</script>
Prev
manifest
Next
更新日志