๐ŸŽจ ๋ผ์ดํŠธ ๋ชจ๋“œ, ๋‹คํฌ ๋ชจ๋“œ, ํ…Œ๋งˆ ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆ, Styled-components, NextJS, Typescript.

22464 ๋‹จ์–ด reactdesignnextjstypescript

๊ธฐ์ˆ ๋กœ ์†Œ๊ฐœ



NextJS


  • NextJS๋Š” SSR(Server Side Rendering)์˜ ์ง๊ด€์ ์ธ ํ”„๋ ˆ์ž„์›Œํฌ React์ž…๋‹ˆ๋‹ค.

  • ์Šคํƒ€์ผ ๊ตฌ์„ฑ ์š”์†Œ


  • Styled-components รฉ uma biblioteca para React que permite a escrita de CSS in JS.

  • ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!



    Criando a plicaรงรฃo


  • Para criar a aplicaรงรฃo iremos rodar o comando yarn create next-app <nome do projeto>, apรณs executar esse comando ele irรก comeรงar a criar o seu projeto NextJs (pode demorar um pouquinho).

  • ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ํ‰๊ฐ€


  • Eu divido a minha estrutura do NextJS criando uma ํŒŒ์Šคํƒ€src e colocando as minhas ํŒŒ์Šคํƒ€ e arquivos lรก, apenas deixando a ํŒŒ์Šคํƒ€public de fora, mas isso vai de acordo com o seu gosto!

  • ๊ตฌ์„ฑ ๋˜๋Š” Typescript


  • Para configurar o Typescript no projeto รฉ bem simples, iremos adicionรก-lo como dependsรชncia de desenvolvimento no projeto yarn add typescript -D
  • Agora iremos criar o arquivo tsconfig.json , ๋…ธ์Šคํ„ฐ๋ฏธ๋„ ์—์Šคํฌ๋ ˆ๋ฐ” touch tsconfig.json
  • Iremos modificar o nome das nossas pรกginas dentro de src/pages ํ™•์žฅ ์ œ๊ฑฐ.js ๋ฐ ์ถ”๊ฐ€.tsx
  • E set tudo deu certo pelo menos eu espero que sim, podemos rodar yarn dev no nosso terminal e abrira a pรกgina do NextJS na porta :3000



  • ๊ตฌ์„ฑ ์š”์†Œ ์Šคํƒ€์ผ ๊ตฌ์„ฑ ์š”์†Œ


  • Vamos comeรงar adicionado o styled-components no projeto, portanto escreve no seu terminal yarn add styled-components

  • Iremos criar um arquivo chamado _document.tsx dentro de src/pages , nele haverรก o seguinte conteรบdo. Isso รฉ para as injeรงรตes de estilo no server side rendering.

    import Document, { DocumentContext } from 'next/document';
    import { ServerStyleSheet } from 'styled-components';
    
    export default class MyDocument extends Document {
      static async getInitialProps(ctx: DocumentContext) {
        const sheet = new ServerStyleSheet();
        const originalRenderPage = ctx.renderPage;
    
        try {
          ctx.renderPage = () =>
            originalRenderPage({
              enhanceApp: App => props => sheet.collectStyles(<App {...props} />),
            });
    
          const initialProps = await Document.getInitialProps(ctx);
          return {
            ...initialProps,
            styles: (
              <>
                {initialProps.styles}
                {sheet.getStyleElement()}
              </>
            ),
          };
        } finally {
          sheet.seal();
        }
      }
    }
    


  • Dentro da nossa ํŒŒ์Šคํƒ€src/styles vamos criar o arquivostyled.d.ts para sobrescrevermos os tipos do styled-components.

    import 'styled-components';
    
    declare module 'styled-components' {
      export interface DefaultTheme {
        title: string;
        colors: {
          primary: string;
          secundary: string;
    
          background: string;
          text: string;
        };
        fontSizes: {
          small: string;
          medium: string;
          large: string;
        };
      }
    
      export interface CustomTheme {
        title: string;
        colors: {
          primary: string;
          secundary: string;
    
          background: string;
          text: string;
        };
      }
    }
    


  • Dentro no nosso arquivo tsconfig.json vamos adicionar o seguinte atributo.

    ....
    "files": [
        "src/styles/styled.d.ts"
      ]
    


  • Vamos rapidinho criar um estilo global para a aplicaรงรฃo, crie o arquivo global.ts dentro de src/styles
    import { createGlobalStyle } from 'styled-components';
    
    export default createGlobalStyle`
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
        outline: 0;
      }
    
      body {
        background: #fff;
        color: black;
      }
    
      h1, h2, h3, h4, h5, h6, strong {
        font-weight: 700;
      }
    
      button {
        cursor: pointer;
      }
    `;
    


  • Agora vamos importรก-lo no arquivoindex.tsx , ์‚ญ์ œ os arquivos de estilo.css do projeto tambรฉm!

    import GlobalStyles from '../styles/global';
    
    export default function Home() {
      return (
        <>
          <GlobalStyles />
        </>
      );
    }
    


  • ํฌ๋ฆฌ์•ˆ๋„ ์˜ค์Šค ํ…Œ๋งˆ์Šค


  • Vamos criar os temas agora! Dentro da ํŒŒ์Šคํƒ€src/styles vamos criar uma ํŒŒ์Šคํƒ€themes e nela um arquivo dark.ts(para o dark mode) o arquivo light.ts para o(light mode jura?) e um arquivo index.ts.

  • O arquivo dark.ts terรก as seguintes cores (isso vocรช ๊ฒฐ์ • de acordo com o seu design)

    export default {
      title: 'dark',
    
      colors: {
        primary: '#161616',
        secundary: '#555',
    
        background: '#333',
        text: '#fff',
      },
    };
    


  • O arquivo light.ts terรก as seguintes cores

    export default {
      title: 'light',
    
      colors: {
        primary: '#666',
        secundary: '#777',
    
        background: '#fff',
        text: '#333',
      },
    };
    


  • Arquivo index.ts serรก responsรกvel por misturar as cores de cada tema com o que seria comum entre os dois, ์˜ˆ: tamanho de fonte.

    import { DefaultTheme, CustomTheme } from 'styled-components';
    import dark from './dark';
    import light from './light';
    
    const defaultTheme = {
      fontSizes: {
        small: '16px',
        medium: '18px',
        large: '20px',
      },
    };
    
    function combineTheme(theme: CustomTheme): DefaultTheme {
      return { ...defaultTheme, ...theme };
    }
    
    export { combineTheme, dark, light };
    


  • Aplicando os temas!



  • Agora que jรก criamos nossos temas vamos importรก-los e fazer as trocas dinรขmicas de temas, em src/pages vamos fazer algumas alteraรงรตes no nosso index.tsx , mas antes vamos adicionar um componente de switch para ficar mais estiloso jรก que estamos falando de temas , portanto, escreve yarn add react-switch ๋…ธ์Šคํ„ฐ๋ฏธ๋„

    import React, { useState } from 'react';
    import { DefaultTheme, ThemeProvider } from 'styled-components';
    import Switch from 'react-switch';
    import { combineTheme, dark, light } from '../styles/themes';
    import GlobalStyles from '../styles/global';
    
    const Home: React.FC = () => {
      const [theme, setTheme] = useState<DefaultTheme>(combineTheme(light));
    
      const toggleTheme = () => {
        setTheme(theme.title === 'light' ? combineTheme(dark) : combineTheme(light));
      };
    
      return (
        <ThemeProvider theme={theme}>
          <GlobalStyles />
          <Switch checked={theme.title === 'dark'} onChange={toggleTheme} />
        </ThemeProvider>
      );
    };
    
    export default Home;
    


  • Agora vamos em src/styles no nosso arquivo global.ts e vamos fazer as seguintes alteraรงรตes!

    import { createGlobalStyle } from 'styled-components';
    
    export default createGlobalStyle`
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
        outline: 0;
      }
    
      body {
        background: ${props => props.theme.colors.background};
        color: ${props => props.theme.colors.text};
        font-size: ${props => props.theme.fontSizes.small}
      }
    
      h1, h2, h3, h4, h5, h6, strong {
        font-weight: 700;
      }
    
      button {
        cursor: pointer;
      }
    `;
    

  • ๊ธ‰ํžˆ!!! O resultado final ficarรก assim



  • Projeto no Github

    ์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