144 Commits
Author SHA1 Message Date
Anthony Fu 29c1296310 chore: update deps 2026-08-22 07:47:20 +09:00
Anthony Fu a8c8345f75 chore: update deps 2026-03-18 18:33:48 +09:00
Anthony Fu 4530d4c622 chore: update deps 2026-02-09 17:01:04 +09:00
lita-jerry afa6e86dec refactor: recommend project references over single extends in root tsconfig (#139) 2026-01-06 15:38:57 +09:00
Anthony Fu 95d7f62dd6 chore: update deps 2025-10-28 15:45:43 +09:00
Anthony Fu 544858b2e8 chore: update deps 2025-10-02 16:11:33 +09:00
qianYuanJ ba4258a17b fix: change text-green5 to text-green-400 (#136) 2025-08-01 13:32:55 +09:00
qianYuanJ 7ac7d496b4 fix(docs):Change Nuxt3 in the document to Nuxt4 (#135) 2025-07-30 21:24:30 +09:00
Anthony Fu 4fad52b949 feat: upgrade to Nuxt 4 2025-07-17 09:55:00 +09:00
Anthony Fu 83dae853fe chore: update deps 2025-07-02 10:59:44 +09:00
Anthony Fu 6ddb6f5f86 chore: update deps 2025-06-04 15:30:52 +09:00
Anthony Fu 396067234c chore: use nuxt over nuxi 2025-06-02 17:42:50 +09:00
Anthony Fu d0517d7292 chore: update 2025-06-02 17:42:27 +09:00
云游君 6ccc998e03 chore: add nuxi preview command (#134) 2025-06-02 16:39:48 +08:00
IlyaL 6ce4bb8fff chore: add .DS_Store to .gitignore (#131) 2025-04-12 09:00:58 +08:00
Anthony Fu a32ed11704 chore: update deps 2025-04-08 15:14:53 +09:00
Robin 0b2d1b0d1e feat: use nuxi typecheck to ensure up to date types for development (#129) 2025-04-08 14:11:24 +08:00
IlyaL 03099b8c0a fix: copy pnpm-workspace.yaml for docker build catalog resolution (#130) 2025-04-08 14:02:27 +08:00
Anthony Fu 2e78773c3c chore: update deps 2025-03-27 13:46:24 +09:00
Robin 3d932d5a80 fix: align docker FromAsCasing (#128)
https://docs.docker.com/reference/build-checks/from-as-casing/
2025-03-27 12:44:18 +08:00
Anthony Fu cb26a3a2c8 chore: migrate to pnpm catalogs 2025-03-25 16:11:17 +09:00
Anthony Fu 03d8cd0785 chore: update deps 2025-03-05 16:36:49 +08:00
Anthony Fu 2c6d05f0be feat: use unocss wind4 preset 2025-03-05 15:12:05 +08:00
Anthony Fu 1a3ee1ffab chore: update deps 2025-03-05 12:55:08 +08:00
Anthony Fu 24b4986cfe chore: update deps 2025-02-07 14:52:27 +08:00
Anthony Fu 45826b2c1b chore: update deps 2025-02-05 12:40:45 +08:00
Anthony Fu 9d7aea97ff chore: update deps 2025-01-16 22:55:12 +08:00
Anthony Fu 388854d760 chore: update deps 2024-12-26 17:34:14 +08:00
Anthony Fu 6b9f94acb8 chore: update deps 2024-12-24 14:09:58 +08:00
Anthony Fu 4aaf882b31 chore: update deps 2024-12-06 14:45:07 +08:00
Anthony Fu 67259dc9ed chore: update deps 2024-12-03 13:51:52 +08:00
Anthony Fu c075b454d7 feat: ship unocss fonts 2024-11-29 14:17:58 +08:00
Anthony Fu ac2d73a972 chore: update to vite 6 2024-11-29 13:42:44 +08:00
Charlie ✨andAnthony Fu c1335e69db chore: pin typescript (#126)
Co-authored-by: Anthony Fu <github@antfu.me>
2024-11-27 21:01:23 +08:00
Anthony Fu 4527e35a80 chore: update deps 2024-11-27 18:51:32 +08:00
Anthony Fu 9c339b2046 chore: update deps 2024-11-21 17:02:47 +08:00
云游君 ea0b4d2349 feat: add Dockerfile (#124) 2024-10-28 20:26:25 +08:00
Anthony Fu a146ab16a2 chore: update deps 2024-10-24 23:33:49 +09:00
Anthony Fu 213c6cd424 chore: update deps 2024-10-19 15:05:15 +09:00
Anthony Fu 7b43079b64 chore: update deps 2024-09-19 12:21:05 +02:00
云游君 b168368dbc fix: p tag wrap ul for nuxt ssr (#120) 2024-09-09 02:08:43 +02:00
Max Chang e7ececf87f docs: update file path (#119) 2024-08-30 14:55:17 +02:00
Anthony Fu 8d6b8e2673 chore: update deps 2024-08-26 17:17:16 +02:00
云游君 5f4fa624cb chore: update repo path in README.md (#118) 2024-08-24 21:53:48 +02:00
Anthony Fu fe3b8ce1c1 feat: use nuxt 4 structure 2024-08-14 14:29:01 +02:00
Anthony Fu 3f192323d8 chore: update deps 2024-08-14 14:17:50 +02:00
Hannah JensenandAnthony Fu 1c8e1ab817 feat: update Node.js version in netlify.toml (#117)
Co-authored-by: Anthony Fu <github@antfu.me>
2024-07-25 18:13:04 +02:00
云游君andyunyouyang 43ca598c02 feat: use home layout for index (#116)
Co-authored-by: yunyouyang <yunyouyang@tencent.com>
2024-07-11 23:54:03 +08:00
Joaquín Sánchez 3a235915f2 chore: add antfu open collective (#114) 2024-05-12 04:43:19 +02:00
Anthony Fu 0d631cd09f chore: update deps 2024-05-10 16:03:20 +02:00
Anthony Fu f9d842ee50 chore: update lock 2024-04-23 20:07:43 +02:00
Anthony Fu 7dbf5c3d97 chore: update deps 2024-04-23 18:17:37 +02:00
Anthony Fu 8e9de004c9 chore: update deps 2024-04-11 14:20:08 +02:00
Anthony Fu e284c16c54 chore: update deps 2024-04-08 16:28:19 +02:00
Anthony Fu 6efa4c6c7f chore: update deps 2024-04-05 13:39:43 +02:00
Anthony Fu 1c429961e4 chore: update deps 2024-03-28 10:35:12 +01:00
Anthony Fu 1f0f6ed6e9 chore: lint 2024-03-28 08:56:52 +01:00
Anthony Fu 486335d807 chore: update deps 2024-03-28 01:05:16 +01:00
Anthony Fu cf7040f16f chore: update deps 2024-03-27 00:15:15 +01:00
Anthony Fu ebd06e31d2 chore: update 2024-03-20 20:23:39 +01:00
Anthony Fu b2248289ab feat: use @nuxt/eslint 2024-03-20 20:20:07 +01:00
Aymane Dara Hlamnach 8fb9588ea2 fix(pwa): set address bar theme color (#109) 2024-02-05 15:19:15 +01:00
Anthony Fu d29567248b feat: add nuxt-module-eslint-config 2024-01-19 11:00:23 +01:00
Anthony Fu 4e0e30dd01 chore: update deps 2023-12-10 20:36:20 +01:00
Anthony Fu 0f4c45c4cc chore: improve linting 2023-12-07 18:33:58 +01:00
Anthony Fu b45e219298 feat: enable formatters in eslint-config 2023-12-04 18:05:08 +01:00
Anthony Fu 32b6eba6cb chore: update deps 2023-11-27 11:54:47 +01:00
Anthony Fu 8be97a4237 chore: update deps 2023-11-20 20:14:21 +01:00
Anthony Fu 0e682a796d chore: update deps 2023-10-20 04:11:10 +08:00
Anthony Fu aa30218698 chore: fix eslint vscode setup 2023-09-28 08:47:47 +08:00
Anthony Fu ea6033cfe9 chore: update deps, migrate to new eslint format 2023-09-28 07:55:17 +08:00
Anthony Fu 198e2c5e4b chore: update 2023-08-28 10:41:28 +02:00
Anthony Fu bf20ae4c2b chore: update deps 2023-08-28 05:01:23 +02:00
Anthony Fu 8a21f03439 chore: update deps 2023-08-06 11:42:54 +02:00
Anthony Fu cbc248c5d0 chore: update lock 2023-08-03 11:18:18 +02:00
Anthony Fu a6e5e98f6f chore: update deps 2023-08-01 17:50:56 +02:00
Anthony Fu f93218a441 chore: update deps 2023-07-31 21:04:12 +02:00
Anthony Fu 6ceecab0bd chore: update deps 2023-07-18 11:27:01 +02:00
Anthony Fu 38b0c41e9c chore: fix types 2023-07-18 11:25:35 +02:00
RinatMadreiter e6497af762 docs: update README.md (#96) 2023-06-26 11:40:57 +02:00
Anthony Fu 80f272cb08 chore: update deps 2023-06-21 14:24:11 +02:00
Anthony Fu b78a03fb2c feat: enable typedPages 2023-06-13 17:47:28 +02:00
Anthony Fu 929c7a1914 chore: update deps 2023-06-13 16:43:13 +02:00
Joaquín Sánchez fefb1e96a5 chore: update pwa module to fix typecheck in plugin template (#93) 2023-05-21 14:06:47 +02:00
云游君 405aaaa69d ci: add lint & typecheck by github actions (#94) 2023-05-21 14:06:32 +02:00
Anthony Fu 81d172961c chore: update deps 2023-05-20 15:40:34 +02:00
Anthony Fu 69b4783b40 chore: update deps 2023-05-18 11:19:15 +02:00
rogepiandMickeyZheng 1ab3660e88 chore: update deps (#92)
Co-authored-by: MickeyZheng <mickeyzheng@cherrypicks.com>
2023-05-18 11:17:55 +02:00
Anthony Fu 4d6212751b chore: update deps 2023-05-10 18:03:30 +02:00
_lmmmmmm 9f216ea432 docs: add devtools (#88) 2023-05-04 13:33:59 +02:00
Anthony Fu 9ef5d4b1d1 fix: enable renderJsonPayloads, close #84 2023-04-12 11:43:34 +02:00
Anthony Fu b6a79728d2 chore: update deps 2023-04-11 22:07:56 +02:00
Anthony Fu 704918fa58 chore: update deps 2023-04-11 14:42:33 +02:00
Anthony Fu fa85c45af1 chore: disable reactivity transform 2023-03-17 08:48:06 +01:00
Anthony Fu 799410e42e feat: install @nuxt/devtools 2023-03-17 08:46:50 +01:00
Anthony Fu 8450b29d10 chore: update deps 2023-03-17 08:46:13 +01:00
Bogdan Ciuca 1c0b7d098b fix: type errors and warnings (#81) 2023-03-17 08:44:52 +01:00
Joaquín Sánchez a957421136 chore: include offline support (#79) 2023-02-22 11:31:26 +01:00
Joaquín SánchezandAnthony Fu ac3bac5513 feat: PWA using @vite-pwa/nuxt module with auto update strategy (#75)
Co-authored-by: Anthony Fu <anthonyfu117@hotmail.com>
2023-02-18 12:00:15 +01:00
Tolga Akkiraz 575149c356 chore: remove attributify workaround (#78) 2023-02-18 11:58:11 +01:00
Anthony Fu 86221d2c52 chore: update deps 2023-02-08 23:46:20 +01:00
Joaquín Sánchez c5df9d4959 docs: add license and funding (#76) 2023-02-07 17:20:33 +01:00
yuyin 48d3dcdd42 chore: update deps (#74) 2023-01-29 04:57:08 +01:00
_lmmmmmm 71e6127b16 chore: update nuxt3 link url (#72) 2022-12-13 10:38:42 +01:00
Oumar Barry 613b35cc7b chore: remove pnpm workaround for netlify (#70) 2022-12-13 10:38:26 +01:00
云游君 a814625790 fix: color.preference by @nuxtjs/color-mode@3.2.0 (#69) 2022-11-29 20:46:38 +08:00
EvanLong fe93f8d166 fix: rename 404.vue to [...all].vue (#67) 2022-11-27 16:10:51 +08:00
云游君 e92eb66e52 fix: toggleDark not works (#66) 2022-11-17 01:20:17 +08:00
Anthony Fu e2b9e7d23d chore: update deps 2022-11-16 23:49:03 +08:00
Anthony Fu 2342db4af0 chore: update deps 2022-11-13 13:02:15 +08:00
mohen aa66af82a8 fix: data.preview, data.value Object is possibly 'null'. (#63) 2022-11-02 17:36:40 +08:00
Anthony Fu 5b74fdd684 fix: upgrade to rc12 and fix UnoCSS FOUC 2022-11-01 15:00:43 +08:00
Cinob 1404cd0d12 refactor: defineNuxtConfig is auto imported (#62) 2022-10-09 16:07:57 +08:00
Anthony Fu 0467bd915a chore: update deps 2022-09-27 09:38:30 +08:00
菜狗 2698de3396 chores: add generate scripts (#59) 2022-09-06 00:17:08 +08:00
Anthony Fu 0836a3b7e4 chore: update deps 2022-08-30 19:04:49 +08:00
Anthony Fu a6d3353e1d chore: update deps 2022-08-26 02:11:19 +08:00
Arbust0 cabfc636f7 chore:layout typo (#55) 2022-08-21 21:35:39 +08:00
Anthony Fu 598f258ef4 chore: update deps 2022-08-04 23:10:28 +08:00
Anthony Fu 67428fdc37 fix: netlify workaround 2022-08-04 23:09:48 +08:00
Anthony Fu 45042088f7 chore: update lock 2022-07-22 14:38:58 +08:00
Anthony Fu 873a77754f feat: prepare nuxt on postinstall, close #51 2022-07-20 03:43:08 +08:00
Anthony Fu 3e29a5a8aa chore: update deps 2022-07-19 21:14:33 +08:00
Anthony Fu ea9b216f95 chore: update deps 2022-07-06 17:55:25 +08:00
Anthony Fu df99989c4d chore: update deps 2022-06-14 23:20:49 +08:00
Anthony Fu 1a38d24265 chore: update deps, close #44 2022-06-04 17:39:18 +08:00
Anthony Fu 3b3e7ecac3 chore: update deps 2022-05-12 17:41:14 +08:00
Anthony Fu ffb8725ac1 chore: update deps 2022-05-03 05:09:07 +08:00
Anthony Fu 687f89b058 chore: strict by default 2022-04-27 17:38:29 +08:00
Sébastien Chopin e7f0a4b7eb feat: improvements (#35)
* feat: improvements

* chore: upgrade to rc1
2022-04-21 11:32:24 +08:00
Hasan Demirtaş d42083f93f fix: color mode preference (#36) 2022-04-21 11:31:20 +08:00
Hasan Demirtaş b1eaea501a feat: introduce layouts (#28) 2022-04-20 23:28:49 +08:00
Hasan Demirtaş 7bfa84d907 fix: color mode (#33) 2022-04-20 23:27:38 +08:00
Lo 46175373e9 fix: <a> target (#34) 2022-04-20 23:27:18 +08:00
Anthony Fu 1ad36a1abb chore: update deps 2022-04-20 22:07:12 +08:00
Anthony Fu 3600c71eb6 chore: use nuxt package rc 2022-04-20 20:51:43 +08:00
Anthony Fu 6f1a843649 feat: use @nuxtjs/color-mode, close #24 2022-04-19 11:27:55 +08:00
Anthony Fu 64ee601c2b chore: update deps 2022-04-19 10:59:13 +08:00
Anthony Fu 6050e07123 feat: auto import for store 2022-04-19 10:57:23 +08:00
Anthony Fu 581b36d3aa feat: enable reactivityTransform 2022-04-19 10:55:43 +08:00
Johann Schopplich 2d2eef40c4 chore: buildModules is deprecated (#27) 2022-04-19 10:54:37 +08:00
Johann Schopplich d99e15b100 refactor: use defineEventHandler for server api (#26) 2022-04-19 10:52:47 +08:00
Anthony Fu 1a274da6c4 chore: update deps 2022-04-13 06:35:41 +08:00
Anthony Fu 792793090f chore: update deps 2022-04-08 15:12:25 +08:00
52 changed files with 12917 additions and 6050 deletions

No files matched your search

-4
View File
@@ -1,4 +0,0 @@
dist
node_modules
.output
.nuxt
-3
View File
@@ -1,3 +0,0 @@
{
"extends": "@antfu"
}
+2
View File
@@ -0,0 +1,2 @@
open_collective: antfu
github: [antfu]
+43
View File
@@ -0,0 +1,43 @@
name: CI
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: pnpm/action-setup@v6
- uses: actions/setup-node@v7
with:
node-version: lts/*
cache: pnpm
- name: Install
run: pnpm install
- name: Lint
run: pnpm run lint
typecheck:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: pnpm/action-setup@v6
- uses: actions/setup-node@v7
with:
node-version: lts/*
cache: pnpm
- name: Install
run: pnpm install
- name: Typecheck
run: pnpm run typecheck
+3
View File
@@ -1,6 +1,9 @@
.DS_Store
node_modules
*.log
dist
.output
.nuxt
.env
.idea/
public/assets/fonts
-1
View File
@@ -1 +0,0 @@
shamefully-hoist=true
+11
View File
@@ -0,0 +1,11 @@
{
"recommendations": [
"antfu.iconify",
"antfu.unocss",
"antfu.goto-alias",
"csstools.postcss",
"dbaeumer.vscode-eslint",
"vue.volar",
"antfu.pnpm-catalog-lens"
]
}
+45
View File
@@ -0,0 +1,45 @@
{
"files.associations": {
"*.css": "postcss"
},
// Disable the default formatter, use eslint instead
"prettier.enable": false,
"editor.formatOnSave": false,
// Auto fix
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit",
"source.organizeImports": "never"
},
// Silent the stylistic rules in you IDE, but still auto fix them
"eslint.rules.customizations": [
{ "rule": "style/*", "severity": "off" },
{ "rule": "*-indent", "severity": "off" },
{ "rule": "*-spacing", "severity": "off" },
{ "rule": "*-spaces", "severity": "off" },
{ "rule": "*-order", "severity": "off" },
{ "rule": "*-dangle", "severity": "off" },
{ "rule": "*-newline", "severity": "off" },
{ "rule": "*quotes", "severity": "off" },
{ "rule": "*semi", "severity": "off" }
],
// Enable eslint for all supported languages
"eslint.validate": [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact",
"vue",
"html",
"markdown",
"json",
"jsonc",
"yaml"
],
"interline-translate.knownPopularWordCount": 6000,
"iconify.annotations": true,
"iconify.inplace": true
}
+22
View File
@@ -0,0 +1,22 @@
FROM node:20-alpine AS build-stage
WORKDIR /app
RUN corepack enable
COPY .npmrc package.json pnpm-lock.yaml pnpm-workspace.yaml ./
RUN --mount=type=cache,id=pnpm-store,target=/root/.pnpm-store \
pnpm install --frozen-lockfile
COPY . .
RUN pnpm build
# SSR
FROM node:20-alpine AS production-stage
WORKDIR /app
COPY --from=build-stage /app/.output ./.output
EXPOSE 3000
CMD ["node", ".output/server/index.mjs"]
+21
View File
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2021-PRESENT Anthony Fu<https://github.com/antfu>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+26 -24
View File
@@ -1,59 +1,61 @@
<p align="center">
<img src="https://user-images.githubusercontent.com/11247099/140462375-7b7ac4db-35b7-453c-8a05-13d8d20282c4.png" width="600"/>
<img src="https://user-images.githubusercontent.com/11247099/140462375-7b7ac4db-35b7-453c-8a05-13d8d20282c4.png" alt="Vitesse" width="600"/>
</p>
<h2 align="center">
<a href="https://github.com/antfu/vitesse">Vitesse</a> for Nuxt 3
<a href="https://github.com/antfu/vitesse">Vitesse</a> for Nuxt 4
</h2><br>
<pre align="center">
🧪 Working in Progress
</pre>
<p align="center">
<br>
<a href="https://vitesse-nuxt3.netlify.app/">🖥 Online Preview</a>
<br><br>
<a href="https://stackblitz.com/github/antfu/vitesse-nuxt3"><img src="https://developer.stackblitz.com/img/open_in_stackblitz.svg" alt=""></a>
<a href="https://stackblitz.com/github/antfu/vitesse-nuxt"><img src="https://developer.stackblitz.com/img/open_in_stackblitz.svg" alt="Open in StackBlitz" /></a>
</p>
## Features
- [💚 Nuxt 3](https://v3.nuxtjs.org) - SSR, ESR, File-based routing, components auto importing, modules, etc.
- 💚 [Nuxt 4](https://nuxt.com/) - SSR, ESR, File-based routing, components auto importing, modules, etc.
- ⚡️ Vite - Instant HMR
- ⚡️ Vite - Instant HMR.
- 🎨 [UnoCSS](https://github.com/antfu/unocss) - The instant on-demand atomic CSS engine.
- 🎨 [UnoCSS](https://github.com/unocss/unocss) - The instant on-demand atomic CSS engine.
- 😃 Use icons from any icon sets in Pure CSS, powered by [UnoCSS](https://github.com/antfu/unocss)
- 😃 Use icons from any icon sets in Pure CSS, powered by [UnoCSS](https://github.com/unocss/unocss).
- 🔥 The `<script setup>` syntax
- 🔥 The `<script setup>` syntax.
- 🍍 [State Management via Pinia](https://pinia.esm.dev/)
- 🍍 [State Management via Pinia](https://github.com/vuejs/pinia), see [./app/composables/user.ts](./app/composables/user.ts).
- 📑 [Layout system](./app/layouts).
- 📥 APIs auto importing - for Composition API, VueUse and custom composables.
- 🏎 Zero-config cloud functions and deploy
- 🏎 Zero-config cloud functions and deploy.
- 🦾 TypeScript, of course
- 🦾 TypeScript, of course.
- 📲 [PWA](https://github.com/vite-pwa/nuxt) with offline support and auto-update behavior.
## Plugins
### Nuxt Modules
- [VueUse](https://github.com/vueuse/vueuse) - collection of useful composition APIs
- [UnoCSS](https://github.com/antfu/unocss) - the instant on-demand atomic CSS engine.
- [Pinia](https://pinia.esm.dev/) - intuitive, type safe, light and flexible Store for Vue.
- [VueUse](https://github.com/vueuse/vueuse) - collection of useful composition APIs.
- [ColorMode](https://github.com/nuxt-modules/color-mode) - dark and Light mode with auto detection made easy with Nuxt.
- [UnoCSS](https://github.com/unocss/unocss) - the instant on-demand atomic CSS engine.
- [Pinia](https://github.com/vuejs/pinia) - intuitive, type safe, light and flexible Store for Vue.
- [VitePWA](https://github.com/vite-pwa/nuxt) - zero-config PWA Plugin for Nuxt 4.
- [DevTools](https://github.com/nuxt/devtools) - unleash Nuxt Developer Experience.
## IDE
We recommend using [VS Code](https://code.visualstudio.com/) with [Volar](https://github.com/johnsoncodehk/volar) to get the best experience (You might want to disable Vetur if you have it).
We recommend using [VS Code](https://code.visualstudio.com/) with [Volar](https://github.com/johnsoncodehk/volar) to get the best experience (You might want to disable [Vetur](https://vuejs.github.io/vetur/) if you have it).
## Variations
- [vitesse](https://github.com/antfu/vitesse) - Opinionated Vite Starter Template
- [vitesse-lite](https://github.com/antfu/vitesse-lite) - Lightweight version of Vitesse
- [vitesse-nuxt3](https://github.com/antfu/vitesse-nuxt3) - Vitesse for Nuxt 3
- [vitesse-nuxt-bridge](https://github.com/antfu/vitesse-nuxt-bridge) - Vitesse for Nuxt 2 with Bridge
- [vitesse-webext](https://github.com/antfu/vitesse-webext) - WebExtension Vite starter template
@@ -61,18 +63,18 @@ We recommend using [VS Code](https://code.visualstudio.com/) with [Volar](https:
### Online
<a href="https://stackblitz.com/github/antfu/vitesse-nuxt3"><img src="https://developer.stackblitz.com/img/open_in_stackblitz.svg" alt=""></a>
<a href="https://stackblitz.com/github/antfu/vitesse-nuxt"><img src="https://developer.stackblitz.com/img/open_in_stackblitz.svg" alt=""></a>
### GitHub Template
[Create a repo from this template on GitHub](https://github.com/antfu/vitesse-nuxt3/generate).
[Create a repo from this template on GitHub](https://github.com/antfu/vitesse-nuxt/generate).
### Clone to local
If you prefer to do it manually with the cleaner git history
```bash
npx degit antfu/vitesse-nuxt3 my-nuxt3-app
cd my-nuxt3-app
npx degit antfu/vitesse-nuxt my-nuxt-app
cd my-nuxt-app
pnpm i # If you don't have pnpm installed, run: npm install -g pnpm
```
-10
View File
@@ -1,10 +0,0 @@
<template>
<main class="py-20 px-10 text-center">
<NuxtPage />
<Footer />
</main>
</template>
<style>
@import '~/styles/main.css';
</style>
+28
View File
@@ -0,0 +1,28 @@
<script setup lang="ts">
import { appName } from '~/constants'
useHead({
title: appName,
})
</script>
<template>
<VitePwaManifest />
<NuxtLayout>
<NuxtPage />
</NuxtLayout>
</template>
<style>
html,
body,
#__nuxt {
height: 100vh;
margin: 0;
padding: 0;
}
html.dark {
color-scheme: dark;
}
</style>
File renamed without changes.
+21
View File
@@ -0,0 +1,21 @@
<script setup lang="ts">
const color = useColorMode()
useHead({
meta: [{
id: 'theme-color',
name: 'theme-color',
content: () => color.value === 'dark' ? '#222222' : '#ffffff',
}],
})
function toggleDark() {
color.preference = color.value === 'dark' ? 'light' : 'dark'
}
</script>
<template>
<button class="!outline-none" @click="toggleDark">
<div class="i-carbon-sun dark:i-carbon-moon" />
</button>
</template>
@@ -1,13 +1,7 @@
<template>
<div
text="xl gray4"
m-5
flex
justify-center
gap-3
>
<div text="xl gray4" m-5 flex="~ gap3" justify-center>
<NuxtLink i-carbon-campsite to="/" />
<a i-carbon-logo-github href="https://github.com/antfu/vitesse-nuxt3" target="__blank" />
<a i-carbon-logo-github href="https://github.com/antfu/vitesse-nuxt3" target="_blank" />
<DarkToggle />
</div>
</template>
@@ -2,7 +2,7 @@
const name = ref('')
const router = useRouter()
const go = () => {
function go() {
if (name.value)
router.push(`/hi/${encodeURIComponent(name.value)}`)
}
@@ -15,19 +15,16 @@ const go = () => {
v-model="name"
placeholder="What's your name?"
type="text"
autocomplete="false"
p="x-4 y-2"
m="t-5"
w="250px"
text="center"
bg="transparent"
autocomplete="off"
p="x-4 y-2" m="t-5" w="250px"
text="center" bg="transparent"
border="~ rounded gray-200 dark:gray-700"
outline="none active:none"
@keydown.enter="go"
>
<div>
<button
class="m-3 text-sm btn"
text-sm btn m-3
:disabled="!name"
@click="go"
>
+17
View File
@@ -0,0 +1,17 @@
<template>
<div text-2xl font-300 inline-flex cursor-default>
<div flex flex-col children:mx-auto>
<img h-18 w-18 inline-block src="/nuxt.svg">
<span text-green-400 mt--2>Nuxt 4</span>
</div>
<div
text="3xl gray4"
m="x-4 y-auto"
i-carbon-add transform transition-all-500 hover:rotate-135
/>
<div flex flex-col children:mx-auto>
<img h-18 w-18 inline-block src="/vite.png">
<span text-purple-500 mt--2>Vitesse</span>
</div>
</div>
</template>
@@ -1,12 +1,12 @@
<script setup lang="ts">
const { data } = await useFetch('/api/pageview')
const time = useTimeAgo(computed(() => data.value.startAt))
const time = useTimeAgo(() => data.value?.startAt || 0)
</script>
<template>
<div text-gray:80>
<span font-500 text-gray>{{ data.pageview }}</span>
<span text-gray font-500>{{ data?.pageview }}</span>
page views since
<span text-gray>{{ time }}</span>
</div>
File renamed without changes.
File renamed without changes.
+79
View File
@@ -0,0 +1,79 @@
import type { ModuleOptions } from '@vite-pwa/nuxt'
import process from 'node:process'
import { appDescription, appName } from '../constants/index'
const scope = '/'
export const pwa: ModuleOptions = {
registerType: 'autoUpdate',
scope,
base: scope,
manifest: {
id: scope,
scope,
name: appName,
short_name: appName,
description: appDescription,
theme_color: '#ffffff',
icons: [
{
src: 'pwa-192x192.png',
sizes: '192x192',
type: 'image/png',
},
{
src: 'pwa-512x512.png',
sizes: '512x512',
type: 'image/png',
},
{
src: 'maskable-icon.png',
sizes: '512x512',
type: 'image/png',
purpose: 'any maskable',
},
],
},
workbox: {
globPatterns: ['**/*.{js,css,html,txt,png,ico,svg}'],
navigateFallbackDenylist: [/^\/api\//],
navigateFallback: '/',
cleanupOutdatedCaches: true,
runtimeCaching: [
{
urlPattern: /^https:\/\/fonts.googleapis.com\/.*/i,
handler: 'CacheFirst',
options: {
cacheName: 'google-fonts-cache',
expiration: {
maxEntries: 10,
maxAgeSeconds: 60 * 60 * 24 * 365, // <== 365 days
},
cacheableResponse: {
statuses: [0, 200],
},
},
},
{
urlPattern: /^https:\/\/fonts.gstatic.com\/.*/i,
handler: 'CacheFirst',
options: {
cacheName: 'gstatic-fonts-cache',
expiration: {
maxEntries: 10,
maxAgeSeconds: 60 * 60 * 24 * 365, // <== 365 days
},
cacheableResponse: {
statuses: [0, 200],
},
},
},
],
},
registerWebManifestInRouteRules: true,
writePlugin: true,
devOptions: {
enabled: process.env.VITE_PLUGIN_PWA === 'true',
navigateFallback: scope,
},
}
+2
View File
@@ -0,0 +1,2 @@
export const appName = 'Vitesse for Nuxt 4'
export const appDescription = 'Vitesse for Nuxt 4'
+15
View File
@@ -0,0 +1,15 @@
## Layouts
Vue components in this dir are used as layouts.
By default, `default.vue` will be used unless an alternative is specified in the route meta.
```vue
<script setup lang="ts">
definePageMeta({
layout: 'home',
})
</script>
```
Learn more on https://nuxt.com/docs/guide/directory-structure/layouts
+9
View File
@@ -0,0 +1,9 @@
<template>
<main class="px-10 py-20 text-center">
<slot />
<Footer />
<div class="text-sm mx-auto mt-5 text-center opacity-25">
[Default Layout]
</div>
</main>
</template>
+9
View File
@@ -0,0 +1,9 @@
<template>
<main class="px-10 py-20 text-center">
<slot />
<Footer />
<div class="text-sm mx-auto mt-5 text-center opacity-25">
[Home Layout]
</div>
</main>
</template>
+17
View File
@@ -0,0 +1,17 @@
<script setup lang="ts">
const router = useRouter()
</script>
<template>
<main p="x4 y10" text="center teal-700 dark:gray-200">
<div text-4xl>
<div i-carbon-warning inline-block />
</div>
<div>Not found</div>
<div>
<button text-sm btn m="3 t8" @click="router.back()">
Back
</button>
</div>
</main>
</template>
+8 -6
View File
@@ -1,13 +1,15 @@
<script setup lang="ts">
import { useUserStore } from '~/stores/user'
const route = useRoute()
const route = useRoute<'hi-id'>()
const user = useUserStore()
const name = route.params.id
watchEffect(() => {
user.setNewName(route.params.id as string)
})
definePageMeta({
layout: 'home',
})
</script>
<template>
@@ -21,7 +23,7 @@ watchEffect(() => {
</div>
<template v-if="user.otherNames.length">
<p text-sm my-4>
<div text-sm my-4>
<span op-50>Also as known as:</span>
<ul>
<li v-for="otherName in user.otherNames" :key="otherName">
@@ -30,14 +32,14 @@ watchEffect(() => {
</router-link>
</li>
</ul>
</p>
</div>
</template>
<Counter />
<div>
<NuxtLink
class="btn m-3 text-sm"
class="text-sm btn m-3"
to="/"
>
Back
+32
View File
@@ -0,0 +1,32 @@
<script setup lang="ts">
definePageMeta({
layout: 'home',
})
const online = useOnline()
</script>
<template>
<div>
<Logos mb-6 />
<ClientOnly>
<Suspense>
<PageView v-if="online" />
<div v-else text-gray:80>
You're offline
</div>
<template #fallback>
<div op50 italic>
<span animate-pulse>Loading...</span>
</div>
</template>
</Suspense>
<template #fallback>
<div op50>
<span animate-pulse>...</span>
</div>
</template>
</ClientOnly>
<InputEntry />
</div>
</template>
-12
View File
@@ -1,12 +0,0 @@
<script setup lang='ts'>
const color = useColorMode()
function toggleDark() {
color.value = color.value === 'dark' ? 'light' : 'dark'
}
</script>
<template>
<button class="!outline-none" @click="toggleDark()">
<div class="dark:i-carbon-moon i-carbon-sun" />
</button>
</template>
-20
View File
@@ -1,20 +0,0 @@
<template>
<div inline-flex text-2xl font-300 cursor-default>
<div flex flex-col children:mx-auto>
<img w-18 h-18 inline-block src="/nuxt.png">
<span text-green5 mt--2>Nuxt 3</span>
</div>
<div
text="3xl gray4"
m="x-4 y-auto"
transition-all-500
transform
hover:rotate-135
i-carbon-add
/>
<div flex flex-col children:mx-auto>
<img w-18 h-18 inline-block src="/vite.png">
<span text-purple5 mt--2>Vitesse</span>
</div>
</div>
</template>
+12
View File
@@ -0,0 +1,12 @@
// @ts-check
import antfu from '@antfu/eslint-config'
import nuxt from './.nuxt/eslint.config.mjs'
export default antfu(
{
unocss: true,
formatters: true,
pnpm: true,
},
)
.append(nuxt())
+8 -9
View File
@@ -1,12 +1,11 @@
[build.environment]
NPM_FLAGS = "--version"
NODE_VERSION = "16"
[build]
publish = "dist"
command = "npx pnpm i --store=node_modules/.pnpm-store && npx pnpm run build"
publish = "dist"
command = "pnpm run build"
[build.environment]
NODE_VERSION = "20"
[[redirects]]
from = "/*"
to = "/index.html"
status = 200
from = "/*"
to = "/index.html"
status = 200
+67 -24
View File
@@ -1,34 +1,77 @@
import { defineNuxtConfig } from 'nuxt3'
import { pwa } from './app/config/pwa'
import { appDescription } from './app/constants/index'
export default defineNuxtConfig({
meta: {
title: 'Vitesse Nuxt 3',
link: [
{
rel: 'icon', type: 'image/png', href: '/nuxt.png',
},
],
},
buildModules: [
modules: [
'@vueuse/nuxt',
'@unocss/nuxt',
'@pinia/nuxt',
'@nuxtjs/color-mode',
'@vite-pwa/nuxt',
'@nuxt/eslint',
],
vueuse: {
ssrHandlers: true,
devtools: {
enabled: true,
},
unocss: {
uno: true,
attributify: true,
preflight: true,
icons: {
scale: 1.2,
app: {
head: {
viewport: 'width=device-width,initial-scale=1',
link: [
{ rel: 'icon', href: '/favicon.ico', sizes: 'any' },
{ rel: 'icon', type: 'image/svg+xml', href: '/nuxt.svg' },
{ rel: 'apple-touch-icon', href: '/apple-touch-icon.png' },
],
meta: [
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
{ name: 'description', content: appDescription },
{ name: 'apple-mobile-web-app-status-bar-style', content: 'black-translucent' },
{ name: 'theme-color', media: '(prefers-color-scheme: light)', content: 'white' },
{ name: 'theme-color', media: '(prefers-color-scheme: dark)', content: '#222222' },
],
},
shortcuts: [
['btn', 'px-4 py-1 rounded inline-block bg-teal-600 text-white cursor-pointer hover:bg-teal-700 disabled:cursor-default disabled:bg-gray-600 disabled:opacity-50'],
],
},
// experimental: {
// viteNode: true,
// },
colorMode: {
classSuffix: '',
},
future: {
compatibilityVersion: 4,
},
experimental: {
// when using generate, payload js assets included in sw precache manifest
// but missing on offline, disabling extraction it until fixed
payloadExtraction: false,
renderJsonPayloads: true,
typedPages: true,
},
compatibilityDate: '2024-08-14',
nitro: {
esbuild: {
options: {
target: 'esnext',
},
},
prerender: {
crawlLinks: false,
routes: ['/'],
ignore: ['/hi'],
},
},
eslint: {
config: {
standalone: false,
nuxt: {
sortConfigKeys: true,
},
},
},
pwa,
})
+32 -21
View File
@@ -1,29 +1,40 @@
{
"type": "module",
"private": true,
"packageManager": "pnpm@11.22.0",
"scripts": {
"build": "nuxi build",
"dev": "nuxi dev",
"build": "nuxt build",
"dev:pwa": "VITE_PLUGIN_PWA=true nuxt dev",
"dev": "nuxt dev",
"generate": "nuxt generate",
"prepare": "nuxt prepare",
"preview": "nuxt preview",
"start": "node .output/server/index.mjs",
"lint": "eslint ."
},
"dependencies": {
"pinia": "^2.0.12"
"start:generate": "npx serve .output/public",
"lint": "eslint .",
"typecheck": "nuxt typecheck"
},
"devDependencies": {
"@antfu/eslint-config": "^0.19.1",
"@iconify-json/carbon": "^1.1.2",
"@iconify-json/twemoji": "^1.1.2",
"@pinia/nuxt": "^0.1.8",
"@unocss/nuxt": "^0.30.8",
"@vueuse/nuxt": "^8.2.3",
"eslint": "^8.12.0",
"nuxt3": "^3.0.0-27478938.fdd6a91",
"typescript": "^4.6.3"
},
"pnpm": {
"overrides": {
"@nuxt/kit": "npm:@nuxt/kit-edge@latest",
"@nuxt/kit-edge": "latest"
}
"@antfu/eslint-config": "catalog:dev",
"@iconify-json/carbon": "catalog:icons",
"@iconify-json/twemoji": "catalog:icons",
"@nuxt/devtools": "catalog:build",
"@nuxt/eslint": "catalog:build",
"@nuxtjs/color-mode": "catalog:build",
"@pinia/nuxt": "catalog:build",
"@types/node": "catalog:dev",
"@unocss/eslint-config": "catalog:build",
"@unocss/nuxt": "catalog:build",
"@vite-pwa/nuxt": "catalog:build",
"@vueuse/core": "catalog:frontend",
"@vueuse/nuxt": "catalog:build",
"eslint": "catalog:dev",
"eslint-plugin-format": "catalog:dev",
"nuxt": "catalog:build",
"pinia": "catalog:frontend",
"typescript": "catalog:dev",
"unocss": "catalog:build",
"vue": "catalog:frontend",
"vue-tsc": "catalog:dev"
}
}
-14
View File
@@ -1,14 +0,0 @@
<template>
<div>
<Logos mb-6 />
<Suspense>
<PageView />
<template #fallback>
<div op50 italic>
<span animate-pulse>Loading...</span>
</div>
</template>
</Suspense>
<InputEntry />
</div>
</template>
+12267 -5869
View File
File diff suppressed because it is too large. Load diff
+57
View File
@@ -0,0 +1,57 @@
minimumReleaseAge: 0
shamefullyHoist: true
shellEmulator: true
strictPeerDependencies: false
autoInstallPeers: false
trustPolicy: no-downgrade
packages: []
overrides:
'@nuxt/devtools': 'catalog:build'
'@nuxt/kit': 'catalog:build'
chokidar: 'catalog:build'
nuxt: 'catalog:build'
rollup: 4.62.5
semver: 'catalog:build'
unplugin: 'catalog:build'
vite: 'catalog:build'
workbox-build: 7.4.0
catalogs:
build:
'@nuxt/devtools': ^3.4.1
'@nuxt/eslint': ^1.17.0
'@nuxt/kit': ^4.5.2
'@nuxtjs/color-mode': ^4.0.1
'@pinia/nuxt': ^1.0.2
'@unocss/eslint-config': ^66.8.1
'@unocss/nuxt': ^66.8.1
'@vite-pwa/nuxt': ^1.1.1
'@vueuse/nuxt': ^14.4.0
chokidar: ^5.0.0
nuxt: ^4.5.2
semver: ^7.8.5
unocss: ^66.8.1
unplugin: ^3.3.0
vite: ^8.2.2
dev:
'@antfu/eslint-config': ^9.3.0
'@types/node': ^26.2.0
eslint: ^10.9.0
eslint-plugin-format: ^2.0.1
typescript: ^6.0.3
vue-tsc: ^3.3.11
frontend:
'@vueuse/core': ^14.4.0
pinia: ^4.0.3
vue: ^3.5.41
icons:
'@iconify-json/carbon': ^1.2.25
'@iconify-json/twemoji': ^1.2.5
update:
ignoreDeps:
- typescript@7
allowBuilds:
esbuild: true
unrs-resolver: true
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

+3
View File
@@ -0,0 +1,3 @@
<svg width="900" height="900" viewBox="0 0 900 900" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M504.908 750H839.476C850.103 750.001 860.542 747.229 869.745 741.963C878.948 736.696 886.589 729.121 891.9 719.999C897.211 710.876 900.005 700.529 900 689.997C899.995 679.465 897.193 669.12 891.873 660.002L667.187 274.289C661.876 265.169 654.237 257.595 645.036 252.329C635.835 247.064 625.398 244.291 614.773 244.291C604.149 244.291 593.711 247.064 584.511 252.329C575.31 257.595 567.67 265.169 562.36 274.289L504.908 372.979L392.581 179.993C387.266 170.874 379.623 163.301 370.42 158.036C361.216 152.772 350.777 150 340.151 150C329.525 150 319.086 152.772 309.883 158.036C300.679 163.301 293.036 170.874 287.721 179.993L8.12649 660.002C2.80743 669.12 0.00462935 679.465 5.72978e-06 689.997C-0.00461789 700.529 2.78909 710.876 8.10015 719.999C13.4112 729.121 21.0523 736.696 30.255 741.963C39.4576 747.229 49.8973 750.001 60.524 750H270.538C353.748 750 415.112 713.775 457.336 643.101L559.849 467.145L614.757 372.979L779.547 655.834H559.849L504.908 750ZM267.114 655.737L120.551 655.704L340.249 278.586L449.87 467.145L376.474 593.175C348.433 639.03 316.577 655.737 267.114 655.737Z" fill="#00DC82"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

+2
View File
@@ -0,0 +1,2 @@
User-agent: *
Allow: /
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

+2 -2
View File
@@ -1,7 +1,7 @@
const startAt = Date.now()
let count = 0
export default () => ({
export default defineEventHandler(() => ({
pageview: count++,
startAt,
})
}))
+3
View File
@@ -0,0 +1,3 @@
{
"extends": "../.nuxt/tsconfig.server.json"
}
-12
View File
@@ -1,12 +0,0 @@
html,
body,
#app {
height: 100vh;
margin: 0;
padding: 0;
}
html.dark {
background: #222;
color: white;
}
+7 -1
View File
@@ -1,3 +1,9 @@
{
"extends": "./.nuxt/tsconfig.json"
"references": [
{ "path": "./.nuxt/tsconfig.app.json" },
{ "path": "./.nuxt/tsconfig.server.json" },
{ "path": "./.nuxt/tsconfig.shared.json" },
{ "path": "./.nuxt/tsconfig.node.json" }
],
"files": []
}
+38
View File
@@ -0,0 +1,38 @@
import { createLocalFontProcessor } from '@unocss/preset-web-fonts/local'
import {
defineConfig,
presetAttributify,
presetIcons,
presetTypography,
presetWebFonts,
presetWind4,
transformerDirectives,
transformerVariantGroup,
} from 'unocss'
export default defineConfig({
shortcuts: [
['btn', 'px-4 py-1 rounded inline-block bg-teal-600 text-white cursor-pointer hover:bg-teal-700 disabled:cursor-default disabled:bg-gray-600 disabled:opacity-50'],
['icon-btn', 'inline-block cursor-pointer select-none opacity-75 transition duration-200 ease-in-out hover:opacity-100 hover:text-teal-600'],
],
presets: [
presetWind4(),
presetAttributify(),
presetIcons({
scale: 1.2,
}),
presetTypography(),
presetWebFonts({
fonts: {
sans: 'DM Sans',
serif: 'DM Serif Display',
mono: 'DM Mono',
},
processors: createLocalFontProcessor(),
}),
],
transformers: [
transformerDirectives(),
transformerVariantGroup(),
],
})