React Native(Expo) + NativeBase 환경에서 Storybook v6(CSF3.0) 가져오기

과제.
Storybook을 React Native 환경으로 가져올 때 공식 튜토리얼에 설명된 절차에 따라 진행하면 이전 버전이 설치됩니다.
https://storybook.js.org/tutorials/intro-to-storybook/react-native/en/get-started/
2022년 3월까지 최신 스토리북은 6.4 계열이지만, 다음 명령을 실행해 도입한 스토리북은 5.3 계열이다.
npx -p @storybook/cli sb init --type react_native
+    "@storybook/addon-actions": "^5.3",
+    "@storybook/addon-knobs": "^5.3",
+    "@storybook/addon-links": "^5.3",
+    "@storybook/addon-ondevice-actions": "^5.3.23",
+    "@storybook/addon-ondevice-knobs": "^5.3.25",
+    "@storybook/react-native": "^5.3.25",
+    "@storybook/react-native-server": "^5.3.23",
Storybook은version6.3 이후의ComponentStoryFormat3.0으로 통칭CSF3이다.지금까지보다 쉬운 이야기를 0으로 표현할 수 있다.
https://storybook.js.org/blog/component-story-format-3-0/
React Native CSF3 에서도0의 은혜를 받고 싶어서 본 기사의 순서대로 설정해 봤기 때문에 기사에 남는다.
본고의 환경 정보
  • Expo42 시리즈
  • NativeBase3.2 시리즈
  • Storybook 및 관련 포장 6.4 시스템
  • 면책 사항
  • 필자는 태어나서 처음으로 Storybook을 접한 초보자이기 때문에 목표에서 벗어났다는 것을 설명할 수 있다
  • 가져오기만 했기 때문에 실제 구성 요소 개발에 적용되기 시작하면 어떻게 될지 몰라
  • 결론은react-native-web을 사용하여React Native
  • 를 지원한다는 것이다.

  • 집필할 때의 README.md의 React Native v6학과 4의 데모 등이 기재되지 않아 공식적인 지원 상황에 의문이 있으므로 주의사항을 바탕으로 도입 등을 판단해달라
  • 가져오기 단계
    react를 대상으로 sb init 지정하기
    목표는react_native가 아니라react이다.
    npx -p @storybook/cli sb init --type react
    
    이것은 상당한 시간이 걸리기 때문에 차를 마시면서 기다린다.
    main.덮어쓰기 js
    다시 쓰기 자동으로 생성된 .storybook/main.js.
    module.exports = {
      stories: ['../src/**/*.stories.mdx', '../src/**/*.stories.@(js|jsx|ts|tsx)'],
      addons: [
        '@storybook/addon-links',
        '@storybook/addon-essentials',
        '@storybook/addon-interactions',
      ],
      framework: '@storybook/react',
      // https://zenn.dev/himorishige/scraps/8cca98dc9120d2
      webpackFinal: (config) => {
        config.resolve.alias = {
          'react-native$': 'react-native-web',
        };
        // https://github.com/react-native-svg/react-native-svg/issues/1553#issuecomment-1011487502
        config.resolve.extensions.unshift('.web.js');
        return config;
      },
    };
    
    
    webpackFinal의 항목이 중점이다.
    https://storybook.js.org/docs/react/configure/overview#configure-your-storybook-project
    react-native-web 사용
    주석에 기재된 Scrap을 참고해 사용react-native의 모든 곳을 Aliasreact-native-web로 설정해 웹팩이 해결하도록 했다.
    https://webpack.js.org/configuration/resolve/
    이런 행동을 할 수 있다는 게 리액트 네이티브의 본색을 발휘하는 거죠.
    ※ 만일의 경우를 대비해 이런 방법을 취할 때 스토리북에서 현지인의 독특한 행동을 확인하는 것은 불가능할 수 있으니 양해 부탁드립니다
    react-native svg 오류 제거
    다음은 config.resolve.extensions.unshift('.web.js');에 관한 부분이다.
    여기를 설정하지 않으면 다음과 같은 오류가 발생합니다.NativeBase 구성 요소를 사용하는 Story가 없으면 오류가 발생하지 않을 수 있습니다.
    ModuleParseError: Module parse failed: Unexpected token (18:12)
    You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders
    | const AssetSourceResolver = require('./AssetSourceResolver');
    | 
    > import type {ResolvedAssetSource} from './AssetSourceResolver';
    | 
    | let _customSourceTransformer, _serverURL, _scriptURL;
    
    이 일에 대해 나는 줄곧 쉴 새 없이 지껄였는데, 상술한 수정안을 찾았기 때문에 잘 처리되었다.대략적으로react-native-web로 변환합니다.js라는 확장자는 일부 구성 요소가 변환된 것 같아서, 그것을 Webpack의 해결 대상으로 삼을 필요가 있습니다.
    https://github.com/react-native-svg/react-native-svg/issues/1553#issuecomment-804089936
    https://webpack.js.org/configuration/resolve/#resolveextensions
    NativeBaseProvider 설정
    NativeBase가 포함된 어셈블리의 경우 Provider 패키지가 필요하므로 .storybook/preview.js는 다음과 같습니다.
    import { NativeBaseProvider } from 'native-base';
    import { theme } from '~/utils/themes/NativeBase';
    import React from 'react';
    
    export const parameters = {
      actions: { argTypesRegex: '^on[A-Z].*' },
      controls: {
        matchers: {
          color: /(background|color)$/i,
          date: /Date$/,
        },
      },
    };
    
    const withThemeProvider = (Story, context) => {
      return (
        <NativeBaseProvider theme={theme}>
          <Story {...context} />
        </NativeBaseProvider>
      );
    };
    export const decorators = [withThemeProvider];
    
    내 환경에서는 theme만 있으면 OK이지만 다른 필요에 따라 파라미터를 설정하세요.
    이전 설정 이후 yarn storybook 실행한 후, NativeBase의 Buttton 구성 요소를 사용하는 구성 요소를 Story로 열 수 있습니다.

    보태다
    V7 설정 정보
    공식 문서를 보면 다음 대형 업데이트를 위한 V7을 위한 피처 플라그가 나왔으니 앞으로 가져올 분들은 일찍 도전하실 수 있습니다.
    https://storybook.js.org/docs/react/configure/overview#feature-flags
    Babel 정보
    베벨 설정을 맞춤형으로 만들 필요가 있다고 생각했는데 그게 아니었어요.
    CSF3.정보
    Story는 다음과 같이 안전하고 간단하게 작성할 수 있습니다.편하네.제목은 기본적으로 디렉터리 구조를 반영합니다.
    import { ComponentMeta, ComponentStoryObj } from '@storybook/react';
    import ActionButton from '~/components/ui/button/ActionButton';
    import Colors from '~/utils/themes/Colors';
    
    export default {
      component: ActionButton,
    } as ComponentMeta<typeof ActionButton>;
    
    export const Primary: ComponentStoryObj<typeof ActionButton> = {
      args: {
        size: 'md',
        children: '送信する',
      },
    };
    
    총결산
    Storybook은 언제 활용하고 싶은지 정기적으로 주목하고 특히 CSF3에 주목한다.0의 쓰기 방식이 편리해졌고 최근에도 msw와testing-Library와 포인트를 매길 수 있어 전방 개발에서 당연한 개발 절차에 포함될 수 있는 도구로 진화되었는가?초보자로서 나는 이렇게 생각한다.
    활용 등에 대한 설명이 있으면 연락 주세요!
    참고 문헌
  • https://zenn.dev/himorishige/scraps/8cca98dc9120d2
  • https://storybook.js.org/blog/component-story-format-3-0/
  • https://www.s-arcana.co.jp/blog/2021/01/19/4519
  • https://webpack.js.org/configuration/resolve/#resolveextensions
  • https://github.com/react-native-svg/react-native-svg/issues/1553#issuecomment-804089936
  • 좋은 웹페이지 즐겨찾기