<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>松本 侑真 — #VS Code</title><description>「VS Code」タグの記事フィード</description><link>https://yuuma.dev/</link><item><title>【Astro】Paste Imageで実現する、ストレスフリーな画像最適化ワークフロー（PNG→AVIF/WebP自動変換）</title><link>https://yuuma.dev/blog/image-workflow/</link><guid isPermaLink="true">https://yuuma.dev/blog/image-workflow/</guid><description>VS Code拡張機能「Paste Image」を使ってMarkdownに画像を簡単に貼り付けつつ、裏側でPNGからAVIF/WebPへの最適化、そしてpictureタグへの自動変換まで行う完全自動化ワークフローの構築方法を解説します。</description><pubDate>Sun, 23 Nov 2025 23:48:28 GMT</pubDate><content:encoded>&lt;p&gt;&lt;picture&gt;
  &lt;source srcset=&quot;/blog/img/image-workflow/2025-11-24-11-54-49.avif&quot; type=&quot;image/avif&quot;&gt;
  &lt;source srcset=&quot;/blog/img/image-workflow/2025-11-24-11-54-49.webp&quot; type=&quot;image/webp&quot;&gt;
  &lt;img src=&quot;https://yuuma.dev/blog/img/image-workflow/2025-11-24-11-54-49.png&quot; alt=&quot;2025-11-24-11-54-49&quot; width=&quot;1000&quot; height=&quot;600&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;
                    &lt;/p&gt;&lt;figcaption class=&quot;caption-image w-fit py-2 flex gap-1 items-center mx-auto text-muted font-semibold&quot;&gt;
                      &lt;svg fill=&quot;currentColor&quot; stroke-width=&quot;0&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 24 24&quot; height=&quot;1em&quot; width=&quot;1em&quot; style=&quot;overflow: visible; color: currentcolor;&quot;&gt;&lt;path d=&quot;M19.999 4h-16c-1.103 0-2 .897-2 2v12c0 1.103.897 2 2 2h16c1.103 0 2-.897 2-2V6c0-1.103-.897-2-2-2zm-13.5 3a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3zm5.5 10h-7l4-5 1.5 2 3-4 5.5 7h-7z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
                      作業ログを読み込ませてnano-bananaで作ったフローチャート
                    &lt;/figcaption&gt;
                  &lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;技術ブログをMarkdownで書く際、「画像の扱い」が面倒だと感じることはありませんか？&lt;/p&gt;
&lt;p&gt;スクリーンショットを撮って、ファイル名を決めて保存して、パスを書いて…という作業は、執筆のリズムを崩してしまいます。また、Webサイトのパフォーマンスを考えると、生のPNGをそのまま配信するのではなく、WebPやAVIFといった次世代フォーマットに最適化することも不可欠です。&lt;/p&gt;
&lt;p&gt;今回は、Astroで作られたブログ環境において、これらの面倒な作業をすべて自動化し、「&lt;strong&gt;ショートカットキーを一発押すだけ&lt;/strong&gt;」で完結するストレスフリーなワークフローを構築しました。その全容と設定方法を紹介します。&lt;/p&gt;
&lt;h2 id=&quot;目指すゴール&quot;&gt;&lt;a href=&quot;#目指すゴール&quot; class=&quot;heading-link&quot;&gt;目指すゴール&lt;/a&gt;&lt;span class=&quot;anchor&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;この記事で構築する環境のゴールはシンプルです。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;「クリップボードの画像を、&lt;code&gt;cmd+option+v&lt;/code&gt; を押すだけでMarkdownに貼り付け完了。裏側で勝手に最適化される」&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;これだけです。人間は執筆に集中し、面倒なことはすべてスクリプトに任せます。&lt;/p&gt;
&lt;h3 id=&quot;実現する機能&quot;&gt;&lt;a href=&quot;#実現する機能&quot; class=&quot;heading-link&quot;&gt;実現する機能&lt;/a&gt;&lt;span class=&quot;anchor&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;ワンタッチ貼り付け&lt;/strong&gt;: VS Code拡張機能「Paste Image」を使い、ショートカットキーで画像をMarkdownに挿入。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自動最適化&lt;/strong&gt;: 保存されたPNG画像を検知し、軽量なAVIFとWebPフォーマットを自動生成。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ディレクトリ分離戦略&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;人間が管理する元画像（PNG）は &lt;code&gt;src/&lt;/code&gt; 以下に保存。&lt;/li&gt;
&lt;li&gt;配信用の最適化画像（AVIF/WebP/PNG）はスクリプトが &lt;code&gt;public/&lt;/code&gt; 以下に自動生成・ミラーリング。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;#x3C;picture&gt;&lt;/code&gt;タグ自動変換&lt;/strong&gt;: Markdownの画像記法を、ブラウザが最適な形式を選べる &lt;code&gt;&amp;#x3C;picture&gt;&lt;/code&gt; タグのHTMLに自動変換。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;開発時の自動同期&lt;/strong&gt;: &lt;code&gt;npm run dev&lt;/code&gt; 中に画像が追加されたら、即座に変換スクリプトを走らせる。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;成果物のイメージ&quot;&gt;&lt;a href=&quot;#成果物のイメージ&quot; class=&quot;heading-link&quot;&gt;成果物のイメージ&lt;/a&gt;&lt;span class=&quot;anchor&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;クリップボードに画像がある状態で &lt;code&gt;cmd+option+v&lt;/code&gt; を押すと、Markdownには以下のように入力されます。&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;
  &lt;source srcset=&quot;/blog/img/image-workflow/2025-11-24-01-03-20.avif&quot; type=&quot;image/avif&quot;&gt;
  &lt;source srcset=&quot;/blog/img/image-workflow/2025-11-24-01-03-20.webp&quot; type=&quot;image/webp&quot;&gt;
  &lt;img src=&quot;https://yuuma.dev/blog/img/image-workflow/2025-11-24-01-03-20.png&quot; alt=&quot;2025-11-24-01-03-20&quot; style=&quot;max-height:480px;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
