Storybook: ์• ๋“œ์˜จ ํŒจ๋„์ด ํ‘œ์‹œ๋˜์ง€ ์•Š์ง€๋งŒ ๋…ธ๋ธŒ๋Š” ๊ณ„์† ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค (?)

์— ๋งŒ๋“  2019๋…„ 10์›” 11์ผ  ยท  18์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: storybookjs/storybook

๋ฒ„๊ทธ ์„ค๋ช…
StencilJs ํ”„๋กœ์ ํŠธ์— ๋…ธ๋ธŒ ์• ๋“œ์˜จ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ธฐ์ˆ ์ ์œผ๋กœ ์ž‘๋™ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (์Šคํ† ๋ฆฌ ๋‚ด์—์„œ ๊ตฌ์„ฑ ์š”์†Œ prob๋ฅผ ์„ค์ •ํ•˜๋ฉด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ : ์Šคํ† ๋ฆฌ ํŒŒ์ผ์„ ํ™•์ธํ•œ ๋‹ค์Œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๊ทธ๊ฒƒ์€-๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค). ํ•˜์ง€๋งŒ ์• ๋“œ์˜จ ํŒจ๋„์ด ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์„ค์ •์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (addons.js, package.json ๋“ฑ).

์‹คํ–‰์ค‘์ธ ์Šคํ† ๋ฆฌ ๋ถ์—์„œ ์• ๋“œ์˜จ ํ‘œ์‹œ ์˜ต์…˜์„ ์„ ํƒํ–ˆ์ง€๋งŒ ์•„๋ฌด๊ฒƒ๋„ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ npm run storybook

์žฌํ˜„ํ•˜๋ ค๋ฉด
๋™์ž‘์„ ์žฌํ˜„ํ•˜๋Š” ๋‹จ๊ณ„ :

  1. ์Šคํ† ๋ฆฌ ๋ถ ์‹œ์ž‘
  2. ์ธก๋ฉด์ด๋‚˜ ํ•˜๋‹จ์— ์• ๋“œ์˜จ ํŒจ๋„์ด ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ์ƒ๋˜๋Š” ํ–‰๋™
์‚ฌ์šฉํ•  ์• ๋“œ์˜จ์ด ์„ค์น˜๋˜์–ด ์žˆ์œผ๋ฉด ์• ๋“œ์˜จ ํŒจ๋„์ด ํ‘œ์‹œ ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

์Šคํฌ๋ฆฐ ์ƒท
storybook

์ฝ”๋“œ ์กฐ๊ฐ
์•„๋ž˜๋Š” ๋‚ด .storybook / addons.js์ž…๋‹ˆ๋‹ค.

import '@storybook/addon-a11y/register';
import '@storybook/addon-actions/register';
import '@storybook/addon-knobs/register';

์•„๋ž˜๋Š” ๋‚ด package.json์ž…๋‹ˆ๋‹ค.

"scripts": {
    "build": "stencil build",
    "start": "stencil build --dev --watch --serve",
    "stencil.dev": "stencil build --dev --watch --docs",
    "storybook.dev": "./node_modules/.bin/start-storybook -p 8008 -c .storybook -s ./dist",
    "storybook": "npm run build && ./node_modules/.bin/concurrently  \"npm run stencil.dev\" \"npm run storybook.dev\"",
    "test": "stencil test --spec --e2e",
    "test.watch": "stencil test --spec --e2e --watch",
    "generate": "stencil generate"
  },
  "dependencies": {
    "@ionic/core": "^4.9.1"
  },
  "devDependencies": {
    "@stencil/core": "^1.7.0",
    "@stencil/less": "^1.0.0",
    "@stencil/utils": "0.0.5",
    "@stencil/webpack": "0.0.6",
    "@storybook/addon-a11y": "5.2.3",
    "@storybook/addon-actions": "5.2.3",
    "@storybook/addon-knobs": "5.2.3",
    "@storybook/addon-storysource": "5.2.3",
    "@storybook/addon-viewport": "5.2.3",
    "@storybook/addons": "5.2.3",
    "@storybook/cli": "5.2.3",
    "@storybook/html": "5.2.3",
    "@storybook/polymer": "5.2.3",
    "babel-core": "6.26.3",
    "babel-loader": "7.1.5",
    "babel-preset-env": "1.7.0",
    "lit-html": "1.1.1",
    "polymer-webpack-loader": "2.0.3",
    "ts-loader": "^5.4.5",
    "concurrently": "^4.1.0"
  }

์•„๋ž˜๋Š” ๋‚ด .storybook / config.js์ž…๋‹ˆ๋‹ค.

