Tutoriale wideo
Twórz angażującą dokumentację wideo
Twoja biblioteka open-source zyskała popularność z 10K gwiazdkami na GitHub, ale użytkownicy narzekają na słabą dokumentację. Musisz stworzyć referencje API, przewodniki użytkowania, dokumentację architektury, przewodniki migracji i interaktywne przykłady. Baza kodu obejmuje 50K linii ze złożonymi API, a potrzebujesz wszystkiego gotowego na duże wydanie v2.0 w przyszłym tygodniu.
Po ukończeniu tej lekcji opanujesz:
Stwórz kompleksową dokumentację zawierającą:
Zacznij od analizy tego co istnieje:
@src @docs"Przeanalizuj obecny stan dokumentacji:- Jaka dokumentacja istnieje?- Co jest przestarzałe lub niepoprawne?- Co całkowicie brakuje?- Jak jest zorganizowana?- Jakich formatów używa?Stwórz raport analizy luk w dokumentacji"
"Zaprojektuj kompleksową strukturę dokumentacji dla:- Referencji API (automatycznie generowanej z kodu)- Tutoriali (nauka oparta na zadaniach)- Przewodników konceptualnych (zrozumienie systemu)- Przewodników how-to (rozwiązywanie konkretnych problemów)- Dokumentacji architektury (projekt systemu)- Przewodnika kontrybuowania (dla open source)Stwórz plan dokumentacji z priorytetami"
Przełącz na tryb Agent:
"Skonfiguruj nowoczesną infrastrukturę dokumentacji:- Zainstaluj i skonfiguruj generator dokumentacji- Skonfiguruj pipeline przetwarzania markdown- Skonfiguruj podświetlanie składni- Dodaj funkcjonalność wyszukiwania- Skonfiguruj workflow wdrażaniaUżyj Docusaurus lub podobnego narzędzia"
Przykład konfiguracji dokumentacji:
module.exports = { title: 'Dokumentacja MojejBiblioteki', tagline: 'Potężna, bezpieczna typowo i łatwa w użyciu', url: 'https://docs.mojabiblioteka.dev', baseUrl: '/',
presets: [ [ '@docusaurus/preset-classic', { docs: { sidebarPath: require.resolve('./sidebars.js'), editUrl: 'https://github.com/mojaorg/mojabiblioteka/edit/main/', remarkPlugins: [ require('remark-code-import'), require('remark-math'), ], rehypePlugins: [ require('rehype-katex'), ], }, theme: { customCss: require.resolve('./src/css/custom.css'), }, }, ], ],
plugins: [ [ '@docusaurus/plugin-content-docs', { id: 'api', path: 'api', routeBasePath: 'api', sidebarPath: require.resolve('./sidebarsApi.js'), }, ], '@docusaurus/plugin-ideal-image', [ 'docusaurus-plugin-typedoc', { entryPoints: ['../src/index.ts'], tsconfig: '../tsconfig.json', out: 'api', sidebar: { categoryLabel: 'Referencja API', position: 1, }, }, ], ],
themeConfig: { navbar: { title: 'MojaBiblioteka', items: [ { type: 'doc', docId: 'intro', position: 'left', label: 'Dokumenty', }, { to: '/api', label: 'API', position: 'left', }, { href: 'https://github.com/mojaorg/mojabiblioteka', label: 'GitHub', position: 'right', }, ], },
algolia: { appId: 'TWOJ_APP_ID', apiKey: 'TWOJ_SEARCH_API_KEY', indexName: 'mojabiblioteka', },
prism: { theme: lightCodeTheme, darkTheme: darkCodeTheme, additionalLanguages: ['rust', 'elixir'], }, },};
{ "mcpServers": { "context7": { "command": "npx", "args": ["-y", "@upstash/context7-mcp"] } }}
"Używając Context7 MCP, pokaż mi najnowsze:- Wzorce dokumentacji React 18- Standardy komentarzy dokumentacyjnych TypeScript 5- Przykłady dokumentacji testowania Jest- Struktury dokumentacji popularnych bibliotek"
// Uzyskaj dokumentację konkretnej biblioteki"Używając Context7: Jak Next.js 14 dokumentuje:- Trasy API- Propsy komponentów- Opcje konfiguracji- Przewodniki migracji"
"Używając Context7, pokaż obecne standardy JSDoc dla:- Funkcji asynchronicznych- Typów generycznych- Komponentów React- Obsługi błędów
Następnie zastosuj do naszej bazy kodu"
"Używając Context7, znajdź przykłady:- Poolingu połączeń z bazą danych- Middleware uwierzytelniania- Użycia hooków React- Granic błędów
Dostosuj dla naszej dokumentacji"
"Używając Context7, przeanalizuj jak biblioteki obsługują:- Dokumentację breaking changes- Przewodniki migracji wersji- Notacje deprecation- Ścieżki upgrade'u"
"Używając Context7 MCP, porównaj style dokumentacji:- React vs Vue dokumentacja komponentów- Express vs Fastify dokumentacja API- Prisma vs TypeORM dokumentacja schematówJakie wzorce działają najlepiej dla naszej biblioteki?"
// Uzyskaj konwencje specyficzne dla frameworka"Używając Context7: Pokaż mi najlepsze praktyki Docusaurus dla:- Struktury nawigacji- Optymalizacji wyszukiwania- Dokumentacji wersjonowanej- Interaktywnych przykładów"
"Używając Context7 MCP, sprawdź nasze zależności:- Czy używamy przestarzałych API?- Jaka jest ścieżka migracji dla przestarzałych metod?- Które biblioteki mają główne aktualizacje?- Jakie są nowe najlepsze praktyki?"
// Aktualizuj dokumentację odpowiednio"Na podstawie ustaleń Context7, zaktualizuj naszą dokumentację aby:- Odwoływać się do aktualnych metod API- Używać nowoczesnych przykładów składni- Podążać za najnowszymi konwencjami- Zawierać ostrzeżenia o deprecation"
Aktualizacje w czasie rzeczywistym:
"Używając Context7, co nowego w React Router v6.4+?Zaktualizuj naszą dokumentację routingu aby odzwierciedlić:- Nowe wzorce ładowania danych- Zmiany w boundary błędów- Aktualizacje konfiguracji tras"
Nauka międzybibliotekowa:
"Używając Context7, jak popularne biblioteki dokumentują:- Przepływy uwierzytelniania (NextAuth, Auth0, Supabase)- Zarządzanie stanem (Redux, Zustand, Jotai)- Obsługę formularzy (React Hook Form, Formik)Zastosuj najlepsze wzorce do naszej dokumentacji"
Dokumentacja świadoma wersji:
"Używając Context7, stwórz dokumentację specyficzną dla wersji:- v1.x używając starego API- v2.x z nowymi funkcjami- Przewodnik migracji między wersjami- Macierz kompatybilności"
@src"Generuj kompleksową dokumentację API:- Wyciągnij wszystkie publiczne API- Dokumentuj parametry i typy zwracane- Zawrzyj informacje o typach- Dodaj przykłady użycia dla każdej metody- Dokumentuj przypadki brzegowe i błędy- Stwórz cross-referencjeUżyj formatu JSDoc/TSDoc"
Przykład wygenerowanej dokumentacji:
/** * Tworzy pulę połączeń dla operacji bazodanowych z automatyczną * logiką ponownych prób i recyklingiem połączeń. * * @example * ```typescript * // Podstawowe użycie * const pool = createPool({ * host: 'localhost', * database: 'myapp', * max: 20 * }); * * // Z opcjami zaawansowanymi * const pool = createPool({ * host: 'db.example.com', * port: 5432, * database: 'production', * user: 'dbuser', * password: process.env.DB_PASSWORD, * max: 50, * idleTimeoutMillis: 30000, * connectionTimeoutMillis: 2000, * retryAttempts: 3, * retryDelay: 1000, * ssl: { * rejectUnauthorized: true, * ca: fs.readFileSync('./ca-cert.pem') * } * }); * * // Używanie puli * const result = await pool.query('SELECT * FROM users WHERE id = $1', [userId]); * ``` * * @param config - Opcje konfiguracji puli * @param config.host - Adres hosta bazy danych * @param config.port - Port bazy danych (domyślnie: 5432) * @param config.database - Nazwa bazy danych * @param config.user - Użytkownik bazy danych * @param config.password - Hasło bazy danych * @param config.max - Maksymalna liczba klientów w puli (domyślnie: 10) * @param config.idleTimeoutMillis - Timeout bezczynnego klienta (domyślnie: 10000) * @param config.connectionTimeoutMillis - Timeout połączenia (domyślnie: 0) * @param config.retryAttempts - Liczba prób ponownych (domyślnie: 3) * @param config.retryDelay - Opóźnienie między próbami w ms (domyślnie: 1000) * @param config.ssl - Konfiguracja SSL obiekt lub boolean * * @returns Skonfigurowana instancja puli bazy danych * * @throws {ConnectionError} Gdy nie można nawiązać połączenia z bazą danych * @throws {ConfigurationError} Gdy brakuje wymaganej konfiguracji * @throws {SSLError} Gdy konfiguracja SSL jest nieprawidłowa * * @see {@link Pool} dla metod instancji puli * @see {@link query} dla wykonywania zapytań * @see {@link transaction} dla wsparcia transakcji * * @since 1.0.0 * @public */export function createPool(config: PoolConfig): Pool { validateConfig(config);
const pool = new Pool({ ...defaultConfig, ...config, // Wrapper logiki ponownych prób Client: createRetryableClient(config), });
// Dodaj obsługę zdarzeń pool.on('error', (err, client) => { logger.error('Nieoczekiwany błąd bezczynnego klienta', err); });
pool.on('connect', (client) => { logger.debug('Nowy klient podłączony do puli'); });
return wrapPoolMethods(pool);}
/** * Opcje konfiguracji puli * @public */export interface PoolConfig { /** Adres hosta bazy danych */ host: string;
/** Port bazy danych @defaultValue 5432 */ port?: number;
/** Nazwa bazy danych */ database: string;
/** Użytkownik bazy danych */ user?: string;
/** Hasło bazy danych */ password?: string;
/** * Maksymalna liczba klientów w puli * @defaultValue 10 * @remarks * Rozważ limity połączeń twojej bazy danych przy ustawianiu tej wartości. * Każdy klient zużywa zasoby zarówno na serwerze aplikacji jak i bazy danych. */ max?: number;
/** * Liczba milisekund które klient musi być bezczynny przed zamknięciem * @defaultValue 10000 */ idleTimeoutMillis?: number;
/** * Liczba milisekund oczekiwania przed timeout przy łączeniu * @defaultValue 0 (bez timeout) */ connectionTimeoutMillis?: number;
/** * Liczba prób ponownych nieudanych połączeń * @defaultValue 3 */ retryAttempts?: number;
/** * Opóźnienie między próbami ponownych połączeń w milisekundach * @defaultValue 1000 */ retryDelay?: number;
/** * Konfiguracja SSL * @example * ```typescript * // Włącz SSL z domyślnymi ustawieniami * ssl: true * * // Niestandardowa konfiguracja SSL * ssl: { * rejectUnauthorized: true, * ca: fs.readFileSync('./ca-cert.pem'), * key: fs.readFileSync('./client-key.pem'), * cert: fs.readFileSync('./client-cert.pem') * } * ``` */ ssl?: boolean | SSLConfig;}
@src/types"Dokumentuj wszystkie typy i interfejsy TypeScript:- Wyciągnij definicje typów- Dokumentuj parametry typów- Pokaż hierarchię dziedziczenia- Stwórz przykłady użycia typów- Dokumentuj związki dyskryminowane- Dodaj przykłady type guards"
@src @tests"Generuj przykłady kodu dla wszystkich głównych funkcji:- Przykłady podstawowego użycia- Zaawansowane wzorce- Przykłady obsługi błędów- Przykłady optymalizacji wydajności- Przykłady integracji- Przykłady pełnych aplikacjiWyciągnij z testów gdzie to możliwe"
@src @examples"Stwórz kompleksowy przewodnik rozpoczynania pracy:- Instrukcje instalacji (npm, yarn, pnpm)- Podstawowa konfiguracja i setup- Pierwszy prosty przykład- Częste przypadki użycia- Sekcja rozwiązywania problemów- Następne krokiZrób go przyjaznym dla początkujących ale kompleksowym"
Przykład przewodnika rozpoczynania pracy:
# Rozpoczynanie pracy z MojąBiblioteką
## Instalacja
MojaBiblioteka może być zainstalowana używając twojego ulubionego menedżera pakietów:
```bash# npmnpm install mojabiblioteka
# yarnyarn add mojabiblioteka
# pnpmpnpm add mojabiblioteka
// Moduły ES (zalecane)import { createPool, query } from 'mojabiblioteka';
// CommonJSconst { createPool, query } = require('mojabiblioteka');
import { createPool } from 'mojabiblioteka';
// Stwórz pulę połączeńconst pool = createPool({ host: 'localhost', database: 'myapp', user: 'myuser', password: 'mypassword'});
// Przetestuj połączenietry { const result = await pool.query('SELECT NOW()'); console.log('Połączono pomyślnie:', result.rows[0]);} catch (error) { console.error('Połączenie nieudane:', error);}
// Proste zapytanieconst users = await pool.query('SELECT * FROM users');console.log(`Znaleziono ${users.rowCount} użytkowników`);
// Zapytanie sparametryzowane (zapobiega SQL injection)const userId = 123;const user = await pool.query( 'SELECT * FROM users WHERE id = $1', [userId]);
// Używanie query builderaconst activeUsers = await pool .select('id', 'name', 'email') .from('users') .where('active', true) .orderBy('created_at', 'DESC') .limit(10) .execute();
// Automatyczne zarządzanie połączeniamiasync function getUser(id: number) { // Połączenie jest automatycznie nabywane i zwalniane return pool.query('SELECT * FROM users WHERE id = $1', [id]);}
// Manualne zarządzanie połączeniami dla transakcjiasync function transferFunds(from: number, to: number, amount: number) { const client = await pool.connect();
try { await client.query('BEGIN');
await client.query( 'UPDATE accounts SET balance = balance - $1 WHERE id = $2', [amount, from] );
await client.query( 'UPDATE accounts SET balance = balance + $1 WHERE id = $2', [amount, to] );
await client.query('COMMIT'); } catch (error) { await client.query('ROLLBACK'); throw error; } finally { client.release(); }}
import { DatabaseError, ConnectionError } from 'mojabiblioteka';
try { const result = await pool.query('SELECT * FROM users');} catch (error) { if (error instanceof ConnectionError) { console.error('Połączenie z bazą danych nieudane:', error.message); // Implementuj logikę ponownych prób lub fallback } else if (error instanceof DatabaseError) { console.error('Zapytanie nieudane:', error.message); // Loguj szczegóły zapytania dla debugowania } else { console.error('Nieoczekiwany błąd:', error); }}
const pool = createPool({ host: process.env.DB_HOST || 'localhost', port: parseInt(process.env.DB_PORT || '5432'), database: process.env.DB_NAME || 'development', user: process.env.DB_USER, password: process.env.DB_PASSWORD, max: parseInt(process.env.DB_POOL_SIZE || '10'), // Włącz SSL w produkcji ssl: process.env.NODE_ENV === 'production'});
const pool = createPool({ // Ustawienia połączenia host: 'db.example.com', port: 5432, database: 'production',
// Ustawienia puli max: 20, // Maksymalny rozmiar puli min: 5, // Minimalny rozmiar puli idleTimeoutMillis: 30000, // Zamknij bezczynnych klientów po 30s connectionTimeoutMillis: 2000, // Timeout nowych połączeń po 2s
// Ustawienia ponownych prób retryAttempts: 3, retryDelay: 1000,
// Monitoring onConnect: (client) => { console.log('Klient połączony'); }, onError: (error, client) => { console.error('Błąd puli:', error); }});
Timeout połączenia
// Zwiększ timeout połączeniaconst pool = createPool({ connectionTimeoutMillis: 5000, // 5 sekund // ... pozostała konfiguracja});
Za dużo połączeń
// Monitoruj użycie puliconsole.log('Łączna liczba klientów:', pool.totalCount);console.log('Bezczynni klienci:', pool.idleCount);console.log('Oczekujące żądania:', pool.waitingCount);
// Dostosuj rozmiar puli na podstawie użyciaconst pool = createPool({ max: 50, // Zwiększ maksymalną liczbę połączeń // ... pozostała konfiguracja});
Problemy z połączeniem SSL
// Debuguj połączenia SSLconst pool = createPool({ ssl: { rejectUnauthorized: false, // Tylko dla developmentu! // Dla produkcji, dostarcz odpowiednie certyfikaty ca: fs.readFileSync('./server-ca.pem'), }});
Teraz gdy masz MojąBibliotekę działającą:
Eksploruj zaawansowane funkcje
Najlepsze praktyki
Przewodniki integracji
2. **Stwórz przewodniki tematyczne**
```typescript"Generuj szczegółowe przewodniki dla konkretnych tematów:- Wzorce uwierzytelniania- Optymalizacja wydajności- Strategie obsługi błędów- Podejścia do testowania- Przewodniki wdrażania- Najlepsze praktyki bezpieczeństwaKażdy przewodnik powinien być kompleksowy i praktyczny"
"Stwórz interaktywną dokumentację:- Playground'y żywego kodu- Przykłady do uruchomienia- Interaktywny eksplorator API- Tutoriale krok po kroku- Demonstracje wideoUżyj CodeSandbox lub podobnego"
@src"Stwórz dokumentację architektury:- Diagram przeglądu systemu- Relacje komponentów- Diagramy przepływu danych- Diagramy sekwencji dla kluczowych przepływów- Architektura wdrożeniaUżyj Mermaid lub PlantUML"
Przykład dokumentacji architektury:
# Architektura systemu
## Przegląd
MojaBiblioteka podąża za modularną architekturą zaprojektowaną dla skalowalności i łatwości utrzymania.
```mermaidgraph TB subgraph "Warstwa aplikacji" APP[Twoja aplikacja] end
subgraph "Rdzeń MojejBiblioteki" API[Publiczne API] QM[Menedżer zapytań] PM[Menedżer puli] CM[Menedżer połączeń] RM[Menedżer ponownych prób] end
subgraph "Warstwa bazy danych" PG[(PostgreSQL)] MY[(MySQL)] MS[(SQL Server)] end
APP --> API API --> QM API --> PM QM --> CM PM --> CM CM --> RM RM --> PG RM --> MY RM --> MS
Odpowiedzialny za zarządzanie pulami połączeń z bazą danych:
Obsługuje wykonywanie i optymalizację zapytań:
Obsługa połączeń niskiego poziomu:
Implementuje wzorce odporności:
Podstawowa funkcjonalność nie ma zewnętrznych zależności, zapewniając:
Rozszerzona funkcjonalność przez wtyczki:
import { createPool } from 'mojabiblioteka';import { metricsPlugin } from 'mojabiblioteka-metrics';import { cachingPlugin } from 'mojabiblioteka-cache';
const pool = createPool({ // ... konfiguracja plugins: [ metricsPlugin({ provider: 'prometheus' }), cachingPlugin({ ttl: 300 }) ]});
Pełne wsparcie TypeScript z:
2. **Dokumentuj decyzje projektowe**
```typescript"Stwórz ADR (Architecture Decision Records):- Kluczowe decyzje projektowe- Rozważane alternatywy- Uzasadnienie wyborów- Zaakceptowane kompromisy- Strategie migracjiPodążaj za szablonem ADR"
"Dokumentuj charakterystyki wydajności:- Wyniki benchmarków- Techniki optymalizacji- Strategie skalowania- Wymagania zasobowe- Analiza wąskich gardełZawrzyj rzeczywiste pomiary"
"Stwórz zautomatyzowany pipeline dokumentacji:- Wyciągnij dokumentację z kodu źródłowego- Generuj przy każdym commit- Aktualizuj dokumentację specyficzną dla wersji- Wdrażaj na stronę dokumentacji- Powiadamiaj o breaking changesUżyj GitHub Actions"
Przykład workflow automatyzacji:
name: Dokumentacja
on: push: branches: [main] paths: - 'src/**' - 'docs/**' pull_request: branches: [main]
jobs: generate-docs: runs-on: ubuntu-latest
steps: - uses: actions/checkout@v3
- name: Setup Node.js uses: actions/setup-node@v3 with: node-version: '18' cache: 'npm'
- name: Zainstaluj zależności run: npm ci
- name: Generuj dokumentację API run: | npm run docs:api npm run docs:types
- name: Sprawdź pokrycie dokumentacji run: | npm run docs:coverage # Niepowodzenie jeśli pokrycie < 90%
- name: Generuj przykłady z testów run: npm run docs:examples
- name: Zbuduj stronę dokumentacji run: npm run docs:build
- name: Uruchom testy dokumentacji run: | # Testuj wszystkie przykłady kodu npm run docs:test-examples
# Sprawdź zepsute linki npm run docs:check-links
- name: Wdróż na GitHub Pages if: github.ref == 'refs/heads/main' uses: peaceiris/actions-gh-pages@v3 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./docs/build
- name: Zaktualizuj indeks wyszukiwania if: github.ref == 'refs/heads/main' run: | npm run docs:update-search env: ALGOLIA_API_KEY: ${{ secrets.ALGOLIA_API_KEY }}
"Stwórz testy dla dokumentacji:- Waliduj kompilację przykładów kodu- Testuj wyjścia przykładów- Sprawdź kompletność API- Weryfikuj integralność linków- Zapewnij spójność wersjiUruchamiaj w CI/CD"
"Stwórz metryki jakości dokumentacji:- Procent pokrycia- Wskaźniki świeżości- Kompletność przykładów- Skuteczność wyszukiwania- Integracja opinii użytkownikówWyświetl w dashboardzie"
Użyj Context7 aby być na bieżąco:
// Badania przed dokumentowaniem"Używając Context7 MCP, zbadaj:- Jak React dokumentuje hooki?- Jaki jest standard TypeScript dla generyków?- Jak popularne ORM dokumentują zapytania?"
// Waliduj względem obecnych standardów"Używając Context7, zweryfikuj że nasze przykłady używają:- Najnowszej składni (ES2024+)- Aktualnych wersji bibliotek- Nowoczesnych najlepszych praktyk- Nieprzdestarzałych API"
// Znajdź inspirację dokumentacyjną"Używając Context7, pokaż mi doskonałą dokumentację dla:- Ograniczania szybkości API- Połączeń WebSocket- Przepływów uwierzytelnianiaUżyj jako szablonów dla naszej dokumentacji"
Traktuj dokumentację jak kod:
/** * @example <caption>Podstawowa pula połączeń</caption> * ```typescript * const pool = createPool({ * host: 'localhost', * database: 'myapp' * }); * ``` * * @example <caption>Konfiguracja produkcyjna</caption> * ```typescript * const pool = createPool({ * host: process.env.DB_HOST, * database: process.env.DB_NAME, * max: 50, * ssl: true * }); * ``` */export function createPool(config: PoolConfig): Pool { // Implementacja}
Utrzymuj dokumentację zsynchronizowaną z kodem:
// Generuj dokumentację z testówdescribe('createPool', () => { it('tworzy podstawową pulę', () => { // @doc-example: basic-pool const pool = createPool({ host: 'localhost', database: 'test' });
expect(pool).toBeDefined(); // @end-doc-example });});
Warstwy informacji dla różnych odbiorców:
// Proste zapytanie selectconst users = await db .select('*') .from('users') .execute();
// Złożone zapytanie z join'amiconst posts = await db .select('posts.*', 'users.name as author') .from('posts') .join('users', 'posts.user_id', 'users.id') .where('posts.published', true) .orderBy('posts.created_at', 'DESC') .limit(10) .execute();
// Dynamiczne budowanie zapytańconst query = db.select().from('products');
if (filters.category) { query.where('category', filters.category);}
if (filters.priceRange) { query.whereBetween('price', [filters.priceRange.min, filters.priceRange.max] );}
const results = await query .orderBy(sortField, sortOrder) .paginate(page, perPage);
Problem: Przykłady kodu już nie działają
Rozwiązanie:
// Testuj wszystkie przykłady automatycznieimport { extractExamples } from './docs-utils';
describe('Przykłady dokumentacji', () => { const examples = extractExamples('./docs');
test.each(examples)('$name powinien działać bez błędów', async ({ code }) => { const result = await runExample(code); expect(result.error).toBeUndefined(); } );});
Problem: Przykładom brakuje niezbędnej konfiguracji
Rozwiązanie:
## Kompletny przykład
```typescript// Wymagane importyimport { createPool } from 'mojabiblioteka';import dotenv from 'dotenv';
// Załaduj zmienne środowiskowedotenv.config();
// Stwórz pulę z obsługą błędówasync function setupDatabase() { try { const pool = createPool({ host: process.env.DB_HOST, database: process.env.DB_NAME, user: process.env.DB_USER, password: process.env.DB_PASSWORD });
// Przetestuj połączenie await pool.query('SELECT 1'); console.log('Baza danych połączona');
return pool; } catch (error) { console.error('Połączenie z bazą danych nieudane:', error); process.exit(1); }}
// Użyj w aplikacjiconst pool = await setupDatabase();
Problem: Użytkownicy nie mogą znaleźć tego czego potrzebują
Rozwiązanie:
// Dodaj metadane wyszukiwania/** * @keywords connection, pool, database, postgres, mysql * @category Database * @since 1.0.0 */
// Stwórz synonimy wyszukiwaniaconst searchSynonyms = { 'connect': ['connection', 'pool', 'client'], 'query': ['select', 'insert', 'update', 'delete', 'sql'], 'error': ['exception', 'failure', 'problem']};
Zaawansowane funkcje dokumentacji:
Internacjonalizacja
Interaktywna nauka
Funkcje wspomagane AI
Dokumentacja wzbogacona MCP
Twoja dokumentacja odnosi sukces gdy:
Projekty z świetną dokumentacją raportują:
Przed publikacją:
Opanowałeś generowanie dokumentacji. Kontynuuj swoją podróż:
Tutoriale wideo
Twórz angażującą dokumentację wideo
Eksplorator API
Zbuduj interaktywny playground API
Przewodnik kontrybuowania
Umożliw dokumentację społecznościową
Kontynuuj do Następnej lekcji →