๐ loaders ๋ก ๋ฐ์ดํฐ ์ ๋ฌํ๊ธฐ
Storybook 6.1 ๋ถํฐ ์คํ์ ๊ธฐ๋ฅ์ผ๋ก loaders
๊ฐ ์ถ๊ฐ๋์์ต๋๋ค.
์์ ํ ๊ธฐ๊ฐ์ ๊ฑฐ์ณ Storybook 7.0 ์์๋ stable ๋ก ๋ณ๊ฒฝ๋์๋๋ฐ์.
๊ธฐ์กด์ args
๋ฅผ ํตํด ์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด์ฃผ๋ ๋์ , loaders
์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ ํจ์๋ฅผ ์ ์ํจ์ผ๋ก์ ์คํ ๋ฆฌ๋ถ render context ์ ์ด๋ฅผ ํ ๋นํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์ถ๊ฐ๋์์ต๋๋ค.
๋ชจ๋ ์คํ ๋ฆฌ์ ์ ์ฉ๋๋์ง ์ ๋ฌด์ ๋ฐ๋ผ global loader ์ story loader ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ๋๋๋๋ฐ,
์ด๋ฒ ๊ฒฝ์ฐ์๋ ๊ฐ๋ณ ์คํ ๋ฆฌ์ ์ฃผ์
์ด ํ์ํด์ story loader
๋ฐฉ์์ ์ฌ์ฉํ์ต๋๋ค.
๐ ์์๋ก ์ดํด๋ด ์๋ค.
๋ค์๊ณผ ๊ฐ์ ์น ์ปดํฌ๋ํธ๊ฐ ์๋ค๊ณ ํ๊ฒ ์ต๋๋ค.
ํด๋น ์ปดํฌ๋ํธ๋ ์์ ์บ๋ฒ์ค์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ๋ ๋๋งํ๋ ์ญํ ์ ์ํด ๋ง๋ค์ด์ก์ต๋๋ค.
ํ์ฌ๋ ๊ณ ์ ๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ด๋ฏธ์ง๋ฅผ ๊ทธ๋ ค์ฃผ๊ณ ์๋๋ฐ, ์ด๋ฅผ ๋์ ์ผ๋ก ๋ฐ๊พธ๊ณ ์ถ์ ์ํฉ์ ๋๋ค.
import { html } from 'lit-html'
export const Basic = ({ caption, selected }) =>
html`<v-canvas-preview caption="${caption}" selected="${selected}"></v-canvas-preview>`
Basic.args = {
caption: 'ํ๋ฆฌ๋ทฐ ์ค๋ช
',
selected: true,
}
์ด๋ฅผ ์ํด์ ์บ๋ฒ์ค์ ImageData
๋ฅผ ์ ๋ฌํด์ค์ผํฉ๋๋ค.
๋จผ์ ImageData
๋ฅผ ์์ฑํ๋ ํจ์๋ฅผ ์ ์ํฉ๋๋ค.
ํ
์คํธ๋ฅผ ์ํด ์ํ ์ด๋ฏธ์ง๋ฅผ ์ด์ฉํด์ ImageData
๋ฅผ ์์ฑํฉ๋๋ค.
async function getImageData() {
return new Promise((resolve, reject) => {
const canvas = document.createElement('canvas')
canvas.width = 1000
canvas.height = 1000
const image = new Image()
image.src = 'assets/images/test.png'
image.addEventListener('load', () => {
const ctx = canvas.getContext('2d')
ctx?.drawImage(image, 0, 0, 130, 130)
const imageData = ctx?.getImageData(0, 0, 130, 130)
if (imageData) {
resolve(imageData)
} else {
reject()
}
})
})
}
canvas
์ ๋ถ๋ฌ์จ ์ด๋ฏธ์ง๋ฅผ ๊ทธ๋ฆฐ ๋ค์, ์ค๋
์ท์ ์์ฑํด์ ImageData
๋ฅผ ๋ฐํํ๋ ํจ์์
๋๋ค.
์ด๋ฏธ์ง ๋ก๋ฉ์ด ๋น๋๊ธฐ๋ก ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ ์ ํจ์ ๋ํ ๋น๋๊ธฐ Promise
๋ฅผ ๋ฐํํ๋ฉฐ,
์ผ๋ฐ์ ์ธ args
์ ๋ฌ ๋ฐฉ์์ผ๋ก๋ ์คํ ๋ฆฌ๋ถ์ ๋ ๋๋งํ ์ ์์ต๋๋ค.
๋์ loaders
๋ฅผ ์ด์ฉํด์ ์ปดํฌ๋ํธ์ ๋น๋๊ธฐ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด loaders
๋ฅผ ์คํ ๋ฆฌ์ ์ถ๊ฐํฉ๋๋ค.
export const Basic = (
{ caption, selected },
{ loaded: { imageData } }
) => {
console.log(imageData) // โ
๋ก๊ทธ๋ก ํ์ธํด๋ณด์
return html`<v-canvas-preview caption="${caption}" selected="${selected}"></v-canvas-preview>`
}
Basic.loaders = [
async () => ({
imageData: await getImageData(),
}),
]
๋ฐ์ดํฐ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ฌ๋๋ ๊ฒ์ ํ์ธํด๋ด ๋๋ค.
์ด์ ์ด ๊ฐ์ ์ปดํฌ๋ํธ์ ๋๊ฒจ์ค ๋ค ์ํ๋ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๋ฉด ๋ฉ๋๋ค.
์ด๋ฒ ์์ ์์๋ element ์ property ๋ก ์ด ๊ฐ์ ์ง์ ํด์ค๋๋ค.
ImageData
๋ก ์บ๋ฒ์ค์ ๋ ๋๋งํ๋ ๋ก์ง์ v-canvas-preview
๋ด์ ์ ์๋์ด์์ผ๋ฉฐ
์ด๋ฒ ํฌ์คํธ์์๋ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ๋ด์ฉ์ด๊ธฐ ๋๋ฌธ์ ๊ตฌํ์ ์๋ตํฉ๋๋ค.
export const Basic = (
{ caption, selected },
{ loaded: { imageData } }
) => {
const loadImageData = () => {
setTimeout(() => {
const $preview = document.querySelector('v-canvas-preview')
if ($preview) {
$preview.imageData = { image: imageData }
}
}, 0)
}
loadImageData()
return html`<v-canvas-preview caption="${caption}" selected="${selected}"></v-canvas-preview>`
}
๐ ์ฐธ๊ณ ์๋ฃ
'๐จโ๐ป web.dev > fe' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Storybook useArgs ํ์ฉํ๊ธฐ (1) | 2023.08.28 |
---|---|
Web Component์ ํจ๊ป ์ปดํฌ๋ํธ ๋ง๋ค๊ธฐ (0) | 2023.08.25 |
Storybook ์์ ์ปดํฌ๋ํธ ๋จ์ ํ ์คํธํ๊ธฐ (0) | 2023.06.24 |
React Framer Motion ํบ์๋ณด๊ธฐ (0) | 2023.03.27 |
ํ๋ก ํธ์๋ E2E ํ ์คํ (with Cypress) (2) | 2023.03.19 |
๐ฌ ๋๊ธ