この記事をおすすめしたい人
- WordPressしか知らないのにNuxt.jsを始めようとしてる人
- Nuxt.jsでhead内の記述に手を加えたい人
- つまりオレ
何も知らない超初心者が脱WordPressしたくてNuxt.jsでサイト構築していくシリーズです。
今回はNuxt.jsで、HTMLのheadタグ内の操作にトライします。
最終的にはまとめページみたいにしたいんですが、まだ半分くらいです。
JavaScript苦手ながらもとうとうスクリプト部分を触っていかないといけないですが、これが終わったらコンテンツ作りに入れるので気合い入れてお届けします!
WordPressの上でな!
※ このブログはWordPress製です
このページの目次
まずはデフォルトのheadタグを確認
デモ画面が出力されているHTMLのhead内を確認してみました。
<head >
//タイトルタグ
<title>nuxt-test</title>
//メタタグ(文字コード、viewport、description)
<meta data-n-head="ssr" charset="utf-8">
<meta data-n-head="ssr" name="viewport" content="width=device-width, initial-scale=1">
<meta data-n-head="ssr" data-hid="description" name="description" content="## Build Setup">
//Favicon
<link data-n-head="ssr" rel="icon" type="image/x-icon" href="/favicon.ico">
//Nuxt.jsのスクリプト
<link rel="preload" href="/_nuxt/runtime.js" as="script">
<link rel="preload" href="/_nuxt/commons.app.js" as="script">
<link rel="preload" href="/_nuxt/vendors.app.js" as="script">
<link rel="preload" href="/_nuxt/app.js" as="script">
<link rel="preload" href="/_nuxt/pages/index.js" as="script">
//node_modules\@nuxt\vue-app\template\components\nuxt-loading.vue
<style data-vue-ssr-id="7e56e4e3:0">
(略)
</style>
//node_modules\@nuxt\vue-app\template\components\nuxt-build-indicator.vue
<style data-vue-ssr-id="7e49e411:0">
(略)
</style>
//layouts\default.vue
<style data-vue-ssr-id="56b15182:0">
(略)
</style>
//pages\index.vue
<style data-vue-ssr-id="1b7833da:0">
(略)
</style>
//components\Logo.vue
<style data-vue-ssr-id="1930a9a0:0">
(略)
</style>
</head>
読みやすいよう整形と一部簡略化はしましたが、まだまだ量が多いので簡単にまとめると…
- タイトル
- 基本的なMETAタグ
- Favicon
- Nuxt.jsのスクリプト
- スタイルシート
この5つの要素が含まれていることが分かります。
これを踏まえてもうちょっと簡略化すると…。
<head >
//タイトルタグ
<title>nuxt-test</title>
//メタタグ
//Favicon
(略)
//Nuxt.jsのスクリプト
(略)
<style>
(略)
</style>
</head>
ここに自分が足したいものを足していこうと思います。
おまけ:スタイルシートが読み込まれる順
読み込まれるスタイルは次の5種類。
- nuxt-loading.vue(必須)
- nuxt-build-indicator.vue(必須)
- レイアウト(default.vue)
- そのページのvueファイル(index.vue)
- コンポーネント(Logo.vue)
この順番で読み込まれていました。
Nuxt.jsのシステムから自動で読み込まれる上2つの中身は、次の3+4つです。
- .nuxt-progress
- .nuxt-progress.nuxt-progress-notransition
- .nuxt-progress-failed
- (.nuxt__build_indicator)
- (.v-enter-active)
- (.v-leave-to)
- (svg)
svgが汎用的で困りますが、ユニークな属性セレクタが指定されているので自分が使うsvgに影響を及ぼすことはありません。
さらにビルドしたHTMLにはnuxt-build-indicator.vueから読み込まれた下4つ(カッコついてるやつ)は含まれていませんでした。 「nuxt-progress」というクラス名だけ避ければよさそう。
なので開発サイドとしては、
- レイアウト
- index.vue
- コンポーネント
の順に読み込まれるぞ、ってのと「nuxt-progress」で始まるクラスは定義済みだぞ、ってのを知っておけばいいのかなと。
headに自由に項目を追加・削除していく前に
上のデフォルトheadの内容を前提に、ここから自由に追加・削除を行っていきたいと思います。
WordPressであれば割と簡単です。
追加はheader.phpに書き加えるだけだし、削除も「wp_deregister_script」「wp_dequeue_style」やらでいらないのを消すだけです。 分からなくてもググればけっこうすぐに解説記事が見つかります。
ですがNuxt.js。
そもそもheadが触りやすいところにないのだ!
そこでこのページでは僕が追加したいheadの項目を実装するのに四苦八苦したのをまとめていきます。
削除は必要ないんじゃないかな
簡略化したデフォルトのheadがコレ↓です。
<head >
//タイトルタグ
//メタタグ
//Favicon
//Nuxt.jsのスクリプト
<style>
(略)
</style>
</head>
タイトルはいるでしょ。
METAタグも必要なのばっかりに厳選されてるでしょ。
Faviconはいるでしょ(どっちかという足したい)。
あえて消したいとするならNuxt.js関連のスクリプト、システムから自動で読み込まれてしまうCSSですが、これは消したら動作に支障をきたしそうなので諦める。
となると、消したいものってないんですよね…。
なので今回は削除については考えません。
title/descriptionをページ毎に設定したい
WordPressと比較すると…
titleやdescriptionも変えられないの!?
って感じですが、Nuxt.jsのデモ構成にはページ毎にtitle/descriptionを変える記述がありません。
なのでちょっとひと手間必要です。
TITLEの設定
DESCRIPTIONの設定
「lang="ja"」を設定
HTMLタグに「lang="ja"」を追加します。
lang属性がないとGoogleのLighthouseに怒られるので設定しておきます。
LANGの設定
Faviconの詳細設定
デフォルトの「favicon.ico」だけじゃなく、各OS/ブラウザ向けに詳細設定したい場合はどうするのか。
DESCRIPTION設定の応用でできます。
Faviconの設定
OGPタグの設定
SNS向けの情報を設定する部分です。
WordPressでは「All In One SEO Pack」というプラグインに任せっきりだったので、OGP公式サイトを参考に自分で書いてみることにしました。
ほとんどの項目はDESCRIPTION設定の応用でできます。
「og:url」だけやっかいですが、僕は先にcanonicalで詰まっていたので、こちらでは大丈夫でした。
canonicalの設定
canonicalはそのページの絶対URLさえ分かれば設定できます。 めっちゃ簡単そうに見えるでしょ?
めちゃくそ大変でした…。
たった1行に大苦戦
Vue.jsとかJavaScriptが分かってる人にはたぶん簡単なんだと思う。
jQueryなどのスクリプト追加
すんません、JavaScript苦手なもんでまだノータッチです。
やりますよ…。
やればいいんでしょ!!
近日中には公開できません!
Nuxt.js公式マニュアルによると、「nuxt.config.js」の「head」プロパティ内に次のコードを追加すればできるそうです。
export default {
head: {
script: [
{ src: '(スクリプトファイルのURL)' }
],
}
}
CSSの設定
CSS関連は課題がけっこう多いです。
デフォルトだと、「vueファイルに記述したCSS」を、「コメント含めてそのまま」「インラインCSSとして追加」されます。
これらを好みの方法に切り替えていきます。
外部CSSの読み込み
vueファイルに設定するのではなく外部のCSSファイルを読み込ませます。
Nuxt.jsはレイアウト>ページのvueファイル>コンポーネントの順にCSSが適用されるので、
- 全ページ共通のスタイルはレイアウトに
- そのページ専用のスタイルはvueファイルに
- コンポーネント内で完結するスタイルはコンポーネントに
という風に分けることで、メンテナンス性も高いんじゃないかと思います。
ですが、vueファイルが縦に長くなったりすると、templateタグ(HTML部分)とstyleタグ(CSS部分)を上下に行ったり来たりしないといけなくなります。
それならやっぱりCSSだけ独立させてる方が編集はしやすいのでは…?
と考えたので独立させることにしました。
外部CSSの参照
ベンダープレフィックスの自動追加
ベンダープレフィックスというのはこういう↓やつです。
.flex {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
}
各ブラウザでちゃんと動作するよう接頭辞をつけるやつ。
こんなのいちいち書き分けてられないので自動で追加できるツールがあります。 超便利。
これを外部ツール依存せずにNuxt.js内で完結させられないか、というお話です。
まだ試してないんですができそう。
CSSの圧縮
コメントや不要なスペースの削除を自動でやらせたいというお話です。
「npm run dev」で開発中はCSSの中身がそのまま表示されていたので何か設定しなきゃ…と考えていたんですが、ビルドすればstyleタグの中身どころか、headタグの中身全体が圧縮されていました。
静的出力の場合も動的出力の場合も同様です。
なので設定不要。
SASS/SCSS対応
SASSはスタイルシートのメンテナンス性を上げるものです。 変数が使えたり、入れ子にできたりと、CSSが圧倒的に書きやすくなります。
流れは次のような感じです。
- SASS/SCSSで編集
- SASS/SCSSをビルド?コンパイル?
- CSSとして出力
この2の段階をNuxt.js内でできないかというお話です。
割と簡単にできました。
構造化データの設定
構造化データというのは…
実態はよく分かっていませんが、ページの情報を効率的にGoogleに伝えるためのJSONデータのことです。
SEOに効果あるよと言われて勉強し、パンくずリストとかarticleとか表面的なのは割と簡単に実装できたんですが、調べていくとかなり奧が深くて、気が付いたらナンチャラ式構造化データみたいなのも書けるようになり…
いざ、実装してみたはいいものの、実装したパターンと実装したパターンで差がわかんないという…。
学習コスト大きかったのにい!!
僕のやり方が間違っている?
実際にそんな効果はない?
今後効果が出てくる?
よくわかんないですけど、学んだ分をNuxt.js上でも再現できるようにしたいと思います。
まだノータッチなのでいずれ、ね…。
PHPではオートで出力できる仕組みを作ったので、まぁいけるっしょNuxt.jsでも。
まとめ
だいぶまとまって来ましたが、もうちょっと勉強して追加予定です。
headタグが自由に操作できるようになれば次は本格的にコンテンツ作りに入ります!
以上、WordPressからお届けしました!
Nuxt.js HEADタグ操作編の目次
- 第1回 head内操作のまとめ(このページ)
- 第2回 ページ毎にtitleを設定
- 第3回 ページ毎にdescriptionを設定
- 第4回 「lang="ja"」を設定
- 第5回 Faviconの設定を追加
- 第6回 SNS用OGPの設定を追加
- 第7回 canonicalの設定
- 第8回 jQueryなどのスクリプト追加(近日公開予定)
- 第9回 外部CSSファイルを読み込む
- 第10回 レイアウトのCSSを独立させる
- 第11回 CSSの詳細設定(近日公開予定)
- 第12回 構造化データの設定(近日公開予定)
- 第13回 「data-n-head」などを削除