博客

LunariaJS 终极实战:构建企业级多语言文档平台

综合运用本系列所学知识,从零构建一个完整的企业级多语言文档平台,涵盖项目规划、架构设计、完整配置、CI/CD 集成、团队协作等全部环节。

LibDoc Team 2026年3月6日 LunariaJS 专栏 133 分钟阅读
#LunariaJS #企业级 #实战 #多语言文档 #完整指南

LunariaJS 终极实战:构建企业级多语言文档平台

恭喜你完成了 LunariaJS 系列的九篇文章!今天,让我们综合运用所有学到的知识,从零开始构建一个完整的企业级多语言文档平台。这是本系列的终章,也是检验你学习成果的最佳实践。

💡 官方文档LunariaJS 中文文档

项目规划

需求分析

项目背景:我们需要为一个开源项目构建多语言文档站点,要求:

需求描述优先级
多语言支持支持中文、日文、韩文四种语言
翻译状态可视化实时追踪翻译进度
团队协作支持社区贡献者参与翻译
自动化CI/CD 自动构建和部署
性能优化快速加载和响应
SEO 优化搜索引擎友好

技术选型

基于需求分析,选择以下技术栈:

技术用途选择理由
Astro 5.0框架高性能,SEO 友好
Starlight文档主题开箱即用的文档解决方案
LunariaJS翻译管理Git-based 工作流,可视化仪表板
GitHub ActionsCI/CD与 GitHub 深度集成
Vercel托管快速部署,边缘网络

架构设计

┌─────────────────────────────────────────────────────────────────────┐
│                         用户层                                       │
│                    (开发者/贡献者/读者)                               │
├─────────────────────────────────────────────────────────────────────┤
│                       访问层                                         │
│   ┌─────────────┐   ┌─────────────┐   ┌─────────────┐              │
│   │ 文档站点     │   │ 翻译仪表板  │   │  GitHub Repo │              │
│   │ (Vercel)    │   │ (Vercel)    │   │             │              │
│   └─────────────┘   └─────────────┘   └─────────────┘              │
├─────────────────────────────────────────────────────────────────────┤
│                       应用层                                         │
│   ┌─────────────────────────────────────────────────────────────┐   │
│   │                    Astro + Starlight                        │   │
│   │  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐        │   │
│   │  │  内容管理    │  │  i18n 路由  │  │  搜索功能   │        │   │
│   │  └─────────────┘  └─────────────┘  └─────────────┘        │   │
│   └─────────────────────────────────────────────────────────────┘   │
│   ┌─────────────────────────────────────────────────────────────┐   │
│   │                      LunariaJS                              │   │
│   │  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐        │   │
│   │  │  状态追踪   │  │  仪表板生成 │  │  Git 集成   │        │   │
│   │  └─────────────┘  └─────────────┘  └─────────────┘        │   │
│   └─────────────────────────────────────────────────────────────┘   │
├─────────────────────────────────────────────────────────────────────┤
│                       基础设施层                                     │
│   ┌─────────────┐   ┌─────────────┐   ┌─────────────┐              │
│   │  Git        │   │ GitHub      │   │ CI/CD       │              │
│   │  (版本控制)  │   │ (代码托管)  │   │ (自动化)    │              │
│   └─────────────┘   └─────────────┘   └─────────────┘              │
└─────────────────────────────────────────────────────────────────────┘

技术栈搭建

步骤 1:初始化项目

# 使用 Starlight 模板创建项目
npm create astro@latest my-docs -- --template starlight

# 进入项目目录
cd my-docs

# 安装 LunariaJS
npm install @lunariajs/starlight

# 初始化 Git(如果还没有)
git init
git add .
git commit -m "Initial commit"

步骤 2:配置 Astro

// astro.config.mjs
import { defineConfig } from 'astro/config';
import starlight from '@astrojs/starlight';
import lunaria from '@lunariajs/starlight';

