DEV Community

Davilson de Castro
Davilson de Castro

Posted on

Setup inicial de aplicações ReactJs

Neste post quero mostrar como configurar uma aplicação ReactJs para deixá-la padronizada para trabalho em equipes.

Primeiramente vamos criar a aplicação utilizando a cli create-react-app:

yarn create react-app nome-do-projeto --template typescript
Enter fullscreen mode Exit fullscreen mode

Configurando o EditorConfig

Este plugin ajuda a manter as configurações do editor iguais para todos os devs do projeto. Basta instalar a extensão EditorConfig for VS Code em seu vsCode, criar um arquivo com o nome .editorconfig na raiz do projeto e colar o conteúdo abaixo:

root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
Enter fullscreen mode Exit fullscreen mode

Configurando Path Alias no projeto

para que não tenhamos que ficar importando nossos componentes utilizando ../../../../../components/Button, vamos configurar o alias no Webpack, assim nossas importações ficará assim @Components/Button.

1 - Primeiramente crie um arquivo na raiz do projeto com o nome tsconfig.paths.json e cole o conteúdo abaixo:

{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@Components/*": ["./src/components/*"],
      "@Sections/*": ["./src/sections/*"],
      "@Pages/*": ["./src/pages/*"],
      "@Core/*": ["./src/core/*"]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

2 - No arquivo tsconfig.json na raiz do projeto, basta inserir o atributo extends antes de compilerOptions:

{
  "extends": "./tsconfig.paths.json",
  "compilerOptions": {...}
}
Enter fullscreen mode Exit fullscreen mode

3 - Para alterar as configurações padrão do webpack do react, precisamos instalar a biblioteca @craco/craco:

yarn add @craco/craco -D
Enter fullscreen mode Exit fullscreen mode

4 - Na raiz do projeto crie um arquivo com o nome craco.config.js e cole o conteúdo abaixo:

const path = require('path');

const config = require('./tsconfig.paths.json');

const cracoConfig = { webpack: { alias: {} } };

Object.keys(config.compilerOptions.paths).forEach((itemKey) => {
  const pathKey = itemKey.replace('/*', '');
  const pathValue = config.compilerOptions.paths[itemKey][0].replace('/*', '');
  cracoConfig.webpack.alias[pathKey] = path.resolve(__dirname, pathValue);
});

module.exports = cracoConfig;
Enter fullscreen mode Exit fullscreen mode

5 - No arquivo package.json altere os scripts do react para:

{
  "scripts": {
    "start": "craco start",
    "build": "craco build",
    "test": "craco test",
    "eject": "craco eject"
  }
}
Enter fullscreen mode Exit fullscreen mode

Configurando o Eslint + Prettier

Para deixar o código padronizado entre os desenvolvedores do projeto, vamos utilizar o eslint para identificar os códigos que estão fora do padrão e o prettier para aplicar a formatação com base nas regras definidas pelo eslint.

1 - Instale a biblioteca eslint como dependência de desenvolvimento:

yarn add eslint -D
Enter fullscreen mode Exit fullscreen mode

2 - Execute a sequencia abaixo para configurar o eslint através da cli:

# 1 - Inicio da configuração do eslint
yarn eslint --init

# 2 - Escolha a opção "To check syntax, find problems, and enforce code style" 
How would you like to use ESLint?
  To check syntax only
  To check syntax and find problems
❯ To check syntax, find problems, and enforce code style

# 3 - Escolha a opção "JavaScript modules (import/export)" 
What type of modules does your project use?
❯ JavaScript modules (import/export)
  CommonJS (require/exports)
  None of these

# 4 - Escolha a opção "React" 
Which framework does your project use?
❯ React
  Vue.js
  None of these

# 5 - Escolha a opção "Yes" 
Does your project use TypeScript?
  No
❯ Yes

# 6 - Pressionando a barra de espaço, deixe selecionado somente a opção "Browser" 
Where does your code run?
✔ Browser
  Node

# 7 - Escolha a opção "Use a popular style guide" 
How would you like to define a style for your project? … 
❯ Use a popular style guide
  Answer questions about your style
  Inspect your JavaScript file(s)

# 8 - Escolha a opção "Use a popular style guide" 
How would you like to define a style for your project? … 
❯ Use a popular style guide
  Answer questions about your style
  Inspect your JavaScript file(s)

# 9 - Escolha a opção "Airbnb" 
Which style guide do you want to follow?
❯ Airbnb: https://github.com/airbnb/javascript
  Standard: https://github.com/standard/standard
  Google: https://github.com/google/eslint-config-google
  XO: https://github.com/xojs/eslint-config-xo

# 10 - Escolha a opção "JavaScript" 
What format do you want your config file to be in? … 
❯ JavaScript
  YAML
  JSON

# 11 - Escolha a opção "Yes" 
Would you like to install them now with npm?
  No
❯ Yes
Enter fullscreen mode Exit fullscreen mode

3 - Após finalizar a configuração, apague os arquivos package-lock.json, yarn.lock e a pasta node_modules. Agora execute o comando yarn para instalar e atualizar as referências de todas as bibliotecas.

4 - Agora vamos instalar o restante das dependências para o eslint e para o prettier:

yarn add prettier eslint-config-prettier eslint-plugin-prettier babel-eslint eslint-plugin-import-helpers eslint-import-resolver-alias -D
Enter fullscreen mode Exit fullscreen mode

5 - No arquivo .eslint.js, cole o conteúdo abaixo:

const path = require('path');

const config = require('./tsconfig.paths.json');

module.exports = {
  env: {
    browser: true,
    es2021: true,
  },
  parser: '@typescript-eslint/parser',
  extends: [
    'plugin:react/recommended',
    'airbnb',
    'plugin:@typescript-eslint/recommended',
    'plugin:import/typescript',
    'plugin:prettier/recommended',
  ],
  plugins: [
    'react',
    'prettier',
    '@typescript-eslint',
    'eslint-plugin-import-helpers',
  ],
  parserOptions: {
    ecmaFeatures: {
      jsx: true,
    },
    ecmaVersion: 12,
    sourceType: 'module',
  },
  rules: {
    'prettier/prettier': 'error',
    '@typescript-eslint/no-var-requires': 'off',
    'react/jsx-filename-extension': ['error', { extensions: ['.tsx'] }],
    'react/react-in-jsx-scope': 'off',
    'react/jsx-one-expression-per-line': 'off',
    'no-use-before-define': 'off',
    '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }],
    '@typescript-eslint/explicit-module-boundary-types': 'off',
    'import-helpers/order-imports': [
      'warn',
      {
        newlinesBetween: 'always',
        groups: [
          ['/^react/'],
          ['module'],
          ['/^~//'],
          ['parent', 'sibling', 'index'],
        ],
        alphabetize: { order: 'asc', ignoreCase: true },
      },
    ],
    'import/extensions': [
      'error',
      'ignorePackages',
      {
        js: 'never',
        jsx: 'never',
        ts: 'never',
        tsx: 'never',
      },
    ],
  },
  settings: {
    'import/resolver': {
      alias: {
        extensions: ['.js', '.ts', '.tsx', '.jsx'],
        map: Object.keys(config.compilerOptions.paths).map((itemKey) => {
          const pathKey = itemKey.replace('/*', '');
          const pathValue = config.compilerOptions.paths[itemKey][0].replace(
            '/*',
            '',
          );
          return [pathKey, path.resolve(__dirname, pathValue)];
        }),
      },
    },
  },
};
Enter fullscreen mode Exit fullscreen mode

6 - Crie na raiz do projeto um arquivo com o nome .prettierrc.js e cole o conteúdo abaixo:

module.exports = {
  semi: true,
  singleQuote: true,
  trailingComma: "all"
};
Enter fullscreen mode Exit fullscreen mode

7 - Crie na raiz do projeto o arquivo .eslintignore, ele será responsável por ignorar alguns arquivos que não precisam ser analisados pelo eslint:

**/node_modules/*
**/out/*
**/dist/*
Enter fullscreen mode Exit fullscreen mode

8 - Crie na raiz do projeto o arquivo .prettierignore, ele será responsável por ignorar alguns arquivos que não precisam ser formatados pelo prettier:

node_modules
yarn.lock
package-lock.json
public
Enter fullscreen mode Exit fullscreen mode

Para finalizar

Na hora de fazer commits das funcionalidades desenvolvidas, uma boa pratica é utilizar Conventional Commits para isto.

Vamos garantir que ao fazer os commits o código esteja nos padrões definidos pelo eslint/prettier e que a mensagem do commit esteja na especificação do Conventional Commits.

1 - Vamos instalar algumas bibliotecas que irá nos ajudar nisso:

yarn add husky @commitlint/config-conventional @commitlint/cli -D
Enter fullscreen mode Exit fullscreen mode

2 - Adicione estes 3 scripts no package.json na raiz do projeto:

{
  "scripts": {
    "lint": "eslint ./",
    "lintFix": "eslint ./ --fix",
    "postinstall": "husky install"
  }
}
Enter fullscreen mode Exit fullscreen mode

3 - Vamos criar o arquivo de configuração para o commitlint. Na raiz do projeto crie um arquivo com o nome commitlint.config.js e cole o conteúdo abaixo:

module.exports = {
  extends: ['@commitlint/config-conventional']
};
Enter fullscreen mode Exit fullscreen mode

4 - Agora vamos ativar o Husky e instalar os scripts que irá rodar antes de cada commit:

# Ativando o husky
yarn husky install

# Instalando o script para verificar eslint no pre-commit
yarn husky add .husky/pre-commit 'yarn lint'

# Instalando o script para verificar se a mensagem está na especificação do Conventional Commits
yarn husky add .husky/commit-msg 'yarn commitlint --edit $1'
Enter fullscreen mode Exit fullscreen mode

Pronto

Após todas as bibliotecas instaladas e configuradas, basta reiniciar seu vsCode e começar a codar 🤟🏻

Top comments (1)

Collapse
 
bernbrasil profile image
Bernardo Brasil

Muito bacana o artigo, vou tentar por em prática!