Composable Storefront  でデバッグをしてみる

※ これから記載する事項は、私が所属する会社とは一切関係のない事柄です。


ここでは PWA Kit を利用したローカル開発の際、また Managed Runtime（以下、MRT） 上にデプロイした後のデバッグ方法を紹介して行きたいと思います。（[詳細](https://developer.salesforce.com/docs/commerce/pwa-kit-managed-runtime/guide/debugging.html#tail-logs-on-managed-runtime)）


## クエリによるステートとサーバーサイドレンダリングの確認

ここでは URL のクエリを利用してサーバーサイドレンダリング時とステートの確認方法を見て行きます。

#### サーバーサイドレンダリングのみの状態を確認したい場合

クライアントでの [Hydration](https://en.wikipedia.org/wiki/Hydration_(web_development))（Javascript のイベントのアタッチ）を行わずに完全にサーバーからレンダリングされた状態のページを確認したい場合は URL のクエリに `__server_only` というパラメータを設定します。例えばホームページで確認を行いたい場合は `http://localhost:3000/?__server_only` のようにします。

下記はパラメータを指定しない状態でのホームページですが、この場合は Hydration が行われるためヘッダーのアローの表示やホバーした際のメニューの表示が行われます。
![スクリーンショット 2023-07-19 18.20.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/21f98936-558d-e389-46f5-ef8bb7d158b0.png)



一方、パラメータを設定することで Hydration が行われず、アローボタンやホバー時のメニューの表示といった Javascript イベントで行われる動的な部分が機能していないことが確認できます。
![スクリーンショット 2023-07-19 18.20.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/a8b8db62-33e6-4237-614d-4beab0431a57.png)



#### サーバーサイドから送られてくるステートを確認したい場合

PWA Kit は Isomorphic Javascript でありサーバーサイドで処理された状態をステートとしてクライアント側に HTML を通じて JSON 形式でグローバル変数 `__PRELOADED_STATE__` に渡しますが、その内容をフォーマットされた状態で確認したい場合は `__pretty_print` パラメータをURLに付与することで可能になります。例えばホームページでのステートの確認したい場合は `http://localhost:3000/?__pretty_print` のような URL になります。


##### 下記がフォーマットされていない状態

![スクリーンショット 2023-07-19 18.21.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/07641792-2fc3-3af4-452a-a133cbdf735b.png)


##### フォーマットされている状態

![スクリーンショット 2023-07-19 18.21.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/a066506a-03d0-a532-aeeb-9de1d421852f.png)


##### デベロッパーツールのコンソールで確認したい場合

デベロッパーツールのコンソールで確認したい場合は `window.__PRELOADED_STATE__` を実行すれば確認することも可能です。
![スクリーンショット 2023-07-19 18.22.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/4c4e4858-a351-16bc-97af-2871c9d983fe.png)


## サーバーサイド（Node.js ）のデバッグ

#### Google Cromeによるデバッグ

ここでは Google Chrome を利用したサーバーサイドのデバッグ方法を紹介します。
まずは、 `npm run start:inspect` コマンドでローカルでデバッグモードで PWA Kit を実行します。次に `chrome://inspect` という URL にブラウザでアクセスします。すると「Open dedicated DevTools for Node」というリンクをクリックします。
![スクリーンショット 2023-07-19 17.23.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/c39a4964-c2cb-d4da-be0c-f8886dc3f44f.png)



すると、下記のような画面が表示されて、デバッグを始めることができます。
もし、`localhost:9229` が設定に入っていなければ自身で設定してください。 Node.js のデバッグの際に利用されるポートについては「[Debugging Guide](https://nodejs.org/en/docs/guides/debugging-getting-started)」をご覧ください。
![スクリーンショット 2023-07-19 17.24.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/e39bab59-d5c0-f29a-ccee-726c5da3b4a1.png)




あとは普通のデバッグと同様にブレークポイントを設定したり変数の中身を確認することができます。見た目はクライアントサイドのデバッグと似ていますが、画面上部の「DevTool - Node.js」と書いてあればサーバサイド側のデバッグであることが確認できます。
![スクリーンショット 2023-07-19 17.34.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/4c688a92-3b9c-d9e4-1376-2e0c378dae96.png)




#### VS Code によるデバッグ

ここでは VS Code を利用したサーバサイドのデバッグ方法を紹介します。
まずは Google Chrome でのデバッグと同様に `npm run start:inspect` コマンドで PWA Kit を起動させます。
そのあと、VS Code 上でコマンドパレットを表示（ `Command + Shift + P` （Mac の場合）、 `Ctrl + Shift + P` （Windows の場合））し「Debug: Attach to Node Process」を選択します。
![スクリーンショット 2023-07-19 17.43.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/6c65dd9f-e9b1-fb95-826b-24e6b70f7e39.png)



次に一番上の Node.js プロセスを選択するとデバッグが開始されます。
![スクリーンショット 2023-07-19 17.43.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/ffe20d3e-9b98-dd1a-0a69-74b121b1bed4.png)



あとは通常のデバッグ時と同様にブレークポイントを設定したり変数の中身を確認することができます。
![スクリーンショット 2023-07-19 17.50.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/7bca138b-bb87-b906-562b-f61bb266e25f.png)


#### Google Chrome、 VS Code 共通の確認方法

Google Chrome での開発や VS Code での開発共にデバッガがアタッチされた際は「Debugger attached.」という文字が `npm run start:inspect` を実行しているターミナルに表示されます。
![スクリーンショット 2023-07-19 17.30.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/4e2ede98-e0c9-1c9a-2ed5-33cfe919a9b6.png)




## クライアントサイド（Javascript のデバッグ）

クライアントサイドのデバッグを行う際は、通常の Google Chrome などのブラウザのデバッグで可能です。
Google Chrome の開発者ツールの画面上部にはサーバーサイドの場合「DevTool - Node.js」と表示されているのに対してクライアントサイドの場合は「DevTool - {URL} 」になってると思います。

![スクリーンショット 2023-07-19 17.39.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/dc7b3178-0150-6501-1464-14508a7e4d84.png)




## MRT のリアルタイムログ取得

ここでは PWA Kit を MRT にデプロイした後にアプリケーションログを確認する方法を紹介します。

#### サンプルコード

今回はサンプルとしてホーム画面表示時に「テストーーーーーーー」とログに表示されるようにコードを修正したものをデプロイしてログを確認してみたいと思います。MRT へのデプロイ方法については「[Salesforce B2C Commerce PWA Kit のサンプルを構築してみる](https://qiita.com/syunyama/items/58433ae8e3c5fda7f37e#4--managed-runtime%E3%81%B8%E3%81%AE%E5%85%AC%E9%96%8B%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4)」を参照してください。
![スクリーンショット 2023-07-19 17.54.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/8c2f3e87-8378-0f44-d68b-377864ac1e3b.png)


#### MRT ログを取得する

ログを取得するためにはコマンドを実行します。その際、環境 ID とプロジェクト ID が必要となりますが、取得方法は「[プロジェクト ID の取得](https://qiita.com/syunyama/items/db62cfa105e30cb73a3f#2-%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88-id-%E3%81%AE%E5%8F%96%E5%BE%97)」と「[環境 ID の取得](https://qiita.com/syunyama/items/db62cfa105e30cb73a3f#3-%E7%92%B0%E5%A2%83-id-%E3%81%AE%E5%8F%96%E5%BE%97)」を参照してください。


##### デプロイした PWA Kit のプロジェクト外での取得コマンド

```sh
npx @salesforce/pwa-kit-dev tail-logs --environment {環境 ID} --project {プロジェクト ID}
```

##### プロジェクト内でのコマンド

```sh
npm run tail-logs -- --environment {環境 ID}
```

#### 実行結果

コマンドを実行した状態でデプロイした環境のホーム画面に遷移するとデプロイした内容が取得できていることが確認できます。
![スクリーンショット 2023-07-19 18.06.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/62b9fcf1-fffb-89f1-041b-b95551703bbd.png)

#### 注意点
* ログ取得コマンドのセッション保持時間は 60 分です
* 1 環境につきログ取得に利用できるセッションは 100 セッションまでです
* ログ取得を行うユーザは MRT の開発者または管理者権限が必要です