Sketch webView方式插件开发技术总结

news2024/11/25 20:49:07

Sketch作为一款广受欢迎的矢量图形设计工具,其功能远不止基础的矢量设计,它的真正实力部分源自其丰富的插件生态系统。Sketch向开发者提供了官方的第三方插件接口,这使得整个社区能够创建和分享众多功能各异的插件,极大地拓展了Sketch的核心功能集。用户可以便捷地探索数百种精心设计的插件,以契合个人工作流的独特需求,并能够简单快捷地获取和安装这些插件。

尤其值得一提的是,Sketch采用JavaScript API作为插件开发的主要手段,这一机制允许开发者利用JavaScript编写插件代码,借助CocoaScript桥梁与Sketch的内部API以及macOS框架无缝对接。因此,即便是熟悉Web前端技术的开发者也能相对轻松地涉足Sketch插件开发领域,创造出更多提升设计效率和功能性的插件解决方案。

一、Sketch插件可以做什么?

Sketch中的插件可以做任何用户可以做的事情(甚至更多)。例如:

二、插件简介

Sketch 插件都是 *.sketchplugin 的形式,其实就是一个文件夹,通过右键显示包内容,可以看到最普通的内部结构式是这样的:

manifest.json用来声明插件配置信息,commands 定义所有可执行命令,每条 command 有唯一标志符,identifier,menu 定义插件菜单,通过 identifier 关联到执行命令。

my-commond.js是插件逻辑的实现代码实现文件。

三、Javascript API for Sketch

这是Sketch的原型Javascript API。 原生Javascript,Sketch的完整内部结构的一个易于理解的子集。它仍然是一项正在进行中的工作。

Javascript API for Sketch 原理:

四、开发文档

1、开发文档

Sketch Developer — Build something beautiful

2、API

Sketch Developer — API Reference

3、Action API

Redirecting…

Sketch Developer — Actions Reference

4、Sketch Source

SketchAPI/Source at develop · sketch-hq/SketchAPI · GitHub

5、Demo

SketchAPI/examples at develop · sketch-hq/SketchAPI · GitHub

五、Sketch webView

Sketch模块,用于使用webview创建复杂的UI。有别于一般的插件页面,可以使用webview模块加载一个复杂的Web应用,使其与Sketch进行交互。

1、BrowserWindow

在浏览器窗口中创建和控制Sketch:

// In the plugin.
const BrowserWindow = require('sketch-module-web-view');
const identifier = "identifier";//webview 标识
let win = new BrowserWindow({identifier, width: 800, height: 600, alwaysOnTop: true})
win.on('closed', () => {
  win = null
})
// Load a remote URL
win.loadURL('https://github.com')
// Or load a local HTML file
win.loadURL(require('./index.html'))

2、获取已存在的BrowserWindow
import { getWebview } from 'sketch-module-web-view/remote';
const = identifier = "identifier";
const existingWebview = getWebview(identifier);
if (existingWebview) {
  if (existingWebview.isVisible()) {
  // close the devtool if it's open
    existingWebview.close()
  }
}

3、webContents
const BrowserWindow = require('sketch-module-web-view')
let win = new BrowserWindow({ width: 800, height: 1500 })
win.loadURL('http://github.com')
let contents = win.webContents
console.log(contents)

4、skech与webview的通信

1)Sending a message to the WebView from your plugin command

On the WebView:

window.someGlobalFunctionDefinedInTheWebview = function(arg) {
  console.log(arg)
}
On the plugin:
插件启动向WebView发送数据:
browserWindow.webContents
  .executeJavaScript('someGlobalFunctionDefinedInTheWebview("hello")')
  .then(res => {
    // do something with the result
  })

动态向WebView发送数据:

import {getWebview, isWebviewPresent, sendToWebview} from 'sketch-module-web-view/remote';
var existingWebview = getWebview(identifier);
if (isWebviewPresent(existingWebview.id)){ 
 sendToWebview (existingWebview.id , `someGlobalFunctionDefinedInTheWebview(${sentData})` ) 
}

2)Sending a message to the plugin from the WebView

On the plugin:

