0

我正在尝试使用 Cloudflare Workers 测试 Fast Google Fonts的实现,来自 Cloudflare 的博客,用于将 Google Fonts 样式表直接内联到 HTML 中。通过 Cloudflare 工作程序运行时,实现本身似乎运行良好。但是我写了一些测试,在运行测试时,我得到了这个错误,说TransformStream没有定义。

通过以下方式运行我的 Jest 测试时出错npm run test

ReferenceError: TransformStream is not defined

这是测试命中的代码:

async function processHtmlResponse(request, response) {
  ...

  // This is where the reference error comes up 
  const { readable, writable } = new TransformStream();

  const newResponse = new Response(readable, response);
  modifyHtmlStream(response.body, writable, request, embedStylesheet);

  return newResponse;
}

这个测试看起来像这样,我们基本上期望样式表链接将被样式表本身替换,包含所有@font-face样式。

describe('inlineGoogleFontsHtml', () => {
  it('inlines the response of a Google Fonts stylesheet link within an HTML response', async () => {
    const request = new Request('https://example.com')
    const response = new Response(
        '<html><head><link rel="stylesheet" media="screen" href="https://fonts.googleapis.com/css?family=Lato:300"></head><body></body></html>',
        {
          headers: {
            'Content-Type': 'text/html'
          }
        }
    )
    const rewrittenResponse = processHtmlResponse(request, response)
    const rewrittenResponseText = await rewrittenResponse.text()
    expect(rewrittenResponseText).toContain('@font-face')
})

我不确定这里的问题是什么。TransformStream在节点中工作吗?是否需要一些 polyfill?

相关: Cloudflare 流

4

1 回答 1

1

TransformStream是浏览器端标准Streams API的一部分。它不是由 Node 实现的(因为早在这个规范存在之前他们就有了自己的流),所以在 Node.js 中测试你的代码时你需要一个 polyfill。

顺便说一句,您所遵循的示例相当陈旧。现在,最好使用HTMLRewriter来实现这种转换——专门重写 HTML 效率更高。(但是,它是 Cloudflare 特有的功能,因此您根本无法在 Node 下对其进行测试。)

于 2020-05-07T23:59:58.320 回答