Часть 1 - установка, стилизованные компоненты и сборник рассказов
Недавно на работе я имел удовольствие начать использовать Typescript и поэкспериментировать со стилями-компонентами. Это полностью изменило мою точку зрения на интерфейс. В качестве побочного проекта я решил создать свою первую библиотеку компонентов со статическими типами и стилизованными компонентами.
Настройка
npx create-react-app components-library --typescript
Я начал с простого создания шаблона приложения для реагирования с поддержкой машинописного текста. Нам действительно не нужен веб-пакет, но если мы хотим создать пример приложения, которое использует наши компоненты, это может пригодиться. Поскольку я научился не бояться конфигураций веб-пакетов, а понимать их, я всегда удаляю свои проекты. Это дает вам лучшее понимание того, как настроено ваше приложение и как оно работает без скрытой магии.
npm run eject
После извлечения мы можем добавить в наш проект сборник рассказов, который позволит продемонстрировать и задокументировать нашу библиотеку.
npx -p @storybook/cli sb init && npm run storybook
Моя хорошая практика - иметь все, что касается одного объекта, такого как компонент, который мне нравится хранить истории из сборника рассказов о тестах, и сам компонент в одном каталоге. Чтобы настроить сборник рассказов для поиска историй во всем каталоге src / components, мы должны настроить его следующим образом.
//.storybook/config.js import { configure } from '@storybook/react'; // automatically import all files ending in *.stories.js const req = require.context('../src/components', true, /.stories.js$/); function loadStories() { req.keys().forEach(filename => req(filename)); } configure(loadStories, module);
Чтобы включить поддержку машинописного текста, нам нужно отредактировать конфигурацию веб-пакета сборников рассказов и заменить его содержимое приведенным ниже кодом. Это позволит использовать модули машинописного текста в рассказах на javascript.
//.storybook/webpack.config.js const path = require('path'); module.exports = (baseConfig, env, config) => { config.resolve.modules = [ ...(config.resolve.modules || []), path.resolve(__dirname, '../src') ]; config.module.rules.push({ test: /\.(ts|tsx)$/, loader: require.resolve("babel-loader"), options: { presets: [["react-app", { flow: false, typescript: true }]] } }); config.resolve.extensions.push(".ts", ".tsx"); return config; };
💅 Стилизованные компоненты 💅
Основная причина, по которой я думаю, что сейчас прекрасное время для создания библиотеки компонентов, - это стилизованные компоненты. Раньше были похожие проекты, но этот потряс индустрию. После выпуска v3.1, который дал ~ 10-кратное улучшение производительности, а затем еще v4.0 с еще 25% и множеством улучшений. Он стал почти таким же производительным, как модули css, с гораздо лучшим API. Чтобы добавить стилизованные компоненты в наш проект, просто запустите
npm i @types/styled-components npm i -D styled-components
Мы добавляем стилизованные компоненты в devDependencies, чтобы избежать конфликтов при установке вашей библиотеки в другой проект.
Убедитесь, что вы добавили стилизованные компоненты как peerDependency, чтобы ваши будущие пользователи не сердились из-за отсутствия стилизованных компонентов 😭.
//package.json ..., "peerDependencies": { "styled-components": "^4.1.3" }, ...
Первый компонент
Наш первый компонент должен быть довольно простым, поэтому, как всегда, мы воспользуемся кнопкой 😅.
//src/components/button/index.tsx import styled from "styled-components"; const StyledButton = styled.button` padding-bottom: 10px; padding-left: 20px; padding-right: 20px; padding-top: 15px; background-color: red; &:active { outline: 0; color: #fff; top: 1px; } `; export const Button = StyledButton;
И история для этой кнопки
//src/components/button/button.stories.js import React from "react"; import { storiesOf } from "@storybook/react"; import {Button} from './'; storiesOf("Button", module) .add("with text", () => ( <Button>Hello Button</Button> ));
Чтобы узнать, как статически печатать стилизованные компоненты, перейдите ко второй части этого руководства 😎