Skip to content

Commit 0c37af4

Browse files
cramforceWilliam Chou
authored andcommitted
Optimize YT loading (ampproject#5003)
- render some players outside the first viewport (but less than the 3 default viewports, see comment) - preload the player HTML (this can now be done, because we never preload in prerender where we don't allowed cookied domains like youtube.com) Unrelated change: Remove long deprecated method in preconnect.js
1 parent bd152f5 commit 0c37af4

File tree

2 files changed

+13
-16
lines changed

2 files changed

+13
-16
lines changed

extensions/amp-youtube/0.1/amp-youtube.js

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class AmpYoutube extends AMP.BaseElement {
5252
* @override
5353
*/
5454
preconnectCallback(opt_onLayout) {
55-
this.preconnect.url('https://www.youtube.com', opt_onLayout);
55+
this.preconnect.preload(this.getVideoIframeSrc_());
5656
// Host that YT uses to serve JS needed by player.
5757
this.preconnect.url('https://s.ytimg.com', opt_onLayout);
5858
// Load high resolution placeholder images for videos in prerender mode.
@@ -66,7 +66,11 @@ class AmpYoutube extends AMP.BaseElement {
6666

6767
/** @override */
6868
renderOutsideViewport() {
69-
return false;
69+
// We are conservative about loading YT videos outside the viewport,
70+
// because the player is pretty heavy.
71+
// This will still start loading before they become visible, but it
72+
// won't typically load a large number of embeds.
73+
return 0.75;
7074
}
7175

7276
/** @override */
@@ -81,13 +85,18 @@ class AmpYoutube extends AMP.BaseElement {
8185
}
8286
}
8387

88+
/** @return {string} */
89+
getVideoIframeSrc_() {
90+
dev().assert(this.videoid_);
91+
return `https://www.youtube.com/embed/${encodeURIComponent(this.videoid_ || '')}?enablejsapi=1`;
92+
}
93+
8494
/** @override */
8595
layoutCallback() {
8696
// See
8797
// https://developers.google.com/youtube/iframe_api_reference
8898
const iframe = this.element.ownerDocument.createElement('iframe');
89-
dev().assert(this.videoid_);
90-
let src = `https://www.youtube.com/embed/${encodeURIComponent(this.videoid_ || '')}?enablejsapi=1`;
99+
let src = this.getVideoIframeSrc_();
91100

92101
const params = getDataParamsFromAttributes(this.element);
93102
if ('autoplay' in params) {

src/preconnect.js

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -134,18 +134,6 @@ export class Preconnect {
134134
this.preconnectPolyfill_(origin);
135135
}
136136

137-
/**
138-
* Temporary to not break prod when versions are misaligned across binaries.
139-
* DO NOT USE!
140-
* This should be safe to remove 1 version after 1468017284333 hits prod.
141-
* @param {string} url
142-
* @param {string=} opt_preloadAs
143-
* @deprecated
144-
*/
145-
prefetch(url, opt_preloadAs) {
146-
this.preload(url, opt_preloadAs);
147-
}
148-
149137
/**
150138
* Asks the browser to preload a URL. Always also does a preconnect
151139
* because browser support for that is better.

0 commit comments

Comments
 (0)