skip to content
Logo
Yurikago Blog

画像をIE11でpreloadする

/ 3 min read

Table of Contents

link要素のrel属性にpreloadを指定するとリソースを先読みします。リソースを先読みすることでレンダリングがブロックされにくくなりページパフォーマンスが向上するのですが、この機能はIEで使えません。この記事ではpreloadのPolyfillを導入してIEで同等の機能を実現する方法をまとめました。

参考: https://caniuse.com/#search=preload

preloadとは

要素のrel属性でpreloadを指定すると、HTMLの 要素内で読み込みリクエストを宣言し、ページのライフサイクルの早期の、ブラウザーの主なレンダリング機構が起動する前に読み込みを始めたい、すぐに必要なリソースを指定することができます。これにより、そのリソースがより早く利用でき、ページのレンダリングがブロックされにくくなり、性能が向上します。

参考: https://developer.mozilla.org/ja/docs/Web/HTML/Preloading_content

Polyfill

digitalkaoz氏が作成したライブラリを利用させていただきます。2020/07/09時点のバージョンはv1.22.5です。

参考: https://github.com/digitalkaoz/preload-polyfill

インストール

Terminal window
% mkdir preload-polyfill
% cd preload-polyfill
% npm init -y
% npm install @digitalkaoz/preload-polyfill

node_modules/@digitalkaoz/preload-polyfill/distに以下のスクリプトが作成されます。

  • preload-polyfill.min.js
  • preload-polyfill-invoke.min.js
  • preload-polyfill-inline.min.js

スクリプトを読み込む

検証リポジトリ: https://github.com/cuavv/sandbox-preload-polyfill

<!DOCTYPE html>
<html>
<head>
<!-- PromiseのPolyfill -->
<script src="https://www.promisejs.org/polyfills/promise-6.1.0.js"></script>
<script>
/**
* IE9以上向けにCustomEventの機能を代替する
* @see https://developer.mozilla.org/ja/docs/Web/API/CustomEvent/CustomEvent#Polyfill
*/
;(function () {
if (typeof window.CustomEvent === 'function') return false
function CustomEvent(event, params) {
params = params || {
bubbles: false,
cancelable: false,
detail: undefined,
}
var evt = document.createEvent('CustomEvent')
evt.initCustomEvent(
event,
params.bubbles,
params.cancelable,
params.detail
)
return evt
}
CustomEvent.prototype = window.Event.prototype
window.CustomEvent = CustomEvent
})()
</script>
<script src="/lib//preload-polyfill.min.js"></script>
<script src="/lib/preload-polyfill-invoke.min.js"></script>
<script src="/lib/preload-polyfill-inline.min.js"></script>
<link rel="preload" as="image" href="/image/bridge-4605202_1280.jpg" />
</head>
<body>
<script type="text/javascript" src="/js/hello.js"></script>
<script type="text/javascript" src="/js/hello.js"></script>
<script type="text/javascript" src="/js/hello.js"></script>
<script type="text/javascript" src="/js/hello.js"></script>
<script type="text/javascript" src="/js/hello.js"></script>
<script type="text/javascript" src="/js/hello.js"></script>
<script type="text/javascript" src="/js/hello.js"></script>
<script type="text/javascript" src="/js/hello.js"></script>
<script type="text/javascript" src="/js/hello.js"></script>
<script type="text/javascript" src="/js/hello.js"></script>
<img src="/image/bridge-4605202_1280.jpg" alt="bridge" />
</body>
</html>

Dockerコンテナを立ち上げてIE11で以下のURLにアクセスします。

http://192.168.99.100:8080/preload.html

結果

preloadなしに比べて、preloadありは画像を早いタイミングでリクエストします。この結果からpreloadがIE11で動作していることが分かります。

preloadなし

no-preload

preloadあり

preload

最後に

preloadを導入してどれくらいページパフォーマンスが向上するのかはそのうち調べます。