Defining Our Core Frontend Stack
Here's the core stack we'll be using:
- React - as the view library
- Zustand - for global state management
- Vite - as the bundler
- Tailwind CSS - for styling
Setting Up the Frontend App
Let's get started with the frontend setup. Begin by creating the project
folder and initializing a Vite project:
cd ./project
npm create vite@latest
✔ Project name: … ./
✔ Select a framework: › React
✔ Select a variant: › TypeScript + SWC
npm install
Cool! We have App with the following structure (or similar one if in the future templae changes)
project-root/
│
├── node_modules/
│
├── public/
│
├── src/
│ ├── assets/
│ │ ├── App.css
│ │ ├── App.tsx
│ │ ├── index.css
│ │ ├── main.tsx
│ │ └── vite-env.d.ts
│
├── .gitignore
│
├── README.md
│
├── eslint.config.js
│
├── index.html
│
├── package-lock.json
│
├── package.json
│
├── tsconfig.app.json
│
├── tsconfig.json
│
├── tsconfig.node.json
│
├── vite.config.ts
Let’s add port config so our app runs every time with the same
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react-swc";
// https://vitejs.dev/config/
export default defineConfig({
server: {
port: 3000,
},
plugins: [react()],
});
Tweaking ESLint
Firstly, we need to tweak ESLint. The default template sets recommended settings, which do not enforce a specific code style strictly. So let's improve this by updating the eslint.config.js
file with:
import js from "@eslint/js";
import globals from "globals";
import reactHooks from "eslint-plugin-react-hooks";
import reactRefresh from "eslint-plugin-react-refresh";
import tseslint from "typescript-eslint";
export default tseslint.config(
{ ignores: ["dist"] },
{
extends: [js.configs.recommended, ...tseslint.configs.recommended],
files: ["**/*.{ts,tsx}"],
languageOptions: {
ecmaVersion: 2020,
globals: globals.browser,
},
plugins: {
"react-hooks": reactHooks,
"react-refresh": reactRefresh,
},
rules: {
...reactHooks.configs.recommended.rules,
"react-refresh/only-export-components": [
"warn",
{ allowConstantExport: true },
],
"@typescript-eslint/no-explicit-any": "error"
},
}
);
Adding Prettier
To ensure a consistent code style, let's add prettier. Create a .prettierrc
file with the following contents:
{
"tabWidth": 4,
"useTabs": false,
"jsxSingleQuote": false,
"bracketSpacing": true,
"jsxBracketSameLine": false
}
Now after you run the project npm run dev you should see starting screen like this one
Configuring Tailwind CSS
Here comes tailwind configurations. Firstly Install tailwind:
npm install -D tailwindcss postcss autoprefixer
npm install @heroicons/react
npx tailwindcss init -p
You should see a couple new configurational files in the root not
tailwind.config.js
postcss.config.js
to the index.html we will add link to tailwind font:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Money manager</title>
<link rel="stylesheet" href="https://rsms.me/inter/inter.css" />
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>
Secondly, add configurations inside tailwind.config.js so that the library knows where is our code place
const defaultTheme = require('tailwindcss/defaultTheme')
/** @type {import('tailwindcss').Config} */
export default {
content: [
"./index.html",
"./src/**/*.{js,ts,jsx,tsx}",
],
theme: {
extend: {
fontFamily: {
sans: ['Inter var', ...defaultTheme.fontFamily.sans],
},
},
},
plugins: [],
}
Thirdly, import tailwind library in index.css to have styles availiable in our bundle
@tailwind base;
@tailwind components;
@tailwind utilities;
Finally we are going to test our changes. Inside of the App.tsx write a hello world with tailwind classes
function App() {
return (
<>
<h1 className="text-3xl font-bold underline">Hello world!</h1>
</>
);
}
export default App;
If you see screen like this after reloading the project you’ve done everything right!
Clean Up
Delete any predefined template files and folders you don't need. Your final folder structure should look like this:
node_modules
public
src
├─ App.tsx
├─ index.css
├─ main.tsx
├─ vite-env.d.ts
.gitignore
.prettierignore
.prettierrc
README.md
eslint.config.js
index.html
package-lock.json
package.json
postcss config.js
tailwind.config.js
tsconfig.app.json
tsconfig.json
tsconfig.node.json
vite.config.ts
In case you face some issues or bugs you can copy code for this first lessong from this link:
This concludes the setup for our frontend app.
Happy coding!
Top comments (0)