개발 워크플로우
개발 서버
bash
pnpm dev다음 기능과 함께 Vite 개발 서버 실행:
- Hot module replacement
- Fast refresh
- Source maps
- 포트 5173
컴포넌트 개발
위치
컴포넌트는 목적별로 구성됩니다:
src/components/
├── layout/ # AppShell, Navbar
├── ui/ # Button, Card, Badge
├── Alert.js
├── BusinessCard.js
├── CategoryFilter.js
├── PostcodeSelect.js
└── ...컴포넌트 생성
VanJS 함수형 컴포넌트 사용:
javascript
import van from 'vanjs-core';
const { div, button } = van.tags;
export function MyComponent({ title }) {
const count = van.state(0);
return div(
{ class: 'my-component' },
button(
{
onclick: () => count.val++,
class: 'btn btn-primary'
},
() => `Count: ${count.val}`
)
);
}스타일링
Tailwind v4 유틸리티 클래스 사용:
javascript
div({ class: 'flex items-center gap-4 p-4 rounded-lg bg-background' })shadcn/ui 디자인 토큰은 CSS 변수를 통해 사용 가능합니다.
상태 관리
VanJS 반응형 상태:
javascript
const state = van.state(initialValue);
state.val = newValue; // 업데이트
const current = state.val; // 읽기파생 상태:
javascript
van.derive(() => {
// 의존성 변경 시 실행
console.log(state.val);
});라우팅
src/lib/router.js의 해시 기반 라우팅:
javascript
import { navigate } from './lib/router.js';
// 프로그래매틱 네비게이션
navigate('/business/1234567890');
// 해시 링크
a({ href: '#/docs' }, 'Docs')데이터 로딩
인덱스 (시작 시)
javascript
import { loadAllIndices } from './lib/dataLoader.js';
await loadAllIndices();
// 로드: postcode_index, category_index, classificationsProgressive Loading
javascript
import { loadPostcode } from './lib/postcodeLoader.js';
const businesses = await loadPostcode('06234');
// 반환: _shard 메타데이터가 포함된 사업자 배열상세 보기
javascript
import { loadBusinessDetails } from './lib/dataLoader.js';
const details = await loadBusinessDetails(business);
// business._shard를 사용하여 샤드 직접 페치테스트
테스트 실행:
bash
pnpm test워치 모드:
bash
pnpm test:watchVitest를 사용한 테스트 구조:
javascript
import { describe, it, expect } from 'vitest';
describe('MyComponent', () => {
it('renders correctly', () => {
const el = MyComponent({ title: 'Test' });
expect(el).toBeDefined();
});
});빌드
프로덕션 빌드:
bash
pnpm build출력: dist/
미리보기:
bash
pnpm preview코드 스타일
- 불변성: 항상 새 객체 생성
- 작은 함수: <50줄
- 명확한 이름: 설명적이고 축약 없이
- 에러 처리: 명시적 try/catch
- 주석: "왜"만 작성, "무엇"은 작성하지 않음
일반 작업
새 페이지 추가
src/pages/MyPage.js생성src/lib/router.js에 라우트 추가src/components/layout/Navbar.js에 네비게이션 링크 추가
분류 체계 추가
bizcat/또는prdcat/에서 JSON 생성public/data/로 복사dataLoader.loadCategoryMetadata()업데이트
스타일 업데이트
전역 스타일은 src/index.css를 편집하거나 Tailwind 유틸리티를 인라인으로 사용하세요.
디버깅
디버그 로깅 활성화:
javascript
console.log('[dataLoader.js] Loading postcode:', postcode);JSONL 로딩 패턴을 확인하려면 DevTools에서 네트워크 요청을 확인하세요.
OpenBSD 참고사항
scripts/의 플랫폼별 스크립트:
install-tailwind-openbsd.sh- lightningcss 및 @tailwindcss/oxide 패치install-rolldown-openbsd.sh- rolldown 바인딩 패치
pnpm install 후 매번 실행하세요.