SOFTWARE DEVELOPMENT | 4 mins read

สร้าง Design System สำหรับ React โดยใช้ Storybook

By Pun on 05 Jun 2020
sennalabs-blog-banner

หลายๆ บริษัทหรือ developer หลายๆ คนต่างก็รู้จัก UI library มาแล้วทั้งนั้น ซึ่งแต่ละ library ก็มีหน้าตา วิธีใช้งาน หรือข้อจำกัดที่แตกต่างกันออกไป หลายบริษัทจึงหันมาสร้างเป็น design system เป็นของตัวเองเพื่อให้ใช้งานได้ตามจุดประสงค์มากขึ้น ซึ่งการสร้าง design system / UI library ขึ้นมานั้นก็ควรมี document อธิบายการใช้งานด้วย ซึ่ง Storybook เป็น tool ที่จะช่วยให้คุณสร้าง design system / UI library เป็นของตัวเองได้อย่างง่ายขึ้น

 

รู้จักกับ Storybook

Storybook เป็น tool ที่ช่วยให้เราสร้าง UI components ได้ง่ายขึ้น ซึ่งสามารถเขียนได้หลาย framework เช่น React, React Native, Vue, Angular หรือเขียนเป็น UI components ของ HTML ก็ได้

 

ข้อดีของ Storybook คือสามารถสร้างตัว UI ให้เห็นภาพได้ทันที designer เข้ามาดูแล้วเข้าใจได้ง่าย ทำ document ได้ง่าย อีกทั้งยังมีคนใช้เยอะมากๆ อีกด้วย เช่น Airbnb, Uber, Sematic-UI เป็นต้น (ดูเพิ่มเติมได้ที่ https://storybook.js.org/docs/examples/)

 

มาเริ่มทำ Design System ไว้ใช้เองกันเถอะ

ในบทความนี้จะพาทำ Storybook โดยใช้ React ซึ่งก่อนอื่นเลยเราต้อง project ขึ้นมาก่อน โดยในที่นี้จะสร้างโดย Create React App

npx create-react-app my-design-system
                cd my-design-system

 

หลังจากนั้นก็ทำการติดตั้งพระเอกของเราเข้าไป คือ Storybook นั่นเอง

 

ทีนี้ก็ลองใช้คำสั่งเพื่อรัน Storybook ขึ้นมาแล้วดูผลลัพธ์ที่ http://localhost:9009

npm run storybook
                // or
                yarn storybook

ซึ่ง Storybook จะสร้าง folder ให้เรา 2 folders ด้วยกันคือ

  • .storybook - เอาไว้ตั้งค่า config ต่างๆ ซึ่งหากต้องการเพิ่ม addon ก็เพิ่มได้ที่นี่
  • src/stories - รวม stories ต่างๆ ที่จะเอามาแสดงในหน้าเว็บไซต์

 

ทีนี้เรามาลองสร้าง component เป็นของตัวเองเลยดีกว่า โดยในที่นี้จะสร้างเป็น input component เพื่อให้เข้าใจง่าย

เริ่มต้นคือสร้าง component ขึ้นมาก่อน โดยในที่นี้จะสร้างไว้ที่ src/components/Input.js

// src/components/Input.js
                import React from 'react'
                
                const Input = ({ style, ...props }) => (
                 <input
                   {...props}
                   style={{
                     color: 'deepskyblue',
                     border: '2px solid deepskyblue',
                     outline: 'none',
                     fontSize: 20,
                     borderRadius: 10,
                     width: 500,
                     padding: 10,
                     ...style
                   }}
                 />
                )
                 
                export default Input

 

หลังจากนั้นก็ต้องไปสร้างไฟล์ story ไว้ที่ src/stories/Input.stories.js

// src/stories/Input.stories.js
                import React from 'react';
                import Input from '../components/Input'
                 
                export default {
                 title: 'Input',
                 component: Input,
                };
                 
                export const Basic = () => <Input />;

 

และเมื่อกลับไปดูบน browser ก็จะพบ component ของเราขึ้นมาแล้วนั้นเอง

ทีนี้เราก็มี design system ไว้ใช้เองแล้ว

 

Storybook Addons

แต่เดี๋ยวก่อน ทำ design system แต่นี้ก็ไม่ค่อยมีประโยชน์เท่าไหร่น่ะสิ document ก็ไม่มี ไม่ต้องกังวลไป ทาง Storybook ได้มี addon ไว้ให้เราเลือกใช้มากมาย ซึ่งแต่ละตัวก็มีประโยชน์และใช้ง่ายมากๆ เรามาลองทำความรู้จักกับ addon บางตัวเลยดีกว่า

 

Knobs

Knobs เป็น addon ที่ช่วยให้เราสามารถ interact กับ component ได้ เช่น ถ้าส่ง props นี้แล้วจะเกิดอะไรขึ้น

เริ่มต้นจากการเพิ่ม Knobs เข้าไปใน project ก่อน

npm install @storybook/addon-knobs --save-dev
                // or
                yarn add @storybook/addon-knobs --dev

 

จากนั้นให้ทำการเพิ่ม Knobs เข้าไปใน .storybook/main.js

// .storybook/main.js
                module.exports = {
                 stories: ['../src/**/*.stories.js'],
                 addons: [
                   '@storybook/preset-create-react-app',
                   '@storybook/addon-actions',
                   '@storybook/addon-links',
                   '@storybook/addon-knobs/register', // add this line
                 ],
                };

 

ทีนี้เราก็สามารถใช้ Knobs ได้แล้ว โดยวิธีให้ก็ไม่ยาก เพียงแต่เราครอบ function ของ Knobs ไว้ให้กับ props ที่เราต้องการ interact ด้วย

// src/stories/Input.stories.js
                import React from 'react';
                import { withKnobs, text, boolean } from '@storybook/addon-knobs'; // add this line
                import Input from '../components/Input'
                 
                export default {
                 title: 'Input',
                 component: Input,
                 decorators: [withKnobs], // add this line
                };
                 
                export const Basic = () => (
                 <Input
                   placeholder={text('placeholder', 'Enter text here')} // add this line
                   disabled={boolean('disable', false)} // add this line
                 />
                );

 

เมื่อเรา restart Storybook จะพบว่ามี tab Knobs เพิ่มขึ้นมา และเมื่อเราแก้ไขค่าต่างๆ UI ที่ได้ก็จะเปลี่ยนไปตามค่านั้นๆ

 

Docs

Docs เป็น addon ที่ช่วยให้เราสามารถเขียน document ของ component ได้ง่ายขึ้น ซึ่งมีวิธีการเขียนเป็น markdown เริ่มต้นจากการเพิ่ม Docs เข้าไปใน project ก่อน

npm install @storybook/addon-docs --save-dev
                // or
                yarn add @storybook/addon-docs --dev

 

จากนั้นให้ทำการเพิ่ม Docs เข้าไปใน .storybook/main.js

// .storybook/main.js
                module.exports = {
                 stories: ['../src/**/*.stories.(js|mdx)'], // edit this line
                 addons: [
                   '@storybook/preset-create-react-app',
                   '@storybook/addon-actions',
                   '@storybook/addon-links',
                   '@storybook/addon-knobs/register',
                   '@storybook/addon-docs', // add this line
                 ],
                };

 

ทีนี้เราก็ก็ลองสร้างไฟล์ document ของ input component ง่ายๆ ดู

<!-- src/stories/Input.stories.mdx -->
                import { Meta, Story, Preview } from '@storybook/addon-docs/blocks';
                import Input from '../components/Input'
                 
                <Meta title="MDX/Input" component={Input} />
                 
                # Input
                 
                With `MDX` we can define a story for `Input` right in the middle of our
                markdown documentation.
                 
                <Preview>
                 <Story name="all inputs">
                   <div>
                     <Input placeholder="without value" />
                     <hr />
                     <Input value="with value" />
                   </div>
                 </Story>
                </Preview>

 

เมื่อเรา restart Storybook จะพบว่ามี document ของ input component ที่เราสร้างแล้ว

 

บทสรุป

Storybook เป็น tool ที่ช่วยให้เราสร้าง design system / UI library ได้ง่ายขึ้น แล้วก็มี addon มากมายให้เลือกใช้ อีกทั้งยังรอบรับหลาย framework ซึ่งในบทความนี้เป็นเพียงการสอนการทำ Storybook แบบง่ายๆ เท่านั้น ซึ่งหากทุกท่านสนใจสามารถลองเอาไปพัฒนาต่อได้

 

ติดตามบทความอื่นๆ จากเราได้ที่ SennaLabs Blogs

 

Written By
Pun