[Shopify]ストアでReactを使用する方法

[Shopify]ストアでReactを使用する方法

 

 

Reactのチュートリアルとかやってみたけど、Shopifyストア上で実際にどうやって使用できるか分からない、、、具体的なイメージが湧かないって人向けに『Shopify ストア上でReactを使用する方法』についてまとめてみました!

 

前提 

・theme kitを使用できる
・JavaScriptわかる
・React多少知ってる
・npm入ってる

 

やること

・ShopifyストアでReact使えるように環境整備
・カートボタンをReact使って出力してみる

 

Shopifyストア上でReact使えるようになるので、色々Reactで作ってみるのも面白いかも知れません!それでは早速スタートです。 

 

Shopify内の環境を整える

テスト用のテーマを作成

ライブテーマではなく、テスト用のテーマを使用した方が良いので、テーマを複製して、config.yml上でテストテーマ情報を追加する。

 

theme watch できる状態にしておく

今回は react という名前で設定したので、ターミナルから該当テーマのルートディレクトリに移動して、

theme watch -e react

で theme watch する。

これで、ローカル上でファイルの変更があれば、勝手にテスト用テーマに反映されるようになった。

 

npmの環境を整える

次に、新しいターミナルタブを開き、同じく該当テーマのルートディレクトリに移動し

npm init -y 

を入力する。すると package.json というファイルが作成される。(npmがインストールされていない場合は、先にインストールする必要があるので注意です。)

 

必要なものをインストールする

次にreactを使用する際に必要なdependenciesをインストールしましょう。

npm install --save react react-dom

そして、reactに関連する必須なものもインストールしてしまいます。

npm install --save-dev @babel/core @babel/preset-env @babel/preset-react babel-loader core-js webpack webpack-cli webpack-merge

これで大枠の環境がセットアップできました!

※ローカル環境内のセットアップなので、まだテーマには何も反映されていません。

 

Reactがちゃんと動いているか検証

ここでちゃんとReactが動くか検証してみます。

具体的にやることとしては、サイト内のカートアイコンをReact側から出力してみて、ちゃんと出力されていればReactがちゃんと動いていると判断できます。

 

必要なアイコンとsnippetsを作成

まずテーマ側で必要になるものを設定していきます。

具体的には

・react出力用のsnippets
・snippets出力

を設定する必要があります。

 

①react 出力用のsnippetsの作成

/snippets/cart-icon-snippets.liquid

という新しいファイルを作成し、その中に下記のようなReact出力用の空のdiv要素を記載します。

 

{%- comment -%}
React Test Snippets
{%- endcomment -%}

<div id="react-cart-icon"></div>

 

このreact-cart-iconの中にReactから出力されるコードが表示されるイメージですね!

 

②snippets出力

このsnippetsを作成しただけでは、もちろんサイト上に表示されません。

どこかで 

{% render 'cart-icon-snippets' %}

と該当snippetsを呼び出さなければなりません。

今回はカートアイコンを出力したいので、ヘッダーでrenderしてみます。

Debutテーマの場合は、

<a href="{{ routes.cart_url }}" class="site-header__icon site-header__cart">
{% include 'icon-cart' %}
<span class="icon__fallback-text">{{ 'layout.cart.title' | t }}</span>
<div id="CartCount" class="site-header__cart-count{% if cart.item_count == 0 %} hide{% endif %}" data-cart-count-bubble>
<span data-cart-count>{{ cart.item_count }}</span>
<span class="icon__fallback-text medium-up--hide">{{ 'layout.cart.items_count' | t: count: cart.item_count }}</span>
</div>
</a>

の下に追加するといい感じに表示される予定です。

ちなみに上記既存カートアイコンの下に

<a href="#">hello</a>

みたいに仮で入れたら問題なく表示されました。

react test header shopify

なので、この部分に

{% render 'cart-icon-snippets' %}

を記載します。

画像で恐縮ですが、こんな感じ。

shopify render snippets

 

これで一旦テーマ側の設定は完了です。

あとは、cart-icon-snippets.liquidファイルにreactから出力できれば、ヘッダーにカートアイコンを出力できるはずです。

それでは引き続きReact側の設定を進めていきましょう! 

 

scriptsフォルダを作成する

テーマディレクトリ内でscriptsフォルダを作成します。 

assets, snippets, sections, templatesに並んでscriptsフォルダが存在する感じです。

scripts フォルダ react

 

その中にReactで使用するComponentsフォルダ、および、今回カートアイコンの出力で使用するcartIcon.jsファイル(scripts/Components/cartIcon.js)を作成します。

scripts/Components/cartIcon.jsの中には下記のように記載します。

import React from 'react'

