Skip to content

Commit 42be73a

Browse files
committed
perf: improve caching for code + docs
1 parent 1e32a89 commit 42be73a

4 files changed

Lines changed: 21 additions & 7 deletions

File tree

app/pages/code/[...path].vue

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ definePageMeta({
1111
})
1212
1313
const route = useRoute('code')
14-
const router = useRouter()
1514
1615
// Parse package name, version, and file path from URL
1716
// Patterns:

app/pages/docs/[...path].vue

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
<script setup lang="ts">
2+
import { setResponseHeader } from 'h3'
23
import type { DocsResponse } from '#shared/types'
34
import { assertValidPackageName } from '#shared/utils/npm'
45
@@ -38,6 +39,18 @@ const { data: pkg } = usePackage(packageName)
3839
3940
const latestVersion = computed(() => pkg.value?.['dist-tags']?.latest ?? null)
4041
42+
if (import.meta.server && !requestedVersion.value) {
43+
const app = useNuxtApp()
44+
const { data: pkg } = await usePackage(packageName)
45+
const latest = pkg.value?.['dist-tags']?.latest
46+
if (latest) {
47+
setResponseHeader(useRequestEvent()!, 'Cache-Control', 'no-cache')
48+
app.runWithContext(() =>
49+
navigateTo('/docs/' + packageName.value + '/v/' + latest, { redirectCode: 302 }),
50+
)
51+
}
52+
}
53+
4154
watch(
4255
[requestedVersion, latestVersion, packageName],
4356
([version, latest, name]) => {

nuxt.config.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,11 @@ export default defineNuxtConfig({
7979
'/**': { isr: 60 },
8080
'/package/**': { isr: 60 },
8181
'/search': { isr: false, cache: false },
82+
// infinite cache (versioned - doesn't change)
83+
'/code/**': { isr: true, cache: { maxAge: 365 * 24 * 60 * 60 } },
84+
'/api/registry/docs/**': { isr: true, cache: { maxAge: 365 * 24 * 60 * 60 } },
85+
'/api/registry/file/**': { isr: true, cache: { maxAge: 365 * 24 * 60 * 60 } },
86+
'/api/registry/files/**': { isr: true, cache: { maxAge: 365 * 24 * 60 * 60 } },
8287
// static pages
8388
'/about': { prerender: true },
8489
'/settings': { prerender: true },

server/api/registry/docs/[...pkg].get.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import type { DocsResponse } from '#shared/types'
2-
import { fetchNpmPackage } from '#server/utils/npm'
32
import { assertValidPackageName } from '#shared/utils/npm'
43
import { parsePackageParam } from '#shared/utils/parse-package-param'
54
import { generateDocsWithDeno } from '#server/utils/docs'
@@ -12,19 +11,17 @@ export default defineCachedEventHandler(
1211
throw createError({ statusCode: 404, message: 'Package name is required' })
1312
}
1413

15-
const { packageName, version: requestedVersion } = parsePackageParam(pkgParam)
14+
const { packageName, version } = parsePackageParam(pkgParam)
1615

1716
if (!packageName) {
1817
// TODO: throwing 404 rather than 400 as it's cacheable
1918
throw createError({ statusCode: 404, message: 'Package name is required' })
2019
}
2120
assertValidPackageName(packageName)
2221

23-
const packument = await fetchNpmPackage(packageName)
24-
const version = requestedVersion ?? packument['dist-tags']?.latest
25-
2622
if (!version) {
27-
throw createError({ statusCode: 404, message: 'No latest version found' })
23+
// TODO: throwing 404 rather than 400 as it's cacheable
24+
throw createError({ statusCode: 404, message: 'Package version is required' })
2825
}
2926

3027
let generated

0 commit comments

Comments
 (0)