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" },
],
});
Ключевые свойства:
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 предоставляет возможность настраивать интеграцию с внешними библиотеками для сборки, оптимизации и обработки ресурсов:
fresh-twind или напрямую через конфигурацию сборки.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",
},
});
Это упрощает настройку проектов, где требуется различное поведение для разработки, тестирования и продакшена.
Для крупных приложений рекомендуется:
Такой подход позволяет легко управлять проектом, минимизировать дублирование и ускорять процесс сборки без потери гибкости.