Basic Integration Guide for Nuxt
This guide demonstrates how to integrate staticseek into a Nuxt application. You can find the complete implementation in our GitHub repository and see it in action at our live demo.
Getting Started
Section titled “Getting Started”To start the local development server:
npm installnpm run devOpen your browser and visit http://localhost:3000 to see the application in action.
Deployment
Section titled “Deployment”This example is optimized for static hosting. Generate and deploy the static files with these steps:
npm installnpm run generate# Upload the generated ".output/public" directory to your HTTP serverBasic Usage of staticseek with Nuxt
Section titled “Basic Usage of staticseek with Nuxt”The following implementation (pages/index.vue) showcases the fundamental usage of staticseek in a Single Page Application (SPA).
The application searches through a predefined array and highlights matching keywords.
<script setup lang="ts">import { LinearIndex, StaticSeekError, createIndex, search } from "staticseek";import type { SearchResult } from "staticseek";
const query = ref("");const result = ref<SearchResult[]>([]);const { data } = await useAsyncData("search", () => queryCollection("contents").where("stem", "=", "sentences").first(),);const target = data.value?.data ?? [];
const index = createIndex(LinearIndex, target);if (index instanceof StaticSeekError) throw index;
watch( query, async (q) => { const searchResults = await search(index, q); if (searchResults instanceof StaticSeekError) { console.error(searchResults); result.value = []; return; }
result.value = searchResults; }, { immediate: true },);</script>
<template> <section> <div class="input-area"> <div>search</div> <input type="text" name="search" id="search" v-model="query"/> </div> <h2>results</h2> <ul> <li key="header"> <div class="sentence">sentence</div> <div>score</div> </li> <template v-if="!(result instanceof StaticSeekError) && query.length !== 0"> <li v-for="r in result" :key="r.id"> <div class="sentence">{{ target[r.id] }}</div> <div class="score">{{ r.score.toFixed(4) }}</div> </li> </template> <template v-else-if="query.length === 0"> <li v-for="r in target" :key="r"> <div class="sentence">{{ r }}</div> <div></div> </li> </template> </ul> </section></template>Implementation Details
Section titled “Implementation Details”This example leverages Nuxt Content for data retrieval.
The content collection structure and data schema are defined in content.config.ts.
Data is fetched from sentences.json in the contents directory using the queryCollection() function.
The search functionality is implemented through several key components:
- A search index is initialized by passing the keyword array to
createIndex - User input is captured through a text field, binding to the
queryvariable - Search execution is automated using
watch, which triggers a new search wheneverquerychanges and updates theresultvariable - Search results are referenced using the
SearchResulttype’sidfield, which maps to the original keyword’s position in thetargetarray - Results are automatically sorted by relevance score
- Error handling is implemented for both index creation and search operations