์ํ๋ ์๋ฃจ์
์ค๋ช
Storybook์ ๋งค์ฐ ๊ตฌ์ฑ ์์์ ์ค์ ์ ๋๊ณ Stencil์ ๋งค์ฐ ๊ตฌ์ฑ ์์์ ์ค์ ์ ๋ ํ๋ ์์ํฌ ์ด๋ฏ๋ก Stencil.js ์ง์์ ๋ณด๊ณ ์ถ์ต๋๋ค. ์ด๋ฌํ ๋๊ตฌ๋ ์๋ก๋ฅผ ๋งค์ฐ ์ ๋ณด์ํ ๊ฒ์
๋๋ค.
๊ธฐ๋ฅ์ ํ์ค๋ก ๊ฐ์ ธ์ค๋ ๋ฐ ๋์์ ์ค ์ ์์ต๋๊น?
์, ์ ๋ ํ ์ ์์ต๋๋ค...
#1870 ๋ฐ #3423์ ๋ณต์ ํฉ๋๋ค. ๊ฑฐ๊ธฐ์ ํ ๋ก ์ ๊ณ์ํ์
ํ์ฌ ์คํ ์ค ๋ฐ SB 5๋ฅผ ์ํ ์๋ก์ด ์คํํฐ ๋น๋ ์์ฑ ์์
@Edd-Srickland๋ stencl ์ง์ ๋ฒ์ ์์ ์ ์ํฉ๋๋ค ๐
์คํ ์ค์ด ์๋ ํด๋ฆฌ๋จธ ์คํํฐ๋ฅผ ์ต์ ๋ฒ์ ์ SB๋ก ์ ๊ทธ๋ ์ด๋ํ์ต๋๋ค. ํด๋ฆฌ๋จธ๋ฅผ ์ ๊ฑฐํ๊ณ ์คํ ์ค ์ปดํ์ผ๋ฌ๋ฅผ ์ถ๊ฐํ๋ ๋ฐ ๋์์ด ํ์ํฉ๋๋ค.
์๋ ํ์ธ์,
@Edd-Strickland๋ ์ ๋ณด๋ฅผ ์ํด ์ด ํ๋ก์ ํธ์์ ์คํํฐ์์ ํ๋ ๊ฒ์ฒ๋ผ ์คํ ๋ฆฌ๋ถ ๋ด๋ถ์ ์คํ ์ค์ ๊ตฌํํ์ต๋๋ค. https://github.com/vogloblinsky/nutrition-web-components
Storybook์ HTML ์คํํฐ๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
์ง๊ธ์ Storybook & Stencil์ ์ฌ์ฉํ์ฌ ๋ค์์ ์ํํด์ผ ํ์ต๋๋ค.
๋ด๊ฐ ์๊ฐํ๋ ์ฃผ์ ๋ฌธ์ ๋ ์คํ ๋ฆฌ ๋ด์์ ๊ฐ์ ธ์จ JavaScript ํ์ผ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด Storybook์์ Webpack์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ์ด์์ ์ธ ์ํฌํ๋ก๋ Web Component์ JS ํ์ผ๋ง ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋๋ค.
์, ์ด๊ฒ์ ์ด์ ์ ์ํํ ์์ ์ด์ง๋ง ํด๋ฆฌ๋จธ ๋ฒ์ ์์๋ ์ผ๋ฐ ์ ์ W/C ๊ตฌํ์ผ๋ก ๊ฐ์ ธ์ค๋ฉด ์ ํ์ ์ผ๋ก ๋๊ปด์ง๋ ์คํ ๋ฆฌ๋ก ๋งค๋ฒ ์ ๋ฐ์ดํธํด์ผ ํ๋ค๋ ์๋ฏธ์ ๋๋ค.
์๋
ํ์ธ์, ์คํ
์ค component
์ ํ ํ๋ก์ ํธ์ ์ค์นํ ์ ์๋ ๋ํผ๋ฅผ ๋ง๋ค์์ต๋๋ค. ๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. https://github.com/nisheed2440/stencil-storybook-wrapper
์์์ผ์ ํ ์คํธ ํด๋ด์ผ๊ฒ ์ต๋๋ค. ์ ํ์ด :)
์ด๊ฒ์ด Storybook์ ๊ณต์ ๋ถ๋ถ์ผ๋ก ๋ง๋ค์ด์ง๊น์? ๋๋ ์ด๊ฒ์ด ์ ์คํ ํ์ํฉ๋๋ค!
@otw ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค. ๋์์ฃผ์๊ฒ ์ต๋๊น?
@ndelangen ๊ธฐ๊บผ์ด ํ ์คํธํ๊ณ ํผ๋๋ฐฑ/๋ฒ๊ทธ ๋ณด๊ณ ์๋ฅผ ์ ๊ณตํ๊ฒ ์ต๋๋ค.
์ด๊ฒ์ LitElement(๋ฐ ์ผ๋ฐ์ ์ผ๋ก ์น ๊ตฌ์ฑ ์์)์์ ์๋ํฉ๋๊น ์๋๋ฉด Stencil์์๋ง ์๋ํฉ๋๊น?
@nishe2440 ๋ํผ๊ฐ ์ ๋งํด ๋ณด์ ๋๋ค. ๊ณง ํ ์คํธํ๊ฒ ์ต๋๋ค! ํ์ง๋ง Storybook ๐์ ๋ฌธ์ํ๋ "๋ค์ดํฐ๋ธ" ํตํฉ์ด ์์ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
@nisheed2440 ์ ๋ ๋งค์ฐ ๋ฐ๋นด์ง๋ง(๋ชจ๋์๊ฒ ์ฃ์กํฉ๋๋ค) ์ค๋ ์์ฃผ ์์ ์ฐฝ์ ๊ฐ์ง๊ณ ๋ก์ปฌ์์ ๋งค์ฐ ๋ฐ๋๋ผ ๋ฒ์ ์ ํ ์คํธํ๊ณ ์ ๋ง ์ข์ต๋๋ค. ์ ๋ง ์ ์๋ํฉ๋๋ค.
๋ค์ ์ฃผ์ ๊ธฐ์กด ์คํ ์ค ์ฌ์ฉ์/ํ๋ก์ ํธ์์ ์ด๊ฒ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์์๋ณด๊ธฐ ์ํด ๊ธฐ์กด ํ๋ก์ ํธ์ ํตํฉํ๋ ๋ฐ ์๊ฐ์ ํ ์ ํ ๊ฒ์ ๋๋ค.
๋๋ ์ค๋ ์์นจ์ ๊ทธ๊ฒ์ ํ ์คํธํ๊ณ ๊ฝค ์ ์๋ํฉ๋๋ค! GJ ์ค์ ์ ์ ๋ง ์ฝ์ต๋๋ค. ๋ช ๊ฐ์ง ์ ๋์จ์ ์ค์นํ๊ณ ํ ์คํธํ์ต๋๋ค.
import '@storybook/addon-backgrounds/register';
import '@storybook/addon-knobs/register';
import '@storybook/addon-actions/register';
import '@storybook/addon-notes/register';
๋ชจ๋ ๊ฒ์ด ์ ์๋ํฉ๋๋ค. addon-knobs https://github.com/storybooks/storybook/issues/5017 ์์ ํ ๊ฐ์ง ๋ฌธ์ ๋ฅผ ์ฐพ์์ต๋๋ค. ํ์ง๋ง ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ผ๋ฉฐ ์ด๋ ๊ณง ์์ ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ์ง๋ 2์ฃผ ๋์ StencilJS์ Storybook์ ๊ฐ์ง๊ณ ๋์๊ณ ๋ด ์๋ฃจ์ ์ ๋ค๋ฃจ๋ ๋ผ์ด๋ธ ์คํธ๋ฆฌ๋ฐ์ ํ์ต๋๋ค. ํจ์ฌ ๋ ์ข์ ๋ฐฉ๋ฒ์ด ์๋ค๊ณ ์๊ฐํ์ง๋ง HMR์ ์ป์ ์ ์์๊ณ ๋๋ถ๋ถ์ ํ๋ฌ๊ทธ์ธ์ด ๊ฑฐ์ ๋ฌธ์ ์์ด ์๋ํ์ต๋๋ค. ๋ฐฐํฌ ์คํ ์ค ๋ฒ๋ค์์ ๋ก๋๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ํผ๋๋ฐฑ์ ํ์ํฉ๋๋ค.
https://www.youtube.com/watch?v=XwHtPw3izLE
๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ ๋ ํฌ๊ฐ ์์ต๋๋ค! ^_^
https://github.com/MadnessLabs/enjin-components
@nisheed2440 ์๋
ํ์ธ์,
์คํํ๋ฉด ๋ด ๋ชจ๋ ์คํ ๋ฆฌ๊ฐ ๊ฒ์๋์ง๋ง ๋ชจ๋ ์คํฌ๋ฆฐ์ท์ ๋น์ด ์์ต๋๋ค. ํฌ๋ก๋งคํฑ ์๋ฒ์์ ๊ตฌ์ฑ ์์ ์คํฌ๋ฆฐ์ท์ ๋ ๋๋งํ๋ ค๊ณ ํ ๋ ์คํ
์ค์ด ๋๋ฝ๋์์ ์ ์์ต๋๋ค.
@nisheed2440 ์ ๋ง ๋๋จํ ๋ ธ๋ ฅ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋ฐ๋ผ๊ฑด๋ ์ด๊ฒ์ ํ์ด ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ผ๋ก ์ถ๋ฐํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์คํ ์ค๊ณผ ์คํ ๋ฆฌ๋ถ์ ์๋ก์๊ฒ ์ด์์ ์ ๋๋ค.
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ! ์ต๊ทผ์ ์ด ๋ฌธ์ ์ ๋ํด ๋ง์ ์ผ์ด ์ผ์ด๋์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ์ฌ์ ํ ์ง๋ฌธ, ์๊ฒฌ ๋๋ ๋ฒ๊ทธ๊ฐ ์์ผ๋ฉด ์์ ๋กญ๊ฒ ํ ๋ก ์ ๊ณ์ํ์ญ์์ค. ๋ถํํ๋ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ๋ค๋ฃฐ ์๊ฐ์ด ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ํญ์ ๊ธฐ์ฌ์ ์ด๋ ค ์์ผ๋ฏ๋ก ๋์์ด ํ์ํ๋ฉด ํ ๋ฆฌํ์คํธ๋ฅผ ๋ณด๋ด์ฃผ์ญ์์ค. ๋นํ์ฑ ๋ฌธ์ ๋ 30์ผ ํ์ ๋ซํ๋๋ค. ๊ฐ์ฌ ํด์!
์ด๊ฑฐ ์ค๊ณ ์ถ์ ์ฌ๋ ์์ด?
์ฐ๋ฆฌ ํ์ ๊ณตํต ๊ตฌ์ฑ ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ StencilJS + Storybook์ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ๊ธฐ์ฌํ๊ณ ์ถ์ต๋๋ค. ์ด์ฉ๋ฉด ์ฐ๋ฆฌ ์ค ๋ช ๋ช ์ด ์ด ์ผ์ ์ ์์ผ๋ก ๋๋๋ฆด ์ ์์์ง๋ ๋ชจ๋ฆ ๋๋ค...
๋ง์ ๊ด์ฌ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์: https://twitter.com/dboskovic/status/1120336958008348672
ํ ๊ฐ์ง ์ฌ์ด ์น๋ฆฌ๋ @popcorn245 ์ ๊ตฌ์ฑ์ ์คํ ๋ฆฌ๋ถ ์ฌ์ ์ค์ ์ผ๋ก ํจํค์งํ๋ @storybook/preset-stencil
ํจํค์ง๋ฅผ ๊ฒ์ํ๋ ๊ฒ์
๋๋ค. ์ด์ ๋ํ ๋ฌธ์๋ ์์ง ๋ง๋ฌด๋ฆฌํด์ผ ํ์ง๋ง ๊ณง ์ถ์๋ Storybook ๋ฌธ์ ๋ฆด๋ฆฌ์ค์ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ๊ฐ๋จํ๊ณ ํฅํ ๋๋ถ๋ถ์ SB ๊ตฌ์ฑ์ด ์๋ํ๋ ๋ฐฉ์์
๋๋ค.
๋๋ ๊ทธ๊ฒ์ ์ ํํ๋ ค๋ ์ฌ๋์ ์๋ดํ๊ฒ๋์ด ๊ธฐ์ฉ๋๋ค.
@shilman๋ , ๋ง์ ์ฌ๋๋ค์ด ์ด ๋ฌธ์ ๋ฅผ ์ด๋ง ํ๊ณ ์์ต๋๋ค. ๊ทธ ์ค๋ ๋์๋ ๋ด๊ฐ ์ฐพ์ ๋ช ๊ฐ์ง ์ข์ ์ ์ด ์์ง๋ง ๋ ธ๋ธ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์์ ๋ฌธ์์ด์ ๋ฐํํด์ผ ํ๋ ๊ฒ๊ณผ ๊ฐ์ ์์ ๋ฒ๊ทธ๊ฐ ๋ ๋ง์ต๋๋ค.
ํจ์ฌ ๋ ๋์ ๊ตฌํ์ Stencil ์ปดํ์ผ๋ฌ๋ฅผ ํผ๊ธฐ๋ฐฑํ๊ณ React ๊ตฌ์ฑ ์์์ ๊ฐ์ JSX ์ฌ์ฉ์ ํ์ฉํ์ง๋ง ๊ทธ๊ฒ์ด MHO์ ๋๋ค.
๋ํ Stencil One์ ๋ช ๊ฐ์ง ํฐ ๋ณ๊ฒฝ ์ฌํญ๊ณผ ํจ๊ป ๊ณง ์ถ์๋ ์์ ์ด๋ฏ๋ก ์ด ๋ณ๊ฒฝ ๋ก๊ทธ๋ฅผ ํ์ธํ์ฌ ์ด ์์ ์ ํ๊ณ ์๋ ์ฌ๋์ด ํ์ดํ๋ผ์ธ์ ๋ฌด์์ด ๋์ฌ์ง ์ ์ ์๋๋ก ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
https://github.com/ionic-team/stencil/blob/core-refactor/BREAKING_CHANGES.md
์ด ์ค๋ ๋๋ ํนํ @popcorn245์ ๊ตฌ์ฑ์ ํฐ ๋์์ด ๋์์ต๋๋ค. ๊ฐ์ธ์ ์ผ๋ก ๋๋ @stencil/state-tunnel
ํ๊ณ ์์๋๋ฐ, ์ด๋ ๊ทธ ๊ตฌ์ฑ์ ๊นจ๋จ๋ ธ์ต๋๋ค. ๋คํํ ๋ค์์ ์คํํ์ฌ ๋ช ๊ฐ์ง ์ฌ์ํ ~hacks~ ์กฐ์ ์ผ๋ก ์๋ํ๋๋ก ํ ์ ์์์ต๋๋ค.
npm i -D [email protected]
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ .storybook/webpack.config.js
:
const { existsSync, readdirSync } = require('fs');
const { resolve } = require('path');
const CopyPlugin = require('copy-webpack-plugin');
module.exports = ({ config }) => {
// 1. Transpile <strong i="11">@stencil</strong> modules with Babel
const babelLoader = config.module.rules.find(
({ use }) => use && use[0].loader === 'babel-loader'
);
babelLoader.exclude = [/node_modules\/(?!\@stencil).*/];
if (babelLoader.use[0].options) {
babelLoader.use[0].options.plugins = ['@babel/plugin-syntax-dynamic-import'];
}
// 2. Load JS & CSS from our components
config.entry.push(resolve(__dirname, '..', 'dist', 'MYCOMPONENTNAME.js'));
config.entry.push(resolve(__dirname, '..', 'dist', 'MYCOMPONENTNAME.css'));
const components = resolve(__dirname, '..', 'dist', 'collection', 'components');
readdirSync(components).map(file => {
jsFilePath = resolve(components, file, `${file}.js`);
try {
if (existsSync(jsFilePath)) config.entry.push(jsFilePath);
} catch (err) {
console.error(err);
}
cssFilePath = resolve(components, file, `${file}.css`);
try {
if (existsSync(cssFilePath)) config.entry.push(cssFilePath);
} catch (err) {
console.error(err);
}
});
// 3. Fix dynamic imports for Storybook
// IMPORTANT: webpack must be at 4.28 due to a bug. See here: https://github.com/webpack/webpack/issues/8656
config.plugins.push(
new CopyPlugin([
{
from: resolve(__dirname, '..', 'dist'),
to: resolve(__dirname, '..', 'node_modules', '<strong i="12">@storybook</strong>', 'core', 'dist', 'public'),
},
])
);
return config;
};
์ด๊ฒ์ผ๋ก ์คํ์ ์์ํ๊ณ (๋ค๋ฅธ ๊ณณ์์ ์ธ๊ธํ๋ฏ์ด) concurrently
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด (ํ์ฌ๋ก์๋) ์ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์คํ
์ค๊ณผ ์คํ ๋ฆฌ๋ถ์ ์์ํ๊ณ ์คํํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๊ฒ์ด ํฌํจ๋ ๋น ๋ฅธ ์์ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์์ต๋๋ค. ์ด๋ฏธ ์ต์ ์คํ
์ค ๋ฆด๋ฆฌ์ค๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
์ฌ๊ธฐ์์ ํ์ธํ์ญ์์ค: stencil-storybook-starter
@fvaldes33 ๋ฐ๊ฐ์ต๋๋ค! ๋ณํ ํ์ํ์ต๋๋ค. ์ค์ ๋ก ๋ฐฉ๊ธ Stencil One ๋ฒ ํ๋ก ์ ๋ฐ์ดํธํ๊ณ ๊ตฌ์ฑ์ด ๋น์ทํด ๋ณด์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๊ธฐ๋ณธ ์นํฉ ์ค์ ์ ์์ ํ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ ์๊ฒ ์ ์ผํ ์ฐจ์ด์ ์ stencil build --watch
(๊ฐ๋ฐ์ด ์๋ prod)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด์์ต๋๋ค. ์๋ํ๋ฉด ๋น๋ ์๊ฐ์ด ๋๋ฌด ๋น ๋ฅด๊ณ Stencil์์ prod ๋ฒ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ฝ๊ธฐ ๋๋ฌธ์
๋๋ค(ํนํ ๊ธ๋ก๋ฒ ์คํ์ผ ๋ฐ ๊ธฐํ ๊ฐ์ ธ์ค๊ธฐ).
@ fvaldes33 ์ด๋ป๊ฒ ๊ทธ๋ ๊ฒ ๋ฏธ๋ฆฌ๋ณด๊ธฐ-head.html์์ build/components.js๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๊น? ์ ์ฒด ๊ฒฝ๋ก(์: http://localhost :3333/build/components.js)๋ฅผ ์ ๊ณตํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๊ทธ๋ ๊ฒํ์ง ์์๋๋๊ณ ์ถ์ต๋๋ค.
(๋๋ ๋น์ ์ ์คํํฐ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์์ง๋ง ์๋ก์ด ์คํ ๋ฆฌ๋ถ/html ์ค์น์ ํจ๊ป ์คํ ์ค ์ปดํฌ๋ํธ ์คํํฐ๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค)
ํธ์งํ๋ค:
www ํด๋ ๋์ ํฌํธ 6006์์ ์คํ ๋ฆฌ๋ถ์ ์์ํ๊ณ ์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค. ๋ฌธ์ ํด๊ฒฐ๋จ!
์ฐ๋ฆฌ ์ค ๋ง์ ์ฌ๋๋ค์ด ๋น์ทํ ์๋ฃจ์ ์ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง(์ ๋ฅผ ํฌํจํ์ฌ https://github.com/jagreehal/stencil-boilerplate) ์คํ ์ค ๊ตฌ์ฑ ์์๋ฅผ ํธ์งํ ๋ ํซ/๋ผ์ด๋ธ ์ ๋ฐ์ดํธ๋ฅผ ์ ๋ง ์ํฉ๋๋ค. ํ์ฌ Storybook์ ๋ค์ ๋ก๋ํ๋ ค๋ฉด ๋ธ๋ผ์ฐ์ ๋ฅผ ์๋์ผ๋ก ์๋ก ๊ณ ์ณ์ผ ํฉ๋๋ค.
์ด๋ฅผ ์๋ฃํ๊ธฐ ์ํ ์๊ตฌ ์ฌํญ์ ๊ธ๋จธ๋ฆฌ ๊ธฐํธ ๋ชฉ๋ก์ด ์์ต๋๊น? ๊ตฌ์ถํด์ผ ํ ์ฌํญ์ ์๊ณ ์๋ค๋ฉด ๊ธฐ๊บผ์ด ์ฐธ์ฌํ๊ฒ ์ต๋๋ค.
ํ์ฌ ์ํ๋ ๋ฌด์์ ๋๊น? ๊ธฐ์ฌํ ์ ์์ต๋๊น? ๋๋ ์ด๊ฒ์๋ณด๊ณ ์ถ๋ค!
์์ ์ฌ์ ์ค์ ์ ์ ๊ณตํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋๊ตฐ๊ฐ ์์ ํจํด์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ ์ค์ ์ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด ์คํ ๋ฆฌ๋ถ ์ชฝ์์ ๊ธฐ๊บผ์ด ๋์๋๋ฆฌ๊ฒ ์ต๋๋ค. ๋๋ ์คํ ์ค ์ธก๋ฉด์ ์ต์ํ์ง ์์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ ์ํ๋ ๋๊ตฐ๊ฐ๋ฅผ ์ํด ๋ด ํ๋ก์ ํธ๋ฅผ ๊ฒ์ํ์ต๋๋ค. ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
@Props
์ ๋ํ ์๋ ๋
ธ๋ธ ์์ฑ๋น์ ์ ์๊ฐ์ ์๋ ค์ฃผ์ธ์: https://github.com/DesignByOnyx/stencil-storybook-starter
@DesignByOnyx ๋ฉ์ง๋ค์ . ์ด์ ๋ํด ํธ์ํ๊ณ @storybookjs
์ธ๊ธํ๋ฉด ์คํ ๋ฆฌ๋ถ ๊ณ์ ์์ RTํ๊ฒ ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง์ฝ ๋น์ ์ด ๊ทธ๊ฒ์ ๊ดํ ํฌ์คํธ๋ฅผ ์ฐ๊ณ ์ถ๋ค๋ฉด, ๋๋ ๋น์ ๊ณผ ํจ๊ป ๊ทธ๊ฒ์ ์๋ฆฌ๊ฒ ํ๋ ๊ฒ์ ๊ธฐ์๊ฒ ์๊ฐํฉ๋๋ค. ์ฌ๊ธฐ ์์๊ฐ ๊ฝค ์๋ ๊ฒ ๊ฐ์์.
๋ฉ์ง ์์ @DesignByOnyx ! ์ด๊ฒ์ ์ฌ์ ์ค์ ์ ์๋ฒฝํ๊ฒ ๋ง๋ ๊ฒ ๊ฐ์ต๋๋ค :tada:
์ข์, ๋๋ ํธ์์ ํ๋ค(๋๋ ํธ์ํฐ๋ฅผ ๋ง์ด ํ์ง ์๋๋ค). ๊ฒ๋ค๊ฐ ์ ๋ ๋ธ๋ก๊ทธ๊ฐ ์์ต๋๋ค.
ํ๋ก์ ํธ๊ฐ ์๋ํ๋ ๋์ ๋๋ ์๋๋ฌ ๊ทธ๊ฒ์ ํจ๊ป ๋์ ธ ๋์๊ณ ์ค์ ๋ก ์ฌ์ฉ์ ์ ์ํ๊ธฐ๊ฐ ์ฝ์ง ์์์ต๋๋ค. ๊ฐ ๊ฐ๋ณ ๊ตฌ์ฑ ์์๋ฅผ ๋ ๋๋งํ๊ธฐ ์ํด ์ฌ๋ฌ ํ์ผ์ ๋ก๋ํ๊ณ ๋ณํฉํด์ผ ํ๋ฏ๋ก ๊ฑฐ๊ธฐ์ ์๋ ์ฝ๋ ์ค ์ผ๋ถ๋ ์ ๋ง ๋ถ์์ง๊ธฐ ์ฝ์ต๋๋ค. ๋ ๋ง์ ์๊ฐ์ ํ ์ ํ๊ธฐ ์ ์ ํผ๋๋ฐฑ์ ๋ฐ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
ํ๋ฆฌ์ ์ด ์ด๋ค ๋ชจ์ต์ผ์ง ๊ถ๊ธํฉ๋๋ค. ๊ฐ์ฅ ์ข์ ์ ์ ๋ฐ์ํ์ง ์๋ JSX ์ฌ์ ์ค์ ์ ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด Storybook-html ๋ค์์ฑ ์์ ๋ ์ฝ๊ฒ ๋ ๋๋งํ๊ณ ํ ํ๋ฆฟ์ ์์ฑํ ์ ์์ผ๋ฉฐ ์คํ ์ค๊ณผ ๋ณ๋ก ๊ด๋ จ์ด ์์ต๋๋ค. ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ค๋ฉด ์ฌ๋ฌ ์ ๋์จ๋ ์ ๋ฐ์ดํธํด์ผ ํ๋ฉฐ, ์ ๊ฐ ๊ทธ ๋ ธ๋ ฅ์ ๊ฐ์ฅ ์ ์กฐ์จํ ์ ์์์ง ํ์ ์ด ์์ง ์์ต๋๋ค. ์ด๋ ์ชฝ์ด๋ , ๋ด๊ฐ ๋์ธ ์ ์๋ ์ผ์ ์๋ ค์ฃผ์ธ์.
@DesignByOnyx ๋์ค์ฝ๋์ https://discordapp.com/invite/UUt2PJb
Storybook ๋ธ๋ก๊ทธ์์ ์ด ์์ ์ ์ํํ๊ณ ์คํ ์ค ์ปค๋ฎค๋ํฐ์์ ํ๋ณดํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ ๋ง์ ์ด์ผ๊ธฐ๋ฅผ ๋๋๊ณ ์ถ์ต๋๋ค.
์ ๋ Stencil์ฉ์ผ๋ก @storybook/html
๋ฅผ ์ฌ์ฉํด ์์ผ๋ฉฐ ๊ทธ ๊ฒฝํ์ ๊ฑฐ์ "์๋"ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์์ ์ํํฉ๋๋ค.
concurrently
๋ฅผ ์ฌ์ฉํ์ฌ Storybook ์๋ฒ๋ฅผ ์์ํ๊ณ stencil build --watch
"๋ณ๋ ฌ"-s dist
ํ๋๊ทธ๋ก storybook
๋ฅผ ์์ํ์ฌ ์คํ
์ค dist
์ด ์ ์ ํ์ผ๋ก ์ ๊ณต๋๋๋ก ํฉ๋๋ค.๋ค์๊ณผ ๊ฐ์ ์คํฌ๋ฆฝํธ ํ๊ทธ๋ฅผ ํฌํจํ๋๋ก .storybook/preview-head.html
๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
<script type="module" src="/$PACKAGE_NAME/$PACKAGE_NAME.esm.js"></script>
<script nomodule="" src="/$PACKAGE_NAME/$PACKAGE_NAME.js"></script>
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ ๋ค์ผ! ์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅํ html
์ง์์ ๋ชจ๋ ์น ๊ตฌ์ฑ ์์ ์๊ตฌ ์ฌํญ์ ๋ํด ์๋ํฉ๋๋ค.
๋ด๊ฐ๋ณด๊ณ ์ถ์ ๊ฒ์ ๊ฐ์ ๊ฒ์
๋๋ค @storybook/stencil
์ ๊ฐ์ ๊ฒฝํ (์ฝ๋)์ด ๊ทธ html
์ด์ผ๊ธฐ ์ ์ ์ธก ํจํค์ง๋ฅผํ์ง๋ง,
concurrently
์ด ํ์ํ์ง ์๋๋ก ์คํ ๋ฆฌ๋ถ์ ์ผ๋ถ๋ก ์คํ
์ค ๋น๋ ํ๋ก์ธ์ค ์คํ์ ์ถ์ํํฉ๋๋ค.script
ํ๊ทธ๋ฅผ ์ถ๊ฐํฉ๋๋ค.๊ทธ๋ฐ ๊ฒ์ ๊ด์ฌ์ด ์์ต๋๊น? ์ ๋ Stencil๊ณผ Storybook์์ ํ์ฌ๋ฅผ ๋งค๊ฐํ๋ ๊ณผ์ ์ ์์ผ๋ฉฐ, ๊ทธ๊ฒ์ด ๊ฒฌ์ธ๋ ฅ์ ์ป๋๋ค๊ณ ๊ฐ์ ํ๋ฉด Storybook + Stencil์ด ํจ๊ป ํ๋ ์ดํ๋ ๋์ ๊ทธ ์ด์ผ๊ธฐ(๋ง์ฅ๋์ ์ค๋ก)๋ฅผ ์ ๋ง ๋ฉ์ง๊ฒ ๋ง๋ค๊ธฐ ์ํด "์์ ์๊ฐ"์ ๊ฐ์ง ๊ฒ์ ๋๋ค.
@DesignByOnyx ๊ฐ ์ํํ ์์ ์ ์ ๋ง ํ๋ฅญํ์ง๋ง ํด๋น ํคํธ๋ก Stencil ๊ตฌ์ฑ ์์๋ฅผ _์์_ํด์ผ ํ๊ณ Stencil์ ๋ํ "์ผ๋ฐ" ๋ฌธ์๋ฅผ ๋ฌด์ํด์ผ ํฉ๋๋ค. Storybook์ด "์ผ๋ฐ" ์คํ ์ค ์คํํฐ ํคํธ ์์ ๊ณ์ธตํํ ์ ์๋ ํจํค์ง๋ฅผ ์ ๊ณตํ ์ ์๋ ๊ฒฝ์ฐ ๊ธฐ์กด ์คํ ์ค ๊ตฌ์ฑ ์์ ์งํฉ์ Storybook ๊ตฌ์ฑ์ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์์ต๋๋ค.
ํ๋ฅญํ ์์ฝ @alexlafroscia์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋๋ ๋น์ ์ ์ ์์ด ๋ง์ ์๋ฏธ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์คํ ์ค์ ๋ค์ ๋น๋ํ ๋ HMR์ด ์๋์ผ๋ก ์์๋์ง ์์ต๋๊น? ๊ทธ๋ ๋ค๋ฉด ์ ์๋๋์ง ์์ธ์?
@igor-dv ์ฌ์ ์ค์ ์์ preview-head.html
์ ์ถ๊ฐํ ์ ์์ต๋๊น?
@Hypnosphi ์๋ง๋ ์ด๊ฒ์ ๋ค์ค ํ๋ ์์ํฌ ๋ ธ๋ ฅ์ ๋ํ ํฅ๋ฏธ๋ก์ด ์์ผ ๊ฒ์ ๋๋ค. ์ด ๊ฒฝ์ฐ ๋ฐ์ฝ๋ ์ดํฐ๋ ํ์ํ์ง ์์ง๋ง (๋ถ๋ช ํ) ์ ์ฒด ์ปดํ์ผ๋ฌ๊ฐ ํ์ํฉ๋๋ค.
@alexlafroscia ๊ทํ์ ๊ฒฝ์ฐ ์ด์ผ๊ธฐ์ ์๋ ์ด๋ป๊ฒ ๋ณด์ ๋๊น?
๋ด๊ฐ ์ผํ๋ ํ์ฌ์์ ์ฐ๋ฆฌ๋ ํ๋์ Storybook HTML๊ณผ StencilJS ํจํค์ง๋ฅผ ๊ฐ์ง๊ณ ๋์์ต๋๋ค. ๊ธฐ๊บผ์ด ๊ธฐ์ฌํ๊ฒ ์ต๋๋ค!
@alexlafroscia ๋งค์ฐ ํ๋ฅญํ ์์ด๋์ด์ ๋๋ค. ์ค์ ๋ก ์ด ์ปดํ์ผ๋ฌ๋ฅผ ์๋ฒฝํ๊ฒ ์ง์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ๋ค๋ฅธ ์์ด๋์ด์ ๋๋ค.
์ด ๊ธฐ์ฌ์์๋ StencilJS: Fall 2019 Stencil Roadmap์ ์งํ ์ค์ธ ๋ก๋๋งต์ ๋ค๋ฃน๋๋ค. ํนํ:
๊ณต๊ฐ ์ปดํ์ผ๋ฌ API
์ฐ๋ฆฌ๊ฐ ์ง์คํ๊ณ ์๋ ๋ ๋ค๋ฅธ ์์ญ์ ์ปดํ์ผ๋ฌ๊ฐ ๋ธ๋ผ์ฐ์ ๋ด์์ ์๋ํ๊ณ ๋ค๋ฅธ ๋๊ตฌ์์ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฏธ Stackblitz, CodeSandbox ๋ฐ WebComponents.dev์ ๊ฐ์ ๋ช ๊ฐ์ง ๋ฉ์ง ํ๊ณผ ํ๋ ฅํ๊ณ ์์ต๋๋ค. ๊ฐ์ฅ ๋ฎ์ ์์ค์์ ์ปดํ์ผ๋ฌ๋ ์ด๋ฏธ NodeJS ํ๊ฒฝ์์ ์คํ๋์ง ์๊ณ ์๋ํ๋ฏ๋ก ๊ธฐ์ ์ ์ผ๋ก ์ด๊ฒ์ ์ฃผ์ ๋ฆฌํฉํฐ๊ฐ ์๋๋ผ ์ฌ๋ฐ๋ฅธ API๋ฅผ ๋ ธ์ถํ๋ ๊ฒ์ ๋๋ค.
๋ํ Rollup, Parcel, WebPack ๋ฐ Bazel์ ํฌํจํ ๋ค๋ฅธ NodeJS ๋๊ตฌ์์ ์ปดํ์ผ๋ฌ๋ฅผ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๊ฐ์ ํด์ผ ํ ๋ง์ ์์ญ์ด ์์ต๋๋ค. ์จ๋ผ์ธ ๋๊ตฌ๋ NodeJS ํ๊ฒฝ์ด๋ ์๊ด์์ด ๋๊ตฌ์ ์ ์ง ๊ด๋ฆฌ์์ด๊ณ Stencil ์ปดํ์ผ๋ฌ๋ฅผ ๊ตฌํํ๋ ค๋ ๊ฒฝ์ฐ ๋ถ๋ด ์์ด ์ฐ๋ฝํด ์ฃผ์๋ฉด ๊ธฐ๊บผ์ด ๋์๋๋ฆฌ๊ฒ ์ต๋๋ค!
์ ์ฉํ ์ ์์ต๋๋ค!
์คํ ์ค์ ๋ค์ ๋น๋ํ ๋ HMR์ด ์๋์ผ๋ก ์์๋์ง ์์ต๋๊น? ๊ทธ๋ ๋ค๋ฉด ์ ์๋๋์ง ์์ธ์?
@shilman Storybook๊ณผ Stencil ์ฌ์ด์ ๋ด๊ฐ ๊ฐ์ง ์ค์ ์์ "์ค์ "์ฐ๊ฒฐ์ด ์๊ธฐ ๋๋ฌธ์ ์์๋์ง ์์ต๋๋ค. ๋น๋๋ ์์ฐ์ ๊ฐ๋ฆฌํค๋ ๋จ์ํ <script>
ํ๊ทธ์
๋๋ค.
๊ทํ์ ๊ฒฝ์ฐ ์ด์ผ๊ธฐ์ ์๋ ์ด๋ป๊ฒ ๋ณด์ ๋๊น?
@Hypnosphi ๊ทธ๋ค์์ด ๊ฐ์ (๋ํดํธ์ ๋ํ ์ด์ผ๊ธฐ๋ฅผ ๋ณด๋ฉด my-component
์คํ
์ค์ ์์ ์ด ๋ง๋ ์ต์ด์ ํจํค์ง์ ์์ฑํ๋ ๋ npm init stencil
import { document, console } from 'global';
import { storiesOf } from '@storybook/html';
storiesOf('My Component', module)
.add('without a middle name', () => `
<my-component
first="Alex"
last="LaFroscia"
></my-component>
`)
.add('with a middle name', () => `
<my-component
first="Alex"
middle="Robert"
last="LaFroscia"
></my-component>
`);
StencilJS JSX ๊ธฐ๋ฅ(ํ์ฌ Preact ๊ธฐ๋ฐ)์ ์ฌ์ฉํ์ฌ ๋ณด๋ค ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ ๋ฐฉ์์ผ๋ก ์คํ ๋ฆฌ๋ฅผ ์์ฑํ์ญ์์ค. ํ๋ฒํ ์ค๋๋ JS ๋๋ ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ฒ๊ฑฐ๋ก์ธ ์ ์์ต๋๋ค...
@darondel ์คํ ๋ฆฌ ์ ์ ํ์ผ์ JSX๊ฐ ์๋ ๊ฐ๋ฐ์ ๊ฒฝํ์ ๋ํ ์ฐ๋ ค์ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค. ๋๋ @storybook/html
๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ ์ ์ ๊ณผ๊ฑฐ์ ๊ทธ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ์ผ๋ฉฐ OK์ธ React ๊ฒฝํ์ ์ฌ์ฉํ์ต๋๋ค.
"๊ธฐ๋ณธ" html
๊ฒฝํ์ ๊ฐ๊น๊ฒ ์ ์งํ๋ ค๋ ๋ถ๋ถ์ ์คํ ๋ฆฌ๊ฐ HTML ๊ด์ ์์ ์ค์ ๋ก ์คํ ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ฌธ์ ์ญํ ์ ํ๋๋ก ํ๋ ๊ฒ์
๋๋ค. ์ ์ด๋ ์ฐ๋ฆฌ ์กฐ์ง์์๋ ๋ค๋ฅธ ๊ณณ์์๋ ์ฌ์ฉ๋์ง ์์ต๋๋ค(์ฐ๋ฆฌ๋ ์ฃผ๋ก Ember.js ์์ ์
๋๋ค).
ํ
ํ๋ฆฟ ํ๊ทธ๊ฐ ์ข์ ๊ฒฝํ์ด ์๋ ๊ฒ์ด๋ผ๊ณ ์ธ๊ธํ์ง๋ง htm
๊ฐ์ ๊ฒ์ด ์ข์ ์ต์
์ด ๋ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ํ ํ์ ๋น๋ ๋จ๊ณ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋น๋ ํ๋ก์ธ์ค๋ฅผ ํ๋ฅญํ๊ณ ๊ฐ๋จํ๊ฒ ์ ์งํ์ง๋ง Knobs์ ๊ฐ์ ๊ฒ๊ณผ ๋ ์ฝ๊ฒ ์ํธ ์์ฉํ ์ ์์ต๋๋ค.
๋ํ ๋ค๊ฐ์ค๋ DocsPage ์ ๊ฐ์ ๊ฒ๊ณผ ํตํฉํ๋ ๊ฒ์ด @DesignByOnyx ๊ฐ ์ด๋ฏธ ์ํํ ์์ ์ค ์ผ๋ถ๊ฐ ์ฌ๊ธฐ์์ ์ ์ฉํ ์ ์์ผ๋ฏ๋ก ์คํ ์ค ๊ตฌ์ฑ ์์์ "๋ฉํ๋ฐ์ดํฐ"๋ฅผ ์ฝ์ด ๋ฌธ์ ์ ๋ณด๋ฅผ ์๋์ผ๋ก ์์ฑํ๋ ๊ฒฝ๋ก๊ฐ ์์ ์ ์์ต๋๋ค. ์๋ง๋ "v1" ๋ฌธ์ ๋ ์๋์ง๋ง "v1.1"์์ ๋ณผ ์ ์๋ ์ ๋ง ๋ฉ์ง ๊ฒ์ ๋๋ค! ์๋ ์์ก์ด ์ ๋์จ๊ณผ ๊ฐ์ ๊ฒ์ ๋ง๋๋ ๋น์ ์ ์์ด๋์ด๊ฐ ์ ๋ง ๋ง์์ ๋ญ๋๋ค. ์ ๋ง ํธ๋ฆฌํ ๊ฒ์ ๋๋ค!
์ค๋ Storybook 5.2์ ํจ๊ป ์ถ์๋ DocsPages๋ฅผ ์ฌ์ฉํ์ฌ Stencil์์ ์ํ ๋ฑ์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ Storybook์ผ๋ก ๋ ๋๋งํ๋ ๊ฒ์ด ๊ฐ๋ฅํ์ง ์กฐ์ฌํ์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๊ฐ๋ฅํด์ผ ํ๋ค๊ณ ์๊ฐํ์ง๋ง, ๊ทธ๊ฒ์ ํ์ํ "์ ์ฐฉ์ " ๋ฌด๋ฆฌ๋ฅผ ์์ฉํ๊ธฐ ์ํด Stencil๊ณผ ํจ๊ป Storybook์ ์ฌ์ฉํ๋ ๋ฐ ๋ง์ถคํ๋ ์ ๋์จ ๋๋ ์ฌ์ ์ค์ ์ ๊ฐ๋ ๊ฒ์ด ์ผ๋ง๋ ์ ์ฉํ์ง ํ์คํ ๊ฐ์กฐํฉ๋๋ค.
์ด๋ฒ ์ฃผ์ ์ข ๋ ์ด๊ฒ์ ๊ฒ ํด๋ณด๊ณ ์ ๋ฆฌํ ์ ์๋์ง ์์๋ด์ผ๊ฒ ์ต๋๋ค.
@alexlafroscia ๋ ์๋ก ๋ค๋ฅธ ํ๋ ์์ํฌ๊ฐ ์ด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ ํ์คํํ๊ณ @elevatebart )์์ ํฅ๋ฏธ๋ก์ด ๊ฒ์ ๋ณด์๊ณ @atanasster ๋ ์ฑ๋ฅ์ ์ํด JSON ํ์ผ์ prop ์ ํ์ ์บ์ฑํ๊ธฐ ์ํด ์ด ์์ญ์์ ์์ ํ๊ณ ์์ต๋๋ค. ์ด ๋ชจ๋ ๊ฒ์ 6.0์์ ํตํฉํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
Jetbrains ์์ ์ ์ต์ํ์ง ์์ต๋๋ค. ํ์ธํด์ผ ํฉ๋๋ค! ๊ฒํ ํ๋ ๋ฐ ๋์์ด ๋ ํน์ ์ ๋ณด๊ฐ ์์ผ๋ฉด ์ ๋ฐฉ์๋๋ก ๋ณด๋ด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค!
Stencil์ ๊ฒฝ์ฐ "๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ"์ Stencil ๋น๋ ํ๋ก์ธ์ค์์ JSON ๋ฌธ์ ๋ฅผ Stencil Storybook ์ ๋์จ์ผ๋ก ์ ์๋ ค์ง ์์น ๋๋ ๊ตฌ์ฑ ๊ฐ๋ฅํ ์์น๋ก ์ถ๋ ฅํ๋ ๊ฒ์
๋๋ค. ์ด ๊ฐ์ฒด์๋ ์์๋๋ props, ๋ฐ์ํ ์ด๋ฒคํธ ๋ฐ ๊ฐ ๊ตฌ์ฑ ์์์ readme
ํ์ผ ๋ด์ฉ(์๋ ์์ฑ๋ props ๋ฌธ์ ์ ์ธ)์ ๋ํ ๋ชจ๋ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ํด๋น JSON ํ์ผ์ ์ ๋ณด๋ก Storybook DocsPage๋ฅผ ์ฑ์ฐ๋ ์ ๋ง ๋งค๋ ฅ์ ์ธ ์คํ ๋ฆฌ๋ฅผ ๋ง๋ค ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํด๋น ํ์ผ์ ์ถ๋ ฅ ์
{
"timestamp": "2019-09-18T14:30:38",
"compiler": {
"name": "@stencil/core",
"version": "1.3.2",
"typescriptVersion": "3.5.3"
},
"components": [
{
"tag": "fluid-banner",
"encapsulation": "shadow",
"readme": "# fluid-banner\n\nThis is the contents of the README!\n",
"docs": "This is the contents of the README!",
"docsTags": [],
"usage": {},
"props": [],
"methods": [],
"events": [],
"styles": [],
"slots": []
},
{
"tag": "fluid-button",
"encapsulation": "shadow",
"readme": "# fluid-button\n\n\n",
"docs": "",
"docsTags": [],
"usage": {},
"props": [
{
"name": "destructive",
"type": "boolean",
"mutable": false,
"attr": "destructive",
"reflectToAttr": false,
"docs": "Whether to display in the `destructive` style",
"docsTags": [],
"default": "false",
"optional": false,
"required": false
},
{
"name": "disabled",
"type": "boolean",
"mutable": false,
"attr": "disabled",
"reflectToAttr": false,
"docs": "Whether the button should be treated as `disabled`",
"docsTags": [],
"default": "false",
"optional": false,
"required": false
},
{
"name": "plain",
"type": "boolean",
"mutable": false,
"attr": "plain",
"reflectToAttr": false,
"docs": "Whether to display in the `plain` style",
"docsTags": [],
"default": "false",
"optional": false,
"required": false
},
{
"name": "primary",
"type": "boolean",
"mutable": false,
"attr": "primary",
"reflectToAttr": false,
"docs": "Whether to display in the `primary` style",
"docsTags": [],
"default": "false",
"optional": false,
"required": false
},
{
"name": "size",
"type": "\"large\" | \"medium\" | \"small\"",
"mutable": false,
"attr": "size",
"reflectToAttr": true,
"docs": "The size to display the button",
"docsTags": [],
"default": "\"medium\"",
"optional": false,
"required": false
}
],
"methods": [],
"events": [],
"styles": [],
"slots": []
}
]
}
์ผ์ข
์ ํดํน(JSON ์ถ๋ ฅ์ dist/output.json
์์ฑํ ๋ค์ fetch
์ ์ฌ์ฉํ์ฌ ํ์ผ์ ๊ฐ์ ธ์ด)์ด์ง๋ง DocsPage
๊ตฌ์ฑ ์์๊ฐ ์ฌ์ฉํ ์ ์๋ ์ฌ๋กฏ ์ํ์
๋๋ค.
Props ํ
์ด๋ธ์ ์๋ฒฝํ์ง๋ ์์ง๋ง ๊ฝค ์ข์ต๋๋ค. Stencil ์ถ๋ ฅ์ ํ
์ด๋ธ์ด ๊ธฐ๋ํ๋ ๋ชจ๋ props๋ฅผ ์ ๊ณตํ ๋ค์ ์ผ๋ถ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ตฌ์ฑ ์์์ ๋ํ readme.md
์ ์๋ ๊ฒ์ ๋ฌด์์ด๋ ํ์ผ์ ๋งจ ์์ ๋ ๋๋ง๋ฉ๋๋ค.
์ง์ ๊ฐ์ง๊ณ ๋๊ณ ์ถ๋ค๋ฉด ์ด๊ฒ์ ๋ด๊ฐ ์์ฑํ ๋์ฒด
page
๊ตฌ์ฑ ์์์
๋๋ค.import React, { useContext, useEffect, useState } from "react";
import { DocsPage, DocsContext } from "@storybook/addon-docs/blocks";
export const StorybookDocsPage = () => {
const docsContext = useContext(DocsContext);
const [payload, setPayload] = useState(null);
useEffect(function() {
fetch("./output.json")
.then(res => res.json())
.then(res => setPayload(res));
});
if (!payload) {
return null;
}
const component = payload.components.find(component =>
docsContext.selectedKind.includes(component.tag)
);
// Empty because we will use the whole component README
const titleSlot = () => "";
const subtitleSlot = () => "";
const descriptionSlot = () => component.readme;
const propsSlot = () => ({
rows: component.props.map(prop => ({
name: prop.name,
type: prop.type,
description: prop.docs,
required: prop.required,
defaultValue: prop.default
}))
});
return React.createElement(
DocsPage,
{ titleSlot, subtitleSlot, descriptionSlot, propsSlot },
null
);
};
์
๋ฐ์ดํธ: ํ ๋จ๊ณ ๋ ๋์๊ฐ ์ฌ์ฉ์ ์ ์ ์คํ์ผ์ ๋ํ ๋ฌธ์๊ฐ ํฌํจ๋ ๋ ๋ฒ์งธ ํ
์ด๋ธ์ ์ป๊ธฐ ์ํด ์ ์ฒด ์ฌ์ฉ์ ์ ์ DocsPage
(๋จ์ํ ์ฌ๋กฏ์ ์ฌ์ ์ํ๋ ๊ฒ์ด ์๋๋ผ)๋ฅผ ์ ์ํ์ต๋๋ค.
์ฌ์ฉ์ ์ ์ DocsPage์ฉ ์ฝ๋
import { createElement as e, useContext, useEffect, useState } from "react";
import { DocsPage, PropsTable } from "@storybook/components";
import { H2, H3 } from "@storybook/components/html";
import {
Anchor,
Description,
DocsContext,
Preview,
Story
} from "@storybook/addon-docs/blocks";
function useStencilComponent() {
const docsContext = useContext(DocsContext);
const [payload, setPayload] = useState(null);
useEffect(function() {
fetch("./output.json")
.then(res => res.json())
.then(res => setPayload(res));
});
if (!payload) {
return undefined;
}
return payload.components.find(component =>
docsContext.selectedKind.includes(component.tag)
);
}
const DocsStory = ({
id,
name,
expanded = true,
withToolbar = false,
parameters
}) =>
e(
Anchor,
{ storyId: id },
expanded && e(H3, null, (parameters && parameters.displayName) || name),
expanded &&
parameters &&
parameters.docs &&
parameters.docs.storyDescription &&
e(Description, { markdown: parameters.docs.storyDescription }, null),
e(Preview, { withToolbar }, e(Story, { id, height: "auto" }, null))
);
export const CustomDocsPage = () => {
const docsContext = useContext(DocsContext);
const component = useStencilComponent();
if (!component) {
return null;
}
const { selectedKind, storyStore } = docsContext;
const stories = storyStore.getStoriesForKind(selectedKind);
const [primary, ...otherStories] = stories;
const propDocs = component.props.length
? [
e(H2, null, "Props"),
e(
PropsTable,
{
rows: component.props.map(prop => ({
name: prop.name,
type: prop.type,
description: prop.docs,
required: prop.required,
defaultValue: JSON.parse(prop.default)
}))
},
null
)
]
: [];
const styleDocs = component.styles.length
? [
e(H2, null, "Styles"),
e(
PropsTable,
{
rows: component.styles.map(style => ({
name: style.name,
description: style.docs
}))
},
null
)
]
: [];
const additionalStories = otherStories.length
? [
e(H2, null, "Stories"),
...otherStories.map(story =>
e(
DocsStory,
{ key: story.id, ...story, expanded: true, withToolbar: false },
null
)
)
]
: [];
return e(
DocsPage,
null,
e(Description, { markdown: component.readme }, null),
e(
DocsStory,
{ key: primary.id, ...primary, expanded: false, withToolbar: true },
null
),
...propDocs,
...styleDocs,
...additionalStories
);
};
์ฌ์ฉ์ ์ ์ ํ์ด์ง๋ ๋ํ ๊ฐ ์ด์ผ๊ธฐ์ ๋์ด๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก 500px
๋์ด ์๋ค๋ ์ฌ์ค์ ์์ ํฉ๋๋ค.
@alexlafroscia ์ด๊ฒ์ ๋๋๊ณ ์์ฒญ๋ ์์ ์ ๋๋ค!
์ฐธ๊ณ ๋ก, ์ฐ๋ฆฌ๋ 5.3์์ prop ํ ์ด๋ธ์ ์ผ๋ฐํํ ๊ฒ์ ๋๋ค. ํนํ Vue์ ๊ฐ์ ํ๋ ์์ํฌ์๋ ์ฌ๋กฏ ๋ฐ ์ด๋ฒคํธ์ ๊ฐ๋ ์ด ์์ผ๋ฏ๋ก ์์ฒด ํ ์ด๋ธ๋ก ๋ถํ ํด์ผ ํฉ๋๋ค. ์๋ง๋ ๋น์ ์ ์คํ์ผ ์์ ์ ๋์ผํ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. https://github.com/storybookjs/storybook/issues/8123
๋ด๊ฐ ์ธ๊ธํ Jetbrains ํ๋ก์ ํธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค(cc @piotrtomiak): https://github.com/JetBrains/web-types
๋๋ ๊ทธ๊ฒ์ ์์ธํ ๋ณด์ง ์์๊ณ ๊ทธ๊ฒ์ด ์ฐ๋ฆฌ์๊ฒ ๋ง๋์ง ๋ชจ๋ฆ ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ด ์ฐ๋ฆฌ์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ถฉ์กฑํ๊ณ ๋๋ฌด ๋ง์ ๋ถํ์ํ ๊ฒ์ ์ถ๊ฐํ์ง ์๋๋ค๋ฉด, ๋๋ ์ฐ๋ฆฌ ์์ ์ ํ์ค์ ๋ฐ๋ช ํ๊ธฐ๋ณด๋ค๋ ๊ธฐ์กด ํ์ค์ ์ฌ์ฉํ๊ณ ์ถ์ต๋๋ค.
@shilman ๋ฉํ๋ฐ์ดํฐ ์ ๋ณด ๊ตํ์ ๋ํ ํ์ค์ ์น ๊ตฌ์ฑ ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๊ฐ์ ธ์ค๊ธฐ ์ํ (JetBrains) ๋
ธ๋ ฅ์ ์ดํด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค! ์ฐ๋ฆฌ์ ์ด๊ธฐ ์ถ์ง๋ ฅ์ ๋จ์ํ HTML ํ์ผ์ Vue ๊ตฌ์ฑ ์์์ ๋ํ ์ฐ์ํ ์ฝ๋ ์์ฑ์ ์ ๊ณตํ๋ ๊ฒ์ด์์ง๋ง ๊ทธ๋ฌํ ํ์ค์ผ๋ก ๋ฌ์ฑํ ์ ์๋ ๊ฒ์ด ํจ์ฌ ๋ ๋ง๋ค๋ ๊ฒ์ ์์์ผ๋ฏ๋ก ์ผ๋ฐ ์ ๋ณด ๊ตํ ํ์(IDE, ๋๊ตฌ, ๋ฌธ์). ์ง๊ธ๊น์ง๋ Vue ํ๋ ์์ํฌ์ ์ค์ ์ ๋์์ง๋ง ์น ๊ตฌ์ฑ ์์ ๋๋ ๊ธฐํ ํ๋ ์์ํฌ์ ๋ํ ์ง์์ ํญ์ ์ผ๋์ ๋์์ต๋๋ค. web-types
ํ์ค์ ๊ฝค ์ ์ ํ์ง๋ง Vue ์ปค๋ฎค๋ํฐ์ ์ฌ์ฉ์๋ก๋ถํฐ ๊ธ์ ์ ์ธ ํผ๋๋ฐฑ์ ์ด๋ฏธ ๋ค์์ต๋๋ค. Vue ์ปค๋ฎค๋ํฐ์์ ์ฌ์์ ์ ๊ทน์ ์ผ๋ก ํ๋ณดํ๊ณ ์์ง๋ง ๋ค๋ฅธ ์ปค๋ฎค๋ํฐ์์ ์ฝ๊ฐ์ ๊ด์ฌ์ ์ป์ ์ ์์ด์ ๋๋ฌด ์ข์ต๋๋ค!
web-types
JSON ์คํค๋ง์ ๋๋ฝ๋ ๋ช ๊ฐ์ง ์ฌํญ์ด ์์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ ํ๋ ์์ํฌ์ ๋ฐ๋ผ ๋ค๋ฅด๋ฉฐ ์ฌ์์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด Vue ํน์ ํญ๋ชฉ์๋ vue
์ ๋์ฌ๊ฐ ๋ถ์ต๋๋ค. ๋ํ CSS ์ง์์ ๋ฌธ์ํํ๊ธฐ ์ํ ์ ์ฒด ์น์
์ด ๋๋ฝ๋์ด ํฌํจํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ web-types
์ ๊ธฐํ๋ฅผ ์ค ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐ๋๋ฉด ์ธ์ ๋ ์ง ๋ฌธ์ ๋ฅผ ์ ๊ธฐํ๊ฑฐ๋ ๋๋ฝ๋ ๊ธฐ๋ฅ์ ๋ํ PR์ ์์ฑํ์ญ์์ค.
web-types
ํ์์ผ๋ก ๊ตฌ์ฑ ์์๋ฅผ ๋ฌธ์ํํ๋ ๋ถ์์ฉ์ ๊ฐ๋ฐ์๊ฐ ํ๋ก์ ํธ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํฌํจํ ๋ ์ข์ ์ฝ๋ ์์ฑ์ด ๋ ๊ฒ์
๋๋ค. ์ฐ๋ฆฌ๋ ๊ฐ๊น์ด ์ฅ๋์ ๋ชจ๋ ํ๋ ์์ํฌ์ ๋ํ ๊ณตํต web-types
๊ธฐ๋ฅ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์ด๋ฌํ ์ผ๋ฐ ์ง์์ ๊ตฌํํ ๊ณํ์
๋๋ค. ์ปค๋ฎค๋ํฐ๊ฐ ๋ ๋ง์ ํ์์ ์์ฉํ๋ฉด ๋ค๋ฅธ IDE๊ฐ ์ด ํ์์ ๋ํ ์ง์์ ๋ฐ๋ฅผ ๊ฒ์ด๋ฉฐ, ์ด๋ ๋ชจ๋์๊ฒ ๋์์ด ๋ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค. :)
@alexlafroscia ํ์์ ์ธ ์ํ! ์คํ ์ค ๋ฐ ์คํ ๋ฆฌ๋ถ ํตํฉ(https://github.com/storybookjs/storybook/issues/7644์ ํจ๊ป)์ด ์ข์ ๋ณด์ ๋๋ค.
ํด๋น ๋ฌธ์ ์ ์ฐ๊ฒฐํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! ๋๋ ์๋ ๋น์ทํ ๊ฒฝ๋ก๋ฅผ ๋ฐ์์ง๋ง(๊ธฐ์กด README ํ์ผ์ ์ด๋ป๊ฒ๋ ์ฌ์ฉํ๊ณ DocsPage๋ก ์ง์ ๊ฐ์ ธ์ค๋ ค๊ณ ์๋ํจ) ๊ถ๊ทน์ ์ผ๋ก Stencil์ด ๋ฌธ์ JSON ํ์ผ์ ๋ฃ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ฝ๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค. ํ ์ด๋ธ์ ํฌํจํ์ง _ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ํ ๋ฐ ๋ชจ๋ ๊ฒ(ํด๋น ๋ฐ์ดํฐ๋ JSON ํ์ผ์ ๋ค๋ฅธ ์์น์ ์๊ณ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ๋ ์ฌ์ฉ์ ์ง์ ํ ์ด๋ธ์ ๋ง๋๋ ๋ฐ ์๋ฒฝํ๊ธฐ ๋๋ฌธ์).
@alexlafroscia ๊ฒฐ๊ณผ๋ฅผ ๊ณต์ ํด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. CustomDocsPage
๋๋ฒ๊น
๋ฐฉ๋ฒ์ ์ฌ์ญค๋ด๋ ๋ ๊น์?
addParameters
์ถ๊ฐํ๋ ค๊ณ ์๋ํ์ง๋ง ์ฌ์ฉ์ ์ง์ ์ ์ฌ์ฉํ์ง ์๋ ๊ฒ ๊ฐ์ง๋ง ๋์ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํฉ๋๋ค.
.storybook/config.js
์ค์
import { configure, addParameters } from '@storybook/react';
import { themes } from '@storybook/theming';
import { CustomDocsPage } from './docs.jsx';
addParameters({
options: { theme: themes.dark },
docs: { page: CustomDocsPage }
});
configure(require.context('../src', true, /\.(story|stories)\.(mdx)$/), module);
component.story.mdx
### Web Component
<Story name="WC">
<component-name name="test"></component-name>
</Story>
WC ์์ฒด๋ CustomDocsPage
๋ฅผ ์ฌ์ฉํ์ง ์์๋ ์คํ ๋ฆฌ๋ถ ๋ฌธ์ ํ์ด์ง์ ๋ก๋๋ฉ๋๋ค.
๊ตฌ์ฑ ์์๋ฅผ ๋๋ฒ๊น
ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? ์ผ๋ถ ๋ก๊ทธ๋ฅผ ์ถ๊ฐํ๋ ค๊ณ ์๋ํ์ง๋ง ์๋ฌด ๊ฒ๋ ๋ณผ ์ ์์ต๋๋ค.
๋ฏธ๋ฆฌ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๋๋ ๊ทธ ๋ฌธ์ ๋ ๊ฒช์๋ค -- ๋๋ "๊ตฌ์ฑ ์์" ์์ค์์ DocsPage
๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ ์ํด์ผ ํ๋ค
https://github.com/storybookjs/storybook/blob/next/addons/docs/docs/docspage.md#replace -docspage
@storybook/html
๊ฐ jsx์ ํจ๊ป ์๋ํ๋๋ก ํ ์ ์์ต๋๊น? ์คํ
์ค ๊ตฌ์ฑ ์์์ ๋ํ ๋ด ์ด์ผ๊ธฐ๋ฅผ ํจ์ฌ ์ฝ๊ฒ ์์ฑํ ์ ์์ต๋๋ค. ์
๋ ฅํ๊ณ ์๋ ์์ฑ๋๋ฉฐ document.createElement
๋๋ ํฐ ํ
ํ๋ฆฟ ๋ฌธ์์ด์ ์ฌ์ฉํ ํ์๊ฐ ์์ต๋๋ค. ๋ฐ์ ํจํค์ง๋ฅผ ์ฌ์ฉํ์ฌ ๋งจ ์์ // @jsx
๋ก typescript๋ฅผ ์์ด๋ ค๊ณ ํ์ง๋ง ์๋ํ์ง ์์์ต๋๋ค.
@vidarc ๊ทธ๋ ๊ฒ ํ ๋ ์ค๋ฅ๊ฐ ๋ฌด์ ์ฌ์ฉ์ ์ ์ babel ๊ตฌ์ฑ์ด ์์ต๋๊น?
์ปค์คํฐ๋ง์ด์ง์ด ๋ง์ง ์์ต๋๋ค. ์นํฉ์ ๋ช ๊ฐ์ง๊ฐ ์ถ๊ฐ๋์์ต๋๋ค. ์ฒซ ๋ฒ์งธ typescript๋ Cannot find name 'h'
์ ๋ํด ๋ถํํฉ๋๋ค. ๋ด tsconfig์๋ jsx = react ๋ฐ jsxFactory = h๊ฐ ์์ต๋๋ค. ๋งจ ์์ ์๋ // <strong i="6">@jsx</strong> h
pragma ์ค์ ์ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ๊ฒฝ๊ณ ๊ฐ ์ฌ๋ผ์ง๋๋ก ํ ์ ์์ง๋ง DOM ๋
ธ๋ ๋๋ ๋ฌธ์์ด์ ๋ฐํํ์ง ์๊ธฐ ๋๋ฌธ์ ์คํ ๋ฆฌ๋ถ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์๋ํด ๋ณผ ๊ฒ: https://github.com/developit/vhtml ๋ค์
ํธ์ง : jsx์ ์ ์๋ํฉ๋๋ค. ๊ทธ๋๋ typescript์ ํจ๊ป ์๋ํ๋๋ก ํ๋ ๋ฐฉ๋ฒ์ ์ ์ ์์ต๋๋ค :/
@vidarc h
๊ฐ ํ์ดํผ์คํฌ๋ฆฝํธ๋ฅผ ๋ํ๋ด๋ ๊ฒฝ์ฐ ๋ฌธ์์ด๋ DOM ์์๋ ์๋ ์ฌ์ฉ์ ์ ์ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
vhtml์ ๊ฐ ๊ธธ์ ๋ณด์ธ๋ค
์ฐธ๊ณ ๋ก web-components
์ฑ์ ๋ํ PR์ด ์์ต๋๋ค. https://github.com/storybookjs/storybook/pull/8400
์ฌ๊ธฐ ๋๊ตฐ๊ฐ๊ฐ ์ด ๋ฌธ์ ์ ์ด๋ป๊ฒ ๊ต์ฐจํ๋์ง์ ๋ํด ์ธ๊ธํ ์ ์์ต๋๊น? @Vidarc @DesignByOnyx @Edd-Strickland @alexlafroscia @daKmoR
์์ง #8400์ ํ ์คํธํ์ง ์์์ง๋ง ํ ์คํธํ๊ธฐ ์ ์ ๋ค์์ ํตํด "๋ผ์ด๋ธ" ์คํ ์ค์ ์ฌ์ฉํ ์ ์์์ต๋๋ค.
start-storybook -s ./www
๋ฅผ ์คํํฉ๋๋ค.stencil build --dev --watch
๋ฅผ ์คํํฉ๋๋ค..storybook/config.ts
๋ฅผ ์
๋ฐ์ดํธํ์ฌ HMR์์ ์ฐฝ์ ๋ค์ ๋ก๋ํฉ๋๋ค.const req = require.context('../src/components', true, /.stories.tsx$/);
function loadStories() {
req.keys().forEach(filename => req(filename));
}
configure(loadStories, module);
if (module.hot) {
module.hot.accept(req.id, () => {
const currentLocationHref = window.location.href;
window.history.pushState(null, null, currentLocationHref);
window.location.reload();
});
}
์กฐ๊ธ ์ง์ ๋ถํฉ๋๋ค.
https://github.com/CleverCloud/clever-components/blob/master/stories/atoms/cc-button.stories.js ์ ๊ฐ์ ๋์์ ์กฐ์ฌํ ์ ์๋ ์ด์ ๋ import "./my-component"
๊ฐ import { Component } from "@stencil/core"
์ดํ ์คํจํ๊ธฐ ๋๋ฌธ์
๋๋ค.
์ค์ ๋ก IE11์์ ์๋ํ๋ ์คํ
์ค ๋ฐ ์คํ ๋ฆฌ๋ถ ๊ตฌํ/๊ตฌ์ฑ์ด ์๋ ์ฌ๋์ด ์์ต๋๊น? ๋๋ ์ด์ด ์์ด ์ด ์ค๋ ๋์์ ์ธ๊ธ๋ ๊ฐ ๊ตฌํ์ ์๋ํ์ต๋๋ค.
ํญ์ ์ฒ๋ฆฌ๋์ง ์์ ์ฝ์ ๊ฑฐ๋ถ๊ฐ ๋ฐ์ํฉ๋๋ค. TypeError: Invalid Scheme with stencil versions 1.2.4 -> 1.7.4.
@shilman web-components
์ฑ์์ ์คํ
์ค ๊ตฌ์ฑ ์์๋ฅผ ์ป์ ์ ์์์ง๋ง ๋ชจ๋ ์ฌ๋์ด html
ํ๋๋ก ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฝ๊ณ HMR์ ' t ์คํ
์ค ๊ตฌ์ฑ ์์ ์์ฒด์ ๋ํ ์
๋ฐ์ดํธ์ ๋ฐ์ํฉ๋๋ค.
React, Angular ๋ฑ๊ณผ ๊ฐ์ ์คํ ๋ฆฌ๋ถ ์คํ ์ํ์ค์ ์คํ ์ค ์ปดํ์ผ๋ฌ๋ฅผ ๋น๋ํ๋ ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด ์ ๋ง ์ข์ ๊ฒ์ ๋๋ค.
์คํ
์ค ๊ตฌ์ฑ ์์๋ฅผ "๋ผ์ด๋ธ" ์ํ๋ก ์ ์งํ๋ ๋ฐฉ๋ฒ์ ๊ณ์ ์๋ํ ๊ฒ์ด์ง๋ง ๋ด๊ฐ ๊ฒช๊ณ ์๋ ์ํคํ
์ฒ ๋ฌธ์ ๋ ๋ด๊ฐ ์ค์ํ์ง ์๋ ํ _์คํ
์ค ๊ตฌ์ฑ ์์๊ฐ ์๋ํ๋ ค๋ฉด ์ฌ์ฉ์ ์ ์ ๋น๋ ๋จ๊ณ๊ฐ ํ์ํ๋ค๋ ๊ฒ์
๋๋ค_( stencil build --dev --watch
) ๋ฐ ๋ฐํ์์ ํด๋นํ๋ ํญ๋ชฉ์ด ์์ต๋๋ค.
import { MyComponent} from "./MyComponent"
์๋ํ์ง๋ง @Component
๊ฐ ์ค์ ๋ก @stencil/core
์์ ๋ด๋ณด๋ด์ง์ง ์์๊ธฐ ๋๋ฌธ์ ์คํจํฉ๋๋ค. ์ค์ ๋ก ๋น๋ ๋จ๊ณ์ ์ผ๋ถ๋ก ์ ๊ฑฐ๋ฉ๋๋ค.
์ด๊ฒ์ ์๊ณ ๋ด ๋ค์ ํ ์คํธ๋ React ๋ฐ์ธ๋ฉ(https://github.com/ionic-team/stencil-ds-plugins)์ผ๋ก ๋น๋ ๋จ๊ณ๋ฅผ ์ ์งํ๋ ๋์ HMR ๋ก์ง์ HTML ๋์ React๋ฅผ ์ฌ์ฉํ๋๋ก ๊ต์ฒดํ๋ ๊ฒ์ ๋๋ค. .
์ด๊ฒ์ด ์คํ ๋ฆฌ๋ถ UX๊ฐ React์ ์ผ์นํ๋๋ก ํ๊ณ Stencil์ ๊ตฌ์ฑ ์์ ๊ตฌํ์๋ง ๋จ๊ฒ ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
stencil build
๊ฐ ๊ฐ๋ฐ ๋ชจ๋์์ ๋ณ๋ ฌ๋ก ์คํ๋์ด์ผ ํ๋ ๊ฒ์ด ์ธ์์ ์ข
๋ง์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
package.json
์์ ๋์์ ์คํํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉ์์๊ฒ ์ง์ํ ์ ์์ต๋๋ค.์์ง์ด๋ ๋ถ๋ถ์ด ์ ์ ์๋ฃจ์ ์ด ๋ฐ๋์งํ์ง๋ง ์ฌ๊ธฐ์์ ์ข์ ๊ฒ์ด ํฐ ๊ฒ์ ์ ์ผ๋ก ๋์ง ๋ง์๋ค. AFAIK๋ ํ์ฌ ๋ชจ๋๊ฐ ์ฌ์ ํ ์์ฒด ์คํ ์ค ์ง์์ ์ ๊ณตํ๊ณ ์์ผ๋ฉฐ ์ฌ๊ธฐ ๋ง์ ์ฌ๋๋ค์ ์ํด ์ผ์ ๋จ์ํํ ์ ์๋ ์ข์ ๊ธฐํ๊ฐ ์์ต๋๋ค...
๋์์ ์ฌ์ฉํ๋ ๊ฒ์ด ํ์ฌ ์ ์๊ฒ ํจ๊ณผ์ ์ ๋๋ค.
ํ์คํ ์ฆ๋ถ ๋จ๊ณ๊ฐ ์์ต๋๋ค.
๋๋ฅผ ์ฌ์ฉ์๋ก ๋ง๋ ์ฃผ๋ ์ด์ ๋ ์คํ
์ค์ด ๋์ผํ๊ฒ ์๋ํ์ง ์๋ "์ด์ "์์ต๋๋ค.
์คํ
์ค ํน์ ์์ด๋ ํด๊ฒฐํ ์ ์๋ ๋ด ๋ฐ์ ์ด์ผ๊ธฐ๋ก
๋ณ๊ฒฝ.
2019๋
10์ 31์ผ ๋ชฉ์์ผ ์คํ 5:02 Michael Shilman [email protected]
์ผ๋ค:
๋๋ ์คํ ์ค ๋น๋๋ฅผ ์๊ตฌํ๋ ๊ฒ์ด ์ธ์์ ์ข ๋ง์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
๊ฐ๋ฐ ๋ชจ๋์์ ๋ณ๋ ฌ๋ก ์คํ:
- ์ฌ์ฉ์์๊ฒ ์ด๊ฒ์ ๋์์ ์คํํ๋ ๋ฐฉ๋ฒ์ ์ง์ํ ์ ์์ต๋๋ค.
๊ทธ๋ค์ package.json์์ https://www.npmjs.com/package/concurrently- ์คํ ์ค ์ฌ์ ์ค์ ์ ์์ ์ ์ด ํ๋ก์ธ์ค๋ฅผ ์์ฑํ ๋ค์ ์ข ๋ฃํ ์ ์์ต๋๋ค.
์ฌ์ฉ์์๊ฒ ์จ๊ธฐ๋ ค๋ฉด ์ข ๋ฃ ์์์ง์ด๋ ๋ถ๋ถ์ด ์ ์ ์๋ฃจ์ ์ด ๋ฐ๋์งํ์ง๋ง ์ข์ง ์์ต๋๋ค.
์ฌ๊ธฐ์์ ์๋ํ ๊ฒ์ ์ ์ด ๋์ญ์์ค. AFAIK ์ง๊ธ์ ๋ชจ๋๊ฐ ์ฌ์ ํ ๋กค๋ง ์ค์ ๋๋ค.
ํ์ฌ ์์ฒด ์คํ ์ค ์ง์์ ์ ๊ณตํ๊ณ ์์ต๋๋ค.
์ฌ๊ธฐ ๋ง์ ์ฌ๋๋ค์ ์ํด ์ผ์ ๋จ์ํํ์ญ์์ค ...โ
๋น์ ์ด ๋๊ธ์ ๋ฌ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธ
https://github.com/storybookjs/storybook/issues/4600?email_source=notifications&email_token=AAADWTSIACMC4XSZHQWMAFTQRNW2DA5CNFSM4F7Y7BGKYY3PNVWWK3TUL52HS4DFVEXG43VMXHJ2LDNMV
๋๋ ๊ตฌ๋ ์ทจ์
https://github.com/notifications/unsubscribe-auth/AAADWTWS5RITQW46NXEJHZLQRNW2DANCNFSM4F7Y7BGA
.
์ด์ ๋ํ ๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ(์คํ
์ค)์์ UI(์คํ ๋ฆฌ๋ถ)๋ฅผ ๋ช
ํํ๊ฒ ๋ถ๋ฆฌํ๋ ๊ฒ์
๋๋ค. ์คํ ๋ฆฌ๋ถ ๋
๋ฆฝ ์คํํ์ผ๋ก ์ด๊ฒ์ ์ด๋ฏธ ๊ฐ๋ฅํด์ผ ํฉ๋๋ค.
๊ทธ๋ ๊ฒ ํ๋ฉด ํจ์ฌ ๋ ๋น ๋ฅธ ๋ถํ
์๊ฐ์ ์๋ฏธํ๋ ์คํ ๋ฆฌ๋ถ ๐ช์ ๋ฏธ๋ฆฌ ๊ตฌ์ถํ ์๋ ์์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ ๊ฐ๋ฐํ๋ ๋์ ์คํ ์ค ๋น๋๋ง ์ฌ์ฉํฉ๋๋ค(ํ์ง๋ง ์ฌ์ ํ ์คํ ๋ฆฌ๋ถ UI ์ฌ์ฉ). ์ฆ, ์คํ ๋ฆฌ๋ถ ์นํฉ ์ค์ ๊ณผ์ ์ํธ ์ด์ฉ์ ๋ํด ์๊ฐํ ํ์ ์์ด ์คํ ์ค ๊ฐ๋ฐ ์๋ฒ๊ฐ ์ง์ํ๋ ๋ชจ๋ ์ฅ์ ์ ์ป์ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ด๋ฏธ ์ฌ์ฉํ์ฌ์ด ์กฐ์ฌ es-dev-server
์ํ ์ ์์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ web-components
. ์ฐ๋ฆฌ๋ ์ผ์ข
์ POC๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง ์ฌ์ ํ ๊ฑฐ์น ๊ฐ์ฅ์๋ฆฌ๊ฐ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ ํํ ๋์ผํ ์ ๊ทผ ๋ฐฉ์์ด ์คํ
์ค์์๋ ์๋ํด์ผ ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
๋๊ตฐ๊ฐ ์ง๋ฌธ์ด ์๊ฑฐ๋ ์คํ
์ค์ ์ํด ์ด๊ฒ์ ์กฐ์ฌํ๋ ๋ฐ ๊ด์ฌ์ด ์๊ฑฐ๋ es-dev-server
๋ฅผ ์ฌ์ฉํ์ฌ ์ฐธ์กฐ ํ๋ก์ ํธ๋ฅผ ๋ง๋๋ ๋ฐ ๋์์ด ๋๋ค๋ฉด @LarsDenBakker ๊ฐ ๋ ์์ธํ ์ ๋ณด๋ฅผ ๊ธฐ๊บผ์ด ๊ณต์ ํ ๊ฒ์
๋๋ค ๐ค
์ถ์ : ์ด ๋ชจ๋ ๊ฒ์ ์คํ ๋ฆฌ๋ถ์ ์ฑ๋ ๋ฉ์์ง๊ฐ ํฌํจ๋ ๋ฉ์ง iframe ์ค์ ์ด ์์ด UI๋ฅผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์ ๋ณ๋๋ก ์ ์งํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํฉ๋๋ค ๐ค
๋ชจ๋ ์๋
์ผ๋ง ํ ์ด๊ฒ์ ๋ํด ๋ง์ ๋ง์ง์๊ฑฐ๋ฆผ์ด ๋๋๋ฉด ์คํ ์ค ํตํฉ ์คํ ๋ฆฌ๋ถ ๊ตฌํ https://github.com/Edd-Stricland/stencilbook์ ๋ํ ๋ด ์ ์ฅ์์ ๋๋ค
์ถ๊ฐ๋ก ๋ ผ์ํ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค. ๋๋ถ๋ถ์ ์ฌํญ์ด readme์ ์คํฌ๋ฆฝํธ์ ๋ํ package.json์ ๋ณด๋ฉด ๋ช ํํด์ง๋๋ค.
์ด๊ฒ์ ๋ฐ๋๋ผ ์คํ ์ค ์คํํฐ ์ปดํฌ๋ํธ์ ๋ฐ๋๋ผ ์คํ ๋ฆฌ๋ถ HTML ๊ตฌํ์ ์ฌ์ฉํ์ฌ ๊ตฌ์ถ๋์์ต๋๋ค.
๋ณด์๊ณ ํ๊ธฐ ๋ถํ๋๋ฆฝ๋๋ค...
์ด๊ฒ์ ์คํ ์ค๊ณผ ์คํ ๋ฆฌ๋ถ์ ์ฌ์ฉํ์ฌ ๋ ๋ฆฝํ ์น ์ปดํฌ๋ํธ๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ์คํํฐ ํ๋ก์ ํธ์ ๋๋ค.
์คํ ์ค์ ์น ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ์ฌ ๋น ๋ฅธ ์น ์ฑ์ ๋น๋ํ๊ธฐ ์ํ ์ปดํ์ผ๋ฌ์ ๋๋ค.
์คํ ์ค์ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ํ๋ก ํธ์๋ ํ๋ ์์ํฌ์ ์ต๊ณ ์ ๊ฐ๋ ์ ๋ฐํ์ ๋๊ตฌ๊ฐ ์๋ ์ปดํ์ผ ์๊ฐ์ ๊ฒฐํฉํฉ๋๋ค. Stencil์ TypeScript, JSX, ์์ ๊ฐ์ DOM ๋ ์ด์ด, ํจ์จ์ ์ธ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ, ๋น๋๊ธฐ ๋ ๋๋ง ํ์ดํ๋ผ์ธ(React Fiber์ ์ ์ฌ) ๋ฐ ์ง์ฐ ๋ก๋ฉ์ ์ฆ์ ์ฌ์ฉํ๊ณ ์คํ๋๋ 100% ํ์ค ๊ธฐ๋ฐ ์น ๊ตฌ์ฑ ์์๋ฅผ ์์ฑํฉ๋๋ค. Custom Elements v1 ์ฌ์์ ์ง์ํ๋ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์์
์คํ ์ค ๊ตฌ์ฑ ์์๋ ์น ๊ตฌ์ฑ ์์์ผ ๋ฟ์ด๋ฏ๋ก ๋ชจ๋ ์ฃผ์ ํ๋ ์์ํฌ์์ ์๋ํ๊ฑฐ๋ ์ ํ ํ๋ ์์ํฌ ์์ด ์๋ํฉ๋๋ค.
๋ฆฌํฌ์งํ ๋ฆฌ ๋ณต์
git clone https://github.com/Edd-Strickland/stencilbook.git
๊ธฐ๋ณธ ๋๋ ํ ๋ฆฌ๋ก ๋ณ๊ฒฝ:
cd stencilbook
๋ชจ๋์ ์ค์นํฉ๋๋ค.
npm install
์ ์ฒด ๋ฆฌํฌ์งํ ๋ฆฌ์ ๋ํ ๋น๋๋ฅผ ์คํํฉ๋๋ค.
npm run build:all
์ด ์คํ ์คํ ๋ฆฌ๋ถ ํ:
npm run storybook
์คํ ์ค ๋น๋:
npm run stencil
์๋น/๊ฐ์ ๋ชจ๋์์ ์คํ ์ค์ ์ง์ ์์ํฉ๋๋ค. ์คํ ์ค ๊ตฌ์ฑ ์์๋ฅผ ์ง์ ์์ ํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
npm run stencil:start
watch ๋ฐ serve๋ก ์คํ ๋ฆฌ๋ถ ๋ฐ ์คํ ์ค ๋น๋๋ฅผ ์คํํ๊ณ ๋น๋๋์ด ๋ก์ปฌ์์ ์ ๊ณต๋ ์ด์ ๋ฒ์ ์ ์ญ์ ํฉ๋๋ค.
npm run storybook:build:all
์ง์ญ์์ ์คํ ๋ฆฌ๋ถ ์ ๊ณต:
npm run storybook:serve
๋ชจ๋์ ์ฌ์ค์ ํฉ๋๋ค. ๋ ธ๋ ๋ชจ๋์ ์ญ์ ํ๊ณ ๋ค์ ์ค์นํฉ๋๋ค.
npm run reset:modules
๊ตฌ์ฑ ์์์ ๋ํ ๋จ์ ํ ์คํธ๋ฅผ ์คํํ๋ ค๋ฉด ๋ค์์ ์คํํฉ๋๋ค.
npm test
๊ฐ์ ๋ชจ๋์์ ํ ์คํธ๋ฅผ ์คํํ๋ ค๋ฉด:
npm run test.watch
์ ์คํ ์ค ๊ตฌ์ฑ ์์๋ฅผ ์๋์ผ๋ก ์์ฑํ๋ ค๋ฉด:
npm run generate
@Edd-Srickland ๋ฉ์ง ์์์
๋๋ค! ๋ ์ฌ์ด ๋ถํ
์ ์ํด ์์ ์คํฌ๋ฆฝํธ๋ฅผ ์ถ๊ฐํ ๊ฒ์ ์ ์ํ ์ ์๋ค๋ฉด "start": "npm-run-all -p stencil:start storybook"
ํ์ผ๋ฉฐ ์คํ ๋ฆฌ๋ถ์ด ์คํ
์ค์ด ๋น๋๋ ๋ ์ธ์ํ์ง ๋ชปํ๋ ๊ฒ์ฒ๋ผ ํซ ๋ค์ ๋ก๋๊ฐ ์๋ค๋ ์ ์ ์ ์ธํ๊ณ ๋ ๊ฝค ์ ์๋ํฉ๋๋ค.
...๊ทธ๊ฑด ๋ด๊ฐ ๋ญ๊ฐ๋ฅผ ๋์น๊ณ ์์ง ์๋ ํ?
@shilman ์ด๋ฏธ ๋ง์คํฐ ์ํ์ @storybook/web-components ํจํค์ง๊ฐ ์๋ ๊ฒ ๊ฐ์ง๋ง README.md์์ ์ฐธ์กฐ๋ ์คํ ์ค์ด ๋ณด์ด์ง ์์ต๋๋ค: https://github.com/storybookjs/storybook/tree/next/ ์ฑ/์น ๊ตฌ์ฑ ์์
์ด๊ฒ์ ๋ณํ ๋
ธ๋ ฅ์
๋๊น? ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ํด๋น ๋ฌธ์ ๋ฅผ ์๊ฒ ๋์์ต๋๊น? ๋ฌธ์ ์์ web-components
๋ฅผ ๊ฒ์ํ ๋ ์ฐพ์ ์ ์์ต๋๋ค. app: web-components
ํ๊ทธ๋ฅผ ์ฐพ์์ง๋ง ๋ฐฉ๊ธ ๋ฆด๋ฆฌ์ค ๋ฐ ๋ฒ๊ทธ์ ์ถ๊ฐ๋์์ต๋๋ค.
@storybook/web-components
์ ๊ณตํ๋ ๊ฒ ์ด์์ผ๋ก ์ ์ ํ ์คํ
์ค ์ง์์ ์ถ๊ฐํ๋ ๋ฐ ํ์ํ ๊ฒ์ด ๋ฌด์์ธ์ง ์ดํดํ์ง ๋ชปํฉ๋๋ค. ์ด ์ค๋ ๋์ ๋๊ตฐ๊ฐ๊ฐ ์๊ณ ์๋ค๊ณ ํ์ ํฉ๋๋ค!
@Edd-Srickland ๋ฉ์ง ์์์ ๋๋ค! ๋ ์ฌ์ด ๋ถํ ์ ์ํด ์์ ์คํฌ๋ฆฝํธ๋ฅผ ์ถ๊ฐํ ๊ฒ์ ์ ์ํ ์ ์๋ค๋ฉด
"start": "npm-run-all -p stencil:start storybook"
ํ์ผ๋ฉฐ ์คํ ๋ฆฌ๋ถ์ด ์คํ ์ค์ด ๋น๋๋ ๋ ์ธ์ํ์ง ๋ชปํ๋ ๊ฒ์ฒ๋ผ ํซ ๋ค์ ๋ก๋๊ฐ ์๋ค๋ ์ ์ ์ ์ธํ๊ณ ๋ ๊ฝค ์ ์๋ํฉ๋๋ค....๊ทธ๊ฑด ๋ด๊ฐ ๋ญ๊ฐ๋ฅผ ๋์น๊ณ ์์ง ์๋ ํ?
ํ ์ฌ๊ณผ๋ ๋ฐ์๊ณ ์ง๋์ฃผ ๋ง์ ํ์์ ์ฐธ์ํ์ต๋๋ค.
๊ทํ๊ฐ ๊ฒช๊ณ ์๋ ๋ฌธ์ ์ ๋ํด ํผ๋์ค๋ฝ์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ์ด ์ค๋ ๋๊ฐ ์๋ repo ๋ฌธ์ ๋ฅผ ํตํด ๋ฌธ์ ๋ฅผ ์ ๊ธฐํ ์ ์์ต๋๊น?
๊ทธ๋ฌ๋ ์ค์น๋ฅผ ์ํํ ๋ค์ ์คํ ๋ฆฌ๋ถ ๋ช ๋ น์ ์คํํ๋ฉด ๊ทธ์ ๋ฐ๋ผ ๊ฐ์ ์๋ฒ๊ฐ ์์๋ฉ๋๋ค. ์คํ ์ค์ ์คํ ์ค ๊ตฌ์ฑ ์์๋ฅผ ๋ณ๊ฒฝ, ์ถ๊ฐ ๋๋ ์ ๋ฐ์ดํธํ ๋๋ง๋ค ์๋ HMR์ ์ํํฉ๋๋ค.
@storybook/web-components
์ ๊ณตํ๋ ๊ฒ ์ด์์ผ๋ก ์ ์ ํ ์คํ ์ค ์ง์์ ์ถ๊ฐํ๋ ๋ฐ ํ์ํ ๊ฒ์ด ๋ฌด์์ธ์ง ์ดํดํ์ง ๋ชปํฉ๋๋ค. ์ด ์ค๋ ๋์ ๋๊ตฐ๊ฐ๊ฐ ์๊ณ ์๋ค๊ณ ํ์ ํฉ๋๋ค!
์น ๊ตฌ์ฑ ์์๋ ๋ฐ๋๋ผ ์ธ์คํด์ค์ ์๋ํ์ง๋ง ์คํ ์ค์ ์น ๊ตฌ์ฑ ์์๋ฅผ ์ถ๋ ฅํ์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก W/C๊ฐ ์๋ W/C์ ์ปดํ์ผ๋ฌ๋ก ์คํ๋ฉ๋๋ค.
๋ฐ๋ผ์ ํ๋ฆผ์์ด ๋ ๋ค ํ์ํฉ๋๋ค. ํ๋์ ๋ค์ดํฐ๋ธ JS W/C์ ์คํ ์ค ์ปดํ์ผ๋ฌ์ฉ ํ๋๋ ๋ฐ์ ๋๋ ๊ฐ๋ ๊ตฌ์ฑ ์์๋ก ํ ์ ์๋ ๊ฒ์ฒ๋ผ ์คํ ๋ฆฌ๋ถ ์ธก๋ฉด์์ ์คํ ์ค ๊ธฐ๋ฐ W/C์ ํ๋กํ ํ์ ์ ๋น ๋ฅด๊ฒ ๋ง๋ค๊ณ ์ ํ๋ ๊ฒฝ์ฐ์ ๋๋ค.
@daKmoR ๊ณผ ๋ง๋ ์ด๊ฒ์ด ์ค๋ณต์ธ์ง ์ค๋ณต์ธ์ง ๋ ผ์ํ ์๊ฐ์ด ์์ง๋ง ๋น๋ถ๊ฐ ์ด ๋ฒ์ ์ ์ ์ง ๊ด๋ฆฌํ๊ณ ์์ต๋๋ค.
๋๋ ์ต๊ทผ Bulmil ๊ณผ nuxt-stencil ๋ฐ nuxt ์์ ์ Stencil ํตํฉ์ ๋ํ ์์ ์ผ๋ก ์ธํด ์ฐ์ฐํ ์๊ฒ ๋์์ต๋๋ค.
๋๋ ๋ํ ์ ์ ํ Storybook ์ง์์ด ์๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ์ด์ฉ๋ฉด ๋ณผ ๊ฐ์น๊ฐ ์์ต๋๋ค. ๋ด๋ถ๊ฐ ์ด ์ค๋ ๋์ ํ์ฌ ์ํ์ ์ด๋ป๊ฒ ๋ค๋ฅธ์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง ์ผ๋จ ์คํ ๋ฆฌ๋ถ ์ ์คํํ๋ฉด Bulmil ๋ด์์ ์ฆ์ ์๋ํฉ๋๋ค.
@storybook/addon-actions
์ด(๊ฐ) ์์ง ์๋ํ์ง ์๋ ๊ฒ ๊ฐ๊ฑฐ๋ ์์ง ์๋ํ์ง ๋ชปํ์ต๋๋ค.
์ด ์ค๋ ๋์์ @Gomah๋ฅผ ๋ง๋์ ์คํ ๋ฆฌ๋ถ์ ์คํ ์ค ์ง์์ ๊ฐ์ ํ๊ธฐ ์ํ ํ์ ์ ๋ํ ๊ทธ์ ์์ด๋์ด๋ฅผ ๋ค์ ์ ์์๊น์?
์ต๊ทผ์ ๋๋ Bulmil ๊ณผ nuxt-stencil ๋ฐ nuxt ์์ ์ Stencil ํตํฉ์ ๋ํ ์์ ์ผ๋ก ์ธํด Bulmil์ ์ฐ์ฐํ ๋ง๋ฌ์ต๋๋ค.
๋๋ ๋ํ ์ ์ ํ Storybook ์ง์์ด ์๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ์ด์ฉ๋ฉด ๋ณผ ๊ฐ์น๊ฐ ์์ต๋๋ค. ๋ด๋ถ๊ฐ ์ด ์ค๋ ๋์ ํ์ฌ ์ํ์ ์ด๋ป๊ฒ ๋ค๋ฅธ์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง ์ผ๋จ ์คํ ๋ฆฌ๋ถ ์ ์คํํ๋ฉด Bulmil ๋ด์์ ์ฆ์ ์๋ํฉ๋๋ค.
@storybook/addon-actions
์ด(๊ฐ) ์์ง ์๋ํ์ง ์๋ ๊ฒ ๊ฐ๊ฑฐ๋ ์์ง ์๋ํ์ง ๋ชปํ์ต๋๋ค.
ํ์คํ ์์ repo ๋ด์์ add on action์ด ํ์ค ์คํ ๋ฆฌ๋ถ ์ ๋์จ์ผ๋ก ์๋ํฉ๋๋ค.
E2A: @Gomah ๋ณํ์ด ์๋ ์คํ ์ค ์ฑ .
์์ ๊ธฐ๋ณธ ์คํ ์ค/SB ํตํฉ์ ์ฌ์ฉํ ๋ชฉ์ ์ ๋จ์ํ ์คํ ๋ฆฌ๋ถ์์ ์คํ ๋ฆฌ๋ถ์ผ๋ก, ์คํ ์ค์์ ์คํ ์ค๋ก, ๊ทธ๋ฆฌ๊ณ ๋ ๋ค ํจ๊ป ํตํฉ๋์ด ์คํ ์ค์ ํตํด ๋ง๋ค์ด์ง ์น ๊ตฌ์ฑ ์์๋ฅผ ์คํ ๋ฆฌ๋ถ ํ๋ ์์ ๋ฃ์ ์ ์๋๋ก ํ๋ ๊ธฐ๋ฐ์ ๋ง๋๋ ๊ฒ์ ๋๋ค.
๋๋ W/C ๋ฒ์ ์ด ์ด ๋ฐ๋ณต๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์คํ๋๊ณ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๊ณ ์๋ ๊ธฐ์กด ๋ฒ์ ์ W/C ๋ฒ์ ์ผ๋ก ๋ณํํ ์ ์๋์ง ํ์ธํ๊ธฐ ์ํด ๋ค์ 2์ฃผ ๋์ ํ ์คํ๋ฆฐํธ์ ์ง์คํ์ต๋๋ค.
์ด์์ ์ผ๋ก๋ W/C ๋ณํ์ด ๋จํธํ๋์ง ์๋๋ก ๋ชจ๋ ์๋ํ์ง๋ง ๊ธฐ๋ณธ W/C ๊ตฌํ๊ณผ ๋ฌ๋ฆฌ ์คํ ์ค์ ์ค์ ๋ก ํ๋ ์์ํฌ๊ฐ ์๋๋๋ค. ์ปดํ์ผ๋ฌ. ๋ฐ๋ผ์ ๋์ค์ W/C๋ก ์ถ๋ ฅํ JSX ๊ตฌ์ฑ ์์๋ฅผ ์์ฑํ ์ ์๋๋ก ๊ตฌ๋ณํ๋ ๊ฒ์ด ์ฌ์ ํ ๊ฐ์น๊ฐ ์์ ์ ์์ต๋๋ค.
์๋๋ฉด ์ ๋ง ๊ฐ๋จํ ์๋ ์์ต๋๋ค.
์คํ์ดํฌ๊ฐ ์๋ฃ๋๋ฉด ์๋ ค ๋๋ฆฌ๊ฒ ์ต๋๋ค.
์ปค์คํฐ๋ง์ด์ง์ด ๋ง์ง ์์ต๋๋ค. ์นํฉ์ ๋ช ๊ฐ์ง๊ฐ ์ถ๊ฐ๋์์ต๋๋ค. ์ฒซ ๋ฒ์งธ typescript๋
Cannot find name 'h'
์ ๋ํด ๋ถํํฉ๋๋ค. ๋ด tsconfig์๋ jsx = react ๋ฐ jsxFactory = h๊ฐ ์์ต๋๋ค. ๋งจ ์์ ์๋// <strong i="7">@jsx</strong> h
pragma ์ค์ ์ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ๊ฒฝ๊ณ ๊ฐ ์ฌ๋ผ์ง๋๋ก ํ ์ ์์ง๋ง DOM ๋ ธ๋ ๋๋ ๋ฌธ์์ด์ ๋ฐํํ์ง ์๊ธฐ ๋๋ฌธ์ ์คํ ๋ฆฌ๋ถ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.์๋ํด ๋ณผ ๊ฒ: https://github.com/developit/vhtml ๋ค์
ํธ์ง : jsx์ ์ ์๋ํฉ๋๋ค. ๊ทธ๋๋ typescript์ ํจ๊ป ์๋ํ๋๋ก ํ๋ ๋ฐฉ๋ฒ์ ์ ์ ์์ต๋๋ค :/
์๋
ํ์ธ์ @vidarc์
๋๋ค. storiesOf()
๊ตฌ๋ฌธ์ผ๋ก ์ด ์์
์ ์ํํ ์ ์์์ต๋๊น? ๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ํ์
จ๋์ง ์ ๋ง ๊ถ๊ธํฉ๋๋ค. ๊ณต์ ํ ์ฝ๋ ์์ ๋๋ ์ฝ๋ ๊ธฐ๋ฐ์ด ์์ต๋๊น?
์คํ ๋ฆฌ๋ถ๊ณผ ์คํ
์ค์ด ํตํฉ๋์ด ํ๋ก์ ํธ์์ ์ ์๋ํ์ง๋ง ๊ฐ์ฅ ํฐ ๋ฌธ์ ๋ ๊ฐ์ฒด ์ํ ๋ฑ์ ํฌํจํ๋ ๊ตฌ์ฑ ์์์ ๋ํด document.createElement()
๋ก ์คํ ๋ฆฌ๋ฅผ ๋ง๋๋ ๋ฐ ์์กดํด์ผ ํ๋ค๋ ๊ฒ์
๋๋ค. vhtml
๊ฐ ํด๊ฒฐํ ์ ์๋ค๋ฉด ์ด๊ฒ, ๊ทธ๊ฒ์ ๊ต์ฅํ ๊ฒ์
๋๋ค!
@storybook/web-components
์ ๊ณตํ๋ ๊ฒ ์ด์์ผ๋ก ์ ์ ํ ์คํ ์ค ์ง์์ ์ถ๊ฐํ๋ ๋ฐ ํ์ํ ๊ฒ์ด ๋ฌด์์ธ์ง ์ดํดํ์ง ๋ชปํฉ๋๋ค. ์ด ์ค๋ ๋์ ๋๊ตฐ๊ฐ๊ฐ ์๊ณ ์๋ค๊ณ ํ์ ํฉ๋๋ค!
๋น์ ๋ง์ด ๋ง์์, ์ ๋ ๋์ํฉ๋๋ค. README.md์ ํฌํจ๋ ํด๋๋ฅผ ๋ณด๊ณ ๋ค๋ฅธ ์น ๊ตฌ์ฑ ์์ ํ๋ ์์ํฌ๋ฅผ ๋ณด์์ง๋ง ์คํ ์ค์ ๋ณด์ง ๋ชปํ์ต๋๋ค.
By default the following folders are included
src/*.js
packages/*/src/*.js
node_modules/lit-html/*.js
node_modules/lit-element/*.js
node_modules/@open-wc/*.js
node_modules/@polymer/*.js
node_modules/@vaadin/*.js
๊ทธ๋์ ์คํ ์ค์ด ํฌํจ๋์ง ์์ ์ด์ ๊ฐ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์๋ฌด๊ฒ๋ ์ถ๊ฐํ์ง ์๊ณ ์ด๊ฒ์ด ์ ์๋ํ๋ค๋ฉด ๊ทธ๊ฒ์ ๋์๊ฒ ์๋ฒฝํฉ๋๋ค.
Btw, ์์ ์ธ๊ธํ ์น ๊ตฌ์ฑ ์์ ์ฌ์ ์ค์ ์ ์ํด ํด๊ฒฐ๋์์ผ๋ฏ๋ก ์ด ๋ฌธ์ ๋ฅผ ์ด์ ๋ซ์ ์ ์์ต๋๊น?
์ปค์คํฐ๋ง์ด์ง์ด ๋ง์ง ์์ต๋๋ค. ์นํฉ์ ๋ช ๊ฐ์ง๊ฐ ์ถ๊ฐ๋์์ต๋๋ค. ์ฒซ ๋ฒ์งธ typescript๋
Cannot find name 'h'
์ ๋ํด ๋ถํํฉ๋๋ค. ๋ด tsconfig์๋ jsx = react ๋ฐ jsxFactory = h๊ฐ ์์ต๋๋ค. ๋งจ ์์ ์๋// <strong i="8">@jsx</strong> h
pragma ์ค์ ์ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ๊ฒฝ๊ณ ๊ฐ ์ฌ๋ผ์ง๋๋ก ํ ์ ์์ง๋ง DOM ๋ ธ๋ ๋๋ ๋ฌธ์์ด์ ๋ฐํํ์ง ์๊ธฐ ๋๋ฌธ์ ์คํ ๋ฆฌ๋ถ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์๋ํด ๋ณผ ๊ฒ: https://github.com/developit/vhtml ๋ค์
ํธ์ง : jsx์ ์ ์๋ํฉ๋๋ค. ๊ทธ๋๋ typescript์ ํจ๊ป ์๋ํ๋๋ก ํ๋ ๋ฐฉ๋ฒ์ ์ ์ ์์ต๋๋ค :/์๋ ํ์ธ์ @vidarc์ ๋๋ค.
storiesOf()
๊ตฌ๋ฌธ์ผ๋ก ์ด ์์ ์ ์ํํ ์ ์์์ต๋๊น? ๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ํ์ จ๋์ง ์ ๋ง ๊ถ๊ธํฉ๋๋ค. ๊ณต์ ํ ์ฝ๋ ์์ ๋๋ ์ฝ๋ ๊ธฐ๋ฐ์ด ์์ต๋๊น?์คํ ๋ฆฌ๋ถ๊ณผ ์คํ ์ค์ด ํตํฉ๋์ด ํ๋ก์ ํธ์์ ์ ์๋ํ์ง๋ง ๊ฐ์ฅ ํฐ ๋ฌธ์ ๋ ๊ฐ์ฒด ์ํ ๋ฑ์ ํฌํจํ๋ ๊ตฌ์ฑ ์์์ ๋ํด
document.createElement()
๋ก ์คํ ๋ฆฌ๋ฅผ ๋ง๋๋ ๋ฐ ์์กดํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค.vhtml
๊ฐ ํด๊ฒฐํ ์ ์๋ค๋ฉด ์ด๊ฒ, ๊ทธ๊ฒ์ ๊ต์ฅํ ๊ฒ์ ๋๋ค!
์ต์ ๋ด์ฉ์ ์ฌ์ฉํ์ฌ ์ง์ CSF ์คํ ๋ฆฌ๋ก ๋ง๋ค๊ณ ์คํ ๋ฆฌ๋ฅผ ์ ์๋ํ๋ ํ์์ผ๋ก ๋ฐ๊ฟ ์ ์์ต๋๋ค. ๋ํ ๋ฐ์ดํฐ ๊ฐ์ฒด๋ฅผ ์ฑ์ฐ๊ธฐ ์ํด ์ผ๋ถ ๋ฐ์ดํฐ ํฉํ ๋ฆฌ๋ฅผ ๊ฐ์ ธ์ค๋ฉด ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ํ์ ์ํํ ์ ์์ต๋๋ค....
@robaxelsen https://github.com/storybookjs/storybook/pulls?utf8=%E2%9C%93&q=is%3Apr+sort%3Aupdated-desc+is%3Aclosed+label%3A%22app%3A+web-components %22+
@storybook/web-components
์ ๊ณตํ๋ ๊ฒ ์ด์์ผ๋ก ์ ์ ํ ์คํ ์ค ์ง์์ ์ถ๊ฐํ๋ ๋ฐ ํ์ํ ๊ฒ์ด ๋ฌด์์ธ์ง ์ดํดํ์ง ๋ชปํฉ๋๋ค. ์ด ์ค๋ ๋์ ๋๊ตฐ๊ฐ๊ฐ ์๊ณ ์๋ค๊ณ ํ์ ํฉ๋๋ค!๋น์ ๋ง์ด ๋ง์์, ์ ๋ ๋์ํฉ๋๋ค. README.md์ ํฌํจ๋ ํด๋๋ฅผ ๋ณด๊ณ ๋ค๋ฅธ ์น ๊ตฌ์ฑ ์์ ํ๋ ์์ํฌ๋ฅผ ๋ณด์์ง๋ง ์คํ ์ค์ ๋ณด์ง ๋ชปํ์ต๋๋ค.
By default the following folders are included src/*.js packages/*/src/*.js node_modules/lit-html/*.js node_modules/lit-element/*.js node_modules/@open-wc/*.js node_modules/@polymer/*.js node_modules/@vaadin/*.js
๊ทธ๋์ ์คํ ์ค์ด ํฌํจ๋์ง ์์ ์ด์ ๊ฐ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์๋ฌด๊ฒ๋ ์ถ๊ฐํ์ง ์๊ณ ์ด๊ฒ์ด ์ ์๋ํ๋ค๋ฉด ๊ทธ๊ฒ์ ๋์๊ฒ ์๋ฒฝํฉ๋๋ค.
Btw, ์์ ์ธ๊ธํ ์น ๊ตฌ์ฑ ์์ ์ฌ์ ์ค์ ์ ์ํด ํด๊ฒฐ๋์์ผ๋ฏ๋ก ์ด ๋ฌธ์ ๋ฅผ ์ด์ ๋ซ์ ์ ์์ต๋๊น?
์คํ ์ค๊ณผ ํจ๊ป ์๋ํ๋์ง ํ ์คํธํ๊ณ ๋ค์ ๋ณด๊ณ ํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ซ์ ์ ์์ต๋๋ค. ์ค์ ๋ก ์คํ ์ค๊ณผ ํจ๊ป ์๋ํ์ง ์์ผ๋ฉด ๋ซ๋ ์๋ฏธ๊ฐ ์์ต๋๋ค ...
...
์๋ ํ์ธ์ @vidarc์ ๋๋ค.
storiesOf()
๊ตฌ๋ฌธ์ผ๋ก ์ด ์์ ์ ์ํํ ์ ์์์ต๋๊น? ๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ํ์ จ๋์ง ์ ๋ง ๊ถ๊ธํฉ๋๋ค. ๊ณต์ ํ ์ฝ๋ ์์ ๋๋ ์ฝ๋ ๊ธฐ๋ฐ์ด ์์ต๋๊น?
์คํ ๋ฆฌ๋ถ๊ณผ ์คํ ์ค์ด ํ๋ก์ ํธ์ ํตํฉ๋์ด ์ ์๋ํ๊ณ ์์ง๋ง ๊ฐ์ฅ ํฐ ๋ฌธ์ ๋ ๊ฐ์ฒด ์ํ ๋ฑ์ด ์๋ ๊ตฌ์ฑ ์์์ ๋ํดdocument.createElement()
๋ก ์คํ ๋ฆฌ๋ฅผ ๋ง๋๋ ๋ฐ ์์กดํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค.vhtml
๊ฐ ํด๊ฒฐํ ์ ์๋ค๋ฉด ์ด๊ฒ, ๊ทธ๊ฒ์ ๊ต์ฅํ ๊ฒ์ ๋๋ค!์ต์ ๋ด์ฉ์ ์ฌ์ฉํ์ฌ ์ง์ CSF ์คํ ๋ฆฌ๋ก ๋ง๋ค๊ณ ์คํ ๋ฆฌ๋ฅผ ์ ์๋ํ๋ ํ์์ผ๋ก ๋ฐ๊ฟ ์ ์์ต๋๋ค. ๋ํ ๋ฐ์ดํฐ ๊ฐ์ฒด๋ฅผ ์ฑ์ฐ๊ธฐ ์ํด ์ผ๋ถ ๋ฐ์ดํฐ ํฉํ ๋ฆฌ๋ฅผ ๊ฐ์ ธ์ค๋ฉด ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ํ์ ์ํํ ์ ์์ต๋๋ค....
๊ฐ์ฌ ํด์. CSF๊ฐ ์ง๊ธ ๊ถ์ฅ๋๋ ์คํ ๋ฆฌ ์์ฑ ๋ฐฉ๋ฒ์ด๋ผ๋ ๊ฒ์ ๊นจ๋ซ์ง ๋ชปํ์ต๋๋ค. jsx ์ ๋์จ์ด vhtml btw์ ํจ๊ป ์๋ํ๋๋ก ๊ด๋ฆฌํ์ต๋๊น, ์๋๋ฉด ๋ถ๊ฐ๋ฅํฉ๋๊น?
...
์๋ ํ์ธ์ @vidarc์ ๋๋ค.
storiesOf()
๊ตฌ๋ฌธ์ผ๋ก ์ด ์์ ์ ์ํํ ์ ์์์ต๋๊น? ๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ํ์ จ๋์ง ์ ๋ง ๊ถ๊ธํฉ๋๋ค. ๊ณต์ ํ ์ฝ๋ ์์ ๋๋ ์ฝ๋ ๊ธฐ๋ฐ์ด ์์ต๋๊น?
์คํ ๋ฆฌ๋ถ๊ณผ ์คํ ์ค์ด ํ๋ก์ ํธ์ ํตํฉ๋์ด ์ ์๋ํ๊ณ ์์ง๋ง ๊ฐ์ฅ ํฐ ๋ฌธ์ ๋ ๊ฐ์ฒด ์ํ ๋ฑ์ด ์๋ ๊ตฌ์ฑ ์์์ ๋ํดdocument.createElement()
๋ก ์คํ ๋ฆฌ๋ฅผ ๋ง๋๋ ๋ฐ ์์กดํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค.vhtml
๊ฐ ํด๊ฒฐํ ์ ์๋ค๋ฉด ์ด๊ฒ, ๊ทธ๊ฒ์ ๊ต์ฅํ ๊ฒ์ ๋๋ค!์ต์ ๋ด์ฉ์ ์ฌ์ฉํ์ฌ ์ง์ CSF ์คํ ๋ฆฌ๋ก ๋ง๋ค๊ณ ์คํ ๋ฆฌ๋ฅผ ์ ์๋ํ๋ ํ์์ผ๋ก ๋ฐ๊ฟ ์ ์์ต๋๋ค. ๋ํ ๋ฐ์ดํฐ ๊ฐ์ฒด๋ฅผ ์ฑ์ฐ๊ธฐ ์ํด ์ผ๋ถ ๋ฐ์ดํฐ ํฉํ ๋ฆฌ๋ฅผ ๊ฐ์ ธ์ค๋ฉด ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ํ์ ์ํํ ์ ์์ต๋๋ค....
๊ฐ์ฌ ํด์. CSF๊ฐ ์ง๊ธ ๊ถ์ฅ๋๋ ์คํ ๋ฆฌ ์์ฑ ๋ฐฉ๋ฒ์ด๋ผ๋ ๊ฒ์ ๊นจ๋ซ์ง ๋ชปํ์ต๋๋ค. jsx ์ ๋์จ์ด vhtml btw์ ํจ๊ป ์๋ํ๋๋ก ๊ด๋ฆฌํ์ต๋๊น, ์๋๋ฉด ๋ถ๊ฐ๋ฅํฉ๋๊น?
๋ฐ๋ผ์ JSX๋ ์คํ ์ค ์ปดํ์ผ๋ฌ๋ฅผ ํตํด ์๋์ฐ ๋์ผ๋ก ์ง์ ๊ตฌ๋ฌธ ๋ถ์๋ฉ๋๋ค. ๋ฐ๋ผ์ ์คํ ๋ฆฌ๋ถ์ ์ปดํ์ผ๋ฌ ํตํฉ์ ์ฌ์ฉํ๋ ํ ํ์ค ์คํ ์ค ๊ตฌ์ฑ ์์๋ฅผ ์์ฑํ ๋ค์ CSF ์คํ ๋ฆฌ์ ํฌํจ์ํจ ๋ค์ ๋ฐ์ดํฐ ํฉํ ๋ฆฌ๋ก ๊ฐ์ ธ์์ ์ํ์ ์ฑ์๋๋ค.
๋ด๊ฐ ๊ฒ์ํ ๋ฐ๋๋ผ ๋ฆฌํฌ์งํ ๋ฆฌ๋ VHTML ํ๋ฌ๊ทธ์ธ์ด ํ์ํ์ง ์๊ณ ์คํ ์ค๋ก ์ง์ ์์ฑํ๊ณ ์ถ๋ ฅํ ์ ์๋ ๋ํผ๋ ํ์ํ์ง ์์ต๋๋ค.
๋น์ ์ storyOf ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์ ์์ง๋ง ๋น์ ์ ๊ณ ์ ์ ์ธ document.createElement ํจํด์ ์ ๊ฒจ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ์ฐ๋ฆฌ ์์ด์ฝ์ ๋ํ ์ด ์ค๋๋ ์ด์ผ๊ธฐ์ ๊ตฌ๋ฌธ
import { storiesOf } from '@storybook/html';
/**
* Import readme from component into the story
*/
import markdown from './readme.md';
storiesOf('1-Atoms/icon', module)
.addParameters({ viewport: { defaultViewport: 'responsive' } })
.add('knobs', () => {
/**
* Add Knobs to component panel
* Set within Each knob as the third parameter
*/
let icon = document.createElement('namespace-icon');
icon.classList.add('namespace-action-plan');
icon.size = 'medium';
return icon;
}, { notes: { markdown } });
VS
import centered from '@storybook/addon-centered/html';
import markdown from './readme.md';
export default {
title: 'Atoms|Icon',
decorators: [centered],
parameters: {
notes: { markdown },
viewport: { defaultViewport: 'responsive' }
}
};
export const knobs = (): HTMLNamespaceIconElement => {
const icon: HTMLYooIconElement = document.createElement('namespace-icon');
icon.classList.add('namespace-action-plan');
icon.size = 'medium';
return icon;
};
์ปค์คํฐ๋ง์ด์ง์ด ๋ง์ง ์์ต๋๋ค. ์นํฉ์ ๋ช ๊ฐ์ง๊ฐ ์ถ๊ฐ๋์์ต๋๋ค. ์ฒซ ๋ฒ์งธ typescript๋
Cannot find name 'h'
์ ๋ํด ๋ถํํฉ๋๋ค. ๋ด tsconfig์๋ jsx = react ๋ฐ jsxFactory = h๊ฐ ์์ต๋๋ค. ๋งจ ์์ ์๋// <strong i="8">@jsx</strong> h
pragma ์ค์ ์ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ๊ฒฝ๊ณ ๊ฐ ์ฌ๋ผ์ง๋๋ก ํ ์ ์์ง๋ง DOM ๋ ธ๋ ๋๋ ๋ฌธ์์ด์ ๋ฐํํ์ง ์๊ธฐ ๋๋ฌธ์ ์คํ ๋ฆฌ๋ถ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์๋ํด ๋ณผ ๊ฒ: https://github.com/developit/vhtml ๋ค์
ํธ์ง : jsx์ ์ ์๋ํฉ๋๋ค. ๊ทธ๋๋ typescript์ ํจ๊ป ์๋ํ๋๋ก ํ๋ ๋ฐฉ๋ฒ์ ์ ์ ์์ต๋๋ค :/์๋ ํ์ธ์ @vidarc์ ๋๋ค.
storiesOf()
๊ตฌ๋ฌธ์ผ๋ก ์ด ์์ ์ ์ํํ ์ ์์์ต๋๊น? ๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ํ์ จ๋์ง ์ ๋ง ๊ถ๊ธํฉ๋๋ค. ๊ณต์ ํ ์ฝ๋ ์์ ๋๋ ์ฝ๋ ๊ธฐ๋ฐ์ด ์์ต๋๊น?์คํ ๋ฆฌ๋ถ๊ณผ ์คํ ์ค์ด ํตํฉ๋์ด ํ๋ก์ ํธ์์ ์ ์๋ํ์ง๋ง ๊ฐ์ฅ ํฐ ๋ฌธ์ ๋ ๊ฐ์ฒด ์ํ ๋ฑ์ ํฌํจํ๋ ๊ตฌ์ฑ ์์์ ๋ํด
document.createElement()
๋ก ์คํ ๋ฆฌ๋ฅผ ๋ง๋๋ ๋ฐ ์์กดํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค.vhtml
๊ฐ ํด๊ฒฐํ ์ ์๋ค๋ฉด ์ด๊ฒ, ๊ทธ๊ฒ์ ๊ต์ฅํ ๊ฒ์ ๋๋ค!
@roboxelsen
@storybook/react๋ฅผ ์ฌ์ฉํ๊ณ webpack ๊ตฌ์ฑ์ ์์ ํ์ฌ MDX ํ์ผ๊ณผ ํจ๊ป MD ํ์ผ์ ๋ณํํ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ json ๋ฌธ์ ์ถ๋ ฅ ์คํ
์ค์ ๊ธฐ๋ฐ์ผ๋ก ๋
ธ๋ธ๋ฅผ ์์ฑํ๋ ์ฝ๊ฐ์ ์ฝ๋๊ฐ ์ ๊ณตํฉ๋๋ค. ์คํ
์ค ์ฝ๋์ ๊ฒฝ์ฐ CLI์์ ์คํ ๋ฆฌ๋ถ ์ฌ๋ณธ์ ์ฌ์ฉํ๊ณ ํด๋น ํ์ผ์ preview-head.html ํ์ผ์ ์ฐ๊ฒฐํฉ๋๋ค. ์ ๋ชฉ์ ์ ์์ฃผ ์ ๋ง์ต๋๋ค.
@Edd-Srickland ์์ ์ ์ค๋ช ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋ง์ง๋ง ์์ ์์๋ ์ฌ์ ํ ์์์ ์ํ์ผ๋ก ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์์ฑ์ ์ ๋ฌํด์ผ ํฉ๋๋ค. ๋ด ํฌ๋ง์ vhtml์ด๋ ์ผ๋ฐ ์คํ ์ค ์ปดํ์ผ๋ฌ๋ก ๋ด ์ด์ผ๊ธฐ๋ฅผ JSX๋ก ์์ฑํ ์ ์๋ค๋ ๊ฒ์ด์์ต๋๋ค.
๋ฐ๋ผ์ ๋ค์ ๋์ :
export const knobs = (): HTMLNamespaceIconElement => {
const icon: HTMLYooIconElement = document.createElement('namespace-icon');
icon.classList.add('namespace-action-plan');
icon.size = 'medium';
return icon;
};
...๋๋ ๋ค์๊ณผ ๊ฐ์ด ์ธ ๊ฒ์ด๋ค.
export const knobs = (): HTMLNamespaceIconElement => {
return (
<namespace-icon class="namespace-action-plan" size="medium">
</namespace-icon>
);
};
๊ฐ๋ ์ฑ๊ณผ ์คํ ๋ฆฌ ์์ฑ์ ์ฉ์ด์ฑ์ ์ํด. ๊ทธ๋ฌ๋ฉด ๋ถ๊ฐ๋ฅํ ๊ฑด๊ฐ์? ๊ฐ๋ฅํ๋ค๋ฉด ๊ฐ๋จํ ์๋ฅผ ๋ค์ด ์ฃผ์๊ฒ ์ต๋๊น?
๊ทธ๊ฒ์ด ๋ ์ฌ์ฐ๋ฉด ์ฐ๋ฆฌ๋ ๋ํ ๋ถํ ์ฑํ
์์ ์ด์ผ๊ธฐํ ์ ์์ต๋๋ค. ์ ๋ Rob Axelsen#1373
์
๋๋ค.
ํธ์ง: ์์ ์ถ๊ฐํ๊ธฐ ์ํด CSF ์ค๋ช
์๋ ์ดํด๋ณด๊ณ h
๊ฐ์ ธ์ค๊ธฐ JSX ๊ตฌ๋ฌธ์ผ๋ก ์๋ํ์ง๋ง "์คํ ๋ฆฌ์์ HTML ์ค๋ํซ ๋๋ DOM ๋
ธ๋ ๊ธฐ๋: "๋จ์ํ ์ด์ผ๊ธฐ" ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. "๊ตฌ์ฑ ์์"์.":
export const simpleStory = () => <namespace-icon class="namespace-action-plan" size="medium"></name-spaceicon>;
์ด๊ฒ์ด ์น ๊ตฌ์ฑ ์์์ ๋ํ ์์ฑ์ ์ค์ ํด์ผ ํ๋ ์คํ ๋ฆฌ ์์ฑ์ ๊ดํ ๊ฒ์ด๋ผ๋ฉด @storybook/web-components
์ดํด๋ณผ ์ ์์ต๋๋ค. lit-html ์ ์ฌ์ฉํ์ฌ ์์ฑ์ด ์๋
์ด๊ฒ์ ์คํ ๋ฆฌ๋ถ๊ณผ ์คํ ์ค์ ๋๋ํ ์คํํ ๋ ์๋ํด์ผ ํฉ๋๋ค. :)
์คํ ์ค์ด lit html์ ์ฌ์ฉํ์ง ์๋๋ค๋ ์ ์ ์ ์ธํ๊ณ . ๊ทธ๊ฒ Vue์ ๋ฌธ์ ์ผ...
@shilman ์ด๋ฏธ ๋ง์คํฐ ์ํ์ @storybook/web-components ํจํค์ง๊ฐ ์๋ ๊ฒ ๊ฐ์ง๋ง README.md์์ ์ฐธ์กฐ๋ ์คํ ์ค์ด ๋ณด์ด์ง ์์ต๋๋ค: https://github.com/storybookjs/storybook/tree/next/ ์ฑ/์น ๊ตฌ์ฑ ์์
์ฌ๊ธฐ์ ๋งํฌ๋ ์ ์ฅ์์ ๋ณต์ ์์ ๋ฑ์ด ์๋ ์น ๊ตฌ์ฑ ์์ ํจํค์ง๋ฅผ ์ด๋ป๊ฒ ๋ค์ด๋ก๋ํ๊ณ ํ ์คํธํฉ๋๊น?
@Edd-Stricland๋ ๋ฉ์ธ ์คํ ๋ฆฌ๋ถ ๋ชจ๋ ธ๋ ํฌ์ ๋๋ ํ ๋ฆฌ์ผ ๋ฟ์ ๋๋ค.
์คํ ์ค์ด lit html์ ์ฌ์ฉํ์ง ์๋๋ค๋ ์ ์ ์ ์ธํ๊ณ . ๊ทธ๊ฒ Vue์ ๋ฌธ์ ์ผ...
lit thing
๐ค
๊ทธ๋ฌ๋ ์ด๊ฒ์ด ์น ๊ตฌ์ฑ ์์์ ์๋ฆ๋ค์์ ๋๋ค. ํ๋ ์๋์์ ์คํ ์ค์ด ์ฌ์ฉํ๋ ๊ฒ์ ์ค์ํ์ง ์์ต๋๋ค. lit-html์ ์ฌ์ฉํ๊ฑฐ๋ ์คํ ๋ฆฌ๋ฅผ ์ ์ํ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ง๋ ํ์ํ ๊ฒ์ ์์ฑ์ผ๋ก "html"์ ์์ฑํ๋ ๋ฐฉ๋ฒ๋ฟ์ ๋๋ค.
lit-html์ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
export myStory = () => {
const dataArray = [{ name: 'john', age: 21 }, { name: 'maria', age: 28 }];
return html`
<my-lit-component .title=${'some title'} power="unlimited">
<p> some light dom</p>
</my-lit-component>
<my-stencil-component super-mode .data=${dataArray}></my-stencil-component>
`;
}
๋ฐ๋ผ์ ์คํ ๋ฆฌ์์ Chrome์ DevTools๋ก ์ด๋ํ๋ฉด ์กฐ๋ช ๊ตฌ์ฑ ์์๋ฅผ ์ ํํ ์ ์๊ณ ๋ค์ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
์คํ ์ค ๊ตฌ์ฑ ์์์ ๊ฒฝ์ฐ "๋์ผ"ํฉ๋๋ค.
lit-html์ dom๋ง ๋ ๋๋งํฉ๋๋ค... dom ์์๊ฐ ๋ฑ๋ก๋ ์์น/๋ฐฉ๋ฒ lit-html์ ์์ง ๋ชปํ๋ฏ๋ก ๊ฐ ๊ตฌ์ฑ ์์์ ์ฌ์ฉ๋๋ ๊ธฐ์ ์ ์์ ํ ๋ค๋ฅผ ์ ์์ต๋๋ค... ์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์ฑ ์์๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ์กฐ๋ช ์์, ์คํ ์ค, ๋ฐ๋๋ผ HTMLElement ๋๋ ์ ์ฒด ๋ฐ์/๋ทฐ/๊ฐ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ํ ์น ๊ตฌ์ฑ ์์ ๋ํผ์ผ ์๋ ์์ต๋๋ค... ๐ฑ
์คํ ์ค์ ์ปดํ์ผ๋ฌ์ผ ์ ์์ง๋ง ์น ์ปดํฌ๋ํธ๋ก ์ปดํ์ผ๋๋ฉด ๊ทธ๋ฅ dom์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค ๐ค
์ถ์ : @storybook/web-components
๋ lit-html์ ์ฌ์ฉํฉ๋๋ค.
์คํ ์ค ํ์ ์คํ ์ค/์คํ ๋ฆฌ๋ถ ํตํฉ์ ๋ณ๊ฒฝํ ์ปดํ์ผ๋ฌ๋ฅผ ๋ฆฌํฉํ ๋งํ๊ณ ์์ต๋๋ค.
๋๊ตฌ๋ ์ง ๋ฐฐ์ด๊ณผ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ ์ ์๋ React ์ฒดํฌ์์ https://github.com/the-road-to-learn-react/use-custom-element ๋ฅผ ํตํด ์คํ ์ค ๋ฐ ์คํ ๋ฆฌ๋ถ์ ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ. ๋์ค์ ์ง์ ์๋ํด ๋ณด๊ฒ ์ต๋๋ค. ํ์ง๋ง ์ด๊ฒ์ ์ผ๋ถ ์ฌ๋๋ค์๊ฒ ๋์์ด ๋ ์ ์์ต๋๋ค.
๊ด์ฌ ์๋ ๋ถ๋ค์ ์ํด Storybook/react์ Stencil์ ๊ฒฐํฉํ๋ ์คํํฐ๋ฅผ ๊ฒ์ํ์ต๋๋ค: https://github.com/bbellmyers/stencil-storybook-starter. ์ด ๊ตฌ์ฑ์ ์ฌ์ฉํ๋ฉด ๊ตฌ์ฑ ์์๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด ๋ธ๋ผ์ฐ์ ์์ ํ๋ ์๋ก ๊ณ ์นจ์ด ํ์ํ์ง๋ง ์คํ ๋ฆฌ์ ๋ํ ๋ณ๊ฒฝ์ ๊ทธ๋ ์ง ์์ต๋๋ค.
์คํ ๋ฆฌ๋ถ์ด ์น ์ปดํฌ๋ํธ์ฉ ์คํ ๋ฆฌ๋ถ์ ๊ฐ๋ฐ ์ค์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ์คํ ์ค๋ก ๊ทธ๊ฒ์ ์๋ํ๊ณ ๊ฝค ์ ์๋ํฉ๋๋ค.
https://github.com/storybookjs/storybook/tree/next/app/web-components
@sem4phor ๊ตฌ์ฑ์ ๊ณต์ ํ ์ ์์ต๋๊น?
์น ๊ตฌ์ฑ ์์์ ๋ํ ์๋ก์ด ์คํ ๋ฆฌ๋ถ ์ค์น์์ lit-html์ ๋ํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
ERROR in ./node_modules/@storybook/web-components/dist/client/preview/render.js
Module not found: Error: Can't resolve 'lit-html' in '/Users/david/www/stencil-starter/node_modules/@storybook/web-components/dist/client/preview'
@ ./node_modules/@storybook/web-components/dist/client/preview/render.js 20:15-34
@ ./node_modules/@storybook/web-components/dist/client/preview/index.js
@ ./node_modules/@storybook/web-components/dist/client/index.js
@ ./.storybook/preview.js
@ multi ./node_modules/@storybook/core/dist/server/common/polyfills.js ./node_modules/@storybook/core/dist/server/preview/globals.js ./.storybook/preview.js ./.storybook/generated-entry.js (webpack)-hot-middleware/client.js?reload=true&quiet=true
@dmartinjs ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๊ธฐ๋ณธ ์์ ์์ ๊ตฌ์ฑ ์์๋ฅผ ๋ ๋๋งํ๋ ๋ฐ ์ฌ์ฉ๋๋ 'lit-html'์ ์ง์ ์ค์นํด์ผ ํฉ๋๋ค.
@Edd-Srickland ์น ๊ตฌ์ฑ ์์์ฉ ์คํ ๋ฆฌ๋ถ์ ์ถ๊ฐํ์ผ๋ฉฐ 6.0.0์์ ํด๋ฆฌ๋จธ์ฉ ์คํ ๋ฆฌ๋ถ์ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๊ฑฐ๋ ์ ๋ฐ์ดํธ๋์ง ์์ต๋๋ค.
์น ๊ตฌ์ฑ ์์์ ๋ํ ์คํ ๋ฆฌ๋ถ์ด ์คํ ์ค ๊ตฌ์ฑ ์์์ ๋ํด ์๋ํ๋๋ก ํ๊ธฐ ์ํด ์ํํด์ผ ํ ์์ ์ด ์์ต๋๊น?
์น ๊ตฌ์ฑ ์์ ์คํ ๋ฆฌ๋ถ์ ์คํ ์ค ์น ๊ตฌ์ฑ ์์ ๊ตฌ์ฑ ์์๋ฅผ ๋ ๋๋งํ ์ ์์ง๋ง ์คํ ์ค์ ๋ธ๋ผ์ฐ์ ์์ ๊ทธ๋๋ก ์คํํ ์ ์์ผ๋ฉฐ ์ปดํ์ผํด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ์คํ ๋ฆฌ๋ถ์ ์คํํ๊ธฐ ์ ์ ์คํ ์ค ๊ตฌ์ฑ ์์๋ฅผ ์ปดํ์ผํ์ง ์๋ ํ ์ฌ์ ํ ์ฝ๊ฐ์ ํน๋ณํ ์ฒ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค.
@LarsDenBakker ๋ ์์ ์์ ์ ์ํํ๊ธฐ ์ํด webpack ํ๋ฌ๊ทธ์ธ/๋ก๋๋ฅผ ์ถ๊ฐํ๋ ๋ฌธ์ ์ ๋๋ค. ( ์คํ ์ค ๊ตฌ์ฑ ์์๋ฅผ HMR๋ก ๋ง๋ค๊ณ ๋์ ์ผ๋ก ์ปดํ์ผํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค๊ณ ์๊ฐํฉ๋๋ค)
์, ์คํ ์ค ์์ฒด๊ฐ ๋กค์ ์ ์ฌ์ฉํ์ง๋ง. ์ปดํ์ผ ๋จ๊ณ๋ฅผ ๋ณ๋์ ํ๋ก์ ํธ๋ก ์ฌ์ฉํ ์ ์๋ค๋ฉด ์นํฉ ํ๋ฌ๊ทธ์ธ์ผ๋ก ๋ง๋ค ์๋ ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ๋ํ ๋ด๋ถ์ ๋ํด ์ถฉ๋ถํ ๋ชจ๋ฅธ๋ค.
์คํ ์ค์ Webpack์ ์ฌ์ฉํ์ง ์์ต๋๋ค. ๋์ ๋กค์ ์ ์ฌ์ฉํฉ๋๋ค.
๋ด๊ฐ ์ค์ ํ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ ํ๊ฒ ์๋ํ๊ณ -watch ํธ์ถ์ ์ฌ์ฉํ์ฌ ์คํ ์ค์์ ํด๋นํ๋ HMR์ ํ์ฑํํ ์ ์์ต๋๋ค. ์คํ ์ค์ด ์ ๋ฐ์ดํธ๋๋ฉด ์คํ ์ค์ด ๋ค์ ๋ก๋๋๊ณ ์ ๋ฐ์ดํธ๋๋ฉด Storybook์ด ๋ค์ ๋ก๋๋ฉ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์ปค๋ฒ๋๋ฏ๋ก ๋งค๋ฒ ๋น๋ํ ํ์๊ฐ ์์ต๋๋ค.
์ต๊ทผ์ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์ต์ SB ๋๋ ์คํ ์ค๋ก ์ ๋ฐ์ดํธํ ์๊ฐ์ด ์์์ง๋ง ์ด ํ๋ก์ธ์ค๋ ๊ณ์ ์๋ํ๋ฏ๋ก ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์ต์ ๋ฒ์ ์ผ๋ก ์ ๊ทธ๋ ์ด๋ํ ์ ์์ต๋๋ค.
๊ฐ์ฌ ํด์
@Edd-Srickland ์น ๊ตฌ์ฑ ์์์ฉ ์คํ ๋ฆฌ๋ถ์ ์ถ๊ฐํ์ผ๋ฉฐ 6.0.0์์ ํด๋ฆฌ๋จธ์ฉ ์คํ ๋ฆฌ๋ถ์ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๊ฑฐ๋ ์ ๋ฐ์ดํธ๋์ง ์์ต๋๋ค.
์น ๊ตฌ์ฑ ์์์ ๋ํ ์คํ ๋ฆฌ๋ถ์ด ์คํ ์ค ๊ตฌ์ฑ ์์์ ๋ํด ์๋ํ๋๋ก ํ๊ธฐ ์ํด ์ํํด์ผ ํ ์์ ์ด ์์ต๋๊น?
์, ์นํฉ ์ฌ์ฉ๊ณผ ๋กค์ ์ฌ์ฉ์ ์ฐจ์ด์ ์ ๋ํด ์์์ ์์ธํ ์ค๋ช ํ๋ฏ์ด ํ์ฌ SB WC ๋ฒ์ ์ ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ ๋ ๋๋ง์ ์ํด ์ ์ฒด ์คํ ์ค ๋น๋๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ ์ฌ์ ํ ๋ผ์ด๋ธ ๋ค์ ๋ก๋/HMR์ ๊ณ ๋ คํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด HMR์ ๋ชจ๋ ์ฅ์ ์ด ์คํ ์ค๋ก ์์ค๋ฉ๋๋ค.
์ด ๋ฒ์ ์ ํ์ฌ ํด๋ฆฌ๋จธ ๋ฒ์ ์ด ์๋ HTML ๋ฒ์ ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฏ๋ก ํด๋น ๋ฒ์ ์ ํ๊ธฐํ๋ ค๋ ์ฅ๊ธฐ์ ์ธ ๋ชฉํ์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค.
@LarsDenBakker ๋ ์์ ์์ ์ ์ํํ๊ธฐ ์ํด webpack ํ๋ฌ๊ทธ์ธ/๋ก๋๋ฅผ ์ถ๊ฐํ๋ ๋ฌธ์ ์ ๋๋ค. ( ์คํ ์ค ๊ตฌ์ฑ ์์๋ฅผ HMR๋ก ๋ง๋ค๊ณ ๋์ ์ผ๋ก ์ปดํ์ผํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค๊ณ ์๊ฐํฉ๋๋ค)
๋๋ ๊ทธ๊ฒ์ ์กฐ์ธํ์ง ์์ ๊ฒ์ ๋๋ค. ์คํ ์ค์ ์นํฉ ๋ฒ์ ์ ํจ์ฌ ๋ ์ด๋ ค์ด ๊ฐ๋ฐ ๊ฒฝ๋ก์ด๋ฉฐ ํ์ ์์ด ์ข ์์ฑ ํํ๋ฆฐํธ๋ฅผ ์ฆ๊ฐ์ํต๋๋ค. ๋ด๊ฐ ์์ฑํ ๋ฆฌํฌ์งํ ๋ฆฌ์์ ๋ณผ ์ ์๋ฏ์ด ์คํ ์ค์ ์๊ณ์์ ์คํํ๋ ๊ฒ์ด ์๋ฒฝํ๊ฒ ๊ฐ๋ฅํฉ๋๋ค. WC ๋๋ SB ์ธ์คํด์ค์ ๋ณ๊ฒฝ. ๋ ๋ค ํ์ฉํ๋๋ก ๊ตฌ์ฑํ๋ ๊ฒ์ ๋๋ค.
์, ์คํ ์ค ์์ฒด๊ฐ ๋กค์ ์ ์ฌ์ฉํ์ง๋ง. ์ปดํ์ผ ๋จ๊ณ๋ฅผ ๋ณ๋์ ํ๋ก์ ํธ๋ก ์ฌ์ฉํ ์ ์๋ค๋ฉด ์นํฉ ํ๋ฌ๊ทธ์ธ์ผ๋ก ๋ง๋ค ์๋ ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ๋ํ ๋ด๋ถ์ ๋ํด ์ถฉ๋ถํ ๋ชจ๋ฅธ๋ค.
์ด๋ฏธ ์คํ ์ค WP ํ๋ฌ๊ทธ์ธ์ด ์์ง๋ง ์ด๊ฒ์ ์ง์๋๊ฑฐ๋ ์ปค๋ฎค๋ํฐ์์ ์น์ธํ ์ข ์์ฑ์ด ์๋๋๋ค.
cc @jthoms1 @adamdbradley
@dmartinjs ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๊ธฐ๋ณธ ์์ ์์ ๊ตฌ์ฑ ์์๋ฅผ ๋ ๋๋งํ๋ ๋ฐ ์ฌ์ฉ๋๋ 'lit-html'์ ์ง์ ์ค์นํด์ผ ํฉ๋๋ค.
@sem4phor ๊ตฌ์ฑ์ ๊ณต์ ํ ์ ์์ต๋๊น?
์น ๊ตฌ์ฑ ์์์ ๋ํ ์๋ก์ด ์คํ ๋ฆฌ๋ถ ์ค์น์์ lit-html์ ๋ํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
ERROR in ./node_modules/@storybook/web-components/dist/client/preview/render.js Module not found: Error: Can't resolve 'lit-html' in '/Users/david/www/stencil-starter/node_modules/@storybook/web-components/dist/client/preview' @ ./node_modules/@storybook/web-components/dist/client/preview/render.js 20:15-34 @ ./node_modules/@storybook/web-components/dist/client/preview/index.js @ ./node_modules/@storybook/web-components/dist/client/index.js @ ./.storybook/preview.js @ multi ./node_modules/@storybook/core/dist/server/common/polyfills.js ./node_modules/@storybook/core/dist/server/preview/globals.js ./.storybook/preview.js ./.storybook/generated-entry.js (webpack)-hot-middleware/client.js?reload=true&quiet=true
์ด์ ๋ํ ํผ๋๋ฐฑ์ด ์์ต๋๊น? ์ด ์ข ์์ฑ์ ์ง์ ์ค์นํด์ผ ํฉ๋๋ค. @storybook/web-components์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ข ์์ฑ์ผ๋ก ์๋ ์ค์น๋์ด์ผ ํฉ๋๋ค...?
@LeeBurton ์ด ํผ์ด ์ข ์์ฑ์ด๋ผ๋ฉด ๊ทธ๋ ์ง ์์ต๋๊น? (์ธ์ง ์๋์ง ํ์คํ์ง ์์ ๊ฒฝ์ฐ ์๋ง๋ ๊ทธ๋์ผ ํ ๊ฒ์ ๋๋ค) cc @daKmoR
@LeeBurton ์ ํ ์คํธํ ๋น์ lit-html์ ํผ์ด ์ข ์์ฑ์ด์์ต๋๋ค. ํผ์ด ์ข ์์ฑ์ ์ง์ ์ค์นํด์ผ ํ๋ ๊ฒ์ ์ ์์ ๋๋ค. https://nodejs.org/es/blog/npm/peer-dependencies/
๊ทธ๋งํ ๊ฐ์น๊ฐ ์๊ธฐ ๋๋ฌธ์ .storybook/preview.js
์์ ์ด ๊ตฌ์ฑ์ผ๋ก ์์
ํ๋ ์คํ
์ค์ ์ป์์ต๋๋ค.
import { defineCustomElements } from "../dist/esm/loader.mjs"
defineCustomElements()
configure(require.context('../src', true, /.*\.stories\.(js|mdx)$/), module);
@idmyn ๋๋ ๊ทธ๊ฒ์ ์๋ํ๊ณ ์ปดํ์ผํ๋ ๋์ src ํ์ผ์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ ์๋ ํ๋ ๋ค์ ๋ก๋ ์์ด๋ ์ฌ์ ํ ๋ธ๋ผ์ฐ์ ์ ๋ก๋๋์ง ์์ต๋๋ค.
npm-run-all
ํจํค์ง์ ๋ณ๋ ฌ๋ก start-storybook
๋ฅผ ์คํํ๋ฉด์ ํ๋์ npm ์คํ ์คํฌ๋ฆฝํธ์์ ์๊ณ๋ฅผ ํ์ฑํํ ์ํ์์ ์คํ
์ค์ ๋น๋๋ฅผ ๋ก์ปฌ๋ก ์คํํ์ฌ ์๋ํ๋๋ก ํ์ต๋๋ค.
๋ด main.js์์ ๋ค์์ ์ฌ์ฉํ์ฌ Stencil์ dist ํ์ผ์ ๋ณด๋๋ก ์คํ ๋ฆฌ๋ถ์ webpack ๊ตฌ์ฑ์ ๊ตฌ์ฑํ์ต๋๋ค.
const path = require('path');
const glob = require('glob');
module.exports = {
webpackFinal: (config) => {
// watch all revelant files in dist folder
const distDir = path.resolve(__dirname, '../dist');
const files = glob.sync(`${distDir}/**/*.entry.js`, { absolute: true, ignore: ['**/*.system.entry.js'] });
config.entry.push(...files);
return config;
},
};
ํ๋ก์ ํธ์ ๊ฒฝ๋ก/ํ์ผ์ ์ฝ๊ฐ ๋ณ๊ฒฝํด์ผ ํ ์๋ ์์ง๋ง ์ด๊ฒ์ ์ ์๊ฒ ํจ๊ณผ์ ์ด์์ต๋๋ค.
@DesignByOnyx ๋๋ @Edd-
@Edd-Stricland์ ์ฌ๋ณธ์ 6.0.0-๋ฒ ํ๋ก ํฉ๋ฆฌ์ ์ผ๋ก ์ฑ๊ณต์ ์ผ๋ก ์ฎ๊ฒผ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ณ๊ฒฝ ์ฌํญ(์: readme.md)์ ๋ฐ๊ฒฌํ ๋ ํญ์ ๋ชจ๋ ๊ฒ์ ๋ค์ ์์ฑํ์ง๋ ์๋๋ค๋ ๊ฒ์ ์์์ต๋๋ค.
๊ณต๊ฐ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ @paulpelton์ ๋๊น?
์ง๊ธ์ ๋๋ค, ์ค์ค๋ก๋ฅผ ๋์์ฃผ์ธ์ :-)
๋๋ Edd์ ํ๋ก์ ํธ๋ฅผ ํฌํฌํ์ต๋๋ค . @Edd-Srickland, PR์ ํ๋ฉด ๋ ๊น์? ์ข์ ๊ฒํ ๊ฐ ํ์ํฉ๋๋ค. ๋๋ ์ด๊ฒ์ ์ ๋ฌธ๊ฐ๊ฐ ์๋๋๋ค.
ํจํค์ง๋ฅผ ์ถฉ๋ํ๊ณ ๊ตฌ์ฑ์ ์ ํ์์ผ๋ก ๋ฆฌํฉํ ๋งํ์ต๋๋ค. ํ์ดํ์ ์ถ๊ฐํ๊ณ tsconfig์์ ์ฐธ์กฐํ์ฌ ์คํ ์ค ์ถ๊ฐ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ์คํ ๋ฆฌ๋ฅผ ์ป๊ณ '๋ฉ๋ชจ'๋ฅผ '๋ฌธ์'๋ก ๋ฒ์ญํ๋ ๊ตฌ์ฑ์ ์ถ๊ฐํด์ผ ํ์ต๋๋ค.
์์๋ฆฌ์คํธ:
@paulpelton ๋ด๊ฒ ํ์ํ ๊ฒ์ด ์์ต๋๊น?
@ndelangen ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋น์ ์ด ๋ชจ์์ ์๋ ์์ง๋ง, ์ ๋ Stencil๊ณผ Storybook ๋ชจ๋์ ๋งค์ฐ ์ต์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ค์ํ ๋ฌธ์ ํ ๋ก , Google ๋ฑ์์ ๋์ด์ฌ ์ ์๋ ๊ฒ์ ํจ๊ป ๋ญ์ณค์ต๋๋ค.
๋๋ ์คํํฐ ๋ฆฌํฌ์งํ ๋ฆฌ์๋ ๊ฐ ๋ณด์๊ณ ํฐ ์๊ฐ์ ๋ฐ์์ง๋ง ์ด ๋ฌธ์ ์ ๋ํ ๋ชจ๋ ๋ ธ๋ ฅ์ ๊ธฐ์ธ์์ต๋๋ค(๋ชจ๋ ๊ฐ์ฌํฉ๋๋ค!).
https://github.com/elwynelwyn/stencilbook-ding
@storybook/web-components
๋ฅผ ์ฌ์ฉํ์ฌ ํ์ ์ ๋์จ(์: ์ปจํธ๋กค, ์์
)๊ณผ ํจ๊ป ์์
ํฉ๋๋ค. ์ด ๋จ๊ณ์์ ๋ชจ๋ ๊ฒ์ ์ต์ ๋ฒ์ ..
์คํ
์ค ๊ฐ๋ฐ ์๋ฒ์ ์คํ ๋ฆฌ๋ถ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ๋ ์ ๊ฐ์ ์ถ๊ฐ ํตํฉ(๋ฐ๋ผ์ ์คํ
์ค ์ค๋ฅ ์ค๋ฒ๋ ์ด๊ฐ ์คํ ๋ฆฌ๋ถ์ ์ธ๋ผ์ธ์ผ๋ก ํ์๋ฉ๋๋ค - ๋ ๋์ DX!)(๋์ ๋ํด์๋ ./storybook/preview-body.html
๋ฐ ./src/index.html
).
~Stencil devserver๋ฅผ start-storybook
๋ก ๋งค์ํ์ฌ ๋จ์ผ ๋ช
๋ น์ ์คํํ๋ฉด ์คํ
์ค์ด ๋ค์์ ํ์ ํฉ๋๋ค.~
ํธ์ง: concurrently
+ wait-on
๋จ์ํ - ์คํ
์ค์ด ํ์ ํ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ ๋ค์ ์คํ ๋ฆฌ๋ถ์ผ๋ก ์งํ
์คํ ์ค ๊ตฌ์ฑ ์์ ๋๋ ์คํ ๋ฆฌ๋ถ ์คํ ๋ฆฌ์ ๋ํ ์ฝ๋ ๋ณ๊ฒฝ์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ๋ ์(์ ์ฒด ์คํ ๋ฆฌ๋ถ ์ฑ์ด ์๋)์ ๋ค์ ๋ก๋ํฉ๋๋ค. ์ ์ ํ HMR์ ์๋์ง๋ง ๊ฐ๋ฐํ๊ธฐ์ ์๋นํ ์ข์ต๋๋ค!
๋ฉ์ง. ๋งํฌ๊ฐ ์๋ํ์ง ์์ต๋๋ค.
์, repo๊ฐ โโ๊ณต๊ฐ๋์์ต๋๋ค ^^
์ฌ๊ธฐ์์ stencil v2 ๋ฐ @storybook/web-components v6์ ์ฌ์ฉํ์ฌ ์์ฉ๊ตฌ ์ ์ฅ์๋ฅผ ๋ง๋ค์์ต๋๋ค. https://github.com/bjankord/stencil-storybook-boilerplate
https://github.com/miriamgonp/stencil-web-components-boilerplate์ repo๋ Storybook/Stencil discord ์ฑ๋์์
์ด ๋ repos๋ ๋ฉ์ง๊ฒ ๋ณด์ ๋๋ค. ๊ทธ๊ฒ๋ค์ด ํ๋๋ก ํตํฉ๋๋ค๋ฉด ์ข์ ์ถ๊ฐ ์ฌํญ์ด ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๊ตฐ๊ฐ๊ฐ ์ด ๋ ์ ์ฅ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ
๋๋ ์ ์ ํ hmr ์๋ฃจ์ ์ ์ป์์ต๋๋ค ;) ๊ณง ์ค๊ณ ์์ต๋๋ค!
๋๋ ์ ์ ํ hmr ์๋ฃจ์ ์ ์ป์์ต๋๋ค ;) ๊ณง ์ค๊ณ ์์ต๋๋ค!
์ฌ๊ธฐ์์ด!
Stencil 2+ & Storybook 6+ (์ด์ ์คํ
์ค ๋ฒ์ ๋ ์๋ํด์ผ ํฉ๋๋ค ;))
https://github.com/dutscher/stencil-storybook
์ฌ๋ฏธ์ ๊ฑด๋ฐฐ
ํธ์ง: gh-pages์ ์คํ ๋ฆฌ๋ถ ํฌํจ https://dutscher.github.io/stencil-storybook/index.html
์ด๊ฒ์ ์ง๋ ์ฃผ์ ์ฐ๋ฆฌ ํ๋ก์ ํธ๋ก ๋ฐ๊ฟจ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ์ ๊ด๋ จ์ด ์๋ ๋นํธ(Bootstrap, scss, ๋ฐ์๊ณ ๋ฑ)๋ฅผ ์ ๊ฑฐํ๊ณ ๋ช ๊ฐ์ง ์ฌ์ํ ์ฌํญ(์: package.json ์ด๋ฆ์ด @์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ ธ์จ ๋ชจ๋ ๊ณณ์์ ์๋ํ์ง ์์)์ ์์ ํ ํ myorg/my-proj ํ์) ์ ๋ง ์ ์๋ํ๊ณ ์์ต๋๋ค.
์ด์ ํ๋ฃจ ์ ๋ ์ฌ์ฉํ๋๋ฐ HMR์ด ์ฐ์ํฉ๋๋ค!
@elwynelwyn ์คํ ๋ฆฌ๋ถ ์ชฝ์์ ์ฐ๋ฆฌ๊ฐ ํด์ผ ํ ์ผ์ ๋ฌด์์ด๋ผ๊ณ ์๊ฐํ์ธ์?
@ndelangen ์ค์ํ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ฑด๋ฐฐ
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋๋ ์ง๋ 2์ฃผ ๋์ StencilJS์ Storybook์ ๊ฐ์ง๊ณ ๋์๊ณ ๋ด ์๋ฃจ์ ์ ๋ค๋ฃจ๋ ๋ผ์ด๋ธ ์คํธ๋ฆฌ๋ฐ์ ํ์ต๋๋ค. ํจ์ฌ ๋ ์ข์ ๋ฐฉ๋ฒ์ด ์๋ค๊ณ ์๊ฐํ์ง๋ง HMR์ ์ป์ ์ ์์๊ณ ๋๋ถ๋ถ์ ํ๋ฌ๊ทธ์ธ์ด ๊ฑฐ์ ๋ฌธ์ ์์ด ์๋ํ์ต๋๋ค. ๋ฐฐํฌ ์คํ ์ค ๋ฒ๋ค์์ ๋ก๋๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ํผ๋๋ฐฑ์ ํ์ํฉ๋๋ค.
https://www.youtube.com/watch?v=XwHtPw3izLE
๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ ๋ ํฌ๊ฐ ์์ต๋๋ค! ^_^
https://github.com/MadnessLabs/enjin-components