← Cloudflare Workers / workers / wrangler / migration / v1-to-v2 / wrangler-legacy
Конфигурация
Контекст
Перед публикацией Worker потребуется настроить проект. Настройка выполняется путём изменения ключей и значений в файле Wrangler, расположенном в корне каталога проекта. Перед публикацией вам нужно вручную отредактировать этот файл, чтобы изменить ключи и значения.
Окружения
Конфигурация верхнего уровня представляет собой набор значений, которые указываются в начале файла Wrangler. Эти значения наследуются всеми окружениями, если иное не задано непосредственно в окружении.
Ниже показана структура конфигурации верхнего уровня в файле Wrangler:
{
"$schema": "./node_modules/wrangler/config-schema.json",
"name": "your-worker",
"type": "javascript",
"account_id": "your-account-id",
// This field specifies that the Worker
// will be deployed to a *.workers.dev domain
"workers_dev": true,
// -- OR --
// These fields specify that the Worker
// will deploy to a custom domain
"zone_id": "your-zone-id",
"routes": [
"example.com/*"
]
}"$schema" = "./node_modules/wrangler/config-schema.json"
name = "your-worker"
type = "javascript"
account_id = "your-account-id"
workers_dev = true
zone_id = "your-zone-id"
routes = [ "example.com/*" ]Конфигурация окружения (необязательно): значения конфигурации, которые вы указываете в разделе [env.name] в файле Wrangler.
Окружения позволяют развертывать один и тот же проект в нескольких местах под разными именами. Эти окружения используются с --env или -e флаг на команды которые разворачивают действующие Workers:
builddevpreviewpublishsecret
Некоторые свойства окружения можно унаследованный из конфигурации верхнего уровня, но если в окружении заданы новые значения, они всегда переопределяют значения верхнего уровня.
Пример [env.name] конфигурация выглядит так:
{
"$schema": "./node_modules/wrangler/config-schema.json",
"type": "javascript",
"name": "your-worker",
"account_id": "your-account-id",
"vars": {
"FOO": "default FOO value",
"BAR": "default BAR value"
},
"kv_namespaces": [
{
"binding": "FOO",
"id": "1a...",
"preview_id": "1b..."
}
],
"env": {
"helloworld": {
// Now adding configuration keys for the "helloworld" environment.
// These new values will override the top-level configuration.
"name": "your-worker-helloworld",
"account_id": "your-other-account-id",
"vars": {
"FOO": "env-helloworld FOO value",
"BAR": "env-helloworld BAR value"
},
"kv_namespaces": [
{
// Redeclare kv namespace bindings for each environment
// NOTE: In this case, passing new IDs because new `account_id` value.
"binding": "FOO",
"id": "888...",
"preview_id": "999..."
}
]
}
}
}"$schema" = "./node_modules/wrangler/config-schema.json"
type = "javascript"
name = "your-worker"
account_id = "your-account-id"
[vars]
FOO = "default FOO value"
BAR = "default BAR value"
[[kv_namespaces]]
binding = "FOO"
id = "1a..."
preview_id = "1b..."
[env.helloworld]
name = "your-worker-helloworld"
account_id = "your-other-account-id"
[env.helloworld.vars]
FOO = "env-helloworld FOO value"
BAR = "env-helloworld BAR value"
[[env.helloworld.kv_namespaces]]
binding = "FOO"
id = "888..."
preview_id = "999..."Чтобы развернуть этот пример Worker в helloworld окружение, вы бы выполнили wrangler deploy --env helloworld.
Ключи
В файле Wrangler есть три типа ключей:
-
Ключи только верхнего уровня необходимо настраивать только на верхнем уровне файла Wrangler; все окружения одного проекта должны использовать одинаковое значение такого ключа.
-
Унаследованные ключи можно задавать на верхнем уровне и/или в окружении. Если ключ определён только на верхнем уровне, окружение использует его значение оттуда. Если же ключ определён в окружении, значение из окружения переопределит значение верхнего уровня.
-
Ненаследуемые ключи необходимо задавать отдельно для каждого окружения.
-
nameунаследованное обязательное- Имя скрипта вашего Worker. Если оно наследуется, имя окружения будет добавлено на верхнем уровне.
-
typeобязательный на верхнем уровне- Определяет, как
wrangler buildсоберёт ваш проект. Доступны три варианта:javascript,webpack, а такжеrust.javascriptпроверяет наличие команды сборки, указанной в[build]раздел,webpackсобирает ваш проект с помощью webpack v4, а такжеrustкомпилирует код Rust в проекте в WebAssembly.
- Определяет, как
-
account_idунаследованное обязательное- Это идентификатор аккаунта, связанного с вашей зоной. У вас может быть несколько аккаунтов, поэтому убедитесь, что используете идентификатор аккаунта, связанного с
zone_idвы укажете, если вообще укажете. Также это можно задать черезCF_ACCOUNT_IDпеременную окружения.
- Это идентификатор аккаунта, связанного с вашей зоной. У вас может быть несколько аккаунтов, поэтому убедитесь, что используете идентификатор аккаунта, связанного с
-
zone_idунаследованное необязательное- Это идентификатор зоны или домена, в котором должен работать ваш Worker. Его также можно задать через
CF_ZONE_IDпеременной окружения. Этот ключ необязателен, если вы используете только*.workers.devподдомен.
- Это идентификатор зоны или домена, в котором должен работать ваш Worker. Его также можно задать через
-
workers_devунаследованное необязательное- Это логический флаг, определяющий, будет ли ваш Worker развернут в
*.workers.dev↗ поддомен. Если не указано, по умолчанию используется false.
- Это логический флаг, определяющий, будет ли ваш Worker развернут в
-
routeне наследуется, необязательный- Маршрут в вашей зоне, заданный шаблоном URL, на котором должен работать ваш Worker.
route = "http://example.com/*".routeИЛИroutesключ требуется только если вы не используете*.workers.dev↗ поддомен.
- Маршрут в вашей зоне, заданный шаблоном URL, на котором должен работать ваш Worker.
-
routesне наследуется, необязательный- Список маршрутов, на которых вы хотите использовать свой Worker. Они полностью соответствуют тем же правилам, что и
route, но вы можете указать список из них.routes = ["http://example.com/hello", "http://example.com/goodbye"].routeИЛИroutesключ требуется только если вы не используете*.workers.devподдомен.
- Список маршрутов, на которых вы хотите использовать свой Worker. Они полностью соответствуют тем же правилам, что и
-
webpack_configунаследованное необязательное- Это путь к пользовательскому файлу конфигурации webpack для вашего Worker. Чтобы использовать пользовательскую конфигурацию webpack, необходимо указать это поле, иначе Wrangler будет использовать конфигурацию по умолчанию. См. Страница Wrangler о webpack, где это описано подробнее.
-
varsне наследуется, необязательный- Объект, содержащий текстовые переменные, к которым можно напрямую обращаться в скрипте Worker.
-
kv_namespacesне наследуется, необязательный- Они задают любые Workers KV Пространства имён, к которым вы хотите обращаться изнутри своего Worker.
-
siteунаследованное необязательное- Определяет локальную папку для загрузки и обслуживания из Worker.
-
devне наследуется, необязательный- Аргументы для
wrangler devкоторые настраивают локальный сервер.
- Аргументы для
-
triggersунаследованное необязательное- Настраивает Cron Triggers для запуска Worker по расписанию.
-
usage_modelунаследованное необязательное- Определяет Модель использования для вашего Worker. Есть два варианта:
bundledиunbound. Для новых Worker, если Usage Model не указана, будет установлено значение модель использования по умолчанию, установленная в аккаунте ↗. Для существующих Worker, если Usage Model не указана, будет использована Usage Model, настроенная для этого Worker в панели управления.
- Определяет Модель использования для вашего Worker. Есть два варианта:
-
buildнеобязательный на верхнем уровне- Настраивает пользовательский шаг сборки, который Wrangler выполняет при сборке вашего Worker. См. документация по пользовательским сборкам для дополнительных сведений.
vars
vars ключ определяет таблицу переменные окружения предоставленные вашему скрипту Worker. Все значения являются открытым текстом.
Использование:
{
"vars": {
"FOO": "some value",
"BAR": "some other string"
}
}[vars]
FOO = "some value"
BAR = "some other string"Ключи таблицы доступны вашему Worker в виде глобальных переменных, которые содержат соответствующие им значения.
// Worker code:
console.log(FOO);
//=> "some value"
console.log(BAR);
//=> "some other string"Также вы можете определить vars с использованием формата inline table. В этом стиле не должно быть переносов строк, чтобы конфигурация TOML считалась допустимой:
{
"vars": {
"FOO": "some value",
"BAR": "some other string"
}
}[vars]
FOO = "some value"
BAR = "some other string"kv_namespaces
kv_namespaces определяет список привязок пространств имен KV для вашего Worker.
Использование:
{
"kv_namespaces": [
{
"binding": "FOO",
"id": "0f2ac74b498b48028cb68387c421e279",
"preview_id": "6a1ddb03f3ec250963f0a1e46820076f"
},
{
"binding": "BAR",
"id": "068c101e168d03c65bddf4ba75150fb0",
"preview_id": "fb69528dbc7336525313f2e8c3b17db0"
}
]
}[[kv_namespaces]]
binding = "FOO"
id = "0f2ac74b498b48028cb68387c421e279"
preview_id = "6a1ddb03f3ec250963f0a1e46820076f"
[[kv_namespaces]]
binding = "BAR"
id = "068c101e168d03c65bddf4ba75150fb0"
preview_id = "fb69528dbc7336525313f2e8c3b17db0"Также вы можете определить kv namespaces следующим образом:
{
"kv_namespaces": [
{
"binding": "FOO",
"preview_id": "abc456",
"id": "abc123"
},
{
"binding": "BAR",
"preview_id": "xyz456",
"id": "xyz123"
}
]
}[[kv_namespaces]]
binding = "FOO"
preview_id = "abc456"
id = "abc123"
[[kv_namespaces]]
binding = "BAR"
preview_id = "xyz456"
id = "xyz123"Подобно переменным окружения и secrets, binding имена доступны вашему Worker в виде глобальных переменных.
// Worker script:
let value = await FOO.get("keyname");
//=> gets the value for "keyname" from
//=> the FOO variable, which points to
//=> the "0f2ac...e279" KV namespace-
bindingобязательно- Имя глобальной переменной, на которую будет ссылаться ваш код. Она будет предоставлена как Экземпляр среды выполнения KV.
-
idобязательно- ID пространства имен KV, которое ваш
bindingдолжен представлять. Обязательно дляwrangler publish.
- ID пространства имен KV, которое ваш
-
preview_idобязательно- ID пространства имен KV, которое ваш
bindingдолжен представлять во времяwrangler devилиwrangler preview. Обязательно дляwrangler devиwrangler preview.
- ID пространства имен KV, которое ваш
сайт
A Workers Site сгенерированный с помощью wrangler generate --site или wrangler init --site.
Использование:
{
"site": {
"bucket": "./public",
"entry-point": "workers-site"
}
}[site]
bucket = "./public"
entry-point = "workers-site"-
bucketобязательно- Каталог со статическими ресурсами. Путь должен быть указан относительно файла Wrangler. Пример:
bucket = "./public"
- Каталог со статическими ресурсами. Путь должен быть указан относительно файла Wrangler. Пример:
-
entry-pointнеобязательный- Расположение скрипта Worker. Расположение по умолчанию:
workers-site. Пример:entry-point = "./workers-site"
- Расположение скрипта Worker. Расположение по умолчанию:
-
includeнеобязательный- Исчерпывающий список
.gitignore-подобные шаблоны, соответствующие именам файлов или каталогов в вашемbucketрасположение. Загружены будут только совпавшие элементы. Пример:include = ["upload_dir"]
- Исчерпывающий список
-
excludeнеобязательный- Список
.gitignore-подобные шаблоны, соответствующие файлам или каталогам в вашемbucketкоторые следует исключить из загрузки. Пример:exclude = ["ignore_dir"]
- Список
Также можно определить собственный site используя альтернативный синтаксис TOML ↗.
Лимиты хранилища
Для исключительно больших страниц Workers Sites может не подойти. Действует ограничение 25 МиБ на страницу или файл. Кроме того, Wrangler создаёт манифест ресурсов для ваших файлов, который учитывается в лимите размера скрипта. Если файлов слишком много, использовать Workers Sites может не получиться.
Включение только определённых файлов и каталогов
Если вы хотите включить только определённый набор файлов или каталогов в bucket, добавьте include поле в ваш
[site] раздел вашего файла Wrangler:
{
"site": {
"bucket": "./public",
"entry-point": "workers-site",
"include": [ // must be an array.
"included_dir"
]
}
}[site]
bucket = "./public"
entry-point = "workers-site"
include = [ "included_dir" ]Wrangler будет загружать только файлы и каталоги, соответствующие шаблонам в include массив.
Исключение файлов и каталогов
Если вы хотите исключить файлы или каталоги в bucket, добавьте exclude поле в ваш [site] раздел вашего файла Wrangler:
{
"site": {
"bucket": "./public",
"entry-point": "workers-site",
"exclude": [ // must be an array.
"excluded_dir"
]
}
}[site]
bucket = "./public"
entry-point = "workers-site"
exclude = [ "excluded_dir" ]Wrangler будет игнорировать файлы и каталоги, соответствующие шаблонам в exclude массив при загрузке ресурсов в Workers KV.
Include > Exclude
Если вы укажете оба include и exclude поля, include поле будет использовано, а exclude поле будет проигнорировано.
Игнорируемые записи по умолчанию
Wrangler всегда игнорирует:
node_modules- Скрытые файлы и каталоги
- Символические ссылки
Подробнее о шаблонах include/exclude
См. документация по gitignore ↗ чтобы узнать больше о стандартных шаблонах сопоставления.
Настройка сборки Sites
По умолчанию проекты Workers Sites используют webpack. Однако вы можете использование собственной конфигурации webpack, учитывайте ваш entry и context настройки.
Вы также можете использовать [build] раздел с Workers Sites, при условии что на этапе сборки зависимости разрешаются в node_modules. См. пользовательские сборки раздел для получения дополнительной информации.
триггеры
Набор cron-триггеров, которые вызывают Worker по расписанию.
Использование:
{
"triggers": {
"crons": [
"0 0 * JAN-JUN FRI",
"0 0 LW JUL-DEC *"
]
}
}[triggers]
crons = [ "0 0 * JAN-JUN FRI", "0 0 LW JUL-DEC *" ]cronsнеобязательный- Набор выражения cron ↗, где каждое выражение задаёт отдельное расписание запуска Worker.
dev
Аргументы для wrangler dev можно настроить здесь, чтобы не передавать их каждый раз.
Использование:
{
"dev": {
"port": 9000,
"local_protocol": "https"
}
}[dev]
port = 9_000
local_protocol = "https"-
ipнеобязательный- IP-адрес для локального
wrangler devсервер для прослушивания, по умолчанию127.0.0.1.
- IP-адрес для локального
-
portнеобязательный- Порт для локального
wrangler devсервер для прослушивания, по умолчанию8787.
- Порт для локального
-
local_protocolнеобязательный- Протокол, который локальный
wrangler devсервер для прослушивания запросов, по умолчаниюhttp.
- Протокол, который локальный
-
upstream_protocolнеобязательный- Протокол, который
wrangler devперенаправляет запросы, по умолчанию используетсяhttps.
- Протокол, который
сборка
Пользовательская команда сборки для вашего проекта. Существует две конфигурации в зависимости от формата вашего Worker: service-worker и modules.
Service Workers
Этот раздел посвящен настройке Workers с помощью service-worker формат. Такие Workers используют addEventListener и выглядеть следующим образом:
addEventListener("fetch", (event) => {
event.respondWith(new Response("I'm a service Worker!"));
});Использование:
{
"build": {
"command": "npm install && npm run build",
"upload": {
"format": "service-worker"
}
}
}[build]
command = "npm install && npm run build"
[build.upload]
format = "service-worker"[build]
-
commandнеобязательный- Команда, используемая для сборки вашего Worker. В Linux и macOS команда выполняется в
shоболочку иcmdоболочку для Windows.&&и||можно использовать операторы оболочки.
- Команда, используемая для сборки вашего Worker. В Linux и macOS команда выполняется в
-
cwdнеобязательный- Рабочий каталог для команд. По умолчанию используется корневой каталог проекта.
-
watch_dirнеобязательный- Каталог, за изменениями в котором нужно следить при использовании
wrangler dev, по умолчанию используетsrcотносительно корневого каталога проекта.
- Каталог, за изменениями в котором нужно следить при использовании
[build.upload]
formatобязательно- Формат скрипта Worker должен быть
"service-worker".
- Формат скрипта Worker должен быть
Модули
Теперь Workers поддерживает синтаксис ES Modules. Этот формат позволяет экспортировать набор файлов и/или модулей, в отличие от формата Service Worker, который требует загрузки одного файла.
Модульные Workers export свои обработчики событий вместо использования addEventListener вызовы.
Модули получают все привязки (KV Namespaces, Environment Variables и Secrets) в качестве аргументов экспортируемых обработчиков. В формате Service Worker эти привязки доступны как глобальные переменные.
Загруженный модуль может import другие загруженные ES-модули. При использовании формата CommonJS вы можете require другие загруженные модули CommonJS.
import html from "./index.html";
export default {
// * request is the same as `event.request` from the service worker format
// * waitUntil() and passThroughOnException() are accessible from `ctx` instead of `event` from the service worker format
// * env is where bindings like KV namespaces, Durable Object namespaces, Config variables, and Secrets
// are exposed, instead of them being placed in global scope.
async fetch(request, env, ctx) {
const headers = { "Content-Type": "text/html;charset=UTF-8" };
return new Response(html, { headers });
},
};Чтобы создать проект Workers с помощью Wrangler и Modules, добавьте [build] раздел:
{
"build": {
"command": "npm install && npm run build",
"upload": {
"format": "modules",
"main": "./worker.mjs"
}
}
}[build]
command = "npm install && npm run build"
[build.upload]
format = "modules"
main = "./worker.mjs"[build]
-
commandнеобязательный- Команда, используемая для сборки вашего Worker. В системах Linux и macOS команда выполняется в
shоболочку иcmdоболочку для Windows.&&и||можно использовать операторы оболочки.
- Команда, используемая для сборки вашего Worker. В системах Linux и macOS команда выполняется в
-
cwdнеобязательный- Рабочий каталог для команд. По умолчанию используется корневой каталог проекта.
-
watch_dirнеобязательный- Каталог, за изменениями в котором нужно следить при использовании
wrangler dev, по умолчанию используетsrcотносительно корневого каталога проекта.
- Каталог, за изменениями в котором нужно следить при использовании
[build.upload]
-
formatобязательно- Формат скрипта Workers должен быть
"modules".
- Формат скрипта Workers должен быть
-
dirнеобязательный- Каталог, из которого нужно загрузить модули, по умолчанию используется
distотносительно корневого каталога проекта.
- Каталог, из которого нужно загрузить модули, по умолчанию используется
-
mainобязательно- Относительный путь к основному модулю от
dir, включая./префикс. Основной модуль должен быть ES-модулем. Для проектов со скриптом сборки это обычно результат работы вашего JavaScript-бандлера.
- Относительный путь к основному модулю от
rulesнеобязательный- Упорядоченный список правил, определяющих, какие модули импортировать и в каком виде их импортировать.
Вам потребуется указать правила, чтобы использовать модули Text, Data и CompiledWasm, или если вы хотите
иметь
.jsфайл рассматривался какESModuleвместоCommonJS.
- Упорядоченный список правил, определяющих, какие модули импортировать и в каком виде их импортировать.
Вам потребуется указать правила, чтобы использовать модули Text, Data и CompiledWasm, или если вы хотите
иметь
Значения по умолчанию:
{
// You do not need to include these default rules in your [Wrangler configuration file](/workers/wrangler/configuration/), they are implicit.
// The default rules are treated as the last two rules in the list.
"build": {
"upload": {
"format": "modules",
"main": "./worker.mjs",
"rules": [
{
"type": "ESModule",
"globs": [
"**/*.mjs"
]
},
{
"type": "CommonJS",
"globs": [
"**/*.js",
"**/*.cjs"
]
}
]
}
}
}[build.upload]
format = "modules"
main = "./worker.mjs"
[[build.upload.rules]]
type = "ESModule"
globs = [ "**/*.mjs" ]
[[build.upload.rules]]
type = "CommonJS"
globs = [ "**/*.js", "**/*.cjs" ]-
typeобязательно- Тип модуля. Допустимые варианты см. в таблице ниже:
-
globsобязательно- в стиле UNIX правила glob ↗ которые используются для определения типа модуля для заданного файла в
dir. Globs сопоставляются с относительным путём модуля отbuild.upload.dirбез./префикс. Правила проверяются по порядку, начиная сверху.
- в стиле UNIX правила glob ↗ которые используются для определения типа модуля для заданного файла в
-
fallthroughнеобязательный- Если этот параметр установлен в true, для данного типа модуля будут учитываться дальнейшие правила. Если он не указан или установлен в false, дальнейшие правила для этого типа модуля игнорируются.
Пример
Чтобы показать, как применяются эти уровни, вот файл Wrangler с несколькими средами:
{
"$schema": "./node_modules/wrangler/config-schema.json",
// top level configuration
"type": "javascript",
"name": "my-worker-dev",
"account_id": "12345678901234567890",
"zone_id": "09876543210987654321",
"route": "dev.example.com/*",
"usage_model": "unbound",
"kv_namespaces": [
{
"binding": "FOO",
"id": "b941aabb520e61dcaaeaa64b4d8f8358",
"preview_id": "03c8c8dd3b032b0528f6547d0e1a83f3"
},
{
"binding": "BAR",
"id": "90e6f6abd5b4f981c748c532844461ae",
"preview_id": "e5011a026c5032c09af62c55ecc3f438"
}
],
"build": {
"command": "webpack",
"upload": {
"format": "service-worker"
}
},
"site": {
"bucket": "./public",
"entry-point": "workers-site"
},
"dev": {
"ip": "0.0.0.0",
"port": 9000,
"local_protocol": "http",
"upstream_protocol": "https"
},
"env": {
// environment configuration
"staging": {
"name": "my-worker-staging",
"route": "staging.example.com/*",
"kv_namespaces": [
{
"binding": "FOO",
"id": "0f2ac74b498b48028cb68387c421e279"
},
{
"binding": "BAR",
"id": "068c101e168d03c65bddf4ba75150fb0"
}
]
},
// environment configuration
"production": {
"workers_dev": true,
"kv_namespaces": [
{
"binding": "FOO",
"id": "0d2ac74b498b48028cb68387c421e233"
},
{
"binding": "BAR",
"id": "0d8c101e168d03c65bddf4ba75150f33"
}
]
}
}
}"$schema" = "./node_modules/wrangler/config-schema.json"
type = "javascript"
name = "my-worker-dev"
account_id = "12345678901234567890"
zone_id = "09876543210987654321"
route = "dev.example.com/*"
usage_model = "unbound"
[[kv_namespaces]]
binding = "FOO"
id = "b941aabb520e61dcaaeaa64b4d8f8358"
preview_id = "03c8c8dd3b032b0528f6547d0e1a83f3"
[[kv_namespaces]]
binding = "BAR"
id = "90e6f6abd5b4f981c748c532844461ae"
preview_id = "e5011a026c5032c09af62c55ecc3f438"
[build]
command = "webpack"
[build.upload]
format = "service-worker"
[site]
bucket = "./public"
entry-point = "workers-site"
[dev]
ip = "0.0.0.0"
port = 9_000
local_protocol = "http"
upstream_protocol = "https"
[env.staging]
name = "my-worker-staging"
route = "staging.example.com/*"
[[env.staging.kv_namespaces]]
binding = "FOO"
id = "0f2ac74b498b48028cb68387c421e279"
[[env.staging.kv_namespaces]]
binding = "BAR"
id = "068c101e168d03c65bddf4ba75150fb0"
[env.production]
workers_dev = true
[[env.production.kv_namespaces]]
binding = "FOO"
id = "0d2ac74b498b48028cb68387c421e233"
[[env.production.kv_namespaces]]
binding = "BAR"
id = "0d8c101e168d03c65bddf4ba75150f33"