【问题标题】:Can HTML imports be specified using the Link HTTP header, or only with a <link> tag?可以使用 Link HTTP 标头指定 HTML 导入,还是仅使用 <link> 标记?
【发布时间】:2016-01-13 20:06:09
【问题描述】:

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

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

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

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 working draft) 为 &lt;link&gt; 元素添加了一项重要的新功能:一次从另一个 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>

但是,工作草案规范只明确提到了&lt;link&gt; 元素;它没有引用 Link 标头。它还使用似乎需要&lt;link&gt; 元素与每个导入相关联的语言,

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

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

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

【问题讨论】:

  • 我还没有为这个选择找到任何理由。我以后可能会去找它。

标签: html http-headers link-tag html-imports


【解决方案1】:

没有。

根据RFC 5988: Web LinkingLink 标头在语义上应该等同于&lt;link&gt; 元素:

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 recommendation) 的“link 元素”部分似乎与此相矛盾,明确表示允许它们的语义不同:

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

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

RFC 5988 只是一个“提议的标准”(info on 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);

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

健全性检查揭示了这个测试的一个非常错误的前提:Chrome currently doesn't even support the Link header for stylesheets!它是目前唯一默认支持 HTML 导入的浏览器引擎,因此我们的结论仍然是正确的,但测试本身并没有真正说明预期的行为,因为无论如何它肯定会失败。

【讨论】:

  • 在这种情况下,检查 Firefox 对该功能的实验性实现(在标志后面)的作用更有洞察力。我可能会稍后测试。
  • 嗯。即使启用了该标志,HTML 导入似乎也无法在 Firefox 中运行...
猜你喜欢
  • 2019-06-06
  • 1970-01-01
  • 2018-05-06
  • 1970-01-01
  • 1970-01-01
  • 2020-06-14
  • 1970-01-01
  • 2018-05-13
  • 2019-03-08
相关资源
最近更新 更多