# Qwik City App ⚡️ - [Qwik Docs](https://qwik.dev/) - [Discord](https://qwik.dev/chat) - [Qwik GitHub](https://github.com/QwikDev/qwik) - [@QwikDev](https://twitter.com/QwikDev) - [Vite](https://vitejs.dev/) --- ## Project Structure This project is using Qwik with [QwikCity](https://qwik.dev/qwikcity/overview/). QwikCity is just an extra set of tools on top of Qwik to make it easier to build a full site, including directory-based routing, layouts, and more. Inside your project, you'll see the following directory structure: ``` ├── public/ │ └── ... └── src/ ├── components/ │ └── ... └── routes/ └── ... ``` - `src/routes`: Provides the directory-based routing, which can include a hierarchy of `layout.tsx` layout files, and an `index.tsx` file as the page. Additionally, `index.ts` files are endpoints. Please see the [routing docs](https://qwik.dev/qwikcity/routing/overview/) for more info. - `src/components`: Recommended directory for components. - `public`: Any static assets, like images, can be placed in the public directory. Please see the [Vite public directory](https://vitejs.dev/guide/assets.html#the-public-directory) for more info. ## Add Integrations and deployment Use the `npm run qwik add` command to add additional integrations. Some examples of integrations includes: Cloudflare, Netlify or Express Server, and the [Static Site Generator (SSG)](https://qwik.dev/qwikcity/guides/static-site-generation/). ```shell npm run qwik add # or `yarn qwik add` ``` ## Development Development mode uses [Vite's development server](https://vitejs.dev/). The `dev` command will server-side render (SSR) the output during development. ```shell npm start # or `yarn start` ``` > Note: during dev mode, Vite may request a significant number of `.js` files. This does not represent a Qwik production build. ## Preview The preview command will create a production build of the client modules, a production build of `src/entry.preview.tsx`, and run a local server. The preview server is only for convenience to preview a production build locally and should not be used as a production server. ```shell npm run preview # or `yarn preview` ``` ## Production The production build will generate client and server modules by running both client and server build commands. The build command will use Typescript to run a type check on the source code. ```shell npm run build # or `yarn build` ``` ## Cloudflare Pages Cloudflare's [wrangler](https://github.com/cloudflare/wrangler) CLI can be used to preview a production build locally. To start a local server, run: ``` npm run serve ``` Then visit [http://localhost:8787/](http://localhost:8787/) ### Deployments [Cloudflare Pages](https://pages.cloudflare.com/) are deployable through their [Git provider integrations](https://developers.cloudflare.com/pages/platform/git-integration/). If you don't already have an account, then [create a Cloudflare account here](https://dash.cloudflare.com/sign-up/pages). Next go to your dashboard and follow the [Cloudflare Pages deployment guide](https://developers.cloudflare.com/pages/framework-guides/deploy-anything/). Within the projects "Settings" for "Build and deployments", the "Build command" should be `npm run build`, and the "Build output directory" should be set to `dist`. ### Function Invocation Routes Cloudflare Page's [function-invocation-routes config](https://developers.cloudflare.com/pages/platform/functions/routing/#functions-invocation-routes) can be used to include, or exclude, certain paths to be used by the worker functions. Having a `_routes.json` file gives developers more granular control over when your Function is invoked. This is useful to determine if a page response should be Server-Side Rendered (SSR) or if the response should use a static-site generated (SSG) `index.html` file. By default, the Cloudflare pages adaptor _does not_ include a `public/_routes.json` config, but rather it is auto-generated from the build by the Cloudflare adaptor. An example of an auto-generate `dist/_routes.json` would be: ``` { "include": [ "/*" ], "exclude": [ "/_headers", "/_redirects", "/build/*", "/favicon.ico", "/manifest.json", "/service-worker.js", "/about" ], "version": 1 } ``` In the above example, it's saying _all_ pages should be SSR'd. However, the root static files such as `/favicon.ico` and any static assets in `/build/*` should be excluded from the Functions, and instead treated as a static file. In most cases the generated `dist/_routes.json` file is ideal. However, if you need more granular control over each path, you can instead provide you're own `public/_routes.json` file. When the project provides its own `public/_routes.json` file, then the Cloudflare adaptor will not auto-generate the routes config and instead use the committed one within the `public` directory.