// 语言配置
const languages = ['en', 'zh-cn', 'ja', 'ko'];
const sourceLanguage = 'en';
const languageLabels = {
  en: 'English',
  'zh-cn': '简体中文',
  ja: '日本語',
  ko: '한국어',
};

export default defineConfig({
  site: 'https://docs.example.com',

  integrations: [
    starlight({
      title: 'My Project Documentation',
      defaultLocale: sourceLanguage,

      locales: Object.fromEntries(
        languages.map(lang => [
          lang,
          { label: languageLabels[lang], lang }
        ])
      ),

      sidebar: {
        en: [
          { label: 'Home', link: '/' },
          {
            label: 'Getting Started',
            items: [
              { label: 'Introduction', link: '/introduction/' },
              { label: 'Installation', link: '/installation/' },
              { label: 'Quick Start', link: '/quick-start/' },
            ],
          },
          {
            label: 'Guides',
            items: [
              { label: 'Configuration', link: '/guides/configuration/' },
              { label: 'Deployment', link: '/guides/deployment/' },
            ],
          },
          {
            label: 'Reference',
            items: [
              { label: 'API', link: '/reference/api/' },
              { label: 'CLI', link: '/reference/cli/' },
            ],
          },
        ],
        'zh-cn': [
          { label: '首页', link: '/' },
          {
            label: '快速开始',
            items: [
              { label: '简介', link: '/introduction/' },
              { label: '安装', link: '/installation/' },
              { label: '快速上手', link: '/quick-start/' },
            ],
          },
          {
            label: '指南',
            items: [
              { label: '配置', link: '/guides/configuration/' },
              { label: '部署', link: '/guides/deployment/' },
            ],
          },
          {
            label: '参考',
            items: [
              { label: 'API', link: '/reference/api/' },
              { label: 'CLI', link: '/reference/cli/' },
            ],
          },
        ],
        ja: [
          { label: 'ホーム', link: '/' },
          {
            label: 'はじめに',
            items: [
              { label: '概要', link: '/introduction/' },
              { label: 'インストール', link: '/installation/' },
              { label: 'クイックスタート', link: '/quick-start/' },
            ],
          },
          {
            label: 'ガイド',
            items: [
              { label: '設定', link: '/guides/configuration/' },
              { label: 'デプロイ', link: '/guides/deployment/' },
            ],
          },
          {
            label: 'リファレンス',
            items: [
              { label: 'API', link: '/reference/api/' },
              { label: 'CLI', link: '/reference/cli/' },
            ],
          },
        ],
        ko: [
          { label: '홈', link: '/' },
          {
            label: '시작하기',
            items: [
              { label: '소개', link: '/introduction/' },
              { label: '설치', link: '/installation/' },
              { label: '빠른 시작', link: '/quick-start/' },
            ],
          },
          {
            label: '가이드',
            items: [
              { label: '설정', link: '/guides/configuration/' },
              { label: '배포', link: '/guides/deployment/' },
            ],
          },
          {
            label: '참조',
            items: [
              { label: 'API', link: '/reference/api/' },
              { label: 'CLI', link: '/reference/cli/' },
            ],
          },
        ],
      },

      social: {
        github: 'https://github.com/your-org/your-repo',
      },

      head: [
        { tag: 'meta', attrs: { name: 'theme-color', content: '#6366f1' } },
      ],
    }),

    lunaria({
      sourceLanguage,
      languages,
      files: [
        {
          sourcePath: 'src/content/docs/{lang}/{slug}.md',
          localizationPath: 'src/content/docs/{lang}/{slug}.md',
        },
      ],
      dashboard: {
        outputDir: 'public/i18n-status',
        title: 'Translation Status',
        description: 'Track the progress of documentation translations',
      },
    }),
  ],
});

多语言内容组织

目录结构