import { addDecorator, addParameters, configure } from '@storybook/polymer';
import { withA11y } from '@storybook/addon-a11y';
import { withKnobs } from '@storybook/addon-knobs';
import 'sumai-frontend';

addParameters({
  options: {
    /**
     * name to display in the top left corner
     * <strong i="6">@type</strong> {String}
     */
    name: 'Sumai Components',
    /**
     * URL for name in top left corner to link to
     * <strong i="7">@type</strong> {String}
     */
    url: '#',
    /**
     * show story component as full screen
     * <strong i="8">@type</strong> {Boolean}
     */
    isFullscreen: false,
    /**
     * display panel that shows a list of stories
     * <strong i="9">@type</strong> {Boolean}
     */
    showNav: true,
    /**
     * display panel that shows addon configurations
     * <strong i="10">@type</strong> {Boolean}
     */
    showPanel: true,
    /**
     * display floating search box to search through stories
     * <strong i="11">@type</strong> {Boolean}
     */
    showSearchBox: false,
    /**
     * show addon panel as a vertical panel on the right
     * <strong i="12">@type</strong> {string}
     */
    addonPanelInRight: true,
    /**
     * sorts stories
     * <strong i="13">@type</strong> {Boolean}
     */
    sortStoriesByKind: false,
    /**
     * regex for finding the hierarchy separator
     * <strong i="14">@example</strong>:
     *   null - turn off hierarchy
     *   /\// - split by `/`
     *   /\./ - split by `.`
     *   /\/|\./ - split by `/` or `.`
     * <strong i="15">@type</strong> {Regex}
     */
    hierarchySeparator: null,
    /**
     * regex for finding the hierarchy root separator
     * <strong i="16">@example</strong>:
     *   null - turn off multiple hierarchy roots
     *   /\|/ - split by `|`
     * <strong i="17">@type</strong> {Regex}
     */
    hierarchyRootSeparator: null,
    /**
     * sidebar tree animations
     * <strong i="18">@type</strong> {Boolean}
     */
    sidebarAnimations: true,
    /**
     * id to select an addon panel
     * <strong i="19">@type</strong> {String}
     */
    selectedAddonPanel: undefined, // The order of addons in the "Addon panel" is the same as you import them in 'addons.js'. The first panel will be opened by default as you run Storybook
    /**
     * enable/disable shortcuts
     * <strong i="20">@type</strong> {Boolean}
     */
    enableShortcuts: true // true by default
  }
});

const req = require.context('../src/components', true, /story.tsx$/);
function loadStories() {
  req.keys().forEach(filename => req(filename));
}
configure(loadStories, module);
addDecorator(withA11y);
addDecorator(withKnobs);

// HMR interface
if (module.hot) {
  // Capture hot update
  module.hot.accept('sumai-frontend', () => {
    document.location.reload();
  });
}

์•„๋ž˜๋Š” ๋‚ด ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค.

import { storiesOf } from "@storybook/polymer";
import { text } from "@storybook/addon-knobs";

storiesOf("Basic Components", module)
  .add("Modal", () => {
    const el = document.createElement("sumai-full-width-image");
    el.name = text('Name', 'Namey');
    return el;
  });

์ฒด๊ณ„:

System:
    OS: Linux 5.0 Ubuntu 19.04 (Disco Dingo)
    CPU: (4) x64 Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz
  Binaries:
    Node: 10.15.3 - /usr/local/bin/node
    Yarn: 1.16.0 - /bin/yarn
    npm: 6.4.1 - /usr/local/bin/npm
  Browsers:
    Chrome: 75.0.3770.80
    Firefox: 69.0.2
  npmPackages:
    @storybook/addon-a11y: 5.2.3 => 5.2.3 
    @storybook/addon-actions: 5.2.3 => 5.2.3 
    @storybook/addon-knobs: 5.2.3 => 5.2.3 
    @storybook/addon-storysource: 5.2.3 => 5.2.3 
    @storybook/addon-viewport: 5.2.3 => 5.2.3 
    @storybook/addons: 5.2.3 => 5.2.3 
    @storybook/cli: 5.2.3 => 5.2.3 
    @storybook/html: 5.2.3 => 5.2.3 
    @storybook/polymer: 5.2.3 => 5.2.3

์ถ”๊ฐ€ ์ปจํ…์ŠคํŠธ

bug todo ui

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋•Œ๋•Œ๋กœ UI๋Š” ๋กœ์ปฌ ์ €์žฅ์†Œ์— ๋”ฐ๋ผ ์• ๋“œ์˜จ ํŒจ๋„์ด ์ˆจ๊ฒจ์ง€๋Š” ์žฌ๋ฏธ์žˆ๋Š” ์ƒํƒœ๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†”์—์„œ localStorage.clear() ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํŽ˜์ด์ง€๋ฅผ ํ•˜๋“œ ๋‹ค์‹œ๋กœ๋“œํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  18 ๋Œ“๊ธ€

