【Figma】rollupとsvelteで作るFigmaプラグイン
環境
Node v18.3.0
npm 8.12.1
設定ファイル
rollup
必要なプラグインをインストールする
npm i -D rollup rollup-plugin-node-resolve rollup-plugin-commonjs rollup-plugin-typescript2 typescript tslib rollup-plugin-bundle-html-plus
rollup.config.js
を作成する
// rollup.config.js
import nodeResolve from "rollup-plugin-node-resolve";
import commonjs from "rollup-plugin-commonjs";
import typescript from "rollup-plugin-typescript2";
import html from "rollup-plugin-html-bundle";
export default [
// code
{
input: "src/code.ts",
output: {
name: "code",
file: "dist/code.js"
},
plugins: [
typescript({ tsconfig: "tsconfig.json" }),
nodeResolve(),
commonjs({ transformMixedEsModules: true }),
],
watch: {
clearScreen: true
}
},
// ui
{
input: "src/ui.html",
output: {
dir: "dist",
},
plugins: [
html({
target: 'dist/ui.html',
inline: true,
}),
]
}
];
typescriptの設定
tsconfig.json
を作成する
tsc --init
で作成もできるが、このままコピーしても大丈夫
{
"compilerOptions": {
"lib": ["es5", "es6", "dom"],
"strict": true,
"noImplicitAny": false,
"typeRoots": [
"./node_modules/@types",
"./node_modules/@figma"
],
"esModuleInterop": true
},
"exclude": ["rollup.config.js"]
}
figma
npm i -D @figma/plugin-typings
manifest.json
を作成する
{
"name": "figcode",
"api": "1.0.0",
"main": "dist/code.js",
"ui": "dist/ui.html"
}
codeとhtmlファイル
// src/code.ts
figma.showUI(__html__, { width: 600, height: 400 });
figma.ui.onmessage = (msg) => {
if (msg.type == "cancel") {
figma.closePlugin();
}
}
<!-- src/template.html -->
<html>
<head></head>
<body></body>
</html>
<!-- src/ul.html -->
コマンド追加
package.json
のscripts
にbuild
を足して実行する
{
"scripts": {
"build": "rollup -c"
}
}
npm run build
svelteを使う
まず必要なライブラリをインストールします
npm i -D svelte svelte-preprocess rollup-plugin-svelte @tsconfig/svelte rollup-plugin-json
設定ファイルの書き換え
installしたライブラリを読み込みます
...
import svelte from "rollup-plugin-svelte";
import preprocess from "svelte-preprocess";
import json from "rollup-plugin-json";
const isProduction = !process.env.ROLLUP_WATCH;
export default {
...
// ui
{
input: "src/app.ts",
output: {
format: "umd",
name: "ui",
file: "dist/app.js",
},
plugins: [
json(),
svelte({
dev: !isProduction,
preprocess: preprocess(),
}),
typescript({
tsconfig: "tsconfig.ui.json",
sourceMap: !isProduction,
}),
nodeResolve({
browser: true,
dedupe: ["svelte"],
extensions: [".svelte", ".ts", ".js"],
}),
commonjs({ transformMixedEsModules: true }),
html({
target: 'dist/ui.html',
inline: true,
}),
],
}
}
次にsrc/app.ts
とsrc/main.svelte
を作成します
// src/app.ts
// @ts-ignore
import App from './main.svelte'
const app = new App({
target: document.body,
})
export default app
// src/main.svelte
<script>
let value = "change me!"
</script>
<input type="text" bind:value>
{value}
tsconfig.ui.json
を作成する
{
"extends": "@tsconfig/svelte/tsconfig.json",
"compilerOptions": {
"types": ["node", "svelte"]
},
"include": ["src/**/*"],
"exclude": ["node_modules"]
}
cssを.cssファイルに分けない
rollup.config.js
を編集する
// rollup.config.js
...
export default [
...,
// ui
{
...,
plugins: [
svelte({
...,
emitCss: false,
})
]
}
];
この設定でsvelteファイルをapp.tsやmain.svelteに読み込んでいけば,表示側はちゃんと作れそうです
参考
Building: Rollup Plugin HTML
@rollup/plugin-node-resolve
Create your first Figma plugin with Svelte