var sketch = require('sketch')
browserWindow.webContents.on('nativeLog', function(s) {
  sketch.UI.message(s)
})

On the webview:

window.postMessage('nativeLog', 'Called from the webview')
// you can pass any argument that can be stringified
window.postMessage('nativeLog', {
  a: b,
})
// you can also pass multiple arguments
window.postMessage('nativeLog', 1, 2, 3)

六、构建开发工程

1、确立技术栈

使用Sketch webView的方式开发插件。用户通过操作插件界面,webview与Sketch通信解决用户的问题。这样插件界面可以使用现今所有的前端框架与组件库。

1)webView框架选择Umi Ant Design

注:WebView框架也可以单独的工程与部署。

2)使用Sketch 官方skpm插件工程

3)调试工具

A、使用官方的sketch-dev-tools sketch内作为调试工具

下载代码,代码运行安装插件即可:

npm install
npm run build

调试界面如下:

B、使用浏览器的开发者模式调试webView

在sketch webView中右击显示调试器即可:

4)服务端技术方案

轻量级服务器部署方案 -(阿里云CenOS+宝塔)

2、构建工程

1)创建Sketch插件基础工程

首先,创建sketch-webview-kit插件工程:

npm install -g skpm
skpm create sketch-webview-kit //创建sketch-webview-kit插件工程

其次,依赖sketch-module-web-view:

npm install sketch-module-web-view

2)创建webView工程(Umi Ant Design

首先,创建webView工程目录,

$ mkdir webapp && cd webapp

然后,创建webView工程

yarn create umi

依次:

选择 app, 然后回车确认;

选上 antd 和 dva,然后回车确认;

最后,安装依赖:

$ yarn

3)配置webView工程

A.部署打包配置

.umirc.js文件中,添加:

outputPath:'../src/dist', //打包后的目录
exportStatic: {
  htmlSuffix: true,
 dynamicRoot: true //静态自由部署
},

B.HTML 模板

由于Umi生成没有Html文件,可以自己配置。新建 src/pages/document.ejs,umi 约定如果这个文件存在,会作为默认模板,内容上需要保证有 <div id="root"></div>,比如:

<!doctype html>
<html>
<head>
  <meta charset="utf-8" />
  <title>Your App</title>
</head>
<body>
  <div id="root"></div>
</body>
</html>

C.添加新页面

直接在pages文件夹下建立页面的js与css样式文件即可。

D.《基于 umi 的 React 项目结构介绍》

3、sketch加载webView工程与联调

1)sketch加载webView

第一种方法:

直接部署webView工程,通过Url加载:

win.loadURL('https://github.com')

第二种方法:

加载webView工程打包后的文件:

win.loadURL(require('./dist/index.html'))

注意:

此方法,由umi打包后的静态资源(css、js)需要拷贝到

pannel3/pannel3.sketchplugin/Contents/Resources/_webpack_resources下。

2)联调加载方法:

本地启动webView工程,本地webView工程会在8000端口起一个服务,加载此服务即可:

const Panel = `http://localhost:8000#${Math.random()}`;
win.loadURL(Panel)

4、项目成果

文件目录如下:

七、发布sketch 插件

前提确保manifest.json的version参数已经修改为想要发布的版本。

