いつものように Google Search Console を見ていると、「CLS に関する問題: 0.25 超(パソコン)」 などというものに気がつく。たしか以前にも見た気がする。それなりにチェックしてみたものの、対策というものが、何をすればいいのかよくわからないものだったのではなかったか。
今回、リンクをたどっていくと、その時にはなかったと思うのだけれど、PAGESPEED INSIGHTS なるものが出てきて、対象のページの表示されるスピードチェックなんてのが実行されてその結果が表示された。結果は黄色いレンジで 84 なんて数字を示している。ちなみに、90 以上がグリーンゾーンになっている。そのページのスクリーンショットをとっておけばよかったのだけれど、と思ったのは後の祭りで。
ページスピードをより速く改善するための処方もいろいろと出て書いてある。提示されているものには、すぐに取りかかれそうなものもいくつかありそうだ。

使っている背景画像などは全てサイズダウン済みのはず・・・、と思ったものの確認してみると思い違いも甚だしく、多くの画像がオリジナルサイズのままだった。と、これは、かなり違うことになるはず、と片っ端からサイズダウンさせていく。jpg はあまり変わらないけれど、png の方はものによると元のサイズの 20% 以下ほどまでサイズダウンできる。
そしてお次は、と・・・。
HTTPリクエストを減らすことは以前から頭に入れていて、関連する画像はなるべく一つにまとめるとかは、当然のこととして普段からやっていることではある。今回はもう一歩進めて画像の BASE64 化などということをしてみようかと。

背景画像の BASE64 による文字列化でリクエストを減らす

画像は通常、html、css、javascript において、そのアドレスを指定し、HTTPリクエストにより画像データをダウンロードして表示させる。それを、BASE64 処理によって画像データを文字列に変換させておき、その文字列を指定しておくことで、HTTPリクエストによる画像データのダウンロードをすることなく、その画像を表示させることができるとのこと。これをすれば単純に、HTTPリクエストを減らす事ができると。
実はこのことは以前から知っていたこと。というのは、なんとかリクエストを減らすことができないだろうかと考えていた時に、php でファイルを読み込むことができるのだから、画像ファイルも php で読み込んでデータとして html のようにクライアント側にまとめて送信することは出来ないものだろうか?などと考えて探してみた時に、あっさりとこの BASE64 に変換する方法にたどりついたというわけ。
まぁ、それはいいとしてこの BASE64、良い面ばかりということでもなく、デメリットもある。BASE64 処理によるバイナリデータの文字列化は、そのデータサイズが約 1.3 倍となってしまう。送信するデータの量が増えてしまうわけだ。まぁ、あと、実際にやってみて感じたことは、htmlBASE64 文字列を入れると、そのデータのあまりの長さにコードがとても読みづらくなるということ。javascript ファイルにしても然りで、うっとうしいことなんの。javascript の場合は最後の方の部分だけとかにした方がストレスがたまらなくて良さそうではある。

リクエストは減らすことができるけれど、それぞれの画像データの量は1.3倍になってしまう。と、ふと、考えが浮かんだのだけれど、新しい画像フォーマットである webp を使ってということができないのだろうか。せっかく webp にて画像サイズを圧縮することができたのに、また BASE64 でデータ化することで、データの量が元に近く戻ってしまうというのもなんとも妙な感じではあるのだけれど、それにて元からデータ量をそんなに増やすことなく、リクエストの数は減らせるということになるのだから、それなりに説得力はあるように思う。

webpBASE64 化ももちろん可能であるわけで。php でのエンコードする関数も、ちょっとよけいな手間がかかるけれども、 jpg、png と同じ関数が使えた。
ではあるのだけれど、webp 化は、Mac においての対応状況もよくわからなかったので、ここではひとまず置いておいて、最後の次なる一手として、考えていたことを全てやった後に試してみようということにして、それはあらためてページを変えて書くことにしようと思う。


