← Cloudflare Pages / pages / functions
Расширенный режим
Расширенный режим позволяет разрабатывать Pages Functions с помощью _worker.js файл, а не /functions каталог.
В некоторых случаях встроенная в Pages Functions система маршрутизации по пути к файлу и middleware не подходит для существующих приложений. У вас может быть сложный Worker, который трудно разбить на части в соответствии с файловой системой маршрутизации Pages. Для таких случаев Pages позволяет определить _worker.js файл в выходном каталоге вашего проекта Pages.
При использовании _worker.js файл, весь /functions директория игнорируется, включая её маршрутизацию и промежуточное ПО. Вместо этого _worker.js файл развёртывается и должен быть написан с использованием Синтаксис Module Worker. Если вы никогда не использовали синтаксис Module, обратитесь к Запись в блоге о модулях JavaScript ↗ чтобы узнать больше. Синтаксис модулей позволяет JavaScript-фреймворкам создавать Worker как часть содержимого выходного каталога Pages.
Настройка Function
В расширенном режиме ваша Function берет на себя полный контроль над всеми входящими HTTP запросами к вашему домену. Function обязана самостоятельно выполнять или перенаправлять запросы к статическим ресурсам проекта. Если этого не сделать, поведение будет нарушено или непредсказуемо. Function должна быть написана в синтаксисе Module.
После выполнения _worker.js файл в выходном каталоге, добавьте следующий фрагмент кода:
export default {
async fetch(request, env) {
const url = new URL(request.url);
if (url.pathname.startsWith("/api/")) {
// TODO: Add your custom /api/* logic here.
return new Response("Ok");
}
// Otherwise, serve the static assets.
// Without this, the Worker will error and no assets will be served.
return env.ASSETS.fetch(request);
},
};// Note: You would need to compile your TS into JS and output it as a `_worker.js` file. We do not read `_worker.ts`
interface Env {
ASSETS: Fetcher;
}
export default {
async fetch(request, env): Promise<Response> {
const url = new URL(request.url);
if (url.pathname.startsWith("/api/")) {
// TODO: Add your custom /api/* logic here.
return new Response("Ok");
}
// Otherwise, serve the static assets.
// Without this, the Worker will error and no assets will be served.
return env.ASSETS.fetch(request);
},
} satisfies ExportedHandler<Env>;В приведённом выше коде вы настроили Function на возврат ответа для всех запросов, направленных на /api/. В противном случае Function вернется к выдаче статических ресурсов.
-
env.ASSETS.fetch()функция позволит вам возвращать ресурсы по заданному запросу. envявляется объектом, который содержит ваши переменные окружения и привязки.ASSETSэто привязка Function по умолчанию, обеспечивающая связь между вашей Function и ресурсом Pages, отвечающим за раздачу статических файлов.fetch()вызовы к ресурсу Pages, отвечающему за раздачу статических файлов, и отдаёт запрошенный ресурс.
Миграция с Workers
Чтобы перенести существующий Worker в проект Pages, скопируйте код Worker и вставьте его в новый _worker.js файл. Затем настройте обработку статических файлов, добавив следующий фрагмент кода в _worker.js:
return env.ASSETS.fetch(request);Разверните вашу функцию
После того как вы настроите новую Function или перенесёте Worker на _worker.js, убедитесь, что ваш _worker.js файл помещается в выходной каталог проекта Pages. Чтобы включить расширенный режим, разверните проект через интеграцию с Git.