[READ-ONLY] a fast, modern browser for the npm registry
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

perf: improve caching for code + docs

+21 -7
-1
app/pages/code/[...path].vue
··· 11 11 }) 12 12 13 13 const route = useRoute('code') 14 - const router = useRouter() 15 14 16 15 // Parse package name, version, and file path from URL 17 16 // Patterns:
+13
app/pages/docs/[...path].vue
··· 1 1 <script setup lang="ts"> 2 + import { setResponseHeader } from 'h3' 2 3 import type { DocsResponse } from '#shared/types' 3 4 import { assertValidPackageName } from '#shared/utils/npm' 4 5 ··· 37 38 const { data: pkg } = usePackage(packageName) 38 39 39 40 const latestVersion = computed(() => pkg.value?.['dist-tags']?.latest ?? null) 41 + 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 + } 40 53 41 54 watch( 42 55 [requestedVersion, latestVersion, packageName],
+5
nuxt.config.ts
··· 79 79 '/**': { isr: 60 }, 80 80 '/package/**': { isr: 60 }, 81 81 '/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 } }, 82 87 // static pages 83 88 '/about': { prerender: true }, 84 89 '/settings': { prerender: true },
+3 -6
server/api/registry/docs/[...pkg].get.ts
··· 1 1 import type { DocsResponse } from '#shared/types' 2 - import { fetchNpmPackage } from '#server/utils/npm' 3 2 import { assertValidPackageName } from '#shared/utils/npm' 4 3 import { parsePackageParam } from '#shared/utils/parse-package-param' 5 4 import { generateDocsWithDeno } from '#server/utils/docs' ··· 12 11 throw createError({ statusCode: 404, message: 'Package name is required' }) 13 12 } 14 13 15 - const { packageName, version: requestedVersion } = parsePackageParam(pkgParam) 14 + const { packageName, version } = parsePackageParam(pkgParam) 16 15 17 16 if (!packageName) { 18 17 // TODO: throwing 404 rather than 400 as it's cacheable ··· 20 19 } 21 20 assertValidPackageName(packageName) 22 21 23 - const packument = await fetchNpmPackage(packageName) 24 - const version = requestedVersion ?? packument['dist-tags']?.latest 25 - 26 22 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' }) 28 25 } 29 26 30 27 let generated