Gatsby.jsでは通常のWEBサイトと同様の方法でスクリプトを貼ってもReactが邪魔をして動作しない。
ということで設置手順を記す。
以前は自動広告をgatsby.js
に差し込むと表示がめちゃくちゃになっていて使い物にならなかた(はず)
しかしどうやら内部でアップデートがあったようで久々にテストしてみたところ問題なくgatsby.js
で自動広告を使用することができた。
今回の記事は固定広告用の記事であり、自分で狙った箇所に広告を差し込む方法となるが、まずは自動広告もためしてみることをおすすめする。
2021/02/21更新:プラグインを使う方法は2021/02/21時点で様々な理由で私から強く「非推奨」とさせて頂いている。
詳しく解説しないがプラグインに頼ると様々な弊害が現れるので必ずhtml.js
を配置する次の方法を使うべきであるため記事を再編集した。
念の為参考URL(公式GitHub
よりReact
を多重読み込みする不具合があるそう)
Do NOT use this! · Issue #12 · IsAmrish/gatsby-plugin-google-adsense
まずは.cache/default-html.js
をsrc
直下にそのままコピーペースト。
ファイル名をhtml.js
に変更
html.js
を開きhead
タグへscript
タグを埋め込む。
<script data-ad-client={ここに各自のクライアント番号} async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
クライアントの番号がわからない場合はGoogle Adsense
にログイン後「広告」内の「サマリー」
右側にでてくる画面の「コードを取得」ボタンで表示される。
※読み飛ばしてOK
script
一つ読み込むだけなのに非常に回りくどい方法を行っているように見える。
しかし、この方法を使わずコンポーネント内でScript
を読み込むとリアクトの特性上何度も同じスクリプトを読み込むようでエラーが発生する。
.cache
からファイルを取ってくるので初めは裏技的方法(後々問題が発生しそうな予感)がするがgatsby.js
公式が案内しているカスタマイズ方法なので私は安心して運用している。
次のWEBサイトを参考にコードを作成させていただいた。
Google AdsenseをReactで使う方法(パッケージ未使用) - Qiita
こちらはReact向けの内容ではあるがGatsbyにも応用できる。若干コードが違うのでこだわりがある人は本家も合わせて読んでみてほしい。
/src/components/
配下にGoogleAdSense.js
を新規作成。ファイル名は何でも良い。
import React, { useEffect } from 'react';
export default function AdsCard({path}) {
useEffect(() => {
if (window.adsbygoogle && process.env.NODE_ENV !== "development") {
window.adsbygoogle.push({});
}
}, [path])
return (
<ins className="adsbygoogle"
style={{ "display": "block" , textAlign: "center" }}
data-ad-client={process.env.GOOGLE_AD_CLIENT}
data-ad-slot={process.env.GOOGLE_AD_SLOT}
data-ad-format="auto"
data-full-width-responsive="true"></ins>
);
}
AdsCard
に{path}
という引数を指定しているがここは後述
data-ad-client
とdata-ad-slot
の部分だけ各自のID等を入れること。
clientはID、slotは各自のGoogle AdSenseにログインして各自が設定した広告のID。
styleなどはお好みで。
ここでは環境変数を使っているがわからなければハードコードで。
Gatsbyで環境変数を使う場合は私の記事を参考にしてほしい。
あとは広告を配置したいコンポーネントで読み込むだけ。
まずは先程のコンポーネントをインポートする。名前はお好きなように。
import Ads from '../components/GoogleAdSense'
余談:このインポート方法も基本すぎるせいか解説を省略しているサイトが多く躓いている人もいるかと思う。
このテンプレート内で次の定数を追加しておく。
const path = location ? location.pathname : "error: no path"
これはなくてもよいのだが、先程作ったコンポーネントに渡す自身のURLである。
これを指定しておくとページごとに広告が変化するので予めやっておいたほうが良い。
{/* Ads */}
<div>
<Ads path={path}></Ads>
</div>
あとは上のようにAds
のタグを入れるだけで良い。周りのコメントとdiv
はおまけ(私はスタイリング用)
詳しい解説は省略するがpath
さえ渡っていればページごとに広告が変化する。
以上で完了。
簡単ではあるが、深く理解しようと思うと難解。
今回は設置だけが目的なのでここまで。
どうしてもReactとGatsbyのクセでコーディングが必要となってしまうが一度設置してしまえば殆ど変更することはないと思われる。
また自動広告も今回使っていないので必要であれば他のサイトも参考にしてもらえればと思う。