Dev Mode 特性目前处于公测阶段,部分特性未来可能会调整。
Dev Mode 下, Figma 提供开发者导航设计文件和将设计转换为代码的所有信息,开发者与设计师共享同一个文件( 唯一事实源
),从而有效地避免上下游交接中遗漏细节信息。
Dev Mode 下用户可以:
简而言之, Dev Mode 是专为开发人员打造的,用于快速审查和导航设计,用户可以在任何 Figma 设计文件中启用 Dev Mode 。
</>
的 Dev Mode 切换按钮,也可以使用快捷键( shift + D )Dev Mode 下,左侧边栏将已经设计完成的页面/ Frame 列表显示出来,开发者无需与设计师就设计进度沟通,通过左侧导航快速访问已完成的设计,进行相应的开发。
审查面板显示设计规范和相关信息,辅助开发者更好地理解设计并将设计转化为代码。
Figma 通过 Dev Mode 插件扩展 Dev Mode 能力,而 Dev Mode 插件通常可以从两个部分进行扩展:
这里不做过多讲解,下文在介绍 Dev Mode 插件开发时会具体讲到。
在 Dev Mode 发布之前,设计师与开发工程师在流程上基本属于割裂状态,设计师交付设计稿之后,开发根据命名规则或样式值映射编写样式变量。如意设计助手以插件为桥梁,连接设计师和开发工程师,通过第三方能力来打通 Design Tokens 和组件的代码级应用。但只有获得编辑权限的用户才能在打开文档时启用插件,无形中会增加组织规模。
开发模式特性的发布令团队感到兴奋,无论是开发模式下插件界面直接嵌入审查面板还是 Figma 提供的代码生成( codegen )区块的扩展,给如意设计助手打通设计与下游的流程有着跨越式的体验影响。
设计模式下一般用于设计师进行设计交付,开发模式用于辅助实现设计。如意设计助手借助开发模式的 codegen 的能力,提供开发者快速审查组件代码和设计样式变量的能力。
如意设计助手利用开发模式下对于审查面板的接管以及代码模块的自定义扩展,使得开发者更为便捷地审查代码,目前发布上线的如意设计助手代码相关功能截图如下:
Plugins 选项卡组件代码展示
Inspect 选项卡组件代码展示
如意设计助手利用开发模式下开放的能力,让 Design to Code 的能力更自然地融入设计工具,更有效地串联起设计与开发流程。
与新增的 Dev Mode 相对应的是之前的 Design Mode ,Dev Mode 着力于解决开发与设计的协作痛点,两种模式有以下区别:
和 Figma 其它产品一样,插件可以与开发模式交互。开发模式下的插件集中提供实现设计所需的所有信息,可用于审查与生成代码。
审查: 插件可以接管开发模式下的审查面板,并从设计实现所需的其他工具(例如 Jira 、GitHub 或特定于您的组织的内部 API )中提取相关上下文。
生成代码: 插件可以使用 Figma 本身并不支持的语言和前端框架来自定义生成代码。
开发模式下的插件与非开发模式下的插件有一些关键的差异:
开发模式下,插件的审查功能可以在面板中显示选中图层关联的相关信息,不仅包含 Figma 默认显示的内容。当切换到插件面板时,整个右侧内容将会被插件界面铺满,截图示例如下:
下面将介绍如何定制开发模式下界面和功能。
创建支持审查功能的插件,需要在配置文件中做如下更新:
示例如下:
{
"name": "Plugin for inspection",
"id": "000000000000000000",
"api": "1.0.0",
"main": "code.js",
"editorType": ["dev"],
"capabilities": ["inspect"]
}
组织代码时,也可以通过全局变量 figma来判断 API 调用是否允许。示例代码如下:
if (figma.editorType === "dev") {
// Read the current page and listen to API events
const numChildren = figma.currentPage.children.length
figma.notify(
`This is running in Dev Mode.
The current page has ${numChildren}`
);
} else {
figma.notify(
`This is NOT running in Dev Mode.
We can modify the file!`
);
const node = figma.createRectangle();
node.name = "I proved that I can edit files!";
}
figma.closePlugin();
注:通过在插件配置文件中添加上述的声明,即可支持在开发模式下的插件面板中显示。
Inspect
)面板开发模式下的插件可用于自定义代码生成。插件可识别当前选中节点,基于与图层关联的元数据生成代码块并发送给 Figma 显示在代码面板中。需要注意的是,插件开发者无需专门为自定义的代码块新开 iframe 窗口来显示代码,在开发者模式下,自定义代码可以与 Figma 的代码一起显示在代码面板上。你可以使用插件为 Figma 本身不支持的语言或框架生成代码,或者显示用户可能想要的其他元数据,例如在代码库中导入图标或国际化字符串。
前文有提过这个区别,一言以蔽之,任何使用插件 API 创建节点/删除节点/修改节点在开发模式下都是不被允许的。例如下面的代码:
// This will throw an error because we are trying to create a new node.
const node = figma.createRectangle();
// This will throw an error because we are trying to remove an existing node.
node.remove();
// This will throw an error because we are trying to update a property on a node.
node.name = "Button";
在开发模式下,上面的操作都是不被允许的, Figma 会抛出异常,阻止相应的操作。而下面这些操作,则是允许的:
// Get a node
const node = figma.getNodeById('1:12');
// Read a property
console.log(node.name)
// showUI
figma.showUI(__html__)
// listen to events
figma.on('selectionchange', () => {
// Do something
})
开发模式下,只能读取当前页( page )以及被当前页( page )引用的组件节点。如果组件试图遍历整个文档( document ),除了当前页其它页子节点均会为空。示例代码如下:
// ✅ Works the same as in Figma design
// Children of the current page
figma.currentPage.children
// findAll and findAllWithCriteria
figma.currentPage.findAll(node => node.name === 'Button')
// Getting the main component
instance.mainComponent
// Changing the page
figma.currentPage = figma.root.children[2]
// Accessing data directly on the document root
figma.root.getPluginData("plugin-data-id")
// ❌ Might work differently
// Might not search nodes on other pages
figma.root.findAll(node => node.type === 'INSTANCE')
// Document change won't fire for changes on other pages
figma.on('documentchange', (e) => {
})
// Other pages might not have children
const otherPage = figma.root.children[2]
otherPage.children.length // could be 0
在开发模式下,一次只能选中一个节点,因此,插件每次也只能获取/设置一个节点。示例代码如下:
// Clear selection
figma.currentPage.selection = []
// Select a single node
const node = figma.getNodeById('1:12')
figma.currentPage.selection = [node]
skipInvisibleInstanceChildren
开发模式下,该属性值默认为 true ,这有助于确保插件有更好的性能。
前文讲过,开发模式下插件会占满整个审查面板,而审查面板大小是可变的,因此推荐设计插件中 iframe 时需遵循以下原则:
300px
和500px
进行优化支持 Dev Mode 虽然是新增特性,但也同样需要考虑代码的向后兼容
@figma/plugin-typings
包。如果你在使用 typescript 开发 Figma 插件,建议升级或安装最新的类型包;import { useState } from 'react';
import { emit, on } from '../../utils/event';
import { EVENTS } from '../../consts';
export default () => {
const [detecting, setDetecting] = useState(true);
const [isDevMode, setIsDevMode] = useState<boolean | undefined>(undefined);
emit(EVENTS.DETECT_IS_DEV_MODE);
on(EVENTS.DETECT_IS_DEV_MODE_RESPONSE, (result) => {
setDetecting(false);
setIsDevMode(result === 'dev');
}, true);
// 通信中时处于第3种状态
return [detecting, isDevMode];
};
if (figma.mode === 'codegen') {
figma.codegen.on('generate', codegenHandler);
} else {
// design mode 下的功能
}
如意设计助手在 codegen 实践中,刚开始是在插件代码块中根据组件存在图层中的数据生成相应的代码,因为代码的生成基于 babel 相关的多个包,这样会将多个比较大的库打包进 code.js ,导致触发 500KB 大小限制的问题。而插件UI部分的代码中,同样有代码生成的功能,后续采用 Figma 与插件UI( iframe )通信的方式,将待处理的数据发送给插件UI生成,再发回给 Figma 显示。
Dev Mode 的发布对整个交付流程是巨大的冲击,开发者可以通过 Dev Mode 插件充分发挥其价值,真正做到在一个工具中打通设计与开发。如意设计工具会持续挖掘 Dev Mode 带来的巨大价值,敬请期待我们后续的特性上新。
关注我们 👇 一起成长