在开发过程中,如何在本地 运行 我的 cloudflare worker 无服务器功能?

How to locally run my cloudflare worker serverless function, during development?

我设法使用无服务器框架部署了我的第一个 cloudflare worker https://serverless.com/framework/docs/providers/cloudflare/guide/ 当我击中云时它正在工作。

在开发期间,希望能够在 http://localhost:8080/*

上进行测试

启动本地 HTTP 服务器并使用 serverless.yml 中指定的函数处理我的请求的最简单方法是什么?

我调查了 https://github.com/serverless/examples/tree/master/google-node-simple-http-endpoint 但是没有 "start" 脚本。

https://github.com/serverless/

上似乎没有 cloudflare 的示例

目前无法在本地运行真正的Cloudflare Workers 运行时间。 Workers 团队知道开发人员需要这个,但需要做一些工作才能将核心 Workers 运行 时间与 Cloudflare 软件堆栈的其余部分分开,否则后者对于 运行 本地来说太复杂了。

同时,您可以尝试以下几个选项:

Third-party 模拟器

Cloudworker 是 Cloudflare Workers 的模拟器,运行 在本地位于 node.js 之上。它是由使用 Workers 的公司 Dollar Shave Club 的工程师构建的,而不是由 Cloudflare 构建的。由于它是 Workers 环境的完全独立实现,因此它的行为方式与 "real thing" 之间可能存在细微差别。但是,它足以完成一些工作。

预览服务API

cloudflareworkers.com 上看到的预览可以通过 API 访问。使用一些 curl 命令,您可以将代码上传到 cloudflareworkers.com 并对其进行 运行 测试。这并不是真正的 "local",但如果您始终连接到互联网,那几乎是一样的。您不需要任何特殊凭据即可使用此 API,因此您可以编写一些使用它的脚本 运行 单元测试等

上传名为 worker.js 的脚本 POST 将其上传到 https://cloudflareworkers.com/script:

SCRIPT_ID=$(curl -sX POST https://cloudflareworkers.com/script \
  -H "Content-Type: text/javascript" --data-binary @worker.js | \
  jq -r .id)

现在 $SCRIPT_ID 将是一个 32 位十六进制数字,用于标识您的脚本。请注意,ID 基于哈希,因此如果您两次上传完全相同的脚本,您将获得相同的 ID。

接下来,生成一个随机的 session ID(32 个十六进制数字):

SESSION_ID=$(head -c 16 /dev/urandom | xxd -p)

重要的是这个 session ID 是加密随机的,因为任何拥有该 ID 的人都可以将开发工具连接到您的预览并调试它。

我们也定义两个配置:

PREVIEW_HOST=example.com
HTTPS=1

这些指定当您的工作人员 运行s 时,预览应该像 运行ning 在 https://example.com 上一样。传入请求的 URL 和 Host header 将被重写为此协议和主机名。如果 URL 应该是 HTTPS,则设置 HTTPS=1,如果不是,则设置 HTTPS=0

现在您可以像这样向您的工作人员发送请求:

curl https://00000000000000000000000000000000.cloudflareworkers.com \
  -H "Cookie: __ew_fiddle_preview=$SCRIPT_ID$SESSION_ID$HTTPS$PREVIEW_HOST"

(32 个零可以是任何十六进制数字。在浏览器中使用预览时,这些是 randomly-generated 以防止 cookie 和缓存内容干扰 sessions。使用 curl 时,不过,这并不重要,所以 all-zero 没问题。)

您可以更改此 curl 行以在 URL 中包含路径,使用不同的方法(如 -X POST),添加 header 等。只要显示主机名和 cookie,它就会转到您的预览工作器。

最后,你可以在Chrome中连接devtools控制台进行调试(不幸的是目前只能在Chrome中使用):

google-chrome https://cloudflareworkers.com/devtools/inspector.html?wss=cloudflareworkers.com/inspect/$SESSION_ID&v8only=true

请注意,上面的 API 目前没有正式记录,将来可能会更改,但更改应该相对容易通过在浏览器中打开 cloudflareworkers.com 并查看它提出的要求。

您也可以通过将 Cloudflare worker 加载为 service worker 来在本地进行测试。

注:

  • 使用带 https: 的本地 Web 服务器。 Worker 不会使用 file: 或 http: 协议加载。
  • 您的浏览器需要支持 workers,所以您不能使用 IE。
  • 模拟任何 Cloudflare-specific 特征,例如 KV。

<!doctype html>
<html>

<head>
  <meta charset="utf-8">
</head>

<body>
  <!-- Service worker registration -->
  <script>
    if ('serviceWorker' in navigator) {
      // Register the ServiceWorker
      navigator.serviceWorker.register('/service-worker.js')
        .then(
          function(reg) {
            // Registration succeeded
            console.log('[registerServiceWorker] Registration succeeded. Scope is ' + reg.scope)
            window.location.reload(true)
          })
        .catch(
          function(error) {
            // Registration failed
            console.log('[registerServiceWorker] Registration failed with ' + error)
          })
    } else {
      console.log('[registerServiceWorker] Service workers aren\'t supported')
    }
  </script>
</body>

</html>

Dollar Share Club 创建 Cloudworker。它没有得到积极维护,但它在本地 运行 Cloudflare Workers 的一种方式。

您可以在 guest post 的 Cloudflare blog 上阅读 Cloudworker 的原始维护者的相关信息。