けっこう古めのWebサイトのパフォーマンス改善でやった事まわりの雑なメモです
環境
画像はCloudfront→S3
サーバはEC2
Lambdaも一部仕様(最終的には使わなかった)
次世代フォーマットでの画像の配信
最初にLambdaで↑これを実装しましたが、思ったように点数が上がらなかったので
cwebpを使って、直接S3にwebp形式のファイルをアップロードしました
1 2 3 4 // cwebpの導入 $ sudo curl -o /usr/local/src/libwebp-1.0.2-linux-x86-64.tar.gz https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.0.2-linux-x86-64.tar.gz $ sudo tar zxvf /usr/local/src/libwebp-1.0.2-linux-x86-64.tar.gz -C /usr/local/src/ $ sudo cp /usr/local/src/libwebp-1.0.2-linux-x86-64/bin/cwebp /usr/local/bin/cwebp
jpgとpngを再帰的に一括変換(※元ファイルと同じ階層に.webpファイルが出力されます)
1 2 $ find . -name "*.jpg" | xargs -IXXXX cwebp XXXX -o XXXX.webp $ find . -name "*.png" | xargs -IXXXX cwebp XXXX -o XXXX.webp
js,cssの最小化 単純にWebpackで1ファイルにまとめました。jQueryを利用しているサイトだったので、jQueryをrequireしています
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 // package.json(抜粋) { "scripts": { "webpack-bundle": "./node_modules/.bin/webpack -p", }, "devDependencies": { "css-loader": "^2.1.0", "extract-text-webpack-plugin": "^4.0.0-beta.0", "file-loader": "^3.0.1", "node-sass": "^4.9.0", "style-loader": "^0.23.1", "url-loader": "^1.1.2", "webpack": "^4.29.0", "webpack-cli": "^3.2.1" }, "dependencies": { "jquery": "^1.11.3", } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 // webpack.config.js var ExtractTextPlugin = require("extract-text-webpack-plugin"); var path = require('path'); var webpack = require('webpack'); var jquery = require('jquery'); module.exports = { entry: { "top": path.join(__dirname, "./webpack/top/entry.js"), }, output: { path: __dirname + '/webroot/bundle', filename: "./[name]/bundle.js" }, module: { rules: [ { test: /\.css$/, loader: ExtractTextPlugin.extract({fallback:'style-loader',use:'css-loader'}) }, { test: /\.(jpg|gif|png|woff|woff2|eot|ttf|svg)$/, loader: 'url-loader?limit=100000' }, ] }, resolve: { modules: ['./node_modules'], }, plugins: [ new webpack.ProvidePlugin({ $: "jquery", jQuery: "jquery", "window.jQuery": "jquery" }), new ExtractTextPlugin("./[name]/bundle.css") ], performance: { hints: false }, cache: true };
1 2 // 圧縮 $ npm run webpack-bundle
キーリクエストのプリロード Webpackでbundleしたcss,jsをrel=preload
に指定する
1 2 <link rel="preload" href="/bundle/top/bundle.css" as="style"> <link rel="preload" href="/bundle/top/bundle.js" as="script">
必須のドメインへの事前接続
Resource Hintで、あらかじめ接続するドメインなどを明記しておく
1 2 3 4 <link rel="dns-prefetch" href="//example.com"> <link rel="preconnect" href="//cdn.example.com" crossorigin> <link rel="prefetch" href="/bundle.js" as="script"> <link rel="prerender" href="//example.com/next-page.html">
オフスクリーン画像の遅延読み込み
いまのところ、lazysizesが一番導入も手軽で他のライブラリにも依存しないし、最適解な気がしました
ただし、近い将来、ブラウザ側でlazyloadに標準対応がされそうな雰囲気なので、実装されていればこっちのほうがいいかも
その他:Chromeでjs,cssのカバレッジを調べる Chromeの開発者ツールで、[Console]→[メニュー]→[More tools]→[Coverage]で、読み込んではいるけど使われていないコード(Unused Bytes) などの調査ができる
参考サイト