と、いうことで css の画像の BASE64 化にとりかかる。
BASE64 化する画像は、多くのページで共有する画像だけにとどめる。特定のページだけでしか使わない背景画像とかは、url 指定の場合はそのスタイル設定の対象が存在しなければ画像のリクエストも発生しないはずだと思うが、BASE64 の文字列での指定は、当然のことそのシートが読み込まれれば必ず一緒に転送される。必要のない画像の 1.3 倍のデータが常に一緒についてまわることになってしまう。

さて、どうやろうか!
スタイルシートのリクエストがあった時に、phpBASE64 に変換して返すか?と、いう方法もある。この方法だと、元のスタイルシート( CSS ファイル ) には何の変更もいらないし、訂正やらチェックなどするときに今まで通りで見やすくやりやすい。けれど、これだとサイトアクセスがあるたびに変換することになる。元々、BASE64 に変換させるのは、リクエストを減らして少しでもページの表示スピードを速くするためにやっていることなのに、アクセスの度に変換する処理を入れることは、少なからずリクエストを減らす効果を減じてしまうことになるのではなかろうか。後々のメンテナンスのことを考えると、この方法は良さそうではあるけれど、やはり、少しでも表示スピードを速くすることに長けた方法を選択したい。
で、やはり、あらかじめ変換処理してあるスタイルシートを読み込ませることにする。
予定では、スタイルシートを読み込んで、その中の画像を BASE64 に変換、そのデータをスタイルシートに書き込み保存する、というものをつくるはずだった。しかるに、とりあえず変換する部分のコードを書いて試しにやっていたら、画像の数がそんなに多くないということもあって、テストで変換されたデータをスタイルシートに書き込んで、ということを何回か繰り返していたら、それでことが足りてしまったのであしからず。
それが以下のコード。同じフォルダにある画像を指定すれば、BASE64 に変換してくれるだけの php。”,”で区切ってリストすれば一度に複数も可。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>image file to BASE64 converter</title>
</head>

<body>
<div id="mainframe">
	<div id="header"></div>
	<div id="maincontents">
		<div id="innerframe">
            <?php
                if ( isset( $_GET['target'] ) ) {
                    $target = $_GET['target'];

                    if ( false !== strpos( $target, '.' ) ) {
                        $targets = array();

                        if ( false !== strpos( $target, ',' ) ) {
                            $targets = explode( ',', $target );
                        } else {
                            $targets[] = $target;
                        }

                        foreach ( $targets as $key => $val ) {
                            $extention = substr( $val, strrpos( $val, '.') + 1 );
                            $extary = array( 'jpg', 'png', 'gif' );

                            if ( in_array( $extention, $extary ) ) {
                                if ( file_exists( $val ) ) {
                                    $file = file_get_contents( $val );
                                    $fileinfo = getimagesize( $val );
                                    $encoded_file = base64_encode( $file );
                                    
                                    echo '<p>' . $val . ' : ' . $fileinfo[3] . ' : ' . floor( filesize( $val ) / 100 ) / 10 . 'kb <a href="to_bs.php">back top</a></p>';
                                    echo '<table><tr><td>original</td><td>BASE64</td></tr>';
                                    echo '<tr><td><img src="' . $val . '" style="margin-right:20px;"></td>';
                                    echo '<td><img src="data:image/' . $extention . ';base64,' . $encoded_file . '"></td></tr>';
                                    echo '</table>';
                                    echo '<p>changed after size ( string length ) : ' . strlen( $encoded_file ) . ' Byte</p>';
                                    echo '<p class="copystr" data-tar="enc' . ( string ) $key . '" title="copy data to Clip-Board" style="width:50px;padding:3px;background:linear-gradient(silver,white,lightgrey);border-radius:3px;" onMouseLeave="this.style.cursor=\'default\'" onMouseOver="this.style.cursor=\'pointer\'">copy</p>';
                                    echo '<p><textarea id="enc' . ( string ) $key . '" cols="100" rows="20">' . $encoded_file . '</textarea></p>';
                                } else {
                                    echo '<p>Can\'t detect target file : ' . $val . ' <a href="to_bs.php">back top</a></p>';
                                }
                            } else {
                                echo '<p>Not image file : ' . $val . '. Into image file path.' . ' <a href="to_bs.php">back top</a></p>';                            
                            }
                        }
                    } else {
                        echo '<p>Not file name. Into image file path.' . ' <a href="to_bs.php">back top</a></p>';
                    }
                } else {
            ?>
                    <form action="" method="get">
                        <p>into image-file path</p>
                        <input type="text" value="" name="target" size="80">
                        <input type="submit" name="submit"> 
                    </form>
            <?php
                }
            ?>
		</div>
	</div>
