我读了捆绑systemjs文档的部分内容,在HTTP/2中不再需要捆绑优化:
在HTTP/2上,这种方法可能更为可取,因为它允许在浏览器中单独缓存文件,这意味着不再需要对包进行优化.
我的问题:
HTTP/2规范指示如果客户端取消它,则不会推送在PUSH_PROMISE帧中标识的任何资源.
当浏览器检测到缓存中已存在的资源时,它应取消对此资源的推送.但是,我没有看到浏览器如何检测它.框架是否提供其他信息,如etag或上次修改,以允许浏览器检测是否必须驱逐任何缓存条目或是否可以取消推送?
如果可能,可以节省一些带宽.但是,似乎服务器推送会破坏任何客户端缓存优化.
我正在开始一个新项目,我正在尝试前进思考它.我过去曾使用过Browserify.对于我的新项目,我想使用Webpack,Rollup或SystemJS.到目前为止,Webpack看起来是最成熟的,拥有大量令人敬畏的功能.
不过,我担心Webpack在采用HTTP/2的一两年内会变得无关紧要.所以我想知道,Webpack为通过HTTP/2提供服务的网站提供了什么价值?我不是在寻找一个意见,而是一个关于使用Webpack和HTTP/2的好处的事实解释.如果没有任何好处或很少的好处,这也将有助于我做出决定.
我正在使用新的fetch API在Javascript中编写一个基本应用程序.以下是代码相关部分的基本示例:
function foo(url) {
const options = {};
options.credentials = 'omit';
options.method = 'get';
options.headers = {'Accept': 'text/html'};
options.mode = 'cors';
options.cache = 'default';
options.redirect = 'follow';
options.referrer = 'no-referrer';
options.referrerPolicy = 'no-referrer';
return fetch(url, options);
}
Run Code Online (Sandbox Code Playgroud)
在进行获取请求时,我偶尔会在控制台中看到如下所示的错误:
拒绝加载脚本'<url>',因为它违反了以下内容安全策略指令...
在阅读并了解HTTP/2之后,看起来会出现此消息,因为响应正在推回预加载的脚本.使用devtools,我可以在响应中看到以下标题:
链接:<路径到脚本>; 相对=预载荷; 为=脚本
以下是我的Chrome扩展程序manifest.json文件的相关部分:
{
"content_security_policy": "script-src 'self'; object-src 'self'"
}
Run Code Online (Sandbox Code Playgroud)
以下是Chrome的manifest.json格式的文档,以及内容安全策略如何应用于扩展程序提取的内容:https://developer.chrome.com/extensions/contentSecurityPolicy
我做了一些测试,并且能够确定在获取期间发生此错误消息,而不是在解析响应文本时.没有问题将脚本元素加载到实时DOM中,这一切都发生在获取时.
在我的研究中我无法找到的是如何避免这种行为.看起来急于支持这个伟大的新功能,制作HTTP/2和fetch的人没有考虑我没有获取远程页面以便显示它或其任何相关资源(如css)的用例/图像/脚本.我(应用程序)以后不会使用任何相关资源; 只有资源本身的内容.
在我的使用案例中,这种推送(1)完全浪费了资源,并且(2)现在导致一个非常恼人和压力诱导的消息偶尔出现在控制台中.
话虽如此,这是我希望得到一些帮助的问题:有没有办法向浏览器发信号,使用清单或脚本,我对HTTP/2推送不感兴趣?是否有我可以为获取请求设置的标头告诉Web服务器不响应推送?我可以在我的应用程序清单中使用CSP设置,以某种方式触发不要推送我的响应吗?
我查看了https://w3c.github.io/preload/第3.3节,它没有多大帮助.我看到我可以发送标题Link: </dont/want/to/push/this>; rel=preload; as=script; nopush.问题是我还不知道响应中会有哪些链接头,我不确定fetch是否允许在初始请求中设置链接头.我想知道我是否可以发送某些类型的请求,可以在响应中看到链接头但是避免它们,然后发送追加所有相应nopush头的后续请求?
这是一个简单的测试用例来重现这个问题:
我已经阅读了很多关于HTTP 2的内容(它还在开发中),所以我也听说过服务器推送功能,但我的头脑,这还不清楚.
此服务器推送功能是否意味着服务器能够在没有后者发出请求的情况下向客户端发送响应?就像一个vanilla TCP连接?或者我错过了这一点?
是因为它需要按照请求的顺序对客户端做出响应,导致HTTP 1.1中的行头阻塞问题?
如果每个请求花费的时间相等,那么就不会有行头阻塞和HTTP 1.1流水线操作,并且会执行与HTTP/2多路复用相同的操作吗?
(假设HTTP/2请求中没有请求优先级,并忽略HTTP/2的其他更改,例如头压缩,二进制等)
浏览器对于并行XHR的数量(现在约为6)具有每主机限制.
此限制是否适用于多路复用HTTP/2连接?
我想为JAX-RS客户端实现支持HTTP/1.1和HTTP/2的JAX-RS客户端.
如果服务器支持带有HTTP/2的ALPN,则使用HTTP/2,如果服务器不提供任何信息,则使用HTTP/1.1.
我已经阅读了一些关于ALPN的文章,它似乎是可能的,但我没有找到任何支持这些协议的东西.我没有把这些插在一起.
我目前正在使用Jersey的Jetty HTTP/1.1传输连接器和HTTP/2传输连接器的自定义实现.
http2 ×10
http ×4
server-push ×2
.net ×1
api ×1
asp.net ×1
browser ×1
c# ×1
fetch-api ×1
java ×1
javascript ×1
jersey ×1
jetty ×1
multiplexing ×1
pipelining ×1
rest ×1
restriction ×1
webpack ×1