From 05145a95e41d20d780b508a125e46d8ee0bb26b8 Mon Sep 17 00:00:00 2001 From: Nolan Lawson Date: Tue, 30 May 2017 06:11:15 -0700 Subject: [PATCH] Extract polyfill loading into single module (#3421) --- app/javascript/mastodon/load_polyfills.js | 36 +++++++++++++++++++++++ app/javascript/packs/application.js | 34 +++------------------ app/javascript/packs/public.js | 13 +++----- 3 files changed, 44 insertions(+), 39 deletions(-) create mode 100644 app/javascript/mastodon/load_polyfills.js diff --git a/app/javascript/mastodon/load_polyfills.js b/app/javascript/mastodon/load_polyfills.js new file mode 100644 index 0000000000..bc54685953 --- /dev/null +++ b/app/javascript/mastodon/load_polyfills.js @@ -0,0 +1,36 @@ +// Convenience function to load polyfills and return a promise when it's done. +// If there are no polyfills, then this is just Promise.resolve() which means +// it will execute in the same tick of the event loop (i.e. near-instant). + +function importBasePolyfills() { + return import(/* webpackChunkName: "base_polyfills" */ './base_polyfills'); +} + +function importExtraPolyfills() { + return import(/* webpackChunkName: "extra_polyfills" */ './extra_polyfills'); +} + +function loadPolyfills() { + const needsBasePolyfills = !( + window.Intl && + Object.assign && + Number.isNaN && + window.Symbol && + Array.prototype.includes + ); + + // Latest version of Firefox and Safari do not have IntersectionObserver. + // Edge does not have requestIdleCallback. + // This avoids shipping them all the polyfills. + const needsExtraPolyfills = !( + window.IntersectionObserver && + window.requestIdleCallback + ); + + return Promise.all([ + needsBasePolyfills && importBasePolyfills(), + needsExtraPolyfills && importExtraPolyfills(), + ]); +} + +export default loadPolyfills; diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js index be40726c6e..8932dc5138 100644 --- a/app/javascript/packs/application.js +++ b/app/javascript/packs/application.js @@ -1,32 +1,6 @@ import main from '../mastodon/main'; +import loadPolyfills from '../mastodon/load_polyfills'; -const needsBasePolyfills = !( - window.Intl && - Object.assign && - Number.isNaN && - window.Symbol && - Array.prototype.includes -); - -const needsExtraPolyfills = !( - window.IntersectionObserver && - window.requestIdleCallback -); - -// Latest version of Firefox and Safari do not have IntersectionObserver. -// Edge does not have requestIdleCallback. -// This avoids shipping them all the polyfills. -if (needsBasePolyfills) { - Promise.all([ - import(/* webpackChunkName: "base_polyfills" */ '../mastodon/base_polyfills'), - import(/* webpackChunkName: "extra_polyfills" */ '../mastodon/extra_polyfills'), - ]).then(main).catch(e => { - console.error(e); // eslint-disable-line no-console - }); -} else if (needsExtraPolyfills) { - import(/* webpackChunkName: "extra_polyfills" */ '../mastodon/extra_polyfills').then(main).catch(e => { - console.error(e); // eslint-disable-line no-console - }); -} else { - main(); -} +loadPolyfills().then(main).catch(e => { + console.error(e); // eslint-disable-line no-console +}); diff --git a/app/javascript/packs/public.js b/app/javascript/packs/public.js index 9f71b6dc5a..69c942f342 100644 --- a/app/javascript/packs/public.js +++ b/app/javascript/packs/public.js @@ -3,6 +3,7 @@ import { getLocale } from 'mastodon/locales'; import { length } from 'stringz'; import IntlRelativeFormat from 'intl-relativeformat'; import { delegate } from 'rails-ujs'; +import loadPolyfills from '../mastodon/load_polyfills'; require.context('../images/', true); @@ -85,12 +86,6 @@ function main() { }); } -if (!window.Intl) { - import(/* webpackChunkName: "base_polyfills" */ 'mastodon/base_polyfills').then(() => { - main(); - }).catch(error => { - console.log(error); // eslint-disable-line no-console - }); -} else { - main(); -} +loadPolyfills().then(main).catch(error => { + console.log(error); // eslint-disable-line no-console +});