๋•Œ๋•Œ๋กœ UI๋Š” ๋กœ์ปฌ ์ €์žฅ์†Œ์— ๋”ฐ๋ผ ์• ๋“œ์˜จ ํŒจ๋„์ด ์ˆจ๊ฒจ์ง€๋Š” ์žฌ๋ฏธ์žˆ๋Š” ์ƒํƒœ๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†”์—์„œ localStorage.clear() ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํŽ˜์ด์ง€๋ฅผ ํ•˜๋“œ ๋‹ค์‹œ๋กœ๋“œํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

๋„ค, ๊ทธ๋ ‡๊ฒŒํ–ˆ๊ณ  ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ค‘๋ณต ๋ฌธ์ œ๋กœ ์ธํ•ด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋„์™€ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋ฒ„๊ทธ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค! ์ž‘๋™ํ•˜๊ฒŒ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค!

๋•Œ๋•Œ๋กœ UI๋Š” ๋กœ์ปฌ ์ €์žฅ์†Œ์— ๋”ฐ๋ผ ์• ๋“œ์˜จ ํŒจ๋„์ด ์ˆจ๊ฒจ์ง€๋Š” ์žฌ๋ฏธ์žˆ๋Š” ์ƒํƒœ๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†”์—์„œ localStorage.clear() ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํŽ˜์ด์ง€๋ฅผ ํ•˜๋“œ ๋‹ค์‹œ๋กœ๋“œํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‚˜์˜ ํ•˜๋ฃจ๋ฅผ ๊ตฌํ–ˆ๋‹ค, tvm @shilman

๋‹ซ์•„์•ผํ• ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ์ž์ฃผ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค

์žฌ๊ฐœ. ์ด ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„ ๋‚ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜์ •์— ๋Œ€ํ•œ ํžŒํŠธ๋ฅผ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์˜๊ตฌ์  ์ธ ์ˆ˜์ •์„ ๊ธฐ๋Œ€

๋„์›€์ด๋œ๋‹ค๋ฉด ๋…ธ๋ธŒ ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€ ํ•œ ์งํ›„์ด ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ํŒจ๋„์„ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด๊ฐ€ ํ•œ ๊ฒƒ์€ ... ๋ฉ”๋‰ด๋กœ ์ด๋™ํ•˜์—ฌ (๋ณด์ด์ง€ ์•Š๋Š”) ํŒจ๋„์˜ ๋ฐฉํ–ฅ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ๋ฟ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋งˆ๋ฒ•์ฒ˜๋Ÿผ ์„ธ๋กœ ๋ฐฉํ–ฅ์œผ๋กœ ๋‚˜ํƒ€๋‚˜๊ณ  ๋‚˜์ค‘์— ๋‹ค์‹œ ํšŒ์ „ ํ•  ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋„์›€์ด ๋  ์ˆ˜๋„ ์žˆ๊ณ  ์•„๋‹ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค!

๋กœ์ปฌ ์ €์žฅ์†Œ ์ง€์šฐ๊ธฐ / ์‹œํฌ๋ฆฟ ์ฐฝ ์—ด๊ธฐ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๋ฉด์ด ๋ฌธ์ œ๋„ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. Elements ์ฝ˜์†”์—์„œ ํŒจ๋„์„ ์ฐพ์•„์„œ ํ‘œ์‹œ๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋…ธ๋ธŒ๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ : ์ „ํ™˜ ํ•œ ํ›„ ์ž‘๋™ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.
panelPosition: 'bottom'
...์—
addonPanelInRight: true

๊ตฌ์„ฑ์—์„œ. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค์‹œ panelPosition: 'bottom' ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ๊ณ„์† ์ž‘๋™ํ•˜์ง€๋งŒ ์‹œํฌ๋ฆฟ ์ฐฝ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์œ ์šฉํ•œ ์ •๋ณด์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Œ

๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ ๋ฐฉํ–ฅ์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ๋„์›€์ด๋˜์—ˆ์ง€๋งŒ ๋‹ค๋ฅธ ์ด์•ผ๊ธฐ๋ฅผ ์„ ํƒํ•  ๋•Œ๋งˆ๋‹ค ๊ณ„์† ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. 3 : 2 ๋น„์œจ ํ™”๋ฉด (Surface Book)๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š”๋ฐ ๊ทธ ๋•Œ๋ฌธ์— ๋ฐ์Šคํฌํ†ฑ์œผ๋กœ ์ทจ๊ธ‰๋˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ์Šคํฌํ†ฑ, ํฌ๋กฌ์—์„œ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ๋ฐฉํ–ฅ์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ๋„์›€์ด๋˜์—ˆ์ง€๋งŒ ๋‹ค๋ฅธ ์ด์•ผ๊ธฐ๋ฅผ ์„ ํƒํ•  ๋•Œ๋งˆ๋‹ค ๊ณ„์† ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๋ฅผ ๋ณด๊ฒŒ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ์˜ค๋Š˜์ด ์งœ์ฆ๋‚˜๋Š” ๋ฒ„๊ทธ๋ฅผ ๋งŒ๋‚ฌ๊ณ  localStorage.clear() ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์˜๊ตฌ์  ์ธ ์ˆ˜์ •์„ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ Storybook 6.0.10์—์„œ์ด ๋ฒ„๊ทธ๋ฅผ ๋งŒ๋‚ฌ์ง€๋งŒ ๊ตฌ์„ฑ์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์ˆ˜์ • ์‚ฌํ•ญ์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.
showPanel ๋ฐ panelPosition preview.js ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

// preview.js
addParameters({
  options: {
    showPanel: true,
    panelPosition: "bottom",
  },
});

์ด๊ฒƒ์„ manager.js ๋กœ ์˜ฎ๊ธฐ๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

// manager.js
addons.setConfig({
  showPanel: true,
  panelPosition: "bottom",
});

์•„๋งˆ๋„ ์ด๊ฒƒ์€ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๋ฅผ ์ฐพ๊ฑฐ๋‚˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์„ ์ฐพ๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

Storybook 6.x์—์„œ์ด ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์œผ๋ฉฐ localStorage.clear () ์†”๋ฃจ์…˜์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋น ๋ฅธ ์ˆ˜์ •์œผ๋กœ localStorage.clear ()์— +1 (^ 6.0.18)

๊ทธ๋ฆฌ๊ณ  @milenaNeumann ๐Ÿ™Œ ๐Ÿ™Œ

์ด ์ƒํƒœ์—์„œ๋Š” ๋‹ค์Œ์ด ํ•ด๊ฒฐ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค .

  • "a"๋ˆ„๋ฅด๊ธฐ (๋‹จ์ถ•ํ‚ค)
  • ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ € ์ธ์Šคํ„ด์Šค ์ƒˆ๋กœ ๊ณ ์นจ, ์ƒˆ๋กœ ๊ณ ์นจ, ์ข…๋ฃŒ ๋“ฑ

๋น ๋ฅด๊ณ  ๋”๋Ÿฌ์šด ์ˆ˜์ • :

  • Localstorage.clear ()
  • Firefox์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ๋ธŒ๋ผ์šฐ์ €๋กœ ์ด๋™

์žฅ๊ธฐ ์ˆ˜์ • (๋ชจ๋“  ๊ฒฝ์šฐ์—์„œ ํ•ด๊ฒฐ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ @milenaNeumann์˜ ์†Œํ’ˆ) :

npm i @storybook/addons

.storybook / manager.js :

import { addons } from "@storybook/addons";

addons.setConfig({
  showPanel: true,
  panelPosition: "bottom",
});

๊ฐ™์€. ๊ฐ€์ด๋“œ๋ฅผ ๋”ฐ๋ฅด๊ณ  ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์•„๋ฌด๊ฒƒ๋„ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์„œ ํƒญ์œผ๋กœ ์ด๋™ํ•˜์—ฌ ์—ฌ๊ธฐ์— ๋‚ด ์ธ์ˆ˜๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ : npm-check-updates๋กœ ๋ชจ๋“  ํŒจํ‚ค์ง€๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๊ด€๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ™•์‹คํžˆํ•˜๊ธฐ ์œ„ํ•ด์„œ : ์ด๊ฒƒ์€ Knobs๊ฐ€์žˆ๋Š” Storybook _before_๋ฅผ ๋ณธ ์‚ฌ์šฉ์ž์—๊ฒŒ๋งŒ ๋ฐœ์ƒํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋งž์ฃ ? ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ๋ฐฉ๋ฌธ์ž๋Š” ์˜ํ–ฅ์„๋ฐ›์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋ฅผ ์œ„ํ•ด ์œ„์˜ ์–ด๋Š ๊ฒƒ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ main.js์— ์ปจํŠธ๋กค ์• ๋“œ์˜จ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

module.exports = {
  addons: ['@storybook/addon-knobs', '@storybook/addon-controls'],
  stories: ['./src/stories/*.stories.js'],
};
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