</div>
</body>

<script type="text/javascript">
    ( function () {
        const doc = document,
            copystr = doc.getElementsByClassName( 'copystr' ),
            copystr_len = copystr.length;
        
        for ( let i = 0; i < copystr_len; i++ ) {
            copystr[ i ].onclick = function( e ) {
                const tarp = this.getAttribute( 'data-tar' ),
                    imgbs = doc.getElementById( tarp ).innerText,
                    tartxtarea = doc.getElementById( tarp );

                tartxtarea.select();

                if ( doc.execCommand( 'copy' ) ) {
                    console.log( 'success copy to clipboard : ' + tarp );
                } else {
                    console.log( 'disable copy at this browser' );
                }
            }
        }

        window.onload = function() {
            var ansstr='no';
            if (navigator.cookieEnabled) {
                ansstr='yes';
            }
        }
    }());
</script>

</html>
PHP
CopyExpand

ちなみに BASE64 文字列での画像の指定の仕方はというと、別段、なんら難しいことはなく、以下のごとく。
画像の url が指定してあったところに、
data:image/png;base64,/
という指定された文字列に変換された BASE64 文字列データをくっつけて指定するだけのこと。javascript においても全く同じ。
指定文字列の image/png など画像の種類を指定する部分は、それぞれの画像によって入れ替える。jpg、png、gif 等。ただ、やっているときにうっかり jpg 画像なのにこの部分の訂正をせず png になっていたことがあったが、 jpg 画像はしっかり表示されていたりした。まっ、どうでもいいか。

html
<img src="https://strix.main.jp/images/head_bg.png">
                ↓
BASE64
<img src="data:image/png;base64,/0PIbT1yJjgYZ4cQh+Pwd3rDa.....">