{
  "name": "Whale Kit",
  "identifier": "whale-sketch-webview-kit",
  "description": "A quick prototype tool library for sketch. ",
  "author": "jingwhale",
  "authorEmail": "jingwhale@yeah.net",
  "compatibleVersion": 3,
  "bundleVersion": 1,
  "icon": "icon.png",
  "version": "0.4.3",
  "commands": [
    {
      "name": "Efficient design spec",
      "identifier": "sketch-webview-kit.my-command",
      "script": "whaleHomepage.js"
    },
    {
      "name": "Make Layout",
      "identifier": "sketch-webview-kit.my-command2",
      "script": "makeLayoutCommand.js",
      "shortcut" : "shift control a"
    },
    {
      "name": "Generate Button",
      "identifier": "sketch-webview-kit.my-command3",
      "script": "generateButtonCommand.js",
      "shortcut" : "shift control z"
    },
    {
      "name": "Operate Image",
      "identifier": "sketch-webview-kit.my-command4",
      "script": "operateImageCommand.js",
      "shortcut" : "shift control q"
    },
    {
      "name": "Flow Page",
      "identifier": "sketch-webview-kit.my-command5",
      "script": "flowPageCommand.js",
      "shortcut" : "control option shift p"
    },
    {
      "name": "Screen Shot",
      "identifier": "sketch-webview-kit.my-command6",
      "script": "screenshotCommand.js",
      "shortcut" : "control option shift j"
    },
    {
      "name": "Toggle State",
      "identifier": "sketch-webview-kit.my-command7",
      "script": "toggleStateCommand.js",
      "handler" : "onRun",
      "shortcut" : "control option shift k"
    },
    {
      "name": "Convert to Grayscale",
      "identifier": "sketch-webview-kit.my-command8",
      "script": "convertToGrayscaleCommand.js",
      "handler" : "onRun",
      "shortcut" : "control option shift g"
    },
    {
      "name": "Generate QR Code",
      "shortcut": "ctrl shift option q",
      "identifier": "sketch-webview-kit.my-command9",
      "script": "generateQrcode.js",
      "handler" : "onRun"
    },
    {
      "name": "Generate Cover",
      "shortcut": "ctrl shift option c",
      "identifier": "sketch-webview-kit.my-command10",
      "script": "generateCover.js",
      "handler" : "onRun"
    },
    {
      "name": "Generate Radar Chart",
      "shortcut": "ctrl shift option f",
      "identifier": "sketch-webview-kit.my-command11",
      "script": "generateRadarChart.js",
      "handler" : "onRun"
    },
    {
      "name": "Generate Tags",
      "shortcut": "ctrl shift option t",
      "identifier": "sketch-webview-kit.my-command12",
      "script": "generateTags.js",
      "handler" : "onRun"
    },
    {
      "name": "Generate Signifiers",
      "shortcut": "ctrl shift option s",
      "identifier": "sketch-webview-kit.my-command13",
      "script": "generateSignifiers.js",
      "handler" : "onRun"
    }
  ],
  "menu": {
    "title": "Whale Kit",
    "items": [
      "sketch-webview-kit.my-command",
      "-",
      "sketch-webview-kit.my-command2",
      "sketch-webview-kit.my-command3",
      "sketch-webview-kit.my-command4",
      "sketch-webview-kit.my-command7",
      "-",
      "sketch-webview-kit.my-command12",
      "sketch-webview-kit.my-command13",
      "-",
      "sketch-webview-kit.my-command6",
      "sketch-webview-kit.my-command8",
      "sketch-webview-kit.my-command9",
      "-",
      "sketch-webview-kit.my-command5",
      "sketch-webview-kit.my-command10"
    ]
  }
}

首先,需要把你的插件代码放到 Github仓库;

其次,使用开通GitHub Token;

因为,skpm需要一个GitHub令牌才能发布版本,需要`repo`权限才能创建版本。

设置完后,使用命令:

skpm login

将GitHub Token填进去,回车即可。

最后,使用命令,等待发布完成即可:

skpm publish <bump>

bump为patch, minor, or major其中之一,分别表示补丁,小改,大改

若是patch,变为1.0.1

若是minor,变为1.1.0

若是major,变为2.0.0

一旦你的插件被发布,它就会在sketch进行新的部署时出现在sketch插件官网上(可能需要几分钟到几天),部署成功后,可以在sketch插件官网查看发布的插件。

八、拓展

1、React - SketchApp 

是一个开源库,为设计系统量身定制。它通过将 React 元素渲染到 Sketch 来连接设计和开发之间的鸿沟。

Sketch Javascript API 是源生代码,React - SketchApp 使用react对Javascript API 进行了二次封装。

1)API

API Reference · react-sketchapp

2)自研JINGWHALE Sketch 插件

https://www.jingwhale.com/sketch/index.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1565606.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

sdrangel使用说明

