# Next.js A place for me to learn Next.js > Next.js is developed & maintained by Vercel ## Installation (macOS) Requirements: - Homebrew already installed Install nodejs ```zsh brew install node@22 ``` Check node version ```zsh node -v ``` Check NPM version ```zsh npm -v ``` If you get some errors: ```zsh brew cleanup ``` Then try again ## Create new project ```zsh npx create-next-app@latest ``` Afterwards some questions about the project will be asked. You can leave the settings as default. ## Upgrade to newer Next.js version ```zsh npx @next/codemod@canary upgrade latest ``` ## Run development server ```zsh npm run dev ``` Afterwards the site can be accessed in the browser at `http://localhost:3000`.  ## General structure The whole app is organzied in multiple folders. THe typescript files for the app are stored in `src/app`. The code is written in TypeScript. In `package.json` are the dependencies saved. The Next.js configuration is saved in `next.config.ts`. Each folder in `app` represents a route of the application, but its only accessable when a `page.js` or `route.js` file is contained. When a folder is named with `_` as prefix, it will be ignored by the routing and not accessable from within the application. Folders in parenthesis (Klammern) while not be show in the route. (https://nextjs.org/docs/app/getting-started/project-structure#organize-routes-without-affecting-the-url-path) Slugs can be defined by creating a folder in brackets [] like [slug]. Basic tutorial: https://www.youtube.com/watch?v=__mSgDEOyv8 By default the code is executed on the server. When you want to change this behavior the following has to be added to the top of the file: ```tsx 'use client'; ``` Its possible to render the most parts of an app on the server and some components, like the hover state of the navbar, on the client. Depending on what makes most sense for the application. Thoose components should be move to a separated JS or JSX file. The main function of the app or just a file is defined by `export default`. The layout of the app is defined in `layout.js`. The content of `layout.js` is shared between all pages. ## Styling In `global.css` some global CSS styling rules were defined. Usally this file is imported in the root layout of the app `layout.js`/`layout.jsx`/`layout.tsx`. Commonly TailwindCSS is used with Next.js for easier stylings. This can be recognized in the beginning of the `global.css`-File: ```css @tailwind base; @tailwind components; @tailwind utilities; ``` As an alternative to TailwindCSS also CSS modules can be used for styling. There you would create a own CSS file for every component which needs styling and only import those into the project. More details about that can be found in the [Next.js docs](https://nextjs.org/learn/dashboard-app/css-styling). Additionaly there are other, less popular methods for styling your Next.js app like Sass or CSS-in-JS libraries. And, because in the end just normal CSS is rendered, you can use any styling solution you want/already know too with Next.js. ### TailwindCSS Tailwind is a CSS framework, which enables you to style the whole website without ever leaving the HTML or Next.js code. You never have to touch a CSS file. All styling is done via predefined CSS classes. When using VScode as Editor the [`Tailwind CSS IntelliSense`](https://marketplace.visualstudio.com/items/?itemName=bradlc.vscode-tailwindcss) should be installed. It enables autofill for Tailwind css classes aund adds preview of the css behind a class when hovering over it. It improves the development process with TailwindCSS a lot. The styling is applied when adding a css class to an HTML object. ```jsx
``` When non existing tailwind class matches the value you need, a custom value can be assigend, which will automatically be generated by tailwind on build. ```jsx ``` #### Common classes | class | what it does | | --- | --- | | top-0 | top: 0; | | left-0 | left: 0; | | w-0 | width | | h-0 | height | | m-0 | margin | | mx-auto | margin-inline: auto; | | p-0 | padding | | flex | display: flex; | | h-screen | 100vh; -> viewport height | | bg-gray-900 | background-color | | text-white | text color | | shadow-lg | adds a nice shadow (different variantes are available) | | rounded-3xl | border-radius | | transition-all | add a transition to every property that changes | | hover: