Configurando Babel Root Import em projetos TypeScript no ReactJS e React Native
April 25, 2020 • ☕️ 7 min read
Faaaaala Codeeeeers
Hoje eu vim trazer uma solução muito legal para você que está cansado de ter que fazer importações nos seus projetos TypeScript em ReactJS e React Native, dessa forma:
import Header from '../../../../Components/Header'
Que tal…fazer isso aí acima, virar isso:
import Header from '~/Components/Header'
Muito melhor, né?!
Eu já havia trazido a solução do React Root Import para projetos em ReactJS utilizando JavaScript, e você pode ver aqui:
Utilizando Babel Root Import no ReactJS
Em breve, vou atualizar e adicionar a parte do Root Import no React Native para projetos JavaScript também.
⚛️ Root Import no ReactJS
Antes de começar é recomendado que você tenha o ESLint configurado no seu projeto, caso não tenha ainda, SAIA JÁ DAQUI, você pode seguir esse tutorial que fiz um tempo atrás e vai te ajudar:
Configurando ESlint e o Prettier no ReactJS e React Native
1. Instale o babel-eslint
, babel-plugin-root-import
, customize-cra
, eslint-import-resolver-babel-plugin-root-import
e o react-app-rewired
como dependência de desenvolvimento, dessa maneira:
yarn add babel-eslint babel-plugin-root-import customize-cra eslint-import-resolver-babel-plugin-root-import react-app-rewired -D
2. Depois é necessário alterar os scripts
de start
, build
e test
no seu package.json
, dessa forma:
"start": "react-app-rewired start",
"build": "react-app-rewired build",
"test": "react-app-rewired test",
🎙️ Repare que você apenas substituiu o react-scripts pelo react-app-rewired, isso não vai interferir em nada na sua aplicação, o react-app-rewired junto do customize-cra, que vamos ver daqui a pouco, só nos auxiliam a sobrescrever algumas informações do create-react-app para que ele possa entender o babel-root-import na hora de rodar o projeto.
3. Agora, lá no seu .eslintrc.json
, ao final do arquivo, vai ter um "settings"
, senão tiver, é só você criar ele, ele deve deve ficar desse jeito:
"settings": {
"import/resolver": {
"typescript": {},
"babel-plugin-root-import": {
"rootPathPrefix": "~",
"rootPathSuffix": "src"
}
}
}
🎙️ Aqui um exemplo do meu arquivo completo:
🗒 Obs.: Só lembrando que esse formato aí está em JSON, se o seu .eslintrc for no format ojs, é só adaptar para JavaScript que funciona do mesmo jeito.
4. Crie um arquivo chamado config-overrides.js
na raiz do projeto cole o seguinte código dentro dele:
const { addBabelPlugin, override } = require('customize-cra');
module.exports = override(
addBabelPlugin([
'babel-plugin-root-import',
{
rootPathSuffix: 'src',
},
]),
);
🎙️ Esse arquivo que será responsável de implementar o babel root import no React, digamos assim, em termos.
🎙️ É bem provável que o ESLint fique “reclamando” de um erro que o “customize-cra” deve vir nas dependências de produção e não da de desenvolvimento, mas não é necessário, pode ignorar, não vai influenciar em nada.
5. Crie um arquivo chamado tsconfig.paths.json
na raiz do projeto, e cole o seguinte código nele:
{
"compilerOptions": {
"baseUrl": "src",
"paths": {
"~/*": ["*"]
}
}
}
🎙️ Esse arquivo será responsável por sobrescrever algumas informações do tsconfig.json, tais como a baseURL, que no meu caso é a “src”, e imagino que a sua também, caso não seja, pode mudar. Ah, e também o “paths”.
6. Para finalizar adicione o tsconfig.paths.json
que você criou dentro do tsconfig.json
que já existe na sua aplicação, dessa maneira:
"extends": "./tsconfig.paths.json",
📱 Root Import no React Native
Antes de começar é recomendado que você tenha o ESLint configurado no seu projeto, entao já sabe:
Configurando ESlint e o Prettier no ReactJS e React Native
1. Instale o babel-eslint
, babel-plugin-root-import
, e o eslint-import-resolver-babel-plugin-root-import
como dependência de desenvolvimento
yarn add babel-eslint babel-plugin-root-import eslint-import-resolver-babel-plugin-root-import -D
2. Agora, lá no seu .eslintrc.json
, ao final do arquivo, vai ter um "settings"
, senão tiver, é só você criar ele, ele deve deve ficar desse jeito
"settings": {
"import/resolver": {
"typescript": {},
"babel-plugin-root-import": {
"rootPathPrefix": "~",
"rootPathSuffix": "src"
}
}
}
🎙️ Aqui um exemplo do meu arquivo completo:
🗒 Obs.: Só lembrando que esse formato aí está em JSON, se o seu .eslintrc for no formato js, é só adaptar para JavaScript que funciona do mesmo jeito.
3. Agora acesse o babel.config.js
🎙️ Abaixo de:
presets: ['module:metro-react-native-babel-preset']
🎙️ Cole o seguinte código:
plugins: [
[
'babel-plugin-root-import',
{
rootPathPrefix: '~',
rootPathSuffix: 'src',
},
],
],
🎙️ O arquivo deve estar dessa maneira:
module.exports = {
presets: ['module:metro-react-native-babel-preset'],
plugins: [
[
'babel-plugin-root-import',
{
rootPathPrefix: '~',
rootPathSuffix: 'src',
},
],
],
};
🎙️ Isso é apenas para o babel reconhecer o babel root import, e claro, configurando a pasta “src” como nossa pasta root, se a sua não for essa pode mudar, e também configurando o ~ para ser o nosso prefixo.
4. Por último, adicione dentro do seu compilerOptions
as opções baseURL
apontando para sua pasta root, a minha é a "src"
, e adione o path
, dessa forma
"baseUrl": "src",
"paths": {
"~/*": ["*"]
}
🎙️ É bem provável que essas opções de baseURL e path já existam dentro do tsconfig.json, então só descomente elas, e configure.
🗒 Obs.: Elas não preciam ficar uma do lado da outra, aí é só um exemplo.
✅ Finalizando
Bom, é só isso pessoal, talvez seja necessário você abrir e fechar o VSCode ou seu outro editor de código para tudo funcionar corretamente, mas dessa maneira você deverá ser capaz de importar seus arquivos dessa maneira:
import Header from '~/Components/Header'
Espero que isso seja útil para vocês, qualquer dúvida, pode me procurar, até uma próxima!