Well, I'm liking this a lot more than the current proposal. What's the intersection with <https://w3c.github.io/manifest/>? CC:ing Marcos.
(WARNING: USER AT KEYBOARD UNDER INFLUENCE OF JETLAG) > On 16 Jan 2015, at 1:43 pm, Ilya Grigorik <igrigo...@google.com> wrote: > > A bit of handwaving on pros/cons of a ~manifest like approach: > > + Single URL to represent a bundle of resources (sharing, embedding, etc) > + Fetching is uncoupled from manifest: granular caching, revalidation, > updates, prioritization.. all of my earlier issues are addressed. > + You can make integrity assertions about the manifest and each subresource > within it (via SRI) > + No complications or competition with HTTP/2: you get the best of both worlds > + Can be enhanced with http/2 push where request for manifest becomes the > parent stream against which (same origin) subresources are pushed > + Works fine with HTTP/1 but subject to regular HTTP/1 HoL concerns: use > sharding, etc.. all existing http/1 optimizations apply. > + Compatible out of the gate with old servers, new servers can do smart > things with it (e.g. CDN can fetch and preload assets to edge) > > Also, Alex I asked you this earlier, but I don't recall why we ruled it > out... Wouldn't rel=import address this? E.g... > > <link rel="import" href="/lib/brand.pack"> > > >--- contents of brand.pack ---< > <link rel=preload as=image href=logo.png integrity={fingerprint} /> > <link rel=preload as=stylesheet href=style.css integrity={fingerprint} /> > <link rel=preload as=javascript href=module-thing.js /> > ... > <link rel=preload as=javascript href=https://my.cdn.com/framework.js /> > > <script> > if (someDynamicClientConditionIsMet()) { > var res = document.createElement("link"); > res.rel = "preload"; > res.href = "/custom-thing"; > document.head.appendChild(res); > } > </script> > >------< > > It feels like we already have all the necessary components to compose the > desired behaviors... and more (e.g. dynamic fetches in above example). > > ig > > On Thu, Jan 15, 2015 at 5:20 PM, Alex Russell <slightly...@google.com> wrote: > That had occurred to me too. Maybe once major impls rip out AppCache > support.... > > On Thu, Jan 15, 2015 at 5:05 PM, Travis Leithead > <travis.leith...@microsoft.com> wrote: > Reminds me of: > > <html manifest=”/lib/manifest”> > > > > …in that you get a list of resources to cache for the application. Not quite > the same, but conceptually similar. Perhaps we could avoid creating a new > separate concept, and reuse/extend this manifest? I’m sure someone else has > probably already considered this—apologies for coming in late to the > discussion. > > > > From: Alex Russell [mailto:slightly...@google.com] > Sent: Thursday, January 15, 2015 3:47 PM > To: Ilya Grigorik > Cc: Mark Nottingham; Yoav Weiss; public-web-perf; www-...@w3.org List; Jeni > Tennison > Subject: Re: "Packing on the Web" -- performance use cases / implications > > > > Ilya and I had a chance to chat this afternoon and he had a brilliant idea: > what if there were a preamble section that allowed the package to simply be a > hint to UA to start fetching a list of (not-included) resources? > > > > This would let you invoke one with: > > > > <link rel="package" href="/lib/brand.pack"> > > > > Note the lack of a "scope" attribute. > > > > The contents of "brand.back" wouldn't be a resources, but instead is a list > of URLs to request. This would let a site reduce the number (and repetition) > of <link rel="prefetch"> tags in the first (crucial bytes). This could be > done by using the preamble section of the package to include a structured > list of URLs to preflight. > > > > Thoughts? > > > > > > > > > > On Wed, Jan 14, 2015 at 2:19 PM, Ilya Grigorik <igrigo...@google.com> wrote: > > On Tue, Jan 13, 2015 at 3:35 PM, Alex Russell <slightly...@google.com> wrote: > > On Tue, Jan 13, 2015 at 2:18 PM, Ilya Grigorik <igrigo...@google.com> wrote: > > On Wed, Jan 7, 2015 at 8:25 AM, Mark Nottingham <mnott...@akamai.com> wrote: > > This doc: > http://w3ctag.github.io/packaging-on-the-web/ > says a number of things that about how a Web packaging format could improve > Web performance; e.g., for cache population, bundling packages to distribute > to servers, etc. > > > > tl;dr: I think its introducing perf anti-patterns and is going against the > general direction we want developers to head. Transport optimization should > be left at transport layer and we already have much better (available today!) > solutions for this. > > > > I'm going to leave comments inline below, but I think your read of this is > far too harsh, forecloses meaningful opportunities for developers and UAs, > and in general isn't trying to be as collaborative as I think those of us who > have worked on the design would hope for. > > > > Apologies if it came across as overly negative. Mark asked for perf-related > feedback and that's what I'm trying to provide.. much of which I've shared > previously in other threads and chats. I do think there are interesting use > cases here that are worth resolving, but I'm just not convinced that a new > package streaming format is the right approach: lots of potential pitfalls, > duplicated functionality, etc. My comments shouldn't rule out use cases which > are not perf sensitive, but I do think it's worth considering the perf > implications for cases where it may end up being (ab)used. > > > > ---- some notes as I'm reading through the latest draft: > > > > (a) It's not clear to me how packages are updated after the initial fetch. In > 2.1.1. you download the .pack with a CSS file but then request the CSS > independently later... But what about the .pack? Wouldn't the browser > revalidate it, detect that the package has changed (since CSS has been > updated), and be forced to download the entire bundle once over? Now we have > duplicate downloads on top of unnecessary fetches. > > > > The presence of the package file is a hint. It's designed to be compatible > with legacy UAs which may issue requests for each resource, which the UA is > *absolutely allowed to do in this case*. It can implement whatever heuristic > or fetch is best. > > > > That doesn't address my question though. How does my app rev the package and > take advantage of granular downloads, without incurring unnecessary fetches > and duplicate bytes? I'm with you on heuristics.. I guess I'm asking for some > documented examples of how this could/should work: > > > > a) disregard packages: what we have today.. granular downloads and caching, > but some queuing limitations with http/1. > > b) always fetch packages: you incur unnecessary bytes and fetches whenever a > single resource is updated. > > c) how do I combine packages and granular updates? Wouldn't you always incur > unnecessary and/or duplicate downloads? > > > > In general, all bundling strategies suffer from one huge flaw: a single byte > update in any of its subresources forces a full fetch of the entire file. > > Assuming, as you mistakenly have, that fetching the package is the only way > to address the resource. > > > > I didn't assume that it is, I understand that the proposed method is > "backwards compatible" and that UA can request granular updates for updating > resources.. but this takes us back to the previous point -- is this only > useful for the initial fetch? I'd love to see a good walkthrough of how the > initial fetch + granular update cycle would work here. > > > > (b) Packages introduce another HoL bottleneck: spec talks about ordering > recommendations, but there is still a strict ordering during delivery (e.g. > if the package is not a static resource then a single slow resource blocks > delivery of all resources behind it). > > > > Is the critique -- seriously -- that doing dumb things is dumb? > > > > I'm questioning why we would be enabling features that have all of the > highlighted pitfalls, while we have an existing solution that doesn't suffer > from the same issues. That, and I'm wondering if we can meet the desired use > cases without introducing these gotchas -- e.g. do we need the streaming > package at all vs. some form of manifest~like thing that defers fetching > optimizations to the transport layer. > > > > (c) Packages break granular prioritization: > > > > Only assuming that your server doesn't do something smarter. > > > > One of the great things about these packages is that they can cooperate with > HTTP/2: you can pre-fill caches with granular resources and entirely avoid > serving packages to clients that are savvy to them. > > > > Can you elaborate on the full end-to-end flow of how this would work: initial > package fetch for prefill, followed by...? > > > > Would the UA unpack all the resources from a package into individual cache > entries? Does it retain the package file itself? What's the process for > revalidating a package? Or is that a moot question given that everything is > unpacked and the package itself is not retained? But then, how does the UA > know when to refetch the package? > > > > As an aside: cache prefill is definitely an interesting use case and comes > with lots of gotchas... With http/2 we have the push strategy and the client > has ability to disable it entirely; opt-out from specific pushed resources > (send a RST on any stream - e.g. already in cache); control how much is > pushed (via initial flow window)... because we had a lot of concerns over > servers pushing a lot of unnecessary content and eating up users BW/data. > With packages the UA can only make a binary decision of fetch or no fetch, > which is a lot less flexible. > > > > Your server can even consume packages as an ordered set of resources to > prioritize the sending of (and respond with no-op packages to clients for > which the package wouldn't be useful). > > > > Does this offer anything extra over simply delivering individual resources > with granular caching and prioritization available in http/2? > > > > From what I can tell, the primary feature is that the client doesn't > necessarily know what all the resources it may need to download are... For > which we have two solutions: http/2 push, or we teach the client to learn > what those resource URIs are and initiate the requests from the client > (regardless of http version). > > > > ig > > > > >