使用说明 首先找一个usrp设备&#xff0c;我找到的是b205进行连接。打开生成的sdrangel.exe&#xff0c;第一次打开会出现空白界面 点击Add Rx Device按钮。 然后会弹出一个设备刷新窗口&#xff0c;选择你需要的设备 点击OK后&#xff0c;会响应一段时间&#xff0c;然后弹…

实用VBA:18.角度或坐标的格式转换(单位换算)

1.需求场景 在某些行业工作中&#xff0c;可能会遇到需要将角度或者坐标数值进行格式转换或者单位换算的情形。有很多小工具可以实现这样的换算&#xff0c;也有一些大型的专业软件带有单位换算的模块或者小插件&#xff0c;或者在excel单元格中写入计算公式。其实使用VBA写个函…

ImportError: cannot import name ‘PILLOW_VERSION‘ from ‘PIL‘

原因&#xff1a;torchvision模块在运行时要调用PIL模块的PILLOW_VERSION函数&#xff0c;但PILLOW_VERSION在Pillow 7.0.0之后的版本被移除了&#xff0c;Pillow 7.0.0之后的版本使用__version__函数代替PILLOW_VERSION函数。 解决方法&#xff1a;降低pillow版本即可。 参考…

网络原理 - HTTP / HTTPS(2)——http请求

目录 一、认识 “方法”&#xff08;method&#xff09; 1、GET方法 2、POST方法 &#xff08;1&#xff09;登录 &#xff08;2&#xff09;上传 &#xff08;3&#xff09;GET和POST使用习惯 3、GET方法和POST方法的区别 正确滴 关于一些网上的说法&#xff0c;错误滴…

两数之和-考察哈希表的运用

题目 给定一个整数数组 n u m s nums nums和一个整数目标值 t a r g e t target target&#xff0c;请你在该数组中找出和为目标值 t a r g e t target target的那 两个整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同…

Apache ECharts-数据统计(详解、入门案例)

简介&#xff1a;Apache ECharts 是一款基于 Javascript 的数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性化定制的数据可视化图表。 1、介绍 图 1.1 Apache ECharts 功能、运行环境 功能&#xff1a; ECharts&#xff…

pymc,一个灵活的的 Python 概率编程库!

目录 前言 安装与配置 概率模型 贝叶斯推断 概率分布 蒙特卡罗采样 贝叶斯网络 实例分析 PyMC库的应用场景 1. 概率建模 2. 时间序列分析 3. 模式识别 总结 前言 大家好&#xff0c;今天为大家分享一个超强的 Python 库 - pymc Github地址&#xff1a;https://gith…

开源大模型AI代理操作系统:像Windows一样,操控AI代理

去年&#xff0c;AutoGPT的出现让我们见识到了AI代理强大的自动化能力&#xff0c;并开创了一个全新的AI代理赛道。但在子任务调度、资源分配以及AI之间协作还有不少的难题。 因此&#xff0c;罗格斯大学的研究人员开源了AIOS&#xff0c;这是一种以大模型为核心的AI代理操作系…

JVM 记录

记录 工具 https://gceasy.io 资料 尚硅谷宋红康JVM全套教程&#xff08;详解java虚拟机&#xff09; https://www.bilibili.com/video/BV1PJ411n7xZ?p361 全套课程分为《内存与垃圾回收篇》《字节码与类的加载篇》《性能监控与调优篇》三个篇章。 上篇《内存与垃圾回收篇…

鸿蒙开发-ArkTS语言-并发

鸿蒙开发-UI-交互事件-键鼠事件 鸿蒙开发-UI-交互事件-焦点事件 鸿蒙开发-UI-交互事件-手势事件 鸿蒙开发-UI-web 鸿蒙开发-UI-web-页面 鸿蒙开发-ArkTS语言-基础类库 文章目录 前言 一、并发概述 二、异步并发开发 1. 异步并发概述 1.1 Promise 1.2 async/await 2. 单次…

Linxu的开发工具(三):缓冲区、进度条程序和调试器gdb

