Я давний пользователь AWS. Lambda — это здорово, но для многих случаев использования я чувствую, что это приносит слишком много сложности. Вы должны знать о окружающем ландшафте AWS и о том, как Lambda связывается с IAM, событиями CloudWatch, если вы запускаете рабочие места, похожие на Cron, или API-шлюз, если вы хотите разоблачить конечные точки HTTP. Без сервера Framework и аналогичные облегчают вещи, скрывая детали. Обручи, которые вам нужно пройти, чтобы избежать холодных стартов, раздражают.
Мне еще предстоит профессионально использовать работников CloudFlare и не могу говорить о том, как обслуживание на практике на практике, но я взволнован операционной простотой, которую он обещает. В этом посте я не использую долговечные объекты, а доступ к постоянной памяти в изолятах V8 на краевых узлах кажется сильным подходом к масштабированию веб -сервисов. Кажется, что вы могли бы избежать введения многих слоев кэша, обычно встречающихся в веб -службах.
Clojure Я просто очарован. Я следил за этим, но никогда не делал ничего существенного с этим. За последние годы я работал в основном на статически напечатанных языках в кодовых базах, которые следуют императивному стилю. Хотя я ценю типы и ошибки во времени компиляции и то, как эти вещи приводят как минимум некоторый уровень структуры в любую кучу кода, кажется, есть сладкая точка, где, если вы можете сохранить достаточно простой, система типа добавляет больше накладных расходов чем это приносит ясность. Я также ценю, что в Clojure неизменность — это то, от чего вам нужно активно отказаться.
Давайте начнем.
Настройка проекта и источник работника
Во -первых, мы создаем пустой проект NPM, который зависит от Shadow-cljs Анкет
mkdir lispmachine && cd $_
Package.json
:
{ "name": "lispmachine", "version": "0.0.1", "private": true, "dependencies": { "shadow-cljs": "^2.12.5" }, "scripts": { "build": "shadow-cljs compile worker" } }
Shadow-cljs.edn
:
{:source-paths ["src/main"] :dependencies [] :builds {:worker {:target :esm :output-dir "dist" :modules {:worker {:exports {default lispmachine.worker/eventHandlers} }}}}}
Далее добавьте наш код работника. src/main/lispmachine/koring.cljs
:
(ns lispmachine.worker) (def eventHandlers #js {:fetch (fn [request env] (js/Response. (str "Clojure <3 Cloudflare Workers!\n\n" (js/JSON.stringify request)))) })
Теперь мы должны быть в состоянии компилировать.
npm install npm run build
Настройка работников CloudFlare
Далее установите и настройте Wrangler Если вы еще этого не сделали.
Вы должны быть на 1.16.0 или более поздней версии с поддержкой модулей ES. На данный момент, чтобы использовать модули ES для работников, вам также нужно Забрать прочные объекты, открытая бета-версия Анкет (Вы можете избежать модулей ES и добавить бундлер Но я не хотел этого дополнительного шага. Если вы это сделаете, Esbuild сделает свое дело.)
Добавить wrangler.toml
:
name = "lispmachine" workers_dev = true type = "javascript" [build] cwd = "./dist" command = "npm run build" upload.format = "modules" upload.main = "worker.js" upload.rules = [{ type = "ESModule", globs = ["**/*.js"] }]
Я должен был добавить upload.rules
Потому что Shadow-Cljs генерирует файлы с .js
Расширения и Wrangler предполагают, что такие файлы являются обычными. Я также должен был использовать CWD
После получения ошибок в отношении основного модуля не найден с upload.main
Анкет
Теперь мы готовы взять это вживую и увидеть, что это работает!
CF_ACCOUNT_ID=... wrangler publish
curl https://lispmachine.yoursubdomain.workers.dev
Clojure <3 Cloudflare Workers! {"fetcher":{},"redirect":"manual","headers":{},"url":"https://lispmachine.yoursubdomain.workers.dev/","method":"GET","bodyUsed":false,"body":null}
(Если кто -то знает, почему request.cf
не является частью вывода из (JS/JSON.Stringify запрос)
пожалуйста, дайте мне знать.)
Оригинал: «https://dev.to/pilt/clojurescript-on-cloudflare-workers-2d9g»