We will use Expo's create-expo-app command recommended by the docs.
Also, we will add ESLint, Prettier, and some custom configurations that will make our development process better.
TLDR You can use one command npx create-expo-app -t expo-ts to create a new React Native project with all tools already set up (see README for details) or follow instructions below. 🤓
Please refer to the official React Native and Expo documentation for more details. 🤩
General setup
We will need the Node.js and Git installed before we start.
Please check the docs to ensure everything is installed on your machine.
Now let's create a new app.
Run npx create-expo-app@latest --template blank-typescript command.
Type your project name.
Change the directory to your project with cd <your-project-name> command.
Run npm run start to start Metro Bundler.
Press i to start the iOS simulator or a to run the Android emulator.📱
Absolute path imports
To use absolute path imports, e.g. import { ComponentA } from 'src/components/A' (notice path starts with src), we need to add baseUrl parameter to the compilerOptions of tsconfig.json.
{
"compilerOptions": {
"baseUrl": "./"
},
...
}
{
"compilerOptions": {
"baseUrl": "./"
},
...
}
Move App.tsx to src folder
It's good to have all source files in one place. So let's move App.tsx to src with mv App.tsx src command.
Next, we need to change the index.ts file inside our project's root to load the App component from the src folder:
Let's add a new check-typescript script to our package.json.
...
"scripts": {
...
"check-typescript": "tsc --noEmit"
},
...
...
"scripts": {
...
"check-typescript": "tsc --noEmit"
},
...
Now we can run the npm run check-typescript command to check our code for errors with the TypeScript compiler.
ESLint
ESLint is a JavaScript linter that helps you find and fix errors in your code. It's a great tool to help you write better code and catch mistakes before they make it to production. In conjunction, you can use Prettier, a code formatter that ensures all the code files follow a consistent styling.
npx expo lint
npx expo lint
If you're using VS Code, install the ESLint extension to lint your code as you type.
Add a new check-eslint script to our package.json.
Now we can run the npm run check-eslint command to check our code for errors with ESLint. And npm run check-eslint --fix to fix errors automatically.
Lint script
Let's combine TypeScript and ESLint checks so we can run both at once.
Add a new lint script to our package.json.
...
"scripts": {
...
"lint": "npm run check-typescript && npm run check-eslint"
},
...
...
"scripts": {
...
"lint": "npm run check-typescript && npm run check-eslint"
},
...
Prettier
Prettier is an opinionated code formatter. Let's install it.
npx expo install -- --save-dev prettier
npx expo install -- --save-dev prettier
We will also need .prettierrc.js config file in the project root.
module.exports = {
semi: false,
trailingComma: 'none',
singleQuote: true,
printWidth: 100,
tabWidth: 2,
useTabs: false,
}
module.exports = {
semi: false,
trailingComma: 'none',
singleQuote: true,
printWidth: 100,
tabWidth: 2,
useTabs: false,
}
Sort imports
Unsorted imports look ugly. Also, it could be hard to read and add new imports. So why not sort them automatically? We can do it with trivago/prettier-plugin-sort-imports.
When you're ready to release, run standard-version.
npm install --save-dev standard-version
npm install --save-dev standard-version
Create the .versionrc.js config:
module.exports = {
types: [
{ type: 'feat', section: 'New features' },
{ type: 'fix', section: 'Bug fixes' },
{ type: 'change', section: 'Changes' },
{ type: 'chore', hidden: true },
{ type: 'docs', hidden: true },
{ type: 'style', hidden: true },
{ type: 'perf', hidden: true },
{ type: 'test', hidden: true }
]
}
module.exports = {
types: [
{ type: 'feat', section: 'New features' },
{ type: 'fix', section: 'Bug fixes' },
{ type: 'change', section: 'Changes' },
{ type: 'chore', hidden: true },
{ type: 'docs', hidden: true },
{ type: 'style', hidden: true },
{ type: 'perf', hidden: true },
{ type: 'test', hidden: true }
]
}
We enabled the feat, fix, and change commit types. If you want to enable the other commit types, you can remove the hidden boolean and replace it with the section string, and provide a title.
Add new release script to package.json:
...
"scripts": {
...
"release": "standard-version"
},
...
...
"scripts": {
...
"release": "standard-version"
},
...
Now we can run the npm run release command to get the changelog.
We will use Husky to check if our commit messages follow the conventional commits rules, run the lint check, and format staged code with Prettier and ESLint.