&lt;/picture&gt;&lt;/p&gt;
&lt;div class=&quot;remark-code-container&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light tokyo-night&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#1a1b26;color:#24292e;--shiki-dark:#a9b1d6; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;md&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;![&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-light-text-decoration:underline;--shiki-dark:#73DACA;--shiki-dark-text-decoration:inherit&quot;&gt;画像の説明&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;](&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-light-text-decoration:underline;--shiki-dark:#73DACA;--shiki-dark-text-decoration:underline&quot;&gt;/blog/img/2025-America/Y-MM-DD-hh-mm-ss.png&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-light-text-decoration:underline;--shiki-dark:#89DDFF;--shiki-dark-text-decoration:inherit&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-light-text-decoration:underline;--shiki-dark:#73DACA;--shiki-dark-text-decoration:inherit&quot;&gt;480x0&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-light-text-decoration:underline;--shiki-dark:#89DDFF;--shiki-dark-text-decoration:inherit&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button class=&quot;code-copy-button&quot; id=&quot;code-copy-button-53&quot; type=&quot;button&quot; aria-label=&quot;コードをコピー&quot;&gt;&lt;svg fill=&quot;currentColor&quot; stroke-width=&quot;0&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 512 512&quot; height=&quot;1em&quot; width=&quot;1em&quot; style=&quot;overflow: &amp;#x27;visible&amp;#x27;, color: &amp;#x27;currentcolor&amp;#x27;&quot;&gt;&lt;rect width=&quot;336&quot; height=&quot;336&quot; x=&quot;128&quot; y=&quot;128&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;32&quot; rx=&quot;57&quot; ry=&quot;57&quot;&gt;&lt;/rect&gt;&lt;path fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;32&quot; d=&quot;m383.5 128 .5-24a56.16 56.16 0 0 0-56-56H112a64.19 64.19 0 0 0-64 64v216a56.16 56.16 0 0 0 56 56h24&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;これがビルド時には、以下のようなAVIF -&gt; WebP -&gt; PNGの優先順位で表示可能なHTMLに変換されて出力されます。（“480x0” は高さ指定として処理されます）&lt;/p&gt;
&lt;div class=&quot;remark-code-container&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light tokyo-night&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#1a1b26;color:#24292e;--shiki-dark:#a9b1d6; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#BA3C97&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#F7768E&quot;&gt;picture&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#BA3C97&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#BA3C97&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#F7768E&quot;&gt;source&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#BB9AF7&quot;&gt; srcset&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;/blog/img/.../image.avif&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#BB9AF7&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;image/avif&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#BA3C97&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#BA3C97&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#F7768E&quot;&gt;source&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#BB9AF7&quot;&gt; srcset&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;/blog/img/.../image.webp&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#BB9AF7&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;image/webp&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#BA3C97&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#BA3C97&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#F7768E&quot;&gt;img&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#BB9AF7&quot;&gt;    src&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;/blog/img/.../image.png&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#BB9AF7&quot;&gt;    alt&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;画像の説明&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#BB9AF7&quot;&gt;    height&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;480&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#BB9AF7&quot;&gt;    loading&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;lazy&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#BB9AF7&quot;&gt;    decoding&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#BA3C97&quot;&gt;  /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#BA3C97&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#F7768E&quot;&gt;picture&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#BA3C97&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button class=&quot;code-copy-button&quot; id=&quot;code-copy-button-54&quot; type=&quot;button&quot; aria-label=&quot;コードをコピー&quot;&gt;&lt;svg fill=&quot;currentColor&quot; stroke-width=&quot;0&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 512 512&quot; height=&quot;1em&quot; width=&quot;1em&quot; style=&quot;overflow: &amp;#x27;visible&amp;#x27;, color: &amp;#x27;currentcolor&amp;#x27;&quot;&gt;&lt;rect width=&quot;336&quot; height=&quot;336&quot; x=&quot;128&quot; y=&quot;128&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;32&quot; rx=&quot;57&quot; ry=&quot;57&quot;&gt;&lt;/rect&gt;&lt;path fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;32&quot; d=&quot;m383.5 128 .5-24a56.16 56.16 0 0 0-56-56H112a64.19 64.19 0 0 0-64 64v216a56.16 56.16 0 0 0 56 56h24&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2 id=&quot;構築ステップ&quot;&gt;&lt;a href=&quot;#構築ステップ&quot; class=&quot;heading-link&quot;&gt;構築ステップ&lt;/a&gt;&lt;span class=&quot;anchor&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;では、具体的な構築手順を見ていきましょう。&lt;/p&gt;
&lt;h3 id=&quot;step-1-vs-code拡張paste-imageの導入と設定&quot;&gt;&lt;a href=&quot;#step-1-vs-code拡張paste-imageの導入と設定&quot; class=&quot;heading-link&quot;&gt;Step 1. VS Code拡張「Paste Image」の導入と設定&lt;/a&gt;&lt;span class=&quot;anchor&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;まず、画像を簡単に貼り付けるためのVS Code拡張機能 Paste Image をインストールします。&lt;/p&gt;
&lt;div class=&quot;remark-link-card-plus__container&quot;&gt;
  &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=mushan.vscode-paste-image&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;remark-link-card-plus__card&quot;&gt;
    &lt;div class=&quot;remark-link-card-plus__main&quot;&gt;
  &lt;div class=&quot;remark-link-card-plus__content&quot;&gt;
    &lt;div class=&quot;remark-link-card-plus__title&quot;&gt;Paste Image - Visual Studio Marketplace&lt;/div&gt;
    &lt;div class=&quot;remark-link-card-plus__description&quot;&gt;Extension for Visual Studio Code - paste image from clipboard directly&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;remark-link-card-plus__meta&quot;&gt;
    &lt;span class=&quot;remark-link-card-plus__url&quot;&gt;marketplace.visualstudio.com&lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;remark-link-card-plus__thumbnail&quot;&gt;
  &lt;img src=&quot;https://mushan.gallerycdn.vsassets.io/extensions/mushan/vscode-paste-image/1.0.4/1548255946926/Microsoft.VisualStudio.Services.Icons.Default&quot; class=&quot;remark-link-card-plus__image&quot; alt=&quot;&quot;&gt;
&lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;この拡張機能のキモは、&lt;code&gt;settings.json&lt;/code&gt; で保存先と挿入されるMarkdownのパスを細かく制御できる点です。今回は、「記事ファイルと同じ名前のフォルダ」に画像を保存するように設定します。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.vscode/settings.json&lt;/code&gt;（またはユーザー設定）に以下を追加します。&lt;/p&gt;
&lt;div class=&quot;remark-code-container&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light tokyo-night&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#1a1b26;color:#24292e;--shiki-dark:#a9b1d6; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#51597D;--shiki-dark-font-style:italic&quot;&gt;  // 画像の保存先：src配下の、記事ファイル名と同名のディレクトリ&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;  &quot;&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#7AA2F7&quot;&gt;pasteImage.path&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;${projectRoot}/src/content/blog/img/${currentFileNameWithoutExt}&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#51597D;--shiki-dark-font-style:italic&quot;&gt;  // 保存ファイル名：日時ベース&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;  &quot;&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#7AA2F7&quot;&gt;pasteImage.defaultName&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;Y-MM-DD-HH-mm-ss&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#51597D;--shiki-dark-font-style:italic&quot;&gt;  // 挿入されるMarkdownのパターン：public配下のパスとして記述&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;  &quot;&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#7AA2F7&quot;&gt;pasteImage.insertPattern&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;![${imageFileNameWithoutExt}](/blog/img/${currentFileNameWithoutExt}/${imageFileName} &lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;480x0&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button class=&quot;code-copy-button&quot; id=&quot;code-copy-button-55&quot; type=&quot;button&quot; aria-label=&quot;コードをコピー&quot;&gt;&lt;svg fill=&quot;currentColor&quot; stroke-width=&quot;0&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 512 512&quot; height=&quot;1em&quot; width=&quot;1em&quot; style=&quot;overflow: &amp;#x27;visible&amp;#x27;, color: &amp;#x27;currentcolor&amp;#x27;&quot;&gt;&lt;rect width=&quot;336&quot; height=&quot;336&quot; x=&quot;128&quot; y=&quot;128&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;32&quot; rx=&quot;57&quot; ry=&quot;57&quot;&gt;&lt;/rect&gt;&lt;path fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;32&quot; d=&quot;m383.5 128 .5-24a56.16 56.16 0 0 0-56-56H112a64.19 64.19 0 0 0-64 64v216a56.16 56.16 0 0 0 56 56h24&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h4 id=&quot;ポイント&quot;&gt;&lt;a href=&quot;#ポイント&quot; class=&quot;heading-link&quot;&gt;ポイント&lt;/a&gt;&lt;span class=&quot;anchor&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pasteImage.path:&lt;/code&gt; 元画像はビルド前のソースとして扱いたいので、&lt;code&gt;src/content/blog/img/...&lt;/code&gt; に保存します。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pasteImage.insertPattern:&lt;/code&gt; Markdownには、最終的に配信される public/ 起点のパス（&lt;code&gt;/blog/img/...&lt;/code&gt;）を記述しておきます。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;step-2-pngからavifwebpを生成する変換スクリプト&quot;&gt;&lt;a href=&quot;#step-2-pngからavifwebpを生成する変換スクリプト&quot; class=&quot;heading-link&quot;&gt;Step 2. PNGからAVIF/WebPを生成する変換スクリプト&lt;/a&gt;&lt;span class=&quot;anchor&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;次に、&lt;code&gt;src&lt;/code&gt; に保存されたPNG画像を元に、最適化されたAVIF/WebPファイルを生成して &lt;code&gt;public&lt;/code&gt; ディレクトリに配置するスクリプトを作成します。画像処理には高速な sharp を使用します。&lt;/p&gt;
&lt;p&gt;このスクリプトは以下の役割を担います。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;public&lt;/code&gt; の画像ディレクトリを一旦クリーンアップ。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;src&lt;/code&gt; 内のPNGファイルを探索。&lt;/li&gt;
&lt;li&gt;PNGファイルを &lt;code&gt;public&lt;/code&gt; へコピー（ミラーリング）。&lt;/li&gt;
&lt;li&gt;同時に、リサイズしたAVIFとWebP版を作成して &lt;code&gt;public&lt;/code&gt; へ保存。&lt;/li&gt;
&lt;/ol&gt;
&lt;details class=&quot;callout callout-attention&quot; open&gt;
&lt;summary class=&quot;callout-title callout-title-attention&quot;&gt;&lt;svg fill=&quot;currentColor&quot; stroke-width=&quot;0&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 16 16&quot; height=&quot;1em&quot; width=&quot;1em&quot; style=&quot;overflow: visible; color: currentcolor;&quot;&gt;&lt;path d=&quot;M9.05.435c-.58-.58-1.52-.58-2.1 0L.436 6.95c-.58.58-.58 1.519 0 2.098l6.516 6.516c.58.58 1.519.58 2.098 0l6.516-6.516c.58-.58.58-1.519 0-2.098L9.05.435zM8 4c.535 0 .954.462.9.995l-.35 3.507a.552.552 0 0 1-1.1 0L7.1 4.995A.905.905 0 0 1 8 4zm.002 6a1 1 0 1 1 0 2 1 1 0 0 1 0-2z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;Attention&lt;/summary&gt;
&lt;p&gt;fast-glob, sharp などのパッケージが必要です。事前にインストールしてください。&lt;/p&gt;
&lt;/details&gt;
&lt;details class=&quot;callout callout-info&quot;&gt;
&lt;summary class=&quot;callout-title callout-title-info&quot;&gt;&lt;svg fill=&quot;none&quot; stroke-width=&quot;0&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; stroke=&quot;currentColor&quot; viewBox=&quot;0 0 24 24&quot; height=&quot;1em&quot; width=&quot;1em&quot; style=&quot;overflow: visible; color: currentcolor;&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm8.706-1.442c1.146-.573 2.437.463 2.126 1.706l-.709 2.836.042-.02a.75.75 0 0 1 .67 1.34l-.04.022c-1.147.573-2.438-.463-2.127-1.706l.71-2.836-.042.02a.75.75 0 1 1-.671-1.34l.041-.022ZM12 9a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;convert-images.mjs&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;remark-code-container&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light tokyo-night&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#1a1b26;color:#24292e;--shiki-dark:#a9b1d6; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#7DCFFF&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#0DB9D7&quot;&gt; fg&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#7DCFFF&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;fast-glob&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#7DCFFF&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#0DB9D7&quot;&gt; fs&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#7DCFFF&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;fs/promises&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#7DCFFF&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#0DB9D7&quot;&gt; sharp&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#7DCFFF&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;sharp&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#7DCFFF&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#0DB9D7&quot;&gt; path&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#7DCFFF&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;node:path&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#51597D;--shiki-dark-font-style:italic&quot;&gt;// 設定&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt; SRC_DIR&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;src/content/blog&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt; PUBLIC_DIR&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;public/blog&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt; MAX_WIDTH&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; 1600&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#51597D;--shiki-dark-font-style:italic&quot;&gt; // 最大幅（これより大きい場合はリサイズ）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt; WEBP_QUALITY&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; 80&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt; AVIF_QUALITY&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; 50&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#51597D;--shiki-dark-font-style:italic&quot;&gt;// メイン処理&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;  console&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;Cleaning &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt;PUBLIC_DIR&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt; ...&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#BB9AF7;--shiki-dark-font-style:italic&quot;&gt;  await&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; fs&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;rm&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt;PUBLIC_DIR&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#73DACA&quot;&gt;recursive&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#73DACA&quot;&gt; force&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; })&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#BB9AF7;--shiki-dark-font-style:italic&quot;&gt;  await&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; fs&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;mkdir&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt;PUBLIC_DIR&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#73DACA&quot;&gt;recursive&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; })&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt; pngFiles&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#BB9AF7;--shiki-dark-font-style:italic&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt; fg&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;([&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt;SRC_DIR&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;/**/*.{png,PNG}&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#73DACA&quot;&gt;    onlyFiles&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;  })&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;  let&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#BB9AF7&quot;&gt; converted&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#BB9AF7&quot;&gt;    mirrored&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#BB9AF7&quot;&gt;    failed&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt;  for&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt; pngPath&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; of&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; pngFiles&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt;    try&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#51597D;--shiki-dark-font-style:italic&quot;&gt;      // 1. PNGをpublicへミラーリング&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt; rel&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; path&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;relative&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt;SRC_DIR&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; pngPath&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt; publicPngPath&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; path&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;join&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt;PUBLIC_DIR&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; rel&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#BB9AF7;--shiki-dark-font-style:italic&quot;&gt;      await&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; fs&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;mkdir&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;path&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;dirname&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;publicPngPath&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#73DACA&quot;&gt;recursive&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; })&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#BB9AF7;--shiki-dark-font-style:italic&quot;&gt;      await&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; fs&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;copyFile&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;pngPath&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; publicPngPath&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;      mirrored&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#51597D;--shiki-dark-font-style:italic&quot;&gt;      // 2. sharpで最適化（リサイズ、AVIF/WebP変換）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt; ext&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; path&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;extname&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;publicPngPath&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt; basePublic&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; publicPngPath&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;slice&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;ext&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#7DCFFF&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt; publicWebp&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; `&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;basePublic&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;.webp&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt; publicAvif&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; `&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;basePublic&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;.avif&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt; img&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt; sharp&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;publicPngPath&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt; meta&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#BB9AF7;--shiki-dark-font-style:italic&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; img&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;metadata&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#51597D;--shiki-dark-font-style:italic&quot;&gt;      // 必要ならリサイズ&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt; resized&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;        meta&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#7DCFFF&quot;&gt;width&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt; &amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; meta&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#7DCFFF&quot;&gt;width&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; MAX_WIDTH&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt;          ?&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; img&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;resize&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;({ &lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#73DACA&quot;&gt;width&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; MAX_WIDTH&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#73DACA&quot;&gt; withoutEnlargement&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt;          :&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; img&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#BB9AF7;--shiki-dark-font-style:italic&quot;&gt;      await&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; resized&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;        .&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;clone&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;        .&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;avif&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;({ &lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#73DACA&quot;&gt;quality&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; AVIF_QUALITY&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;        .&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;toFile&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;publicAvif&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#BB9AF7;--shiki-dark-font-style:italic&quot;&gt;      await&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; resized&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;        .&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;clone&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;        .&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;webp&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;({ &lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#73DACA&quot;&gt;quality&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; WEBP_QUALITY&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;        .&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;toFile&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;publicWebp&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;      converted&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; +=&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;    } &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;      failed&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;      console&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;Failed:&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; pngPath&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; e&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#7DCFFF&quot;&gt;message&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;  console&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;({ &lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;mirrored&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; converted&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; failed&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; })&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;main&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button class=&quot;code-copy-button&quot; id=&quot;code-copy-button-56&quot; type=&quot;button&quot; aria-label=&quot;コードをコピー&quot;&gt;&lt;svg fill=&quot;currentColor&quot; stroke-width=&quot;0&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 512 512&quot; height=&quot;1em&quot; width=&quot;1em&quot; style=&quot;overflow: &amp;#x27;visible&amp;#x27;, color: &amp;#x27;currentcolor&amp;#x27;&quot;&gt;&lt;rect width=&quot;336&quot; height=&quot;336&quot; x=&quot;128&quot; y=&quot;128&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;32&quot; rx=&quot;57&quot; ry=&quot;57&quot;&gt;&lt;/rect&gt;&lt;path fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;32&quot; d=&quot;m383.5 128 .5-24a56.16 56.16 0 0 0-56-56H112a64.19 64.19 0 0 0-64 64v216a56.16 56.16 0 0 0 56 56h24&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/details&gt;
&lt;h3 id=&quot;step-3-markdownの画像を-picture-タグに変換するremarkプラグイン&quot;&gt;&lt;a href=&quot;#step-3-markdownの画像を-picture-タグに変換するremarkプラグイン&quot; class=&quot;heading-link&quot;&gt;Step 3. Markdownの画像を picture タグに変換するRemarkプラグイン&lt;/a&gt;&lt;span class=&quot;anchor&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;MarkdownにはPNGのパスが書かれていますが、ブラウザにはAVIFやWebPも提示したいです。そこで、ビルドプロセスでMarkdownの画像記法を &lt;code&gt;&amp;#x3C;picture&gt;&lt;/code&gt; タグのHTMLに置換するRemarkプラグインを作成します。&lt;/p&gt;
&lt;p&gt;このプラグインは、Markdownの &lt;code&gt;![alt](url &quot;title&quot;)&lt;/code&gt; を解析し、対応する .avif と .webp のソースタグを追加したHTMLに置き換えます。また、タイトルの “480x0” といった記述から width や height 属性を抽出する処理も入れています。&lt;/p&gt;
&lt;details class=&quot;callout callout-info&quot;&gt;
&lt;summary class=&quot;callout-title callout-title-info&quot;&gt;&lt;svg fill=&quot;none&quot; stroke-width=&quot;0&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; stroke=&quot;currentColor&quot; viewBox=&quot;0 0 24 24&quot; height=&quot;1em&quot; width=&quot;1em&quot; style=&quot;overflow: visible; color: currentcolor;&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm8.706-1.442c1.146-.573 2.437.463 2.126 1.706l-.709 2.836.042-.02a.75.75 0 0 1 .67 1.34l-.04.022c-1.147.573-2.438-.463-2.127-1.706l.71-2.836-.042.02a.75.75 0 1 1-.671-1.34l.041-.022ZM12 9a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;remark-picture.mjs&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;remark-code-container&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light tokyo-night&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#1a1b26;color:#24292e;--shiki-dark:#a9b1d6; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#7DCFFF&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#0DB9D7&quot;&gt;visit&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#7DCFFF&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;unist-util-visit&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#7DCFFF&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#0DB9D7&quot;&gt; path&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#7DCFFF&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;node:path&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#7DCFFF&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#7DCFFF&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt; remarkPicture&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#E0AF68&quot;&gt;options&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; {})&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt;    exts&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;.png&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#51597D;--shiki-dark-font-style:italic&quot;&gt; // 対象とする拡張子&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt;    imgAttrs&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#73DACA&quot;&gt;loading&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;lazy&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#73DACA&quot;&gt; decoding&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#51597D;--shiki-dark-font-style:italic&quot;&gt; // デフォルト属性&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;  }&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; options&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#BB9AF7;--shiki-dark-font-style:italic&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#E0AF68&quot;&gt;tree&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;    visit&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;tree&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;image&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#E0AF68&quot;&gt;node&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#E0AF68&quot;&gt; index&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#E0AF68&quot;&gt; parent&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt;      if&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;parent&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt; ||&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; typeof&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; index&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt; !==&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#BB9AF7;--shiki-dark-font-style:italic&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt;      if&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;node&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#7DCFFF&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#BB9AF7;--shiki-dark-font-style:italic&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt; url&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; node&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#7DCFFF&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt; ext&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; path&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;extname&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;toLowerCase&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt;      if&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;exts&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;includes&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;ext&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;)) &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#BB9AF7;--shiki-dark-font-style:italic&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#51597D;--shiki-dark-font-style:italic&quot;&gt;      // ベースのパスからavif/webpのパスを生成&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt; base&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; url&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;slice&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;ext&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#7DCFFF&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt; avif&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; `&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;base&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;.avif&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt; webp&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; `&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;base&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;.webp&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt; alt&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;node&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#7DCFFF&quot;&gt;alt&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt; ??&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;replace&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#B4F9F8&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt;g&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;&amp;#x26;quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt; title&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;node&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#7DCFFF&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt; ??&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;replace&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#B4F9F8&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt;g&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;&amp;#x26;quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#51597D;--shiki-dark-font-style:italic&quot;&gt;      // タイトルからサイズ指定を解析 (&quot;WIDTHxHEIGHT&quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;      let&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#BB9AF7&quot;&gt; widthAttr&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;      let&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#BB9AF7&quot;&gt; heightAttr&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;      let&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#BB9AF7&quot;&gt; styleAttr&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt; m&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; title&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;match&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt;^&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#F7768E&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt;\d&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#F7768E&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt;\s&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#B4F9F8&quot;&gt;x&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt;\s&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#F7768E&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt;\d&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#F7768E&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt;      if&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;m&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;        const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt; a&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt; Number&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;m&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;])&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;        const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt; b&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt; Number&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;m&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;])&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt; &amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; b&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#51597D;--shiki-dark-font-style:italic&quot;&gt;          // 両方指定があればwidth/height属性へ&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;          widthAttr&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; `&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt; width=&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;          heightAttr&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; `&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt; height=&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;b&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;        } &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt; if&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt; &amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; b&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt; ===&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#51597D;--shiki-dark-font-style:italic&quot;&gt;          // 高さだけ0ならmax-heightスタイルへ（例）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;          styleAttr&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; `&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt; style=&quot;max-height:&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;px;&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#51597D;--shiki-dark-font-style:italic&quot;&gt;      // その他の属性&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt; extraAttrs&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; Object&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;entries&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;imgAttrs&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;        .&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#E0AF68&quot;&gt;k&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#E0AF68&quot;&gt; v&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; `&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt; ${&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;k&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;=&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;v&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;        .&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;join&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#51597D;--shiki-dark-font-style:italic&quot;&gt;      // HTMLを生成してノードを置き換え&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt; html&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; `&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;&amp;#x3C;picture&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt; &amp;#x3C;source srcset=&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;avif&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;&quot; type=&quot;image/avif&quot; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt; &amp;#x3C;source srcset=&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;webp&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;&quot; type=&quot;image/webp&quot; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt; &amp;#x3C;img src=&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;&quot; alt=&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;alt&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;widthAttr&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;}${&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;heightAttr&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;}${&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;styleAttr&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;}${&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;extraAttrs&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;&amp;#x3C;/picture&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;trim&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;      parent&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#7DCFFF&quot;&gt;children&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#7DCFFF&quot;&gt;index&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#73DACA&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#73DACA&quot;&gt; value&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; html&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;    })&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;  }&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button class=&quot;code-copy-button&quot; id=&quot;code-copy-button-57&quot; type=&quot;button&quot; aria-label=&quot;コードをコピー&quot;&gt;&lt;svg fill=&quot;currentColor&quot; stroke-width=&quot;0&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 512 512&quot; height=&quot;1em&quot; width=&quot;1em&quot; style=&quot;overflow: &amp;#x27;visible&amp;#x27;, color: &amp;#x27;currentcolor&amp;#x27;&quot;&gt;&lt;rect width=&quot;336&quot; height=&quot;336&quot; x=&quot;128&quot; y=&quot;128&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;32&quot; rx=&quot;57&quot; ry=&quot;57&quot;&gt;&lt;/rect&gt;&lt;path fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;32&quot; d=&quot;m383.5 128 .5-24a56.16 56.16 0 0 0-56-56H112a64.19 64.19 0 0 0-64 64v216a56.16 56.16 0 0 0 56 56h24&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/details&gt;
&lt;p&gt;作成したプラグインは &lt;code&gt;astro.config.mjs&lt;/code&gt; の &lt;code&gt;markdown.remarkPlugins&lt;/code&gt; に追加して有効化します。&lt;/p&gt;
&lt;h3 id=&quot;step-4-開発中の自動同期watcherの作成&quot;&gt;&lt;a href=&quot;#step-4-開発中の自動同期watcherの作成&quot; class=&quot;heading-link&quot;&gt;Step 4. 開発中の自動同期（Watcherの作成）&lt;/a&gt;&lt;span class=&quot;anchor&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;最後に、開発サーバー（&lt;code&gt;astro dev&lt;/code&gt;）を動かしている間、画像が追加されたら自動的に Step 2 の変換スクリプトが走るように監視スクリプトを作成します。これがないと、画像を貼るたびに手動でコマンドを叩くことになり、ストレスフリーになりません。
&lt;code&gt;chokidar&lt;/code&gt; を使って &lt;code&gt;src&lt;/code&gt; ディレクトリを監視します。&lt;/p&gt;
&lt;details class=&quot;callout callout-info&quot;&gt;
&lt;summary class=&quot;callout-title callout-title-info&quot;&gt;&lt;svg fill=&quot;none&quot; stroke-width=&quot;0&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; stroke=&quot;currentColor&quot; viewBox=&quot;0 0 24 24&quot; height=&quot;1em&quot; width=&quot;1em&quot; style=&quot;overflow: visible; color: currentcolor;&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm8.706-1.442c1.146-.573 2.437.463 2.126 1.706l-.709 2.836.042-.02a.75.75 0 0 1 .67 1.34l-.04.022c-1.147.573-2.438-.463-2.127-1.706l.71-2.836-.042.02a.75.75 0 1 1-.671-1.34l.041-.022ZM12 9a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;watch-images.mjs&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;remark-code-container&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light tokyo-night&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#1a1b26;color:#24292e;--shiki-dark:#a9b1d6; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#7DCFFF&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#0DB9D7&quot;&gt; chokidar&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#7DCFFF&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;chokidar&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#7DCFFF&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#0DB9D7&quot;&gt;spawn&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#7DCFFF&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;node:child_process&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#7DCFFF&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#0DB9D7&quot;&gt; path&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#7DCFFF&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;node:path&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt; WATCH_DIR&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;src/content/blog&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt; DEBOUNCE_MS&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; 800&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#51597D;--shiki-dark-font-style:italic&quot;&gt; // 連続実行を防ぐためのデバウンス時間&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#BB9AF7&quot;&gt; timer&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; null&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#BB9AF7&quot;&gt; running&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; false&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#BB9AF7&quot;&gt; queued&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; false&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#51597D;--shiki-dark-font-style:italic&quot;&gt;// 変換スクリプト(npm run img:opt)を実行する関数&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt; runConvert&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;running&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;    queued&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#BB9AF7;--shiki-dark-font-style:italic&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;  running&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;  console&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;[img:watch] running img:opt...&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt; p&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt; spawn&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;run&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;img:opt&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#73DACA&quot;&gt;    stdio&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;inherit&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#73DACA&quot;&gt;    shell&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; process&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#7DCFFF&quot;&gt;platform&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt; ===&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;win32&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;  })&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;  p&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;on&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;close&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#E0AF68&quot;&gt;code&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;    running&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; false&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;    console&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;      code&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt; ===&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt; ?&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;[img:watch] done.&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt; :&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;[img:watch] failed&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;      code&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;    )&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#51597D;--shiki-dark-font-style:italic&quot;&gt;    // 実行中に次のリクエストが来ていたら再実行&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;queued&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;      queued&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; false&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;      runConvert&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;  })&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#51597D;--shiki-dark-font-style:italic&quot;&gt;// デバウンス処理&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt; debounceRun&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;timer&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;clearTimeout&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;timer&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;  timer&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt; setTimeout&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;runConvert&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; DEBOUNCE_MS&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#51597D;--shiki-dark-font-style:italic&quot;&gt;// 監視の設定&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt; watcher&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; chokidar&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;watch&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt;WATCH_DIR&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#73DACA&quot;&gt;  ignoreInitial&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#51597D;--shiki-dark-font-style:italic&quot;&gt; // 起動時の既存ファイルスキャンは無視&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#73DACA&quot;&gt;  persistent&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#73DACA&quot;&gt;  usePolling&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#51597D;--shiki-dark-font-style:italic&quot;&gt; // 環境によってはポーリングが必要&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#73DACA&quot;&gt;  interval&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt; 500&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;})&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#51597D;--shiki-dark-font-style:italic&quot;&gt;// PNGファイルの追加・変更を検知&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;watcher&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;on&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;all&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#E0AF68&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#E0AF68&quot;&gt; p&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt; =&gt;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#9D7CD8;--shiki-dark-font-style:italic&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#BB9AF7&quot;&gt; ext&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#89DDFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; path&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;extname&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;toLowerCase&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;ext&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt; !==&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;.png&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt; ||&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; event&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#BB9AF7&quot;&gt; ===&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;unlink&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#BB9AF7;--shiki-dark-font-style:italic&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#51597D;--shiki-dark-font-style:italic&quot;&gt; // 削除は無視するなど調整&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;  console&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;[img:watch]&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; event&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt; p&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;  debounceRun&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;})&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#C0CAF5&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#7AA2F7&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;[img:watch] watching &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF9E64&quot;&gt;WATCH_DIR&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#7DCFFF&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button class=&quot;code-copy-button&quot; id=&quot;code-copy-button-58&quot; type=&quot;button&quot; aria-label=&quot;コードをコピー&quot;&gt;&lt;svg fill=&quot;currentColor&quot; stroke-width=&quot;0&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 512 512&quot; height=&quot;1em&quot; width=&quot;1em&quot; style=&quot;overflow: &amp;#x27;visible&amp;#x27;, color: &amp;#x27;currentcolor&amp;#x27;&quot;&gt;&lt;rect width=&quot;336&quot; height=&quot;336&quot; x=&quot;128&quot; y=&quot;128&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;32&quot; rx=&quot;57&quot; ry=&quot;57&quot;&gt;&lt;/rect&gt;&lt;path fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;32&quot; d=&quot;m383.5 128 .5-24a56.16 56.16 0 0 0-56-56H112a64.19 64.19 0 0 0-64 64v216a56.16 56.16 0 0 0 56 56h24&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/details&gt;
&lt;h3 id=&quot;step-5-packagejson-でコマンドをまとめる&quot;&gt;&lt;a href=&quot;#step-5-packagejson-でコマンドをまとめる&quot; class=&quot;heading-link&quot;&gt;Step 5. package.json でコマンドをまとめる&lt;/a&gt;&lt;span class=&quot;anchor&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;作成したスクリプトを &lt;code&gt;package.json&lt;/code&gt; の &lt;code&gt;scripts&lt;/code&gt; に登録し、Astroのコマンドと連携させます。&lt;/p&gt;
&lt;div class=&quot;remark-code-container&quot;&gt;&lt;div class=&quot;remark-code-title&quot;&gt;package.json&lt;/div&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light tokyo-night&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#1a1b26;color:#24292e;--shiki-dark:#a9b1d6; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;  &quot;&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#7AA2F7&quot;&gt;scripts&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;    &quot;&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#0DB9D7&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;画像変換の単体コマンド&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;    &quot;&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#0DB9D7&quot;&gt;img:opt&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;node scripts/convert-images.mjs&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;    &quot;&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#0DB9D7&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;画像監視の単体コマンド&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;    &quot;&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#0DB9D7&quot;&gt;img:watch&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;node scripts/watch-images.mjs&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;    &quot;&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#0DB9D7&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;devサーバー起動前に一度画像を最適化する&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;    &quot;&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#0DB9D7&quot;&gt;predev&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;npm run img:opt&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;    &quot;&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#0DB9D7&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;監視スクリプトとAstroの開発サーバーを並列で実行する&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;    &quot;&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#0DB9D7&quot;&gt;dev&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;npm run img:watch &amp;#x26; astro dev&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;    &quot;&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#0DB9D7&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;ビルド前にも必ず画像を最適化する&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;    &quot;&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#0DB9D7&quot;&gt;prebuild&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;npm run img:opt&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;    &quot;&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#0DB9D7&quot;&gt;build&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;astro build&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;    &quot;&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#0DB9D7&quot;&gt;preview&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;astro preview&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;    &quot;&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#0DB9D7&quot;&gt;astro&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#89DDFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#9ECE6A&quot;&gt;astro&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#89DDFF&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#9ABDF5&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button class=&quot;code-copy-button&quot; id=&quot;code-copy-button-59&quot; type=&quot;button&quot; aria-label=&quot;コードをコピー&quot;&gt;&lt;svg fill=&quot;currentColor&quot; stroke-width=&quot;0&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 512 512&quot; height=&quot;1em&quot; width=&quot;1em&quot; style=&quot;overflow: &amp;#x27;visible&amp;#x27;, color: &amp;#x27;currentcolor&amp;#x27;&quot;&gt;&lt;rect width=&quot;336&quot; height=&quot;336&quot; x=&quot;128&quot; y=&quot;128&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;32&quot; rx=&quot;57&quot; ry=&quot;57&quot;&gt;&lt;/rect&gt;&lt;path fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;32&quot; d=&quot;m383.5 128 .5-24a56.16 56.16 0 0 0-56-56H112a64.19 64.19 0 0 0-64 64v216a56.16 56.16 0 0 0 56 56h24&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;これで、普段どおり &lt;code&gt;npm run dev&lt;/code&gt; を実行するだけで、画像の監視プロセスも同時に立ち上がるようになりました。&lt;/p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;&lt;a href=&quot;#まとめ&quot; class=&quot;heading-link&quot;&gt;まとめ&lt;/a&gt;&lt;span class=&quot;anchor&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;以上のステップで、理想としていた画像ワークフローが完成しました。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;執筆者は、VS Codeで &lt;code&gt;cmd+option+v&lt;/code&gt; を押すだけ。&lt;/li&gt;
&lt;li&gt;PNGが &lt;code&gt;src/&lt;/code&gt; に保存される。&lt;/li&gt;
&lt;li&gt;Watcherがそれを検知し、変換スクリプトを実行。&lt;/li&gt;
&lt;li&gt;最適化された画像（AVIF/WebP/PNG）が &lt;code&gt;public/&lt;/code&gt; に自動生成される。&lt;/li&gt;
&lt;li&gt;Astro（Remark）がMarkdownを &lt;code&gt;&amp;#x3C;picture&gt;&lt;/code&gt; タグに変換して表示する。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;この仕組みにより、画像の管理コストが劇的に下がり、執筆活動により集中できるようになりました。
また、将来的に別のフレームワークへ移行することになっても、元画像は &lt;code&gt;src&lt;/code&gt; にきれいな状態で残っているため、移行コストを最小限に抑えられるというメリットもあります。&lt;/p&gt;
&lt;p&gt;Astroでブログを構築している方は、ぜひ試してみてください。&lt;/p&gt;</content:encoded></item></channel></rss>