CPP: A Standardized Alternative to AMP
timkadlec.com
timkadlec.com
> Love this. Not sure by coincidence, but the AMP team has been playing around with the same thing under literally the same name. We should meet up some time and discuss details. Not sure it would be an alternative, but rather a complementary thing.
I wonder what ever came of that.
Secondly, He goes on for a few paragraph at the start about how anyone can do this, but that's not so true is it? The whole point of the AMP redirect is that it's on Google cache servers, and unless you have a lot of money, that ain't gonna be cheap.
So at the end of the day, the last part is optional, and it's basically you paying for the cache with allowing them to use their domain (will all ads and traffic stats still sent to you).
That basically turns all AMP web pages into something that Google can track. Google can track enough of the web already, thankyouverymuch.
If your "standard" proposal starts with telling me I have to include content from a specific URL, you already lost me as a potential proponent.
I also happen to disagree with "all CSS needs to be inline".
Unless I missed something, CPP appears to not require me to include some 3rd party content, so I'm on board already :-)
I'm just a casual observer and that's just how I understood the idea.
"Google products, including Google Search, serve valid AMP documents and their resources from the cache to provide a fast user experience across the mobile web."
So it's Google who does deliver from the cache. Moreover, they motivate others to do the same on the same page.
1 - Lazy & Prioritized asset loading logic
2 - Loading assets from cache
Regarding the lazy & prioritized asset loading, the script [2] shouldn't be relying on some Google specific stuff. Since the project is open source, anyone can take a look and get an answer.
Regarding the loading from Google's cache: I haven't dug that much into it, but it's supposedly possible to write your own cache service (instead of relying on the currently free google CDN). Google provided the API and the URL format to so that it should be doable [3]. My assumption is that you can then create your own script, with the cache server URL changed to your own instead of Google's in a simple config file[4].
The question is then: by doing so (and effectively cutting any ties with Google's servers) will your page still be recognized as AMP by Google search engine? It will still reap the actual perf benefits (assuming your CDN does not suck), but if Google's crawler really wants that [1] to be present (and it should not), you wouldn't get the SEO benefits.
[1]
<script async src="https://cdn.ampproject.org/v0.js"></script>
[2] https://github.com/ampproject/amphtml[3] https://developers.google.com/amp/cache/
[4] https://github.com/ampproject/amphtml/blob/c44a48fbb1dbd0de0...
The point is to be able to track requests with javascript (or just Google Analytics, really) blocked.
I think everyone keeps making name collisions to be a much bigger deal than they are in reality.
EDIT: Mostly I’m just annoyed that those useless off-topics about naming keep crowding out actual discussion.
It's going to take significant momentum to displace "CPP" in the appropriate computing contexts.
Anyway if discoverability is an issue they can always give it a catchy marketing name (Project Swift Gazelle) later. CPP is the appropriate name for the proposal, given the relevant context.
If we could get away from policies though, Performant Content Contracts doesn't overlap with much that is CS related.
However, pointing out that for a (large?) portion of us, CPP means "C Plus Plus" so I was confused for a few seconds.
So buzzy.
> CPP could borrow from the concept and approach of the already existing Content Security Policies (CSP). This means that there would likely be a reporting-only mode that would allow sites to see the impact the policy would have on their pages before applying it live.
(To give a concrete example, why bother with optimizing layout-affecting animations to run off the main thread if AMP just forbids them? Such animations are useful, precisely because they affect layout; we aren't doing Web authors any favors by forbidding them instead of just making them fast.)
2. I'm not just talking about animations: things like parallel layout are also useful for static sites.
Edit: I mean this as a sort of lazy way of making a reductio. I don't think .txt is better than HTML/CSS for pages (and I hope that's obvious). I also don't think having no JS is a good idea.
I believe in progressive enhancement, and to a first approximation, I think that all websites have at least one feature that they could implement in JS that would be "a good thing".
Or maybe we could send markdown if the user agent included text/markdown in the request's Accept header, and pipe it through a markdown->HTML filter otherwise.
I would love to see some kind of native markdown support on the web.
Plus, if you users have unreliable internet connections then a JS app can use a service worker to cache the entire app to work offline, and only load in new content when possible. An HTML page doesn't work at all in those circumstances.
Sometimes JS does actually make a site better. It's not always unnecessary bloat.
It looks like this:
<script src="https://example.com/example-framework.js"
integrity="sha384-oqVuAfXRKap...."
crossorigin="anonymous"></script>
I wonder if browsers could keep a cache with those hashes as keys and whenever the integrity hash has a match, then it can take the JS from the cache. That would save huge amounts of bandwidth and pages would be so much faster to load.Probably right now we're fetching the same version of jquery hundred of times from 20 different domains a day.
It piqued my interest, but I was disappointed to discover that it's only supported by Gecko & Blink[1] - not supported by Safari or IE/Edge. Javascript is currently unavoidable for offline apps.
Though it would be nice for the browser to cache it for domains that have delivered the script previously. It wouldn't be that different from a normal cache except the timestamp doesn't matter.
I want to say there's a security concern with re-using these libraries, but I guess the possibility of a hash collision would be extremely small.
But I doubt the bottleneck is JS code. The problem is that web sites are not optimized (some frontend developers think that writing a CSS stylesheet for narrow screen is enough) and they include a lot of resources (including trackers, advertisement, spying social network buttons I never click). Some of the widgets create an iframe (which is like a separate tab in your browser) and load a separate copy of jQuery there, make AJAX requests etc. And even worse, some advertisement networks can create nested iframes 2 or 3 levels deep (for example when a network doesn't had own ads, they can put Google Adwords block). So when you load a page with 10 iframes it loads the CPU as 10 separate tabs.
Decoding images is not free too, especially if it is thousand pixel wide heavily compressed JPEG or PNG image.
The real optimization would be cutting away (or making lazily loadable by user request) everything except content. As website developers are not going to do it, it is better to do the optimization on client side. I wish standard mobile browser allowed disabling JS, web fonts (which are just a waste of bandwidth) and loading images on request. Mobile networks usually have high latency so reducing the number of requests needed to display a page could help a lot.
(And if you meant using hashes to use cache for resources from different domains - there probably will be many misses because every website can use different library versions, they can compress or bundle libraries etc).
For the second part I wonder if browsers could display stale data with some warning saying so; that would solve many problems that happen all the time (refreshing a page after the website came down, ...)
Simplicity has so many things in its favor.
It looks like an over engineered system, and you have to preload the content while on WiFi. And by the way do you know a reliable way to detect whether device is really online or there is a link but no packets are going through?
And every website is supposed to write its own code for service worker.
I think it would be easier to implement a feature in a browser where user can explicitly save some pages for offline reading. Or allow user to view pages from cache.
> Sometimes JS does actually make a site better.
For most sites it just adds unnesessary widgets (like spying share buttons) and advertisements. Especially on newspapers' sites - most of them work better without JS.
It's a pretty interesting talk. Just thinking about this kind of stuff can make way skinnier web pages than AMP. I mean really, if we designed pages for 56k modems, the web would be much much fast on mobile.
Pretty much but buzzwords/PR work, "CPP Compliant" vs "We build stuff properly (for a given value of properly)"
The argument that people will just use best practices out of sheer goodwill or even just basic competence has been thoroughly debunked. No one optimizes for performance if they are not penalized.
That's the quickest alternative I can think of to CPP, though I'd be fine with CPP in any case.
Just cut the crap.
(also, we could call it HTML Light, or htmll)
I know we have:
<script type="text/javascript" src="script.js" async></script>
but for stylesheets, why can't we have something similar? Instead of a JS workaround, can't we have:
<link rel="stylesheet" href="sheet.css" async/>
I hate hate HATE the idea of having css dependent on some JS (even if enabled) that might or might not run depending on what feels like working today.
<link rel="preload" href="/assets/stylesheet.css" as="style" onload="this.rel='stylesheet';">
which will more or less be async CSS. You can see that it will download in the background and morph into a stylesheet when it's ready, while the document continues to be parsed below it.Then it will just be a matter of including this for people with JS switched off:
<noscript>
<link rel="stylesheet" href="/assets/stylesheet.css">
</noscript>
And then for browsers which have JS enabled but don't support the resource hint 'preload', you could do something like this as a fallback: window.addEventListener( 'load', function sweepUnloadedPreloads() {
window.removeEventListener( 'load', sweepUnloadedPreloads, false );
[].slice.call( document.querySelectorAll( '[rel=preload]' ) )
.forEach( function( item ) {
// simply doing this might work:
item.rel='stylesheet';
/** OR, if that doesn't work (I haven't tested it)**/
var new_link = document.createElement( 'link' );
new_link.rel = 'stylesheet';
new_link.href = item.href;
document.head.appendChild( new_link );
});
}, false );
The sketchy hypothetical fallback technique above, or any JavaScript CSS loader, could be augmented by using prefetch to attempt to get the tyres warm and start a low-priority download of the stylesheets in question. <link rel="prefetch" href="/assets/stylesheet.css">
And obviously there's Service Worker, which is also slim on support, but promises to turn your website into a near-native experience by providing the mother of all caches for resources and offline pages/resources.Preload spec: https://www.w3.org/TR/preload/
Preload support: http://caniuse.com/#feat=link-rel-preload
You could also just put the link element(s) specifying your stylesheet(s) in the body to 'async' it — Stripe does this on stripe.com. It's not valid HTML but very few browsers seem to give a damn.
Minor nitpick: they're allowable in iframes. I.e. sandboxed.