src/content/docs/
├── en/                        # 英语(源语言)
│   ├── index.md
│   ├── introduction.md
│   ├── installation.md
│   ├── quick-start.md
│   ├── guides/
│   │   ├── configuration.md
│   │   └── deployment.md
│   └── reference/
│       ├── api.md
│       └── cli.md
├── zh-cn/                     # 中文翻译
│   ├── index.md
│   ├── introduction.md
│   ├── installation.md
│   ├── quick-start.md
│   ├── guides/
│   │   └── configuration.md   # deployment.md 未翻译
│   └── reference/
│       └── api.md
├── ja/                        # 日文翻译
│   ├── index.md
│   ├── introduction.md
│   └── installation.md
└── ko/                        # 韩文翻译
    └── index.md

内容模板

---
# src/content/docs/en/introduction.md
title: Introduction
description: Get started with My Project and learn about its core concepts.
---

# Introduction

Welcome to **My Project**! This guide will help you understand the fundamentals.

## What is My Project?

My Project is a powerful tool that helps you...

## Key Features

- **Feature 1**: Description of feature 1
- **Feature 2**: Description of feature 2
- **Feature 3**: Description of feature 3

## Who Should Use This?

My Project is perfect for:

1. Developers building modern applications
2. Teams working on large-scale projects
3. Anyone who values performance and DX

## Next Steps

Ready to get started? Check out our [Installation Guide](/installation/).

翻译版本示例

---
# src/content/docs/zh-cn/introduction.md
title: 简介
description: 开始使用 My Project,了解其核心概念。
---

# 简介

欢迎使用 **My Project**!本指南将帮助你了解基础知识。

## 什么是 My Project?

My Project 是一个强大的工具,可以帮助你...

## 主要特性

- **特性 1**:特性 1 的描述
- **特性 2**:特性 2 的描述
- **特性 3**:特性 3 的描述

## 谁应该使用?

My Project 非常适合:

1. 构建现代应用程序的开发者
2. 大型项目团队
3. 重视性能和开发体验的任何人

## 下一步

准备好了吗?查看我们的[安装指南](/installation/)。

完整配置文件详解

i18n 共享配置

// src/i18n-config.ts
export const languages = ['en', 'zh-cn', 'ja', 'ko'] as const;
export const sourceLanguage = 'en';

export type Language = (typeof languages)[number];

export const languageLabels: Record<Language, string> = {
  en: 'English',
  'zh-cn': '简体中文',
  ja: '日本語',
  ko: '한국어',
};

export const languageDirections: Record<Language, 'ltr' | 'rtl'> = {
  en: 'ltr',
  'zh-cn': 'ltr',
  ja: 'ltr',
  ko: 'ltr',
};

export const defaultLocale = sourceLanguage;

TypeScript 配置

// tsconfig.json
{
  "extends": "astro/tsconfigs/strictest",
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@/*": ["src/*"],
      "@components/*": ["src/components/*"],
      "@layouts/*": ["src/layouts/*"],
      "@i18n/*": ["src/i18n/*"],
      "@content/*": ["src/content/*"]
    },
    "jsx": "react-jsx",
    "jsxImportSource": "react"
  },
  "include": ["src/**/*", "astro.config.mjs"],
  "exclude": ["node_modules", "dist"]
}

内容集合配置

// src/content/config.ts
import { defineCollection, z } from 'astro:content';
import { docsLoader, docsSchema } from '@astrojs/starlight';

const docs = defineCollection({
  loader: docsLoader(),
  schema: docsSchema({
    extend: z.object({
      // 扩展字段
      author: z.string().optional(),
      difficulty: z.enum(['beginner', 'intermediate', 'advanced']).optional(),
      estimatedTime: z.string().optional(),
    }),
  }),
});

export const collections = { docs };

本地化仪表板定制

自定义样式

/* src/styles/lunaria-custom.css */
:root {
  /* 使用 Starlight 的颜色变量 */
  --lunaria-color-primary: var(--sl-color-accent);
  --lunaria-color-success: #22c55e;
  --lunaria-color-warning: #f59e0b;
  --lunaria-color-danger: #ef4444;

  /* 背景色 */
  --lunaria-bg-primary: var(--sl-color-bg);
  --lunaria-bg-secondary: var(--sl-color-bg-sidebar);

  /* 文本颜色 */
  --lunaria-text-primary: var(--sl-color-text);
  --lunaria-text-secondary: var(--sl-color-text-muted);

  /* 边框 */
  --lunaria-border-color: var(--sl-color-hairline-light);
  --lunaria-border-radius: 0.5rem;
}

