0

HTML<link>元素最常用于在文档中包含 CSS 样式表。典型的用法可能如下所示:

    <link rel="stylesheet" href="/style.css" />

作为在响应正文中包含标记的替代方法,服务器可以使用LinkHTTP 标头指定样式表:

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Link: </style.css>; rel=stylesheet

<!doctype html>
<html>
  <head><title>Example</title></head>
  <body>Hello!</body>
</html>

提议的 HTML 导入功能规范(WC3 工作草案)为元素添加了一个重要的新功能<link>:一次从另一个 HTML 文档导入所有资源的能力,可能包括多个脚本、样式和模板。一个典型的用法可能如下所示:

    <link rel="import" href="/components.html" />

我的期望是,对于像这样的情况,也可以使用Link标题以与样式相同的方式指定 HTML 导入:

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Link: </components.html>; rel=import

<!doctype html>
<html>
  <head><title>Example</title></head>
  <body><ex-warm-welcome>Hello!</ex-warm-welcome></body>
</html>

但是,规范工作草案仅明确提及该<link>元素;它没有引用Link标题。它还使用似乎需要一个<link>元素与每个导入相关联的语言,

每个文档都有一个导入链接列表,每个条目由链接、链接元素和位置、URL 组成。

我看到它支持样式表链接不<link rel="import" ... />支持的属性。async不可能在标题中指定它,但鉴于它是一个可选属性,我不希望这会完全阻止它的支持。

是否可以使用Link标头指定 HTML 导入?任何支持该决定的理由的参考将不胜感激。

4

1 回答 1

0

不。

根据RFC 5988: Web LinkingLink标头应该在语义上等同于<link>元素:

5.  The Link Header Field

   The Link entity-header field provides a means for serialising one or
   more links in HTTP headers.  It is semantically equivalent to the
   <LINK> element in HTML, as well as the atom:link feed-level element
   in Atom [RFC4287].

然而, HTML5 规范( W3C 推荐link)的“元素”部分似乎与此相矛盾,明确表示它们的语义允许不同:

Link:如果支持,则必须假定HTTP标头位于文档中的任何链接之前,按照它们在 HTTP 消息中给出的顺序。这些报头将根据相关规范中给出的规则进行处理。[HTTP] [网页链接]

注意: 在 HTTP Link: headers 中注册关系类型与 HTML 链接类型不同,因此它们的语义可能与同名的 HTML 类型不同。

RFC 5988 只是一个“提议的标准”(关于 rfc-editor.org的信息),虽然它被 HTML5 规范引用,但该引用被明确标记为“非规范”。它仅引用 HTML4 规范本身。鉴于 HTML5 规范是一个完整的标准并且更新,我希望它比 RFC 更相关,并且不希望Link标头在这种情况下工作。但是,让我们暂时搁置所有这些律师事务并实际测试一下。

这是一个简单的 Node 服务器,为尝试以各种方式指定 HTML 导入的页面提供服务:

require('http').createServer(function(request, response) {
  switch (request.url) {
    case '/inline.html':
      response.writeHead(200, {
        'Content-Type': 'text/html',
      });
      response.write('<!doctype html><html><head>');
      response.write('<link rel="import" href="/import.html" />');
      break;

    case '/header.html':
      response.writeHead(200, {
        'Content-Type': 'text/html',
        'Link': '</import.html>; rel=import'
      });
      response.write('<!doctype html><html><head>');
      break;

    case '/import.html':
      response.writeHead(200, {
        'Content-Type': 'text/html',
      });
      response.write('<!doctype html><html><head>');
      response.write('<script>console.log("imported!")</script>');
      break;

    default:
      response.writeHead(404);
  }

  response.end();
}).listen(8080);

当我/inline.html在 Chrome 中访问时,我看到“已导入!” 按预期登录控制台。但是当我访问时/header.html,我什么也没看到。所以最终的答案似乎是否定的:规范和实现都不支持在Link标题中声明 HTML 导入。

健全性检查揭示了这个测试的一个非常错误的前提:Chrome 目前甚至不支持Link样式表的标题!它是目前唯一默认支持 HTML 导入的浏览器引擎,所以我们的结论仍然是正确的,但测试本身并没有真正说明预期的行为,因为无论如何它肯定会失败。

于 2016-01-13T20:06:09.410 回答