@alphatechma/expo-rn-template
v1.0.4
Published
Expo React Native template by Alphatech - base templatizada para apps Expo.
Maintainers
Readme
RNTemplate — Template Expo + React Native
Um template mínimo para iniciar apps Expo + React Native com convenções já preparadas:
- TypeScript configurado (via
tsconfig.json) - Navegação (React Navigation) com Stack + Bottom Tabs
- Estrutura de pastas (páginas, features, estilos, routes, store)
- ESLint + Prettier configurados (Husky + lint-staged incluídos para pre-commit)
Este README explica como usar e personalizar o template rapidamente.
Sumário
- Quickstart
- Scripts úteis
- Lint / Prettier / Husky
- Estrutura do projeto e como adicionar páginas/rotas
- Store / API (RTK Query)
- Tipos TypeScript e módulos sem tipos
- Troubleshooting comuns
- Próximos passos e personalizações sugeridas
- Publicação no npm (via GitHub Actions)
Quickstart
- Instale dependências
npm install --legacy-peer-depsSe você usa yarn ou pnpm adapte o comando conforme a sua preferência.
- Instale os hooks do Husky (preparar git hooks)
npm run prepare
# ou (manual)
npx husky install- Rodar o projeto (Expo)
npm run start
# abrir no iOS / Android / Web
npm run ios
npm run android
npm run web- Validar TypeScript e formatar código
# checar tipos (sem emitir build)
npx tsc --noEmit
# formatar código (Prettier)
npm run formatScripts importantes (package.json)
npm run start— inicia o Metro/Exponpm run ios/npm run android/npm run web— abre para a plataforma correspondentenpm run lint— executa ESLint (configável)npm run lint:fix— aplica correções automáticas onde possívelnpm run format— executa Prettiernpm run prepare— instala os hooks do Husky
Lint / Prettier / Husky
O template já contém configuração mínima:
.eslintrc.jscomextends: ['universe/native'](sua preferência de config)eslint.config.cjsneutralizado para evitar conflito com flat config.prettierrce.prettierignoreprontoshusky+lint-stagedconfigurados: pre-commit executalint-staged
Se quiser executar os checks localmente:
# listar problemas de lint
npm run lint
# tentar corrigir automaticamente
npm run lint:fixSe os hooks não estiverem ativos (por exemplo, em CI ou após clonar):
npm run prepareNota: em ambientes com problemas de peers ou tokens de npm você pode precisar rodar:
npm config delete //registry.npmjs.org/:_authToken
npm login
# depois
npm install --legacy-peer-depsEstrutura do projeto (visão rápida)
Principais pastas:
src/pages/— telas (ex.:Home,Login, etc). O template já tem placeholders.src/routes/— onde o Router/Navigation vive (src/routes/index.tsxjá transformado em template)src/features/— features domain-driven (ex.:account,api— RTK Query slices)src/store/— configuração do Redux / storesrc/styles/— theme, styled.d.ts e tokenssrc/hooks/— providers / wrappers do app (ThemeProvider, NavigationContainer)src/@types/— declarações de módulos e tipos globais
Como adicionar uma tela simples e conectá-la nas rotas:
- Criar arquivo
src/pages/MinhaPagina/index.tsxcom um componente React Native. - Importar a tela em
src/routes/index.tsx(ou mover o placeholder para o arquivo novo). - Adicionar um
Tab.ScreenouStack.Screenconforme desejar.
Exemplo rápido (conceptual):
// src/pages/MinhaPagina/index.tsx
import React from 'react';
import { View, Text } from 'react-native';
export default function MinhaPagina() {
return (
<View><Text>Minha página</Text></View>
);
}E em src/routes/index.tsx adicione a rota ao Tab.Navigator.
Store e API (RTK Query)
O template inclui um apiSlice pronto para injeção de endpoints e um setupStore em src/store/store.ts.
src/features/api/apiSlice.ts— base para RTK Query (configurebaseUrle o token se necessário)- Para criar endpoints de exemplo, veja o
src/features/account/exampleSlice.tsjá incluído como template CRUD usandoapiSlice.injectEndpoints.
Para usar o store em sua aplicação, configure o provider no App.tsx (ou em src/hooks) e passe o store:
import { Provider } from 'react-redux';
import { setupStore } from './src/store/store';
const store = setupStore();
// ... wrap your App with <Provider store={store}> ...Tipos TypeScript e módulos sem tipos
Alguns pacotes não fornecem typings. Para evitar erros do TypeScript o template inclui src/@types/index.d.ts com declarações genéricas para imagens e alguns pacotes. Recomenda-se instalar tipos oficiais quando existirem:
npm i -D @types/react @types/react-nativeSe você adicionar uma dependência que não tem tipos, adicione uma declaração minimal em src/@types/index.d.ts como:
declare module 'nome-do-pacote';Troubleshooting comum
- Erro ao instalar pacotes:
ERESOLVEou conflito de peer- Tente:
npm install --legacy-peer-deps
- Tente:
- Erro
Access token expired or revokednonpm install- Refaça login:
npm logoutenpm loginou delete o token local:
- Refaça login:
npm config delete //registry.npmjs.org/:_authToken
npm loginErro do TypeScript sobre
.tsx/--jsx is not set- Solução:
tsconfig.jsonjá tem"jsx": "react-jsx"configurado. Se estiver faltando, adicione.
- Solução:
Regras do ESLint/Flat config conflitando
- O template inclui
.eslintrc.js(legacy) eeslint.config.cjsneutralizado. Se preferir usar a config flat, remova.eslintrc.jse mantenhaeslint.config.cjs.
- O template inclui
Publicação no npm (via GitHub Actions)
Este template já tem duas opções para publicar no npm a partir do repositório:
- Publicação por tag (manual)
- Criar uma tag com formato
vX.Y.Ze dar push. Exemplo local:
npm run release -- 1.0.2
# isso executa: git tag -a v1.0.2 -m "Release v1.0.2" && git push origin v1.0.2- O workflow
.github/workflows/publish.ymlserá disparado no push da tag e executará (instalação, lint, tsc, build, publish).
- Publicação automática com
semantic-release(recomendada para releases automáticas)
- Push para a branch
mainacionará.github/workflows/release.ymlque executasemantic-release. semantic-releaseanalisa commits (conventional commits) e gera a nova versão, atualizaCHANGELOG.md, faznpm publishe cria uma release no GitHub.
Requisitos / configurações
- Adicione o secret
NPM_TOKENno repositório (Settings → Secrets and variables → Actions)- Nome:
NPM_TOKEN - Valor: token de automação do npm (crie em https://www.npmjs.com/settings/tokens)
- Nome:
GITHUB_TOKENé provido automaticamente pelo GitHub Actions; não é necessário configurá-lo manualmente.
Qual usar?
- Se você prefere controlar as versões manualmente (tagging), use a opção (1).
- Se quer CI/CD para releases automáticas com base em commits (convencional), use (2) e siga o padrão
conventional commits(feat, fix, perf, chore, etc.).
Próximos passos e personalizações sugeridas
- Defina
baseUrlda API emsrc/features/api/apiSlice.tse configure as rotas reais. - Substitua placeholders em
src/pages/*por componentes reais e desça a árvore. - Adicione/atualize tokens e temas em
src/styles/theme.ts. - Ajuste regras do ESLint conforme a sua equipe (ex.: permitir
anyem alguns casos, strenghten rules, etc). - Considere adicionar GitHub Actions para rodar
npm run lintenpx tsc --noEmitno CI.
Arquivos importantes para revisão
package.json— scripts, dependências e hookstsconfig.json— paths e jsxsrc/routes/index.tsx— ponto central de rotas (já convertido para template)src/features/api/apiSlice.ts— base para chamadas HTTP (RTK Query)src/store/store.ts— setup do Reduxsrc/@types/index.d.ts— declare módulos sem tipos
Licença
Coloque aqui a licença do seu template (ex.: MIT) se for público.
Se quiser eu:
- adapto esse README para uma versão curta em inglês;
- gero instruções de CI (GitHub Actions) que rodem
npm install,npm run lintenpx tsc --noEmit;
- gero instruções de CI (GitHub Actions) que rodem
- adiciono um script
create-appsimples que copia o template e roda um assistant de setup.
- adiciono um script
Diga qual das opções acima prefere que eu crie em seguida.
Nota sobre lockfile (recomendado)
Para builds reprodutíveis e para que o workflow npm ci funcione sem problemas, é recomendável commitar o package-lock.json no repositório. Porém, alguns ambientes (ou templates) não incluem o lockfile — por isso os workflows desse template utilizam npm install --legacy-peer-deps --no-audit --no-fund quando necessário, que é mais tolerante a ausência do lockfile e a conflitos de peer.
Se quiser garantir installs idempotentes em CI, gere o lockfile localmente e commite:
npm install --legacy-peer-deps
git add package-lock.json
git commit -m "chore: add package-lock.json"