.dark {
  --lunaria-bg-primary: var(--sl-color-bg);
  --lunaria-bg-secondary: var(--sl-color-bg-sidebar);
  --lunaria-text-primary: var(--sl-color-text);
  --lunaria-text-secondary: var(--sl-color-text-muted);
}

/* 自定义卡片样式 */
.language-card {
  border: 1px solid var(--lunaria-border-color);
  border-radius: var(--lunaria-border-radius);
  padding: 1.5rem;
  transition: transform 0.2s, box-shadow 0.2s;
}

.language-card:hover {
  transform: translateY(-2px);
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}

/* 进度条动画 */
.progress-bar {
  transition: width 0.5s ease-out;
}

/* 状态徽章 */
.status-badge {
  display: inline-flex;
  align-items: center;
  gap: 0.25rem;
  padding: 0.25rem 0.75rem;
  border-radius: 9999px;
  font-size: 0.875rem;
  font-weight: 500;
}

.status-badge.done {
  background-color: rgba(34, 197, 94, 0.1);
  color: #22c55e;
}

.status-badge.outdated {
  background-color: rgba(245, 158, 11, 0.1);
  color: #f59e0b;
}

.status-badge.missing {
  background-color: rgba(239, 68, 68, 0.1);
  color: #ef4444;
}

导航集成

---
// src/components/I18nStatusLink.astro
---
<a
  href="/i18n-status/"
  class="i18n-status-link"
  target="_blank"
  rel="noopener noreferrer"
>
  <svg
    xmlns="http://www.w3.org/2000/svg"
    width="16"
    height="16"
    viewBox="0 0 24 24"
    fill="none"
    stroke="currentColor"
    stroke-width="2"
    stroke-linecap="round"
    stroke-linejoin="round"
  >
    <circle cx="12" cy="12" r="10" />
    <line x1="2" y1="12" x2="22" y2="12" />
    <path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z" />
  </svg>
  <span>Translation Status</span>
</a>

<style>
  .i18n-status-link {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.5rem 1rem;
    background: var(--sl-color-bg);
    border: 1px solid var(--sl-color-hairline-light);
    border-radius: 0.375rem;
    color: var(--sl-color-text);
    text-decoration: none;
    font-size: 0.875rem;
    transition: background-color 0.2s, border-color 0.2s;
  }

  .i18n-status-link:hover {
    background: var(--sl-color-bg-hover);
    border-color: var(--sl-color-accent);
  }
</style>

CI/CD 完整流水线

GitHub Actions 工作流

# .github/workflows/ci.yml
name: CI/CD Pipeline

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]
  workflow_dispatch:

env:
  NODE_VERSION: '20'