css
header{
	margin:0 auto 0 auto;
	text-align:center;
    ・
    ・
	background:url( https://strix.main.jp/images/head_bg.jpg );
}
                ↓
BASE64
header{
	margin:0 auto 0 auto;
	text-align:center;
    ・
    ・
	background:url(data:image/jpg;base64,/0PIbT1yJjgYZ4cQh+Pwd3rDa.....);
}
CSS
CopyExpand

スタイルシートにおいては、コメントアウトしてある行も削除してサイズダウンさせた。
これらだけでもかなり効果が期待できるのでは!と期待しつつ Google Search Console へのリンクをクリックしたのではあるけれど・・・。
結果は 89 。まだイエローゾーン。くっ~~!
体感的に、んっ!と感じる具合に速くなった気はしたのではあるけれど・・・。
ちなみにサーバーは、ロリポップのスタンダードプランだすっ!

Google PAGESPEED INSIGHTS result

jQuery の使用をやめてロードさせないようにする

さて、お次の手はと・・・。何をすれば良いのだろうか?
推奨の項目に目を通していると、jquery 関連で2つのファイルを読み込んでいるのだけれど、この2つのファイルの読み込みを無くすと効果がありそうだ、と。
この部分は前から考えていたことなのだけれど、面倒で手をつけていなかったことでもあり。jquery を使わないように書き直すかな。
と、いうことで、jquery に依存する javascript を書き直すことに。対象は 2ファイル。テーマの jquery ファイルと、それと自作プラグイン、prism ハイライター用の補助的 jquery ファイル。ちなみに、prisum 本家 javascriptjquery 依存では全く違うのでありがたい。さぁ、はたしてどれほどの効果があるだろうか?
この作業は結構手間がかかる。時間もかかる。かかった手間だけの効果があればよかったのではあるけれど・・・、さて、結果はというと。

Google PAGESPEED INSIGHTS result

えっ!たったの1ポイント。あれだけ手間が掛かったのに!でも、かろうじてグリーンゾーンに入って 90 。ふ~っ!
こんなものでしょうか。なかなか難しいものです。
時間をあけて 3度ほど試してみて同じ結果だったので誤差というものもないようだ。
でも、とりあえずこれで javascript もプレーンな状態にすることができたし、前からわかっていたことだけれど、先の事を考えるとやはりライブラリ等には極力依存しない方が良いということなんじゃないだろうか。
ふと、思ったことなのだけれど、メインコンテンツがアニメーションで透明度を変化させて現れるようにしているのは影響があるのだろうかと。このアニメーションの設定は、delay = 0.5s 、duration = 3.0s になってる。試しにそれを delay = 0.2s 、duration = 1.5s に変更してやってみた。
結果はもしやと思ったとおり 1 ポイント良くなった。あれ~?

Google PAGESPEED INSIGHTS result

元々、Search Console に表示されていたのは、「CLS に関する問題」であった。けれど、どの結果を見てみても、その CLS ( Cumulative Layout Shift ) に関しては全く問題はないようだ。一体何をすればよいのだろうか?このアニメーションで表しているメインコンテンツがやはり問題だったのだろうか?
ちなみに単純に考えて、コンテンツの量が少なければ速くなるだろうし、どれくらいの数値が出るのだろう?と期待して試してみると、

と、思った通り少し良い結果となる。このページは字数も多少少なく、prism.js が変換する <pre><code> ブロックも2つしかなく、そしてクラシックエディタで書かれた投稿である。それも多少、影響しているような気がする。

ページ下部の背景画像を Ajax で取得

さて、と。
画像のロードに関してはもう少し詰められるかも。
ページの下の方にある、そんなに重要度の高くないアイコンなどの画像。それらの画像たちも BASE64 化しているわけなのだけれど、下のほうにあって、ページが表示された時には見えない状態にあるので、ならばスタイルシートに指定してアクセスされた時に一緒に読み込ませる必要など、通常ならば無いわけなのである。であるからして、それらの画像の BASE64 データをひとまとめにして、javascript によって Ajax で取得させよう、というこんたん。
まぁ、これは「 O’REILLY High Performance JavaScript 」に書いてあった手法。後ほど出てくる BASE64 データをつなぐデリミタとして使う chr(1) という文字もこの本にて学んだこと。

と、いうことでまずは、javascript から呼ばれてそのページに必要な画像データをまとめて送り返す php の方から。これは、WordPress なので正統的にやるならば、functions.php に記述した関数にて受けることになる。WordPress を介さずに普通に php ファイルで受けることも全く可能なのではあるけれど、その場合、セキュリティの事を少し考えないといけないと思う。まぁ、画像データを送り返すぐらいのようなものならそんなに神経質にならなくてもいいような気もするのだけれど。
画像データはそれ専用の別ファイルに配列にしてまとめて書いておいて、それを functions.php の関数から呼みこんで使うようにした。そうじゃないと、ばかでかいいくつもの画像データが、 functions.php についてまわるなんてことになってしまう。ページごとに必要な画像は異なっているので、それは javascript から指定を出す。

<?php
    function retbaseimgs() {

        // getimg はそのページに必要な画像の指定。画像の入った配列のkey が chr(1) でつながった文字列
        $getimg = isset ( $_POST['getimg']) ? $_POST['getimg'] : '';

        if ( '' !== $getimg ) {
            
            // 画像データファイルの読み込み
            $basefile =  get_stylesheet_directory() . '/base_imgs.php';

            include( $basefile );

            // 必要な画像のkeyデータをばらして配列に格納
            $imgkeys = explode ( chr(1), $getimg );
            $retimg = array();

            // 必要な画像データを配列に格納
            foreach ( $imgkeys as $val ) {
                $retimg[] = $imgs[ $val ][1];
            }

            // 画像データを chr(1) 文字でひとまとめにつなぎ合わせて返信
            echo implode ( chr(1), $retimg );
        } else {
            echo 'Good bye';
        }
        exit();
    }

    // フックが2つあるのはお約束
    add_action( 'wp_ajax_retbaseimgs', 'retbaseimgs' );
    add_action( 'wp_ajax_nopriv_retbaseimgs', 'retbaseimgs' );
?>
PHP
CopyExpand

Ajax を受ける php 側の関数はこれだけのもの。なんてことはない。chr(1) ASCII の小さい番号の方の文字。実際のデータの中に現れる可能性は無いとのこと。ちなみに下は画像データの入ったファイル。そのデータが何の画像がわかるように、ファイル名とセットの二次元配列にしてある。

<?php
    $imgs = [
        [ 'rssfeed', 'iVBORw0KGgoAAAANSUhEUgAAAGQAAAA8CAMAAACn4e/...' ],
        [ 'owl_logo_w', 'iVBORw0KGgoAAAANSUhEUgAAAcIAAADsCAMAAADQ...' ],
        [ 'ojama_jpf', 'iVBORw0KGgoAAAANSUhEUgAAAI8AAACCCAMAAABII2t...' ],
        [ 'simplistic_pagenavi_icon', '/9j/4AAQSkZJRgABAgAAZABkAAD/7AARR...' ],
        ...
        ...
        ...
    ];
?>
PHP
CopyExpand

実際の画像データはあまりにも長く、画像データ自体の数ももっと多く登録しているので省略しているが、[ ファイル名, 画像データ ] を一つの配列にセットした二次元配列である。なぜ二度言う?くどいし。
と、いうことで、送る側の javascript
XMLHttpRequest の部分は、よく使うものなので別関数にしている。それはこれの下に。
ちなみに、下のコードは鳥画像ページのもの。もちろん同じことを、テンプレートの部分を対応させて、この WordPress DIY のページでもやらせてる。アイコン画像自体は共通してる部分が多いもので。

function call_bg() {
	/* image-key > file-name > html-id 
	0 > rssfeed > rssfeed
	1 > owl_logo_w > backowla, backowlb, backowlc
	2 > ojama_jpf > ojm, ojamaflyjpg
	3 > simplistic_pagenavi_icon > splcpn, splcpndl
	4 > hcpc_ico > hcpcm, spcdl
	5 > akahajiro_face_s >  baepocha
	6 > jb_s > jb
	7 > wappy2 > wappy2
	8 > buttonw-blue > wp-logomark
	9 > wordpress > wporg
	10 > saving_spoonie_b > savespoonie
	11 > hoopoe_yawn_a > hoopoe
	12 > lap2 > lapwing
	13 > tit > hoopoewing
	14 > numbers > .numberimg
	15 > theme > sanbanzefbdl
	16 > theme > sanbanzehddl
	17 >  watch_back > ranalogw */

	// テンプレートにより必要な画像の指定、それぞれナロー画面とワイド画面での配列
	const pageset = {// norrow:0 wide:1
		index: [ [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 13, 14, 17 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 13, 14, 17 ] ], 
		tag: [ [ 0, 1, 2, 3, 4, 9, 15, 16 ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13, 15, 16 ] ],
		cat: [ [ 1, 2, 3, 4, 9, 15, 16 ], [ 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 13, 15, 16 ] ], 
		date: [ [ 0 ], [ 0, 6, 7, 8, 13 ] ],
		single: [ [ 0 ], [ 0, 1, 2, 3, 4, 5, 7, 8, 9, 12 ] ]
		},
		urlpara = location.search,
		lnarrow = window.innerWidth < 771 ? 0 : 1;

	let pageimg;

	// テンプレートはurl にて判断
	if ( urlpara ) {
		if ( -1 !== urlpara.indexOf( 'tag=' ) ) {
			pageimg = 'tag';
		} else if ( -1 !== urlpara.indexOf( 'cat=' ) ) {
			pageimg = 'cat';
		} else if ( -1 !== urlpara.indexOf( 'm=' ) ) {
			pageimg = 'date';
		} else if ( -1 !== urlpara.indexOf( 'p=' ) ) {
			pageimg = 'single';
		} else {
			pageimg = 'index';
		}
	} else {
		pageimg = 'index';
	}

	// 各html 要素の、画像指定等の設定
	const tarary = [// html-id or class, image-key, 0-png 1-jpg, bgimage option  
			[ 'rssfeed', 0, 0 ],
			[ 'backowla', 1, 0 ],
			[ 'backowlb', 1, 0 ],
			[ 'backowlc', 1, 0 ],
			[ 'backowlh', 1, 0, ' no-repeat -300px 0' ],
			[ 'ojm', 2, 0 ],
			[ 'ojamaflyjpg', 2, 0 ],// 5
			[ 'splcpn', 3, 0 ],
			[ 'splcpndl', 3, 0 ],
			[ 'hcpc', 4, 1 ],
			[ 'spcdl', 4, 1 ],
			[ 'baepocha', 5, 0 ],// 10
			[ 'jb', 6, 0 ],
			[ 'wporg', 9, 0 ],
			[ 'wappy2', 7, 0, 'center / contain' ],// 13
			[ 'wp-logomark', 8, 0, ' center / contain' ],
			[ 'savespoonie', 10, 0, ' no-repeat top 10px center / contain' ],
			[ 'hoopoe', 11, 0, ' center / cover' ],
			[ 'lapwing', 12, 0 ],
			[ 'hoopoewing', 13, 0, ' center / contain' ],
			[ '.numberimg', 14, 1],
			[ 'sanbanzefbdl', 15, 0, ' no-repeat center / contain' ],
			[ 'sanbanzehddl', 16, 0, ' no-repeat center / contain' ],
			[ 'ranalogw', 17, 0, ' no-repeat center / cover' ]
		],
		tarary_len = tarary.length,
		pageset_len = pageset[ pageimg ][ lnarrow ].length,
		wpajaxurl = 'https://strix.main.jp/wp-admin/admin-ajax.php',
		// php での chr(1) 文字は、javascript では '\u0001'
		strsend = 'action=retbaseimgs&getimg=' + pageset[ pageimg ][ lnarrow ].join( '\u0001' );

	// XMLHttpReauest は別の関数にしている
	ajax_callback( wpajaxurl, strsend, function( result ) {
		if ( -1 === result.indexOf( 'Good bye' ) ) {
			console.log( 'ready images!' );

			const doc = document,
				imgs = result.split( '\u0001' );

			let imgset = {};

			// 画像を指定して取得した場合、欠けた画像の分、画像のキーがずれてしまっている。
			// それを元のキーに画像を対応させる
			for ( let i = 0; i < pageset_len; i++ ) {
				imgset[ pageset[ pageimg ][ lnarrow ][ i ] ] = imgs[ i ];
			}

			for ( let i = 0; i < tarary_len; i++ ) {
				
				if ( '.' === tarary[ i ][0][0] ) {// 対象のhtml 要素が class だった場合
					const tarclass = doc.querySelectorAll( tarary[ i ][0] ),
						tarclass_len = tarclass.length;

					if ( imgset[ tarary[ i ][1] ] ) {
						for ( let j = 0; j < tarclass_len; j++ ) {
							
							if ( tarary[ i ][3] ) {// 画像の指定に他の設定が必要な場合
								tarclass[ j ].style.background = 'url(data:image/' + ( tarary[ i ][2] ? 'jpg' : 'png' ) + ';base64,' + imgset[ tarary[ i ][1] ]+ ')' + ( tarary[ i ][3] ? tarary[ i ][3] : '' );
							} else {
								tarclass[ j ].style.backgroundImage = 'url(data:image/' + ( tarary[ i ][2] ? 'jpg' : 'png' ) + ';base64,' + imgset[ tarary[ i ][1] ] + ')';
							}
						}
					}
				} else {// 対象のhtml 要素が id だった場合
					if ( null !== doc.getElementById( tarary[ i ][0] ) ) {
						if ( imgset[ tarary[ i ][1] ] ) {

							if ( tarary[ i ][3] ) {
								doc.getElementById( tarary[ i ][0] ).style.background = 'url(data:image/' + ( tarary[ i ][2] ? 'jpg' : 'png' ) + ';base64,' + imgset[ tarary[ i ][1] ] + ')' + ( tarary[ i ][3] ? tarary[ i ][3] : '' );
							} else {
								doc.getElementById( tarary[ i ][0] ).style.backgroundImage = 'url(data:image/' + ( tarary[ i ][2] ? 'jpg' : 'png' ) + ';base64,' + imgset[ tarary[ i ][1] ] + ')';
							}
						}
					}
				}
			}
		} else {
			console.log( result );
		}
	}, 'POST', 1 );
}
JavaScript
CopyExpand

コールバックが必要な場合の XMLHttpRequest の関数。

function ajax_callback( url, str, callback, ope ) {

	if ( url ) {
		const operation = 'undefined' === typeof ope ? 'POST' : ope,
			tmpstr = 'undefined' === typeof str ? null : str,
			strsend = Array.isArray( tmpstr ) ? tmpstr.join( '&' ) : tmpstr;

		var req=new XMLHttpRequest();

		req.onreadystatechange = function() {
			let result = '';
	
			if (req.readyState == 4) { // 通信の完了時
				if (req.status == 200) { // 通信の成功時
					result = req.responseText;

					callback( result );
				
				} else {
					console.log( 'error : disabled send' );
				}
			}
		}

		req.open( operation, url, true );
		if ( 'POST' === operation ) {
			req.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
		}
		req.send( strsend );

	} else {
		console.log( 'error : no data url' );
	}
}
JavaScript
CopyExpand

さてさて、結果はいかに!

と、3ポイントほど改善された。ちなみにモバイルの方はといえば・・・?

こちらはまだまだという具合。でかい背景画像がない分、こちらのほうが割合、良い結果が出そうなのではあるけれど・・・?

で、ちなみに鳥画像ページの方はというと。以下の具合。

と、なんとモバイルのほうが好結果が出る。まぁ、こちらの方は重要でない画像はほとんど読み込まないようにしているのだから、当然といえばなんだけれど。
さてさて・・・。

この後、まだまだ闘いは続くのですが・・・この投稿があまりに長くなりつつあるので、続きは新しいページへと移ります。こちらへと → 「Google PAGESPEED INSIGHTS との闘い – それから」

Leave a Reply!

JavaScript is necessary to send a comment.
You can edit and delete your comment if you input a edit key.
Edit key is necessary for attesting you when you edit and delete it.
The tag of HTML cannot be used in comment.
When you comment for the first time, it is displayed after the approval of the administrator.
Because I cannot speak English so much, it takes time to answer.
Required fields are marked *.

※Please enter more than 5 characters only alphabets.
※Edit or delete are possible for 2000 days after approval.

*

♠Simplistic Comment User Editable v4.0

♠When visitors leave comments on the site this site collect the data shown in the comments form, and also the visitor’s IP address and browser user agent string to help spam detection.
♠This site does not use cookie when visitors leave comments and commenter edit comment.
♠This site uses Akismet to reduce spam. Learn how your comment data is processed.

Comments feed

Trackback URL : https://strix.main.jp/wp-trackback.php?p=164288

Sanbanse Funabashi
2011.01.01 sunrise

Top

スクロールさせるか画像をクリックすると元に戻ります。