검색
Xingluo는 Flexsearch를 통합하여 클라이언트 측 전체 텍스트 검색을 제공하며, 언어별 인덱스와 View Transitions 상태 유지를 지원합니다.
활성화
features.search를 통해 구성합니다:
tsfeatures: { search: "flexsearch", // "flexsearch" | false }
false로 설정하면 검색 페이지가 Astro.rewrite되어 404로 리디렉션되고 검색 UI가 생성되지 않습니다.
작동 방식
색인 생성
세 번째 빌드 단계인 node scripts/generateSearchIndex.mjs가 dist/ 디렉토리의 HTML 파일을 스캔합니다:
- 페이지 콘텐츠를 파싱하여 게시물 본문을 추출합니다
- 색인은 언어별로 자동 분할됩니다(
zh-cn과en이 각각 자체 색인을 가짐) - 색인은
dist/search/에 출력됩니다
색인 범위
빌드 스크립트가 게시물 상세 페이지의 <main> 콘텐츠를 파싱하므로 게시물 본문만 색인됩니다. 다른 페이지(홈, 목록, 아카이브 등)는 검색 색인에 포함되지 않습니다.
검색 UI
src/components/pageViews/SearchView.astro가 검색 페이지를 구현합니다:
- Flexsearch 클라이언트 측 색인을 사용하여 브라우저에서 검색 매칭
getAssetPath("search/")를 통해 색인 자산을 찾습니다- shadcn 테마 변수(
--background,--foreground,--primary등)를 사용하여 검색 상자와 결과 목록 스타일링 transition:persist가 내비게이션 간 검색 상태를 유지합니다
검색 흐름
- 사용자가 검색 상자에 입력합니다
- Flexsearch가 현재 언어 색인과 매칭합니다
- 결과 목록에 일치하는 게시물이 표시됩니다(제목, 발행/업데이트 날짜, 카테고리 배지, 태그, 일치하는 본문 발췌)
processTerm이 쿼리 매개변수가 포함된 검색 페이지 URL을 sessionStorage에 기록하여 뒤로가기 버튼이 복원할 수 있도록 합니다
소스 뒤로가기 내비게이션
검색 페이지와 게시물 페이지 간의 뒤로가기 메커니즘:
Main.astro컴포넌트가 소스 페이지 URL을 sessionStorage의backUrl에 기록합니다- 게시물 페이지의
BackButton.astro는 sessionStorage의backUrl로 돌아가는 것을 선호하며, 없으면 홈페이지로 이동합니다 - 검색 페이지의
processTerm은 쿼리 매개변수가 포함된 URL을 기록하여 게시물에서 돌아올 때 검색 상태를 복원합니다
다국어 검색
Flexsearch는 페이지 언어별로 색인을 분할합니다:
zh-cn페이지 (루트) → 중국어 색인en페이지 (/en/접두사) → 영어 색인
검색은 현재 페이지 언어에 맞는 색인을 자동으로 사용합니다: 중국어 페이지에서는 중국어, 영어 페이지에서는 영어.
테마 적응
Flexsearch 검색 UI는 shadcn 테마 변수를 사용하며, SearchView.astro에서 검색 상자와 결과 목록 스타일을 정의합니다:
css:root { --search-primary: var(--primary); --search-text: var(--foreground); --search-background: var(--background); /* ... */ }
다크 모드는 .dark 선택기를 통해 사이트 테마와 일관되게 자동 전환됩니다.
성능
- Flexsearch 색인은 정적 파일입니다. 검색은 서버 요청 없이 클라이언트 측에서 발생합니다
- 색인은 필요 시 로드됩니다(색인 조각은 검색 시에만 다운로드)
transition:persist는 내비게이션 시 검색 UI 재초기화를 방지합니다