ReferenceError: TransformStream is not defined

ReferenceError: TransformStream is not defined

我正在尝试测试 Fast Google Fonts with Cloudflare Workers 的实现,来自 Cloudflare 的博客,用于将 Google 字体样式表直接内联到 HTML。当通过 Cloudflare worker 运行 时,实施本身似乎工作正常。但是我写了一些测试,当 运行 测试时,我得到这个错误,说 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;
}

这个测试看起来像这样,我们基本上期望样式表 link 将被样式表本身替换,包含所有 @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 在 Node 中工作吗?是否需要一些 polyfill?

相关: Cloudflare streams

TransformStream 是浏览器端标准 Streams API 的一部分。它不是由 Node 实现的(因为它们在本规范存在之前很久就有自己的流),因此在 Node 中测试代码时需要一个 polyfill。

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