Расширение конфигурации

Fresh — это современный фреймворк для разработки веб-приложений на JavaScript и TypeScript с акцентом на высокую производительность и минимизацию клиентского JavaScript. Одной из ключевых возможностей является гибкая система конфигурации, позволяющая адаптировать проект под конкретные задачи и расширять стандартные настройки.


Основные элементы конфигурации

Конфигурация Fresh хранится в файле fresh.config.ts или fresh.config.js. Она представляет собой объект, в котором задаются пути, роутинг, сборка, настройки сервера и интеграции с внешними библиотеками.

Пример базовой конфигурации:

import { defineConfig } from "fresh";

export default defineConfig({
  root: "./src",
  build: {
    outDir: "./dist",
    minify: true,
  },
  routes: [
    { path: "/", file: "./routes/index.tsx" },
  ],
});

Ключевые свойства:

  • root — корневая директория проекта, содержащая исходный код.
  • build — параметры сборки: выходная папка, минификация, оптимизация.
  • routes — массив объектов с определением маршрутов.

Расширение конфигурации через плагины

Fresh поддерживает подключение пользовательских плагинов, которые позволяют добавлять новые возможности или изменять поведение сборки. Плагин реализуется как функция, принимающая текущую конфигурацию и возвращающая её модифицированную версию.

Пример плагина:

function customPlugin(config) {
  config.build.minify = false;
  config.build.sourcemap = true;
  return config;
}

export default defineConfig({
  plugins: [customPlugin],
});

Ключевой момент: порядок подключения плагинов важен — они применяются последовательно, поэтому поздние плагины могут переопределять настройки предыдущих.


Наследование и объединение конфигураций

Для крупных проектов часто используется стратегия разделения конфигураций по окружению: development, production и test. Fresh позволяет объединять несколько конфигурационных объектов с помощью стандартного подхода JavaScript — Object.assign или библиотеки deepmerge.

Пример:

import baseConfig from "./fresh.base.config";

const devConfig = {
  build: {
    minify: false,
    sourcemap: true,
  },
  env: "development",
};

export default defineConfig({
  ...baseConfig,
  ...devConfig,
});

Это позволяет хранить общие настройки отдельно и расширять их для разных окружений без дублирования кода.


Настройка маршрутизации и динамических роутов

Конфигурация маршрутов может быть статической и динамической. Динамические маршруты используются для страниц с переменными сегментами URL. Их определение осуществляется через синтаксис [param] в файле маршрута.

Пример:

export default defineConfig({
  routes: [
    { path: "/", file: "./routes/index.tsx" },
    { path: "/blog/[id]", file: "./routes/blog/[id].tsx" },
  ],
});

Расширение маршрутизации возможно через функции, генерирующие массив маршрутов на основе внешних данных:

function generateBlogRoutes(posts) {
  return posts.map(post => ({
    path: `/blog/${post.id}`,
    file: `./routes/blog/${post.id}.tsx`,
  }));
}

Интеграция с внешними инструментами

Fresh предоставляет возможность настраивать интеграцию с внешними библиотеками для сборки, оптимизации и обработки ресурсов:

  • PostCSS и TailwindCSS — подключаются через плагин fresh-twind или напрямую через конфигурацию сборки.
  • ESLint и Prettier — можно подключать через отдельные скрипты, а конфигурацию синхронизировать с Fresh через плагины.
  • TypeScript — полностью поддерживается; конфигурация компилятора определяется в tsconfig.json, а Fresh использует её для сборки.

Пример добавления TailwindCSS:

import { defineConfig } from "fresh";
import twindPlugin from "@twind/fresh-plugin";

export default defineConfig({
  plugins: [twindPlugin()],
});

Переопределение стандартных настроек сборки

Fresh предоставляет гибкий API для настройки процесса сборки. Например, можно изменить обработку статических ресурсов, подключить собственные транспайлеры или изменить поведение минификации:

export default defineConfig({
  build: {
    transpile: ["some-legacy-lib"],
    optimizeDeps: false,
  },
});

Ключевой момент: использование этих настроек позволяет оптимизировать загрузку и рендеринг страниц без изменения исходного кода компонентов.


Использование окружений и переменных

Конфигурация Fresh поддерживает работу с переменными окружения. Они могут быть определены в .env файлах и автоматически подставляться в процессе сборки:

export default defineConfig({
  env: {
    API_URL: process.env.API_URL || "https://api.example.com",
  },
});

Это упрощает настройку проектов, где требуется различное поведение для разработки, тестирования и продакшена.


Стратегии масштабирования конфигурации

Для крупных приложений рекомендуется:

  • Разделять конфигурацию по модулям: роутинг, сборка, плагины, окружение.
  • Использовать динамические функции для генерации маршрутов и плагинов.
  • Сохранять общие настройки в отдельном базовом файле и расширять их через наследование.

Такой подход позволяет легко управлять проектом, минимизировать дублирование и ускорять процесс сборки без потери гибкости.