目次
概要
Google
のChrome
ブラウザはLighthouse
と言う機能を提供してます。この機能を通じてウェブアプリやウェブページの性能を測ることができます。
Lighthouse
はウェブアプリまたはウェブページを分析し、ウェブサイトの性能やベストプラクティス(Best practices)を確認することができるように手伝うツールです。
- Lighthosue: https://github.com/GoogleChrome/lighthouse
今回のブログポストではローカルまたはCI
環境でLighthouse
を実行する方法について説明します。
Lighthouse CI
Lighthouse CI
はCI(Continuous Integration)
環境でLighthouse
の実行や結果を確認できるようにしてくれるツールです。
- Lighthosue CI: https://github.com/GoogleChrome/lighthouse-ci
Lighthouse CI
をローカルまたはCI
環境で実行するためにはNodeJS
の16
バージョン以上の環境が必要です。
Lighthouse CIインストール
NodeJS
環境の上で次のコマンドを実行してLighthouse CI
をインストールします。
npm install --save-dev @lhci/cli
package.json
ファイルがない場合、次のコマンドを実行してグローバル環境にLighthouse CI
をインストールします。
npm install -g @lhci/cli
Lighthouse CI設定
Lighthouse CI
を使うためにはLighthouse
を設定する必要があります。プロジェクトのルートフォルダに.lighthouserc.js
ファイルを生成して次のように修正します。
module.exports = {
ci: {
assert: {
preset: 'lighthouse:recommended',
},
},
};
このように設定するとLighthouse
が提供するおすすめ設定をそのまま使えます。
ターゲット設定
次はLighthouse
が検査するターゲットを設定する必要があります。ターゲットの対象はスタティックファイルまたはURL
を設定することができます。
スタティックファイル
スタティックファイルは開発中のウェブサイトやウェブページのビルド結果を検査する方法です。スタティックファイルを検査するためにはLighthouse
の設定ファイルである.lighthouserc.js
ファイルを開いて下記のように修正します。
module.exports = {
ci: {
collect: {
staticDistDir: '_site/',
},
assert: {
preset: 'lighthouse:recommended',
},
},
};
私はJekyll
を使ってブログを管理しています。Jekyll
はbundle exec jekyll build
と言うコマンドを使ってMarkdown
で作成したブログポストをHTML
ふぁいるでビルドすることができます。このようにビルドした結果ファイルは_site
と言うフォルダへ生成されます。
このように生成されたスタティックファイルのフォルダをcollect
のstaticDistDir
オプションに設定することで、Lighthosue
が検査する対象を設定することができます。
特定URL設定
スタティックファイルを生成することができない場合、検査対象になるページのURL
を入力してLighthouse
を実行することができます。特定URLを検査するためにはLighthouse
の設定ファイルである.lighthouserc.js
ファイルを開いて下記のように修正します。
module.exports = {
ci: {
collect: {
url: [
// Korean
'https://deku.posstree.com/ko/flutter/',
'https://deku.posstree.com/ko/react/',
'https://deku.posstree.com/ko/react-native/',
// English
'https://deku.posstree.com/en/flutter/',
'https://deku.posstree.com/en/react/',
'https://deku.posstree.com/en/react-native/',
// Japanese
'https://deku.posstree.com/flutter/',
'https://deku.posstree.com/react/',
'https://deku.posstree.com/react-native/'
]
},
assert: {
preset: 'lighthouse:recommended',
},
},
};
このように設定すると、Lighthouse
は設定されたURL
を検査します。
サブフォルダの問題
staticDistDir
を使ってフォルダを指定しましたが、指定したフォルダのサブフォルダにあるファイルは検査しない問題が発生しました。私はこの問題を解決するためsitemap.xml
を使いました。
JavaScript
でsitemap.xml
ファイルを読むためにxml-js
ライブラリを使いました。
そしたら、xml-js
ライブラリをインストールするため、次のコマンドを実行します。
npm install --save-dev xml-js
そして、.lighthouserc.js
ファイルを開いて下記のように修正します。
const fs = require('fs');
const convert = require('xml-js');
const SITEMAP_PATH = './_site/sitemap.xml';
const SITE_URL = 'https://deku.posstree.com';
const data = fs.readFileSync(SITEMAP_PATH);
const result = convert.xml2json(data, { compact: true, spaces: 4 });
const json = JSON.parse(result);
const url = json.urlset.url.map((item) => item.loc._text.replace(SITE_URL, ''));
module.exports = {
ci: {
collect: {
staticDistDir: './_site/',
url: url,
},
assert: {
preset: 'lighthouse:recommended',
},
},
};
SITEMAP_PATH
とSITE_URL
を自分のプロジェクトに合わせて修正して使ってください。このようにファイルを修正して実行するとsitemap.xml
に作成されたURLを読んでSITE_URL
を使って要らないURLの文字を消して、当該URLをLighthouse
のオプションに設定してLighthouse
が検査できるようにしました。
このように.lighthouserc.js
ファイルを修正してLighthouse
を実行すると、sitemap.xml
に書いてある全てのページがうまく検査されることが確認できます。
Lighthouse実行
Lighthouse
を使うための全ての設定が終わりました。次はLighthouse
を実行するためpackage.json
ファイルを開いて下記のように実行スクリプトを追加します。
{
"scripts": {
"lighthouse": "lhci autorun"
},
"devDependencies": {
"@lhci/cli": "^0.11.0"
}
}
その後、次のコマンドを実行してLighthouse
を実行します。
npm run lighthouse
package.json
ファイルがない場合、 Lighthouse
コマンドを直接実行します。
lhci autorun
# npx lhci autorun
問題なく実行されたら.lighthouseci
フォルダが生成されてLighthouse
の結果が保存されることが確認できます。また、ターミナルでは次のようにLighthouse
の結果が表示されることが確認できます。
...
✘ viewport failure for minScore assertion
Does not have a `<meta name="viewport">` tag with `width` or `initial-scale`
https://web.dev/viewport/
expected: >=0.9
found: 0
all values: 0, 0, 0
このターミナル結果を見ながら問題を修正するか、.lighthouseci
フォルダ中に生成された結果ファイル(.html
)をブラウザで開いて問題を確認して修正することができます。
CI環境で実行
このように設定したLighthosue
をCI
環境で実行して性能を測ることができます。
GitHub Actions
GitHub Actions
でLighthouse
を実行する方法について説明します。GitHub Actions
を使ってLighthouse
を実行するためには.github/workflows/ci.yml
ファイルを生成して次のように修正します。
name: CI
on: [push]
jobs:
lighthouseci:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 16
- run: npm install
- run: npm run lighthouse
package.json
ファイルがない場合npm install
部分とnpm run lighthouse
部分を次のように修正します。
- run: npm install -g @lhci/cli
- run: lhci autorun
もし、スタティックファイルを検査するようにLighthouse
を設定した場合、npm run lighthouse
またはlhci autorun
コマンドを実行する前に必ずスタティックファイルを生成するコマンドを追加してください。
GitLab CI
GitLab CI
でLighthosue
を実行するためには.gitlab-ci.yml
ファイルを作って次のように修正します。
lighthouse:
image: node:16-slim
script:
- apt-get update
- apt-get install -y libgtk-3.0 libgbm-dev libnss3 libatk-bridge2.0-0 libasound2
- npm install --global npm@latest
- npm install
- npm run lighthouse
only:
refs:
- merge_requests
package.json
ファイルがない場合npm install
部分とnpm run lighthouse
部分を次のように修正します。
- npm install -g @lhci/cli
- lhci autorun
もし、ステティックファイルを検査するようにLighthouse
を設定した場合、npm run lighthouse
またはlhci autorun
コマンドを実行する前に必ずステティックファイルを生成するコマンドを追加してください。
Basic authentication
Lighthouse
を使ってURL
でWebページを検査するように設定した場合、Basic authentication
が設定されたWebページを検査する場合があります。
Lighthouse
を使ってBasic authentication
が設定されたウェブページを検査するためにはいくつか設定を追加する必要があります。まず、次のコマンドを使ってpuppeteer
をインストールします。
npm install --save-dev puppeteer
その後、プロジェクトのルートフォルダにpuppeteerScript.js
ファイルを生成して次のように修正します。
const BASIC_AUTH_USER_NAME = process.env.BASIC_AUTH_USER_NAME;
const BASIC_AUTH_PASSWORD = process.env.BASIC_AUTH_PASSWORD;
async function main(browser, { url }) {
const page = await browser.newPage();
await page.authenticate({
username: BASIC_AUTH_USER_NAME,
password: BASIC_AUTH_PASSWORD,
});
await page.goto(url);
}
module.exports = main;
環境変数のBASIC_AUTH_USER_NAME
、BASIC_AUTH_PASSWORD
にBasic authentication
のIDとパスワードを保存します。その後、.lighthouserc.js
ファイルを開いて下記のようにpuppeteer
を設定します。
module.exports = {
ci: {
collect: {
url: [
// Korean
'https://deku.posstree.com/ko/flutter/',
'https://deku.posstree.com/ko/react/',
'https://deku.posstree.com/ko/react-native/',
// English
'https://deku.posstree.com/en/flutter/',
'https://deku.posstree.com/en/react/',
'https://deku.posstree.com/en/react-native/',
// Japanese
'https://deku.posstree.com/flutter/',
'https://deku.posstree.com/react/',
'https://deku.posstree.com/react-native/'
]
},
puppeteerScript: './puppeteerScript.js',
puppeteerLaunchOptions: {
defaultViewport: null,
args: ['--no-sandbox'],
headless: true,
},
assert: {
preset: 'lighthouse:recommended',
},
},
};
このように修正した後、Lighthouse
を実行すると問題なくBasic authentication
が設定されたウェブページがうまく検査できることが確認できます。
完了
これでLighthouse CI
を使ってローカルやCI
環境でLighthouse
を実行する方法についてみてみました。早いウェブページまたはウェブアプリはユーザの経験(UX)に大きな影響を与します。また、Lighthouse
で測れる項目はSEO
にも大きな影響を与えるので、皆さんもLighthouse
を使って開発してるウェブページやウェブアプリの性能を改善してみてください。
私のブログが役に立ちましたか?下にコメントを残してください。それは私にとって大きな大きな力になります!
アプリ広報
Deku
が開発したアプリを使ってみてください。Deku
が開発したアプリはFlutterで開発されています。興味がある方はアプリをダウンロードしてアプリを使ってくれると本当に助かります。