jobs:
  # 作业 1: 代码检查
  lint:
    name: Lint
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: ${{ env.NODE_VERSION }}
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Run linters
        run: npm run lint

      - name: Check formatting
        run: npm run format:check

  # 作业 2: 构建检查
  build:
    name: Build
    runs-on: ubuntu-latest
    needs: lint
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0  # 获取完整历史用于 LunariaJS

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: ${{ env.NODE_VERSION }}
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Build Astro site
        run: npm run build

      - name: Build Lunaria dashboard
        run: npx lunaria build

      - name: Upload build artifacts
        uses: actions/upload-artifact@v4
        with:
          name: build-output
          path: dist/
          retention-days: 7

  # 作业 3: 翻译状态检查
  i18n-check:
    name: Translation Check
    runs-on: ubuntu-latest
    needs: lint
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: ${{ env.NODE_VERSION }}
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Check translation status
        id: i18n
        run: |
          npx lunaria build --silent
          # 生成状态报告
          REPORT=$(node scripts/i18n-report.js)
          echo "report<<EOF" >> $GITHUB_OUTPUT
          echo "$REPORT" >> $GITHUB_OUTPUT
          echo "EOF" >> $GITHUB_OUTPUT

      - name: Comment on PR
        if: github.event_name == 'pull_request'
        uses: actions/github-script@v7
        with:
          script: |
            const report = `${{ steps.i18n.outputs.report }}`;
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: `## 🌙 Translation Status\n\n${report}`
            });

  # 作业 4: 部署(仅 main 分支)
  deploy:
    name: Deploy
    runs-on: ubuntu-latest
    needs: [build, i18n-check]
    if: github.ref == 'refs/heads/main' && github.event_name == 'push'

    permissions:
      contents: read
      deployments: write

    steps:
      - name: Download build artifacts
        uses: actions/download-artifact@v4
        with:
          name: build-output
          path: dist

      - name: Deploy to Vercel
        uses: amondnet/vercel-action@v25
        with:
          vercel-token: ${{ secrets.VERCEL_TOKEN }}
          vercel-org-id: ${{ secrets.VERCEL_ORG_ID }}
          vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }}
          vercel-args: '--prod'
          working-directory: ./

      - name: Send deployment notification
        if: success()
        run: |
          curl -X POST "${{ secrets.SLACK_WEBHOOK_URL }}" \
            -H 'Content-type: application/json' \
            -d '{
              "text": "✅ Documentation deployed successfully!",
              "attachments": [{
                "fields": [
                  { "title": "Branch", "value": "${{ github.ref_name }}", "short": true },
                  { "title": "Commit", "value": "${{ github.sha }}", "short": true }
                ]
              }]
            }'

翻译状态报告脚本

// scripts/i18n-report.js
const fs = require('fs');
const path = require('path');

function generateReport() {
  const statusPath = path.join('public', 'i18n-status', 'data', 'status.json');

  if (!fs.existsSync(statusPath)) {
    return 'No translation status data available.';
  }

  const status = JSON.parse(fs.readFileSync(statusPath, 'utf8'));

  let report = '| Language | Done | Outdated | Missing | Progress |\n';
  report += '|----------|------|----------|---------|----------|\n';

  const languages = Object.entries(status.languages);

  for (const [lang, data] of languages) {
    if (lang === status.sourceLanguage) continue;

    const progress = Math.round((data.done / data.total) * 100);
    const emoji = progress >= 90 ? '✅' : progress >= 70 ? '⚠️' : '❌';

    report += `| ${lang} | ${data.done} | ${data.outdated} | ${data.missing} | ${emoji} ${progress}% |\n`;
  }

  report += '\n📊 [View Full Dashboard](/i18n-status/)';

  return report;
}

console.log(generateReport());

团队协作工作流

翻译贡献指南

创建 TRANSLATING.md 文件:

# Translation Guide

Thank you for your interest in translating our documentation!

## How to Contribute

### 1. Check Current Status

Visit our [Translation Status Dashboard](/i18n-status/) to see which files need translation.

### 2. Claim a File

Before starting, check if anyone is already working on the file:

