Рубрики
Uncategorized

Clojurescript на работниках CloudFlare

Я давний пользователь AWS. Lambda — это здорово, но для многих случаев использования я чувствую, что это приносит слишком много … Tagged с помощью сервера, Cloudflare, Clojurescript, DevOps.

Я давний пользователь 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»