Screen Shot 2019-05-29 at 10.10.38 AM.png

Sketch 是设计师们依赖的利器,除了本身具备很高效的功能外,它还支持我们为它定制一些插件。那么具体如何开发一个 Sketch 插件呢?今天就试着开发一个插件中的 helloworld 吧。


开始前的准备

在你开始写代码之前,应该先配置好一个方便开发和测试的环境。Sketch 插件的开发,没有专门的 IDE,测试过程也非常繁琐,所以提前做好一些准备能大大提高效率。

0. 开发 Sketch 插件的前提条件

  • 有一台运行 macOS 的电脑
  • 了解基本的 Sketch 使用方法和概念
  • 有不错的 JavaScript 基础
  • *有一点 Objective-C 基础就更好了

1. 如果你没有编辑器,搞一个。

编辑器方面见仁见智,常用的有 vscode、sublime、atom 等,当然如果熟练的话 vim 之类的也 ok。之所以用编辑器是因为我们在做 Sketch 开发时通常要用到 CocoaScript,基本没有什么 IDE 对其支持特别好。用能够自己配置定制化的编辑器反而方便一些。

2. 然后,打开你的 Console.app,你会在 debugging 的过程中反复用到它。

Screen Shot 2019-05-05 at 7.15.00 PM.png
mac 中的 Console.app

1559035839945-f8ce0a54-c395-4917-ae6a-efedc4c9a70e.jpg
_Console.app 界面

_

3. Console.app 会被你机器用来做所有的 debugging,所以需要创建一个搜索筛选器。

如果你用的是最新的系统,在筛选器(filter)中输入: Sketch 回车,然后左边选择“进程”(Process)。再做一次,选择“库”(library)。

如果你使用的是 MacOS Sierra, 在筛选器(filter)中输入:

  1. process:Sketch <回车>
  2. library:Sketch <回车>

然后将这个筛选器保存为“Sketch”。

Screen Shot 2019-05-05 at 7.21.39 PM.png
Console 中保存筛选器

如果用的是更早的系统,请自行查阅相关方法。

成功后应该会在界面上某位置看到这个 Sketch 筛选器。

1559035839867-31d85459-691b-456e-a24e-d8100fac3a09.jpg
快捷筛选器

4. 将你的 Sketch 插件文件夹保存为 Finder 的收藏书签。

你会经常用到这个文件夹,这个文件夹在 Library 中隐藏会让你每次打开都非常抓狂。

  1. ~/Library/Application Support/com.bohemiancoding.sketch3/Plugins

Screen Shot 2019-05-05 at 7.32.00 PM.png
打开这个路径,将文件夹拖到 Finder 收藏栏

现在你可以开始写你的第一个插件了!


要写一个插件,拢共分 10 步

本质上,Sketch 的插件就是一个文件夹,只不过名称加上了 .sketchplugin 的拓展名。

在这个 demo 中,我们使用一个基本的脚本来获取 Sketch 中页面(Page)的名称。

Sketch 插件是用 CocoaScript 写的。CocoaScript 其实就是一种 Objective-C/Cocoa 和 JavaScript 的混合体。主要是能在 Js 里穿插写 Objective-C 代码,对于 Js 基础好的同学来说基本问题不大。

1. 在你的 Sketch Plugins 文件夹中,新建一个文件夹,命名为 MyPlugin.sketchplugin

一旦你为文件夹添加了 .sketchplugin 拓展名,再双击它就不是打开文件夹了,而是直接作为插件安装进 Sketch 里。要想打开文件夹,需要右击-打开包内容。

2. 在这个文件夹里,新建一个文件夹叫 Contents

熟悉 Mac 系统的同学应该知道 app 里面一般都是这么个结构。

3. 在 Contents 文件夹里,新建一个文件夹叫 Sketch

Screen Shot 2019-05-05 at 8.08.32 PM.png
路径状态

在这个 Sketch 文件夹里,你可以开始你的编码了。

至少,你需要包含两个必备的文件: manifest.json 和一个脚本文件。

1_8l57iDwSsF5TnOT0X408tQ.png

manifest 文件是一个编组清单,它描述了你的插件,以及你配置的快捷键、额外的脚本等。 manifest.json 的格式和文件名都必须固定是这样,不能换。

而脚本文件是你可以写逻辑代码的地方,每个脚本文件会被 manifest 文件所引用。每个脚本文件的命名可以随你,只要它在 manifest 引用时名称一致。

4. 新建一个 manifest.json 文件

可以直接在编辑器里新建,保存到 MyPlugin.sketchplugin>Contents>Sketch 路径下。

5. 复制以下代码到 manifest.json 并保存

  1. {
  2. "name" : "My Plugin",
  3. "identifier" : "my.plugin",
  4. "version" : "1.0",
  5. "description" : "My First Sketch Plugin",
  6. "authorEmail" : "your@email.com",
  7. "author" : "Your Name",
  8. "commands" : [
  9. {
  10. "script" : "MyScript.js",
  11. "handler" : "onRun",
  12. "shortcut" : "command shift y",
  13. "name" : "Get Page Names",
  14. "identifier" : "my.plugin.pagenames"
  15. }
  16. ],
  17. }

配置项都是可以顾名思义的,可以针对你的需要稍作修改。

这时候你打开 Sketch 应该已经可以在插件菜单或者插件管理中找到这个插件了。

6. 新建一个 MyScript.js 文件

同样,可以直接在编辑器里新建,保存到 MyPlugin.sketchplugin>Contents>Sketch 路径下。

7. 复制以下代码到 MyScript.js 文件中

  1. var onRun = function(context) {
  2. //reference the Sketch Document
  3. var doc = context.document;
  4. //reference all the pages in the document in an array
  5. var pages = [doc pages];
  6. //loop through the pages of the document
  7. for (var i = 0; i < pages.count(); i++){
  8. //reference each page
  9. var page = pages[i];
  10. //get the name of the page
  11. var pageName = [page name];
  12. //show the page name in the console
  13. log(pageName);
  14. }
  15. }

如果刚才没有在 Sketch 的插件菜单里找到你的插件,现在肯定可以了。

代码的注释基本解释了原理。

8. 进入 Sketch 应用,打开或新建一个文件

随便新建一个什么文件,用来测试你刚才做的插件。

9. 在插件菜单里,找到 MyPlugin>Get Page Names

点击,这时候你的文件 Pages 的名称应该被读取了,如果是新建的文件,应该是只有一个页面叫 Page 1。

10. 进入你的 Console.app 在底部查看是否有一条 log 记录输出了你的页面名称(Page 1)

1559035839866-3cb935e8-445f-466a-8827-883a018c2b06 (1).jpg
最后一条结果,输出了页面名称


这就完事了

这样,你的第一个极简的插件就完成了,走通了。你获取到了页面的名称!

参考文献:https://medium.com/@marianomike/the-beginners-guide-to-writing-sketch-plugins-part-1-28a5e3f01c68