1. Search existing [Pull Requests](https://github.com/your-org/your-repo/pulls)
2. If no one is working on it, create an issue or comment on the dashboard

### 3. Translate

1. Fork the repository
2. Create a branch: `git checkout -b translate/zh-cn/introduction`
3. Copy the source file: `cp src/content/docs/en/introduction.md src/content/docs/zh-cn/introduction.md`
4. Translate the content
5. Test locally: `npm run dev`

### 4. Submit

1. Commit your changes: `git commit -m "Translate introduction to Chinese"`
2. Push to your fork: `git push origin translate/zh-cn/introduction`
3. Create a Pull Request

## Translation Guidelines

- **Preserve formatting**: Keep Markdown syntax intact
- **Keep code examples**: Usually, code doesn't need translation
- **Be consistent**: Use consistent terminology
- **Add context**: Use comments for difficult terms

## Need Help?

Join our [Discord](https://discord.gg/example) and ask in the #translations channel.

PR 模板

创建 .github/pull_request_template.md

## Description

<!-- Describe your changes -->

## Type of Change

- [ ] 📝 Documentation update
- [ ] 🌐 Translation
- [ ] ✨ New feature
- [ ] 🐛 Bug fix

## Translation Checklist (if applicable)

- [ ] I have checked the [Translation Status Dashboard](/i18n-status/)
- [ ] I have preserved the original Markdown formatting
- [ ] I have tested the translation locally
- [ ] I have reviewed the terminology consistency

## Screenshots (if applicable)

<!-- Add screenshots to help explain your changes -->

## Additional Notes

<!-- Any additional information that reviewers should know -->

监控与维护

健康检查脚本

// scripts/health-check.js
const fs = require('fs');
const path = require('path');

async function healthCheck() {
  const issues = [];

  // 1. 检查配置文件
  const configPath = 'lunaria.config.json';
  if (!fs.existsSync(configPath)) {
    issues.push('❌ Missing lunaria.config.json');
  }

  // 2. 检查语言目录
  const languages = ['en', 'zh-cn', 'ja', 'ko'];
  for (const lang of languages) {
    const langDir = `src/content/docs/${lang}`;
    if (!fs.existsSync(langDir)) {
      issues.push(`❌ Missing language directory: ${langDir}`);
    }
  }

  // 3. 检查翻译状态
  const statusPath = 'public/i18n-status/data/status.json';
  if (fs.existsSync(statusPath)) {
    const status = JSON.parse(fs.readFileSync(statusPath, 'utf8'));

    for (const [lang, data] of Object.entries(status.languages)) {
      if (lang === status.sourceLanguage) continue;

      const progress = (data.done / data.total) * 100;
      if (progress < 50) {
        issues.push(`⚠️ Low translation progress for ${lang}: ${progress.toFixed(0)}%`);
      }
    }
  }

  // 4. 检查孤立文件
  const files = fs.readdirSync('src/content/docs', { recursive: true });
  // ... 检查逻辑

  // 输出结果
  if (issues.length === 0) {
    console.log('✅ All health checks passed!');
  } else {
    console.log('⚠️ Health check found issues:\n');
    issues.forEach(issue => console.log(issue));
    process.exit(1);
  }
}

healthCheck();

定期维护任务

# .github/workflows/maintenance.yml
name: Maintenance Tasks

on:
  schedule:
    # 每周一早上 9 点
    - cron: '0 9 * * 1'
  workflow_dispatch:

jobs:
  report:
    name: Generate Weekly Report
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Run health check
        run: node scripts/health-check.js

      - name: Generate weekly report
        id: report
        run: |
          REPORT=$(node scripts/weekly-report.js)
          echo "report<<EOF" >> $GITHUB_OUTPUT
          echo "$REPORT" >> $GITHUB_OUTPUT
          echo "EOF" >> $GITHUB_OUTPUT

      - name: Create issue
        uses: actions/github-script@v7
        with:
          script: |
            github.rest.issues.create({
              owner: context.repo.owner,
              repo: context.repo.repo,
              title: 'Weekly i18n Report - ' + new Date().toISOString().split('T')[0],
              body: `${{ steps.report.outputs.report }}`,
              labels: ['i18n', 'weekly-report']
            });

部署与发布

Vercel 配置

// vercel.json
{
  "buildCommand": "npm run build",
  "outputDirectory": "dist",
  "framework": "astro",
  "trailingSlash": false,
  "headers": [
    {
      "source": "/(.*)",
      "headers": [
        {
          "key": "X-Content-Type-Options",
          "value": "nosniff"
        },
        {
          "key": "X-Frame-Options",
          "value": "DENY"
        },
        {
          "key": "X-XSS-Protection",
          "value": "1; mode=block"
        }
      ]
    }
  ]
}

package.json 完整配置

{
  "name": "my-docs",
  "type": "module",
  "version": "1.0.0",
  "scripts": {
    "dev": "astro dev",
    "start": "astro dev",
    "build": "astro build && npm run lunaria:build",
    "preview": "astro preview",
    "astro": "astro",
    "lint": "eslint src/",
    "format": "prettier --write .",
    "format:check": "prettier --check .",
    "lunaria:build": "lunaria build",
    "lunaria:preview": "lunaria preview",
    "i18n:check": "node scripts/health-check.js",
    "i18n:report": "node scripts/weekly-report.js"
  },
  "dependencies": {
    "@astrojs/starlight": "^0.26.0",
    "@lunariajs/starlight": "^0.4.0",
    "astro": "^5.0.0"
  },
  "devDependencies": {
    "@types/node": "^20.0.0",
    "eslint": "^8.57.0",
    "prettier": "^3.2.0",
    "typescript": "^5.3.0"
  }
}

项目维护指南

版本升级策略

# 检查过时的依赖
npm outdated

# 升级 LunariaJS
npm install @lunariajs/starlight@latest

# 测试升级后的兼容性
npm run build
npm run preview

# 如果有问题,回滚
npm install @lunariajs/starlight@previous-version

依赖管理最佳实践

  1. 定期更新:每月检查依赖更新
  2. 锁定版本:使用 package-lock.json
  3. 测试变更:升级后运行完整测试
  4. 文档同步:更新 CHANGELOG

系列总结与展望

LunariaJS 能力总览

能力描述章节
安装配置快速初始化项目第 2 篇
CLI 操作命令行工具使用第 3 篇
仪表板可视化翻译状态第 4 篇
Git 集成基于版本的翻译追踪第 5 篇
Starlight 集成文档站点整合第 6 篇
CI/CD 集成自动化工作流第 7 篇
核心架构源码级理解第 8 篇
高级配置企业级定制第 9 篇
完整实战端到端实践第 10 篇

学习路径回顾

入门阶段

    ├── 第 1 篇:了解 LunariaJS 是什么
    ├── 第 2 篇:学会安装和配置
    ├── 第 3 篇:掌握 CLI 命令
    ├── 第 4 篇:使用仪表板
    ├── 第 5 篇:理解 Git 工作流
    ├── 第 6 篇:集成 Starlight
    └── 第 7 篇:配置 CI/CD


深度阶段

    ├── 第 8 篇:深入源码架构
    ├── 第 9 篇:企业级配置
    └── 第 10 篇:完整实战


    成为 LunariaJS 专家!

未来发展方向

LunariaJS 作为一个活跃的开源项目,未来可能会有:

  • 更多文件格式支持:Excel、PO 文件等
  • 更深度的 CMS 集成:Headless CMS 支持
  • AI 辅助翻译:与机器翻译服务集成
  • 实时协作:多人同时编辑
  • 高级分析:翻译质量评估

社区资源推荐

资源链接
官方文档https://lunaria.libdoc.top/
中文文档https://lunaria.libdoc.top/zh-cn/
GitHub 仓库https://github.com/withastro/lunaria
Discord 社区https://discord.gg/astro
Astro 官方文档https://docs.astro.build/

结语

恭喜你完成了 LunariaJS 从入门到精通的完整学习旅程!

通过这个 10 篇文章的系列教程,你已经掌握了:

  • ✅ LunariaJS 的核心概念和安装配置
  • ✅ CLI 命令和仪表板的使用
  • ✅ Git 工作流和团队协作
  • ✅ Astro Starlight 集成
  • ✅ CI/CD 自动化部署
  • ✅ 核心架构和源码理解
  • ✅ 企业级高级配置
  • ✅ 完整项目实战

现在,你已经具备了使用 LunariaJS 构建专业级多语言文档平台的能力。开始你的下一个项目吧!

如果你觉得这个系列对你有帮助,欢迎分享给更多的开发者,让更多人了解 LunariaJS 这个强大的本地化管理工具。


💡 推荐阅读