← inaro.devShopify学習ツール
11-01

テーマJSの設計:バニラJSとWeb Components

バンドラ無しのテーマでCustom Elementsパターンを使い、再利用できて壊れにくいJSを書ける

最終確認: 2026-09

解説

受託の現場でなぜ必要か: この回では、テーマエディタがDOMをあとから差し替えても壊れないJSを、Custom Elementsで書けるようになります。
受託では「エディタで並べ替えたら数量ボタンが効かなくなった」という報告の多くを、この書き方で防げます。

Custom Elementsとは

Custom Elementsは、自分で名前を付けたHTML要素を作るブラウザの仕組みで、DawnもHorizonも使っています。
class QuantityInput extends HTMLElementを定義し、customElements.define("quantity-input", QuantityInput)で登録します。
要素がDOMに置かれた時点で自動的に初期化されるので、DOMContentLoadedで一度だけ配線する書き方と違い、あとから挿入されたDOMでも動きます。
初期化はconnectedCallback(DOMに入った時に呼ばれる関数)に書き、querySelectorもここで行います。
コンストラクタの時点では、子要素がまだ無いからです。

JSが動かなくても買える形にするには

購入フォームもカートフォームも、素のHTMLとして送信できる状態にしておきます。
JavaScriptは「ページ遷移なしにする」ための、上に重ねる層と考えます。
こうしておくと、JSが落ちても買えるサイトになります。

テーマのJSにビルド工程はあるか

ありません。
assets/に置いたファイルが、そのまま配信されます。
<script type="module">は使えます。
TypeScriptやバンドラ(複数のファイルを1つにまとめる道具)を使うなら、自分でビルドして出力を`assets/`に入れます

発展:二重定義のガードを必ず入れる

customElements.defineは、必ずif (!customElements.get(name))で囲みます。
同じ名前で2回呼ぶと例外が出て、それ以降のスクリプトが全部止まるからです。
セクションが複数回読み込まれると、同じスクリプトが2回読まれる状況は普通に起きます。
次は演習で、数量ボタンをCustom Elementで作ってみましょう。

ステップ1 / 2

ShopifyはShopify Inc.の商標です。本サイトは個人が制作した非公式の学習教材であり、同社の承認・提携・後援を受けていません。記載内容は2026-09時点のものです。料金・上限値・管理画面のラベルは変わるため、作業の前に公式ドキュメントで確認してください。