export const CartIconCode = () => {
return (
<svg id="Capa_1" enable-background="new 0 0 12 12" height="12" viewBox="0 0 12 12" width="12" xmlns="http://www.w3.org/2000/svg"><g><path d="m472 452c0 11.046-8.954 20-20 20h-20v20c0 11.046-8.954 20-20 20s-20-8.954-20-20v-20h-20c-11.046 0-20-8.954-20-20s8.954-20 20-20h20v-20c0-11.046 8.954-20 20-20s20 8.954 20 20v20h20c11.046 0 20 8.954 20 20zm0-312v192c0 11.046-8.954 20-20 20s-20-8.954-20-20v-172h-40v60c0 11.046-8.954 20-20 20s-20-8.954-20-20v-60h-192v60c0 11.046-8.954 20-20 20s-20-8.954-20-20v-60h-40v312h212c11.046 0 20 8.954 20 20s-8.954 20-20 20h-232c-11.046 0-20-8.954-20-20v-352c0-11.046 8.954-20 20-20h60.946c7.945-67.477 65.477-120 135.054-120s127.109 52.523 135.054 120h60.946c11.046 0 20 8.954 20 20zm-121.341-20c-7.64-45.345-47.176-80-94.659-80s-87.019 34.655-94.659 80z"/></g></svg>
)
}

 

次にscripts/cart-icon.jsも作成しておきましょう。中身は下記のような感じでOKです!(ReactをShopifyストアで使用することが目的なので、各Reactコードの説明は省きます。)

 

import ReactDOM from "react-dom"
import React from "react"
import { CartIconCode } from "./Components/CartIcon"

const rootEl = document.getElementById("react-cart-icon")

rootEl && ReactDOM.render(<CartIconCode />, rootEl)

 

これでReactとしてのコードは問題ないはずです。

 

BabelとWebpackの設定周り

 

次にBabelとWebpackの設定を進めていきます。

作るファイルは下記です。

・webpack.common.js
・webpack.prod.js
・webpack.dev.js
・.babelrc
・package.json(作成済みなので、要編集)

 それぞれ場所はassetsフォルダと同じ列に作成します。こんな感じです。

webpack react ファイル shopify

中身はそれぞれこのような形です。(babelrcもこの一覧の中にありますが、ファイル名の頭に.ドットがついているため、非表示になっています。)

 

①webpack.common.js

const path = require("path")

module.exports = {
entry: {
'cart-icon': "./scripts/cart-icon.js"
},
module: {
rules: [
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
use: ["babel-loader"]
}
]
},
output: {
filename: "[name].bundle.js",
path: path.resolve(__dirname, "assets")
}
}

 

ここでやっているのは、entryとして、cart-icon.jsを記載して、その後outputとしてassetsフォルダに cart-icon.bundle.jsを出力しますよ!という処理を行っています。 

 

②webpack.dev.js


const { merge } = require("webpack-merge")
const common = require("./webpack.common.js")

module.exports = merge(common, {
mode: "development",
devtool: "inline-source-map",
watch: true
})

 

 

③webpack.prod.js


const { merge } = require("webpack-merge")
const common = require("./webpack.common.js")

module.exports = merge(common, {
mode: "production"
})

 

④package.json

ここではすでに存在するpackage.jsonファイルのscript部分に下記を追加します。

"scripts": {
"dev": "webpack --config webpack.dev.js --progress --color",
"build": "webpack --config webpack.prod.js --progress --color"
},

 

 

⑤.babelrc

最後に.babelrcというファイルを作成して、下記のように記載しましょう。

{
"presets":[
[
"@babel/preset-env",
{
"useBuiltIns":"usage",
"corejs":3
}
],
"@babel/preset-react"
]
}

 

 

 

これで

npm run dev

をscriptaフォルダ内で実行するとassetsフォルダ内にcart-icon.bundle.jsというファイルが作成されます!

 

bundleされたファイルを読み込む

最後にbundleされたjsファイルをShopifyストア上で読み込めば、そのjsファイルを使用することができます。

layout/theme.liquidファイルの各jsファイルを読み込んでいる部分に

<script defer type="module" src="{{ 'cart-icon.bundle.js' | asset_url }}"></script>

 

というように記載します。

すると、cart-icon.bundle.jsが読み込まれているはずです!

実際にページを読み込んでみると、、、

このように(色味でちょっとわかりにくいですが)カートアイコンが追加されていました!!

react shopify 使用 適用

 

 (右側のうっすらあるやつです笑)

 

 

ShopifyストアでReactを使用する方法 まとめ

以上、ShopifyのストアでReactを適用・使用する方法でした!

初期設定はちょっと複雑ですが、これで色々Reactで遊べるようになりました。Reactはモダンフロントエンドには無くてはならない技術なので、たくさん深堀りして、できることを増やしていきたいものです。

最後に今回の記事を執筆するにあたって参考にした記事も載せておきます。

参考 https://www.cadence-labs.com/2019/12/how-to-add-react-to-a-shopify-theme/

※ちょっと不要なコードとかもあるかも知れませんが、そこらへんはご了承を笑

それでは最後までお読みいただきありがとうございました。本日も良い1日を!

Contact form

新規ストア構築、開発などのお仕事の依頼・無料相談はこちら