Today I Learned ... react.js
🙋 My Dev Blog
1. storybook 설치
> yarn add -dev @storybook/react
2. 스토리북 실행 명령어 - package.json 수정
"scripts" : {
"storybook" : "start-storybook -p 9001 -c .storybook",
}
3. 스토리 파일 생성
import React from "react";
import { storiesOf } from "@storybook/react";
import Input from "../component/Input";
storiesOf("Input", module).add("기본 설정", () => <Input />);
storiesOf 함수
- 스토리를 스토리북 도구에 추가해줌
4. .storybook
폴더 (root) 생성 후 연결
import { configure } from "@storybook/react";
function loadStories() {
require('../src/stories/InputStory');
}
configure(loadStories, module);
5. npm run storybook
> npm run storybook
import React from 'react';
import { storiesOf } from '@storybook/react';
import Input from '../component/Input';
storiesOf('Input', module)
.add('기본 설정', () => <Input name="name" />)
.add('label 예제', () => <Input name="name" label="이름" />);
- 카운터 스토리 추가
( 지난 예제에서 제작했던 NewCounter.jsx를 이용 )
import React from 'react';
class NewCounter extends React.Component {
constructor(props) {
super(props);
this.state = {};
this.increaseCount = this.increaseCount.bind(this);
}
static getDerivedStateFromProps(props, state) {
const { count } = props;
return {
count,
newCount: count === state.count ? state.newCount : count,
};
}
increaseCount() {
this.setState(({ newCount }) => ({
newCount: newCount + 1,
}));
}
render() {
return (
<div>
현재 카운트 : {this.state.newCount}
<button onClick={this.increaseCount}>카운트 증가</button>
</div>
);
}
}
export default NewCounter;
-> getDerivedStateFromProps()를 이용하여, 외부에서 값이 변경될 시 그것도 반영한다.
❕ 자세한 내용은 dev blog의 이전 글을 참고.
import React from "react";
import { storiesOf } from "@storybook/react";
import NewCounter from "../component/NewCounter";
storiesOf("NewCounter", module).add("기본 설정", () => (
<NewCounter count={0} />
));
import { configure } from "@storybook/react";
function loadStories() {
require('../src/stories/InputStory');
require('../src/stories/NewCounterStory'); // 👈 require로 추가
}
configure(loadStories, module);
저장하는 순간, 자동으로 웹팩이 빌드되면서 스토리북 도구가 리로드된다.
import { configure } from "@storybook/react";
import interopRequireDefault from 'babel-runtime/helpers/interopRequireDefault';
function loadStories() {
const context = require.context('../src/stories', true, /Story\.jsx$/); // 정규표현식 - Story.jsx로 끝나는 파일
context.keys().forEach((srcFile) => {
interopRequireDefault(context(srcFile));
});
}
configure(loadStories, module);
📌 require.context
require.context는 기준 디렉토리로부터 정규표현식에 해당하는 모든 모듈을 불러올 수 있는 웹팩 컴파일러의 특별한 기능이다.
require.context를 사용하면 컴파일타임에 매칭되는 모든 모듈을 웹팩 빌드 디펜던시에 추가하게 되고 덕분에 매칭되는 모든 모듈을 런타임에 불러올 수 있다.
+) 참고 - > npm install -D babel-runtime
로 설치 후 진행함.
addon-actions
addon-jsx
addon-actions
패키지 설치> npm install -D @storybook/addons @storybook/addon-actions
import '@storybook/addon-actions/register';
import React from "react";
import { storiesOf } from "@storybook/react";
import { action } from "@storybook/addon-actions";
import Input from "../component/Input";
storiesOf("Input", module)
.add("기본 설정", () => <Input name="name" />)
.add("label 예제", () => <Input name="name" label="이름" />)
.add("onChange 예제", () => (
<Input name="name" onChange={action("onChange 이벤트 발생")} /> // 👈 action() 사용
));
addon-jsx
설치 + 설정 추가(register_> npm i -D storybook-addon-jsx
import '@storybook/addon-actions/register';
import 'storybook-addon-jsx/register';
addon-jsx는 새로운 예제 추가 함수를 storyOf함수에 추가하므로, config.js를 수정해야 함.
/.storybook/config.js
import { configure, setAddon } from "@storybook/react";
import interopRequireDefault from 'babel-runtime/helpers/interopRequireDefault';
import JSXAddon from 'storybook-addon-jsx'; // 👈 추가된 부분 1
function loadStories() {
const context = require.context('../src/stories', true, /Story\.jsx$/);
context.keys().forEach((srcFile) => {
interopRequireDefault(context(srcFile));
});
}
setAddon(JSXAddon); // 👈 추가된 부분 2
configure(loadStories, module);
+)
🔨 에러 발생함
'jsx'라는 것을 못찾는다는 뜻 같은데, 구글링 해봐도 다 고쳐봐도 계속 해결이 안된다.
내가 storybook 설치할때 뭔가 버전 충돌이 일어난건지 root에 존재한다는 식으로 에러가 떠서
npm i -f (강제 설치)로 설치하긴 했는데 이때문인지는 잘 모르겠다 ...
Error Breaking 에서 추후에 다루도록 하겠다. 🤦♀️