## What? Update examples `.gitignore` files for parity with [Yarn's official recommendations](https://v3.yarnpkg.com/getting-started/qa#which-files-should-be-gitignored), accounting for Yarn's modern Plug-n-Play functionality. ## Why? New projects initialized with `create-next-app` presently add various extraneous files from the Yarn cache to the initial commit. This is most notable in the case of the Next SWC binary, which may exceed 100M in some environments (empirically, 64-bit Darwin and WSL2 Ubuntu, and very probably other unix/linux environments), and prevent users from pushing their new projects to free GitHub repositories without rewriting the commit history to exclude the extraneous files, or unnecessarily setting up Git LFS to include them. ## How? I have errored on the side of exclusion to enable users to push their CNA projects to GitHub as-is and for parity with other package managers, while still providing the opportunity to opt in to additional functionality provided by modern Yarn. These changes follow the recommendations for **non**-[Zero-Install](https://yarnpkg.com/features/caching#zero-installs) configurations, as Zero-Install functionality is an extension on top of the base package manager experience, and may necessitate additional configuration and present additional complications for unsuspecting users, so I think it's best left up to the user to opt-in. On account of the majority of publicly available Next.js-based projects comprising general consumer-facing websites, it is my belief that the majority of Next projects would not benefit from Yarn's Zero-Install functionality, and that explicitly facilitating it by default would break status quo with all other non-Yarn CNA projects. Contrary to the example `.gitignore`s provided by Yarn, I've excluded the `.yarn/sdks` directory as it contains IDE-specific tooling; I feel it would be presumptuous for an environmentally-agnostic tool to target and provide package-manager-specific tooling for specific editors. This too should be left to the user to opt-in to and provide for their project if they deem necessary. I have retained the current `.gitignore`'s exclusion of the `/.pnp` directory for backwards compatibility with older versions of Yarn (the files therein have since been reallocated to the `.yarn` directory addressed by these changes, but I am not clear on when that delineation occurred or the prevalence of Yarn installations which depend on the former convention). Maintaining the exclusion here, in the worst case, implies additional downloads (on an order of magnitude merely similar to using npm from the outset) rather than failure. CC: @samcx ### Adding or Updating Examples - [x] The "examples guidelines" are followed from our contributing doc https://github.com/vercel/next.js/blob/canary/contributing/examples/adding-examples.md - [x] Make sure the linting passes by running `pnpm build && pnpm lint`. See https://github.com/vercel/next.js/blob/canary/contributing/repository/linting.md Co-authored-by: Sam Ko <[email protected]>
With Docker Compose
This example contains everything needed to get a Next.js development and production environment up and running with Docker Compose.
Benefits of Docker Compose
- Develop locally without Node.js or TypeScript installed ✨
- Easy to run, consistent development environment across macOS, Windows, and Linux teams
- Run multiple Next.js apps, databases, and other microservices in a single deployment
- Multistage builds combined with Output Standalone outputs up to 85% smaller apps (Approximately 110 MB compared to 1 GB with create-next-app)
- Easy configuration with YAML files
How to use
Execute create-next-app with npm, Yarn, or pnpm to bootstrap the example:
npx create-next-app --example with-docker-compose with-docker-compose-app
yarn create next-app --example with-docker-compose with-docker-compose-app
pnpm create next-app --example with-docker-compose with-docker-compose-app
Optionally, after the installation is complete:
- Run
cd next-app, then runnpm installoryarn installorpnpm installto generate a lockfile.
It is recommended to commit a lockfile to version control. Although the example will work without one, build errors are more likely to occur when using the latest version of all dependencies. This way, we're always using a known good configuration to develop and run in production.
Prerequisites
Install Docker Desktop for Mac, Windows, or Linux. Docker Desktop includes Docker Compose as part of the installation.
Development
First, run the development server:
# Create a network, which allows containers to communicate
# with each other, by using their container name as a hostname
docker network create my_network
# Build dev
docker compose -f compose.dev.yaml build
# Up dev
docker compose -f compose.dev.yaml up
Open http://localhost:3000 with your browser to see the result.
You can start editing the page by modifying pages/index.tsx. The page auto-updates as you edit the file.
Production
Multistage builds are highly recommended in production. Combined with the Next Output Standalone feature, only node_modules files required for production are copied into the final Docker image.
First, run the production server (Final image approximately 110 MB).
# Create a network, which allows containers to communicate
# with each other, by using their container name as a hostname
docker network create my_network
# Build prod
docker compose -f compose.prod.yaml build
# Up prod in detached mode
docker compose -f compose.prod.yaml up -d
Alternatively, run the production server without multistage builds (Final image approximately 1 GB).
# Create a network, which allows containers to communicate
# with each other, by using their container name as a hostname
docker network create my_network
# Build prod without multistage
docker compose -f compose.prod-without-multistage.yaml build
# Up prod without multistage in detached mode
docker compose -f compose.prod-without-multistage.yaml up -d
Open http://localhost:3000.
Useful commands
# Stop all running containers
docker kill $(docker ps -aq) && docker rm $(docker ps -aq)
# Free space
docker system prune -af --volumes