タイトルの通り、外部ドメインのCSS(Font Awesomeなど)をjsで遅延読み込みさせたいと考えております。
目的としては、ページスピード(スコア)の向上です。
実現したいこと
- 現状、head内で読み込んでいるCSSを削除
- </body>直前にjsを設置し、そこでheadで読み込んでいたCSSを読み込む
困っていること
下記ページを参考に素人ながらjsを書いてみましたが、うまく読み込めておりません。
※読み込めていないというのは、jsで遅延読み込みさせた場合にCSSのレンダリングがされないとう意味です。
通常通りhead内のlinkタグではCSSのレンダリングができております。
https://developers.google.com/speed/docs/insights/OptimizeCSSDelivery
https://www.notitle-weblog.com/entry/2016/11/10/184826
現状のコード
js
1<script async> 2 var fontawesome45 = "https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css"; 3 var fontawesome47 = "https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css"; 4 var fontawesome50 = "https://use.fontawesome.com/releases/v5.3.1/css/all.css"; 5 var fontawesome_animation = "https://cdnjs.cloudflare.com/ajax/libs/font-awesome-animation/0.1.0/font-awesome-animation.min.css"; 6 var jquery = "https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css"; 7 function cb(href) { 8 var link = document.createElement('link'); link.rel = 'stylesheet'; 9 link.href = href; 10 document.head.appendChild(link); 11 }; 12 var raf = requestAnimationFrame || mozRequestAnimationFrame || 13 webkitRequestAnimationFrame || msRequestAnimationFrame; 14 if (raf) { 15 raf(function (){ 16 cb(fontawesome45);cb(fontawesome47);cb(fontawesome50);cb(fontawesome_animation);cb(jquery); 17 }); 18 } else { 19 window.addEventListener('load', function(){ 20 cb(fontawesome45);cb(fontawesome47);cb(fontawesome50);cb(fontawesome_animation);cb(jquery); 21 }); 22 } 23</script>
全体html
html
1<!DOCTYPE html> 2<html> 3<head> 4<link rel="preload" href="css/hoge.css" type="text/css" as="style" onload="this.onload=null;this.rel='stylesheet'"> 5 6<script type="text/javascript" async> 7 /*! loadCSS. [c]2017 Filament Group, Inc. MIT License */ ! function(t) { 8 "use strict"; 9 t.loadCSS || (t.loadCSS = function() {}); 10 var e = loadCSS.relpreload = {}; 11 if (e.support = function() { 12 var e; 13 try { 14 e = t.document.createElement("link").relList.supports("preload") 15 } catch (a) { 16 e = !1 17 } 18 return function() { 19 return e 20 } 21 }(), e.bindMediaToggle = function(t) { 22 function e() { 23 t.addEventListener ? t.removeEventListener("load", e) : t.attachEvent && t.detachEvent("onload", e), t.setAttribute("onload", null), t.media = a 24 } 25 var a = t.media || "all"; 26 t.addEventListener ? t.addEventListener("load", e) : t.attachEvent && t.attachEvent("onload", e), setTimeout(function() { 27 t.rel = "stylesheet", t.media = "only x" 28 }), setTimeout(e, 3e3) 29 }, e.poly = function() { 30 if (!e.support()) 31 for (var a = t.document.getElementsByTagName("link"), n = 0; n < a.length; n++) { 32 var o = a[n]; 33 "preload" !== o.rel || "style" !== o.getAttribute("as") || o.getAttribute("data-loadcss") || (o.setAttribute("data-loadcss", !0), e.bindMediaToggle(o)) 34 } 35 }, !e.support()) { 36 e.poly(); 37 var a = t.setInterval(e.poly, 500); 38 t.addEventListener ? t.addEventListener("load", function() { 39 e.poly(), t.clearInterval(a) 40 }) : t.attachEvent && t.attachEvent("onload", function() { 41 e.poly(), t.clearInterval(a) 42 }) 43 } 44 "undefined" != typeof exports ? exports.loadCSS = loadCSS : t.loadCSS = loadCSS 45 }("undefined" != typeof global ? global : this); 46</script> 47</head> 48 49<body> 50 テキストテキストテキストテキスト 51 <script> 52 ここに上部のjs 53 </script> 54</body> 55</html>
自分が書いたjsが間違っているのか、それとも他のjsとの兼ね合いなのか、
何が原因で上手くいかないのかをご教授頂けますと幸いです。
よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー