← Cloudflare Pages / pages / functions
Маршрутизация
Functions используют файловую маршрутизацию. Ваш /functions структура директорий определяет маршруты, на которых будут выполняться ваши Functions. Вы можете создать /functions директория с таким количеством уровней, какое требуется для задач вашего проекта. Рассмотрим следующую директорию:
- ...
- functions
- index.js
- helloworld.js
- howdyworld.js
- fruits
- index.js
- apple.js
- banana.js
На основе приведённой выше структуры файлов будут сгенерированы следующие маршруты. Эти маршруты сопоставляют шаблон URL-адреса с /functions файл, который вызывается, когда посетитель переходит по URL:
| Путь к файлу | Маршрут |
|---|---|
| /functions/index.js | example.com |
| /functions/helloworld.js | example.com/helloworld |
| /functions/howdyworld.js | example.com/howdyworld |
| /functions/fruits/index.js | example.com/fruits |
| /functions/fruits/apple.js | example.com/fruits/apple |
| /functions/fruits/banana.js | example.com/fruits/banana |
Если для Function не находится совпадения, она будет использовать статический ресурс, если он есть. В противном случае Function будет использовать в качестве резервного варианта поведение маршрутизации по умолчанию для статических файлов Pages.
Динамические маршруты
Динамические маршруты позволяют сопоставлять URL с параметризованными сегментами. Это полезно при создании динамических приложений: вы можете принимать динамические значения, которые сопоставляются с одним путем, изменив имя файла.
Одиночные сегменты пути
Чтобы создать динамический маршрут, заключите имя файла в квадратные скобки, например, /users/[user].js. Тем самым вы создаете заполнитель для одного сегмента пути:
| Путь | Совпадение? |
|---|---|
| /users/nevi | Да |
| /users/daniel | Да |
| /profile/nevi | Нет |
| /users/nevi/foobar | Нет |
| /nevi | Нет |
Составные сегменты пути
Если заключить имя файла в двойные квадратные скобки, например, /users/[[user]].js : вы сопоставляете маршрут любой глубины после /users/:
| Путь | Совпадение? |
|---|---|
| /users/nevi | Да |
| /users/daniel | Да |
| /profile/nevi | Нет |
| /users/nevi/foobar | Да |
| /users/daniel/xyz/123 | Да |
| /nevi | Нет |
Примеры динамических маршрутов
Ознакомьтесь со следующим /functions/ структура директорий:
- ...
- functions
- date.js
- пользователи
- special.js
- [user].js
- [[catchall]].js
Следующие запросы будут соответствовать следующим файлам:
| Запрос | Файл |
|---|---|
| /foo | Запрос будет направлен на статический ресурс, если он доступен. |
| /date | /date.js |
| /users/daniel | /users/[user].js |
| /users/nevi | /users/[user].js |
| /users/special | /users/special.js |
| /users/daniel/xyz/123 | /users/[[catchall]].js |
Сегмент(ы) URL-адреса, соответствующие заполнителю ([user]) будет доступен в запросе context объект. context.params объект можно использовать, чтобы найти значение, соответствующее заданному заполнителю имени файла.
Для файлов, соответствующих одному сегменту URL (используется одна пара скобок), значения возвращаются в виде строки:
export function onRequest(context) {
return new Response(context.params.user);
}Описанная выше логика вернёт daniel для запросов к /users/daniel.
Для файлов, соответствующих нескольким сегментам URL (используется двойная пара скобок), значения возвращаются в виде массива:
export function onRequest(context) {
return new Response(JSON.stringify(context.params.catchall));
}Описанная выше логика вернёт ["daniel", "xyz", "123"] для запросов к /users/daniel/xyz/123.
Маршруты вызова Functions
Для полностью статического проекта Pages предоставляет неограниченное количество бесплатных запросов. Однако как только вы добавляете Functions в проект Pages, все запросы по умолчанию начинают вызывать вашу Function. Чтобы сохранить неограниченное количество бесплатных статических запросов, исключите статические маршруты проекта, создав _routes.json файл. Этот файл будет создан автоматически, если functions директория обнаружена в вашем проекте при публикации проекта с помощью Pages CI или Wrangler.
Создайте _routes.json файл
Создайте _routes.json файл, чтобы управлять тем, когда вызывается Function. Его следует разместить в каталоге сборки проекта.
Каталоги сборки по умолчанию
Ниже приведены стандартные команды сборки и каталоги для популярных фреймворков и инструментов.
| Фреймворк/инструмент | Команда сборки | Директория сборки |
|---|---|---|
| React (Vite) | npm run build | dist |
| Gatsby | npx gatsby build | public |
| Next.js (статический экспорт HTML) | npx next build | out |
| Nuxt.js | npm run build | dist |
| Qwik | npm run build | dist |
| Remix | npm run build | build/client |
| Svelte | npm run build | public |
| SvelteKit | npm run build | .svelte-kit/cloudflare |
| Vue | npm run build | dist |
| Analog | npm run build | dist/analog/public |
| Astro | npm run build | dist |
| Angular | npm run build | dist/cloudflare |
| Brunch | npx brunch build --production | public |
| Docusaurus | npm run build | build |
| Elder.js | npm run build | public |
| Eleventy | npx @11ty/eleventy | _site |
| Ember.js | npx ember-cli build | dist |
| GitBook | npx gitbook-cli build | _book |
| Gridsome | npx gridsome build | dist |
| Hugo | hugo | public |
| Jekyll | jekyll build | _site |
| MkDocs | mkdocs build | site |
| Pelican | pelican content | output |
| React Static | react-static build | dist |
| Slate | ./deploy.sh | build |
| Umi | npx umi build | dist |
| VitePress | npx vitepress build | .vitepress/dist |
| Zola | zola build | public |
Этот файл будет включать три свойства:
- версия: Определяет версию схемы. На данный момент существует только одна версия схемы (версия 1), но в будущем могут появиться новые версии, и мы стремимся сохранять обратную совместимость.
- включить: Определяет маршруты, которые будут вызывать Functions. Поддерживает символы подстановки.
- исключить: Определяет маршруты, которые не будут вызывать Functions. Поддерживает символы подстановки.
excludeвсегда имеет приоритет надinclude.
Пример конфигурации
Ниже приведён пример _routes.json.
{
"version": 1,
"include": ["/*"],
"exclude": []
}Это _routes.json будет вызывать ваши Functions на всех маршрутах.
Ниже приведён ещё один пример _routes.json файл. Любой маршрут внутри /build директорию не вызовет Function и не приведет к списанию платы за вызов Functions.
{
"version": 1,
"include": ["/*"],
"exclude": ["/build/*"]
}Fail open / closed
Если вы используете тариф Workers Free, вы можете настроить поведение Pages при исчерпании дневного лимита бесплатного тарифа на запросы Pages Functions. Например, если в Pages Functions выполняются проверки аутентификации или другая критически важная логика, вы можете отключать свой проект Pages при исчерпании лимита.
-
На панели управления Cloudflare перейдите к разделу Workers & Pages страницу.
Перейдите в Workers & Pages ↗ -
Выберите свой проект Pages.
-
Перейдите в Настройки > Runtime > Fail open / closed.
«Разрешать при сбое» означает, что статические ресурсы продолжат обслуживаться, даже если Pages Functions обычно должны были сработать первыми. «Блокировать при сбое» означает, что вместо статических ресурсов будет возвращена страница ошибки.
Суточный лимит запросов для Pages Functions можно полностью снять, перейдя на Workers Standard.
Лимиты
Для маршрутов вызова Functions действуют следующие ограничения:
- Должно быть указано хотя бы одно правило включения.
- Суммарно может быть не более 100 правил включения и исключения.
- Каждое правило может содержать не более 100 символов.