目录 缓冲区 倒计时程序 对出现swp文件报错的补充&#xff1a; 进度条程序 将tab键设置为四个空格 调试器-gdb 对比测试 实际应用 缓冲区 前言&#xff1a;\n会产生换行和回车两个动作&#xff1a; 回车&#xff1a;回到下一行行首换行&#xff1a;移动到当前所在位置…

《大模型面试宝典》(2024版) 正式发布!

2022 年11月底&#xff0c;OpenAI 正式推出 ChatGPT &#xff0c;不到两个月的时间&#xff0c;月活用户就突破1亿&#xff0c;成为史上增长最快的消费者应用。 目前国内已发布的大模型超过200个&#xff0c;大模型的出现彻底改变了我们的生活和学习方式。 只要你想从事 AI 相…

【论文阅读笔记】SAM-Adapter: Adapting Segment Anything in Underperformed Scenes

1.论文介绍 SAM-Adapter: Adapting Segment Anything in Underperformed Scenes SAM适配器&#xff1a;在表现不佳的场景中适配任何片段 2023年 ICCV Paper Code SAM Fails to Segment Anything? – SAM-Adapter: Adapting SAM in Underperformed Scenes: Camouflage, Shado…

HR是怎么看待PMP证书的呢?

考PMP证书为什么值得&#xff1f;对管理人员有用么&#xff1f; 首先&#xff0c;在行业内部&#xff0c;一名项目经理&#xff0c;需要有PMP证书已经是行业内的共识了。而且面试的时候&#xff0c;如果是同样的年龄段&#xff0c;同样的背景&#xff0c;那有证书在手的人&…

2013年认证杯SPSSPRO杯数学建模C题(第二阶段)公路运输业对于国内生产总值的影响分析全过程文档及程序

2013年认证杯SPSSPRO杯数学建模 C题 公路运输业对于国内生产总值的影响分析 原题再现&#xff1a; 交通运输作为国民经济的载体&#xff0c;沟通生产和消费&#xff0c;在经济发展中扮演着极其重要的角色。纵观几百年来交通运输与经济发展的相互关系&#xff0c;生产水平越高…

九州金榜家庭教育:关注孩子心理健康,增强亲子沟通

家庭教育现在越来越受重视&#xff0c;尤其孩子心理健康&#xff0c;当下社会&#xff0c;孩子心理健康问题频出&#xff0c;很多地方不时传出孩子轻生的新闻&#xff0c;这就是在教育过程中&#xff0c;沟通出现了严重问题&#xff0c;随着心理变化产生&#xff0c;孩子这时候…

Python(乱学)

字典在转化为其他类型时&#xff0c;会出现是否舍弃value的操作&#xff0c;只有在转化为字符串的时候才不会舍弃value 注释的快捷键是ctrl/ 字符串无法与整数&#xff0c;浮点数&#xff0c;等用加号完成拼接 5不入&#xff1f;&#xff1f;&#xff1f; 还有一种格式化的方法…

AI绘画软件有什么用?

人工智能(AI)的应用已经渗透到我们生活的各个角落&#xff0c;其中就包括图像生成。AI绘画软件&#xff0c;是一种基于深度学习技术的创新工具&#xff0c;它能够根据指定的风格、主题或者素材自动创作出新的图片。那么&#xff0c;AI绘画软件具体有什么用呢? 首先&#xff0c…

笔记本电脑外放有声音,插耳机没声音

我的笔记本最近因为微信插耳机没声音&#xff0c;每次电话沟通需求&#xff0c;能把人折磨的要死&#xff0c;我实在不知道是哪个设置出现了问题&#xff0c;如果你也遇到了有的软件插耳机有声音&#xff0c;而换一个软件就没声音&#xff0c;那你可以试试我这个高端的方法 1、…

openGauss学习笔记-254 openGauss性能调优-使用Plan Hint进行调优-子链接块名的hint

文章目录 openGauss学习笔记-254 openGauss性能调优-使用Plan Hint进行调优-子链接块名的hint254.1 功能描述254.2 语法格式254.3 参数说明254.4 示例 openGauss学习笔记-254 openGauss性能调优-使用Plan Hint进行调优-子链接块名的hint 254.1 功能描述 指明子链接块的名称。…