[{"data":1,"prerenderedAt":2694},["ShallowReactive",2],{"series-nuxt-content-blog-1":3},{"doc":4,"prev":935,"next":937},{"id":5,"title":6,"body":7,"category":923,"createdAt":924,"description":925,"extension":926,"index":160,"meta":927,"navigation":450,"path":928,"publish":450,"seo":929,"series":930,"seriesTitle":931,"stem":932,"tag":933,"thumbnail":934,"updatedAt":935,"__hash__":936},"series\u002Fseries\u002Fnuxt-content-blog-1.md","Nuxt Content × SSG で作る静的ブログ。１：概念とセットアップ",{"type":8,"value":9,"toc":908},"minimark",[10,14,22,41,44,49,57,63,66,69,72,90,93,96,110,121,140,143,146,149,280,310,312,355,358,360,363,387,390,393,396,399,405,424,435,491,497,503,509,533,536,539,545,598,605,608,614,827,830,836,847,850,863,889,892,898,904],[11,12,13],"p",{},"こんにちはjunです。私のブログは2021年4月にwordpressを卒業し、Nuxt contentというものを使用してリニューアルしました。wordpressは簡単にサイトは作れますし使い勝手はいいですが、公開サーバーにCMSがあるためにセキュリティ的に問題だったり、大量に記事があるとパフォーマンスが落ちるということがあります。webデベロッパーならばNuxt.jsと静的書き出しぐらいやろうぜ！と思ったのも理由です。",[11,15,16,17,21],{},"このブログリニューアルにはデータ移行含めて２週間ほどかかりましたが、その途中で少し詰まったり工夫したりした箇所が結構あったのでシリーズ記事として、 ",[18,19,20],"strong",{},"「Nuxt Contentによる静的書き出しブログの作成方法」"," として書きたいと思います。シリーズを通して以下のことを解説しようと思います。（まだ予定です。もしかすると執筆途中で変わります。）",[23,24,25,29,32,35,38],"ol",{},[26,27,28],"li",{},"Nuxt Content の仕組みと基本的な使い方",[26,30,31],{},"記事のレンダリングと静的書き出しルーティング",[26,33,34],{},"記事一覧ページとページング実装",[26,36,37],{},"カテゴリーとタグ機能",[26,39,40],{},"記事の管理とデプロイ。SEO対策。アドセンスとアナリティクス設定",[11,42,43],{},"それでは一回目は早速、インストールから概念・基本的な使い方について説明していきます。Nuxt.jsにおける構成などは共有しますが、このサイトにおけるデザインの実装方法などは省略しますのでご了承ください。",[45,46,48],"h2",{"id":47},"nuxt-contentとは","Nuxt Contentとは？",[11,50,51,52,56],{},"nuxt contentはNuxt.jsのモジュールです。",[53,54,55],"code",{},"content\u002F","ディレクトリ配下にmarkdownを用いて記事原稿を作成し、Nuxt.jsがmarkdownを解析してオブジェクトとして利用できるようにしてくれます。",[11,58,59,62],{},[53,60,61],{},"$content","というインスタンスがグローバルに使用できますので、それらを利用してコンポーネントにレンダーするという仕組みです。",[11,64,65],{},"ブログを構成するソースが全てファイルで構成されるので、GitベースのCMSとして利用することができます。（記事の保存にDBを必要としない。）",[45,67,68],{"id":68},"自分のブログの構成について",[11,70,71],{},"今回のシリーズ記事では私の記事と同じ構成を作成できるように解説していこうと思います。2021年5月現在では以下のような構成・機能を持っています。",[73,74,75,78,81,84,87],"ul",{},[26,76,77],{},"記事詳細ページ",[26,79,80],{},"タグ・カテゴリー",[26,82,83],{},"各々の一覧ページとページング",[26,85,86],{},"シリーズ記事",[26,88,89],{},"静的書き出しとデプロイ",[11,91,92],{},"詳細に解説します。",[94,95,77],"h3",{"id":77},[11,97,98,99,102,103,106,107,109],{},"私のサイトでは",[53,100,101],{},"\u002Farticles\u002F{sulg}","、",[53,104,105],{},"\u002Fseries\u002F{sulg}\u002F{index}","というルートにて各記事本体を見ることができ、そのようなルールで構成されています。スラグ（sulg）は原稿マークダウンのファイル名と一致します。ソースでは",[53,108,55],{},"ディレクトリ配下にマークダウンファイルを以下のように格納しています。",[111,112,119],"pre",{"className":113,"code":115,"filename":116,"language":117,"meta":118},[114],"language-text","├── content\n│   ├── articles\n│   │   ├── aaaaaa.md\n│   │   ├── bbbbbb.md\n│   │\n│   └── series\n│       ├── ~~~~~.md\n│       ├── ~~~~~.md\n","Nuxt","text","",[53,120,115],{"__ignoreMap":118},[11,122,123,124,127,128,131,132,135,136,139],{},"上記のように格納することでコンポーネントで、例えば",[53,125,126],{},"this.$content('articles')","として呼び出すことでarticles配下のデータを取得できます。ファイル名＝スラグ名としているので、",[53,129,130],{},"\u002Farticles\u002Faaaaaaa","とすることで、",[53,133,134],{},"aaaaaa.md","の内容がレンダーされるようにしています。このへんのルーティング設定は",[53,137,138],{},"page\u002F","ディレクトリの構成で制御しています。第二回目で解説します。",[94,141,80],{"id":142},"タグカテゴリー",[11,144,145],{},"各記事ではタグとカテゴリーを指定できるようになっています。カテゴリー、タグをクリックするとその一覧に飛ぶのでユーザーはサイトのコンテンツを探しやすくなります。",[11,147,148],{},"タグとカテゴリーは実はマークダウンファイルに記述されています。例えばこの記事のマークダウンには一番最初に以下のようなyml形式の記述があります。",[111,150,154],{"className":151,"code":152,"language":153,"meta":118,"style":118},"language-yml shiki shiki-themes material-theme-ocean","---\ntitle: Nuxt Content × SSG で作る静的ブログ。１：概念とセットアップ\ndescription: Nuxt Content × SSG で作る静的ブログ。概念とセットアップについてまずは解説\ncategory: [devstack]\ntag: [js,nuxt]\nseries: nuxt-content-blog\nseriesTitle: Nuxt Content × SSG で作る静的ブログ。\nindex: 1\npublish: false\n---\n","yml",[53,155,156,165,180,191,208,229,240,251,263,275],{"__ignoreMap":118},[157,158,161],"span",{"class":159,"line":160},"line",1,[157,162,164],{"class":163},"s5Dmg","---\n",[157,166,168,172,176],{"class":159,"line":167},2,[157,169,171],{"class":170},"s-wAU","title",[157,173,175],{"class":174},"sAklC",":",[157,177,179],{"class":178},"sfyAc"," Nuxt Content × SSG で作る静的ブログ。１：概念とセットアップ\n",[157,181,183,186,188],{"class":159,"line":182},3,[157,184,185],{"class":170},"description",[157,187,175],{"class":174},[157,189,190],{"class":178}," Nuxt Content × SSG で作る静的ブログ。概念とセットアップについてまずは解説\n",[157,192,194,197,199,202,205],{"class":159,"line":193},4,[157,195,196],{"class":170},"category",[157,198,175],{"class":174},[157,200,201],{"class":174}," [",[157,203,204],{"class":178},"devstack",[157,206,207],{"class":174},"]\n",[157,209,211,214,216,218,221,224,227],{"class":159,"line":210},5,[157,212,213],{"class":170},"tag",[157,215,175],{"class":174},[157,217,201],{"class":174},[157,219,220],{"class":178},"js",[157,222,223],{"class":174},",",[157,225,226],{"class":178},"nuxt",[157,228,207],{"class":174},[157,230,232,235,237],{"class":159,"line":231},6,[157,233,234],{"class":170},"series",[157,236,175],{"class":174},[157,238,239],{"class":178}," nuxt-content-blog\n",[157,241,243,246,248],{"class":159,"line":242},7,[157,244,245],{"class":170},"seriesTitle",[157,247,175],{"class":174},[157,249,250],{"class":178}," Nuxt Content × SSG で作る静的ブログ。\n",[157,252,254,257,259],{"class":159,"line":253},8,[157,255,256],{"class":170},"index",[157,258,175],{"class":174},[157,260,262],{"class":261},"sx098"," 1\n",[157,264,266,269,271],{"class":159,"line":265},9,[157,267,268],{"class":170},"publish",[157,270,175],{"class":174},[157,272,274],{"class":273},"sbqyR"," false\n",[157,276,278],{"class":159,"line":277},10,[157,279,164],{"class":163},[11,281,282,283,102,286,102,288,290,291,102,293,102,296,299,300,302,303,305,306,309],{},"上記のカラムは自由につけることができます。例えば",[53,284,285],{},"serise",[53,287,256],{},[53,289,268],{},"は私が独自につけています。一方で",[53,292,171],{},[53,294,295],{},"updateAt",[53,297,298],{},"createdAt","など自動的に付与される属性もあります。",[53,301,213],{},",\n",[53,304,196],{},"は配列形式の記述をすることでjs側でも配列で扱うことができます。",[53,307,308],{},"taxonomy.js","というファイルでキーとカテゴリー名、タグを管理しています。（storeでもOKですが、ちょっと困ることがありました。こちらも後で解説します。）",[94,311,83],{"id":83},[73,313,314,319,324,329,335,340,345,350],{},[26,315,316],{},[53,317,318],{},"\u002Farticles\u002F",[26,320,321],{},[53,322,323],{},"\u002Fseries\u002F{sulg}\u002F",[26,325,326],{},[53,327,328],{},"\u002Fcategory\u002F{category_key}\u002F",[26,330,331,334],{},[53,332,333],{},"\u002Ftag\u002F{tag_key}\u002F","\nというパスではその記事種別、カテゴリーの一覧が表示されます。１ページあたり15記事表示されるので記事が多くなるとページングが発生します。ページングの際は",[26,336,337],{},[53,338,339],{},"\u002Farticles\u002Fpage\u002F{n}",[26,341,342],{},[53,343,344],{},"\u002Fseries\u002F{sulg}\u002Fpage\u002F{n}",[26,346,347],{},[53,348,349],{},"\u002Fcategory\u002F{category_key}\u002Fpage\u002F{n}",[26,351,352],{},[53,353,354],{},"\u002Ftag\u002F{tag_key}\u002Fpage\u002F{n}",[11,356,357],{},"というルーティングで現在ページを判別しています。ちなみに静的書き出しするときはページごとにディレクトリが作成されます。",[94,359,89],{"id":89},[11,361,362],{},"私の場合、まずNuxt.jsには静的書き出し（SSG:static site generate）を使用して作成してページ分のHTMLを生成します。そして生成されたHTMLと画像をrsyncで公開サーバーに送っています。作成全体の流れを簡単に説明しますと、",[23,364,365,368,371,374,380],{},[26,366,367],{},"markdownで原稿を記述",[26,369,370],{},"pageコンポーネントに原稿内容をレンダーする。",[26,372,373],{},"公開してよい原稿のみをクエリで取得してルーティングを設定する。",[26,375,376,379],{},[53,377,378],{},"npm run generate"," を使用して作成した原稿分のHTMLを生成する",[26,381,382,383,386],{},"rsyncを使用して",[53,384,385],{},"\u002Fdist","配下を公開サーバーを同期する",[11,388,389],{},"上記のような感じです。結構簡単です。",[11,391,392],{},"以上が簡単な概念と構成の説明です。それでは以降からは具体的なインストールと使い方を説明していきます。",[45,394,395],{"id":395},"インストール方法とセットアップ",[11,397,398],{},"Nuxt contentはNuxt.jsのモジュールですのでまずはNuxtプロジェクトを作成します。",[111,400,403],{"className":401,"code":402,"language":117},[114],"npx create-nuxt-app \u003Cproject-name>\n\n... #普通にNuxtのインストールをする\n\nnpm install @nuxt\u002Fcontent\n\n",[53,404,402],{"__ignoreMap":118},[406,407,411,412],"div",{"className":408},[409,410],"alert","alert-success","\n各種の使用バージョンは以下の通りです。\n",[73,413,414,415,414,418,414,421],{},"\n    ",[26,416,417],{},"Node.js：v12.19.0",[26,419,420],{},"Nuxt.js：2.14.12",[26,422,423],{},"Nuxt Content：1.14.0",[11,425,426,427,430,431,434],{},"インストールが終わったので、",[53,428,429],{},"nuxt.config.js","も",[53,432,433],{},"modules","に以下のように追記します。",[111,436,439],{"className":437,"code":438,"filename":429,"language":220,"meta":118,"style":118},"language-js shiki shiki-themes material-theme-ocean","  ...\n\n  modules: [\n    '@nuxt\u002Fcontent',\n  ],\n\n  ...\n",[53,440,441,446,452,463,476,483,487],{"__ignoreMap":118},[157,442,443],{"class":159,"line":160},[157,444,445],{"class":174},"  ...\n",[157,447,448],{"class":159,"line":167},[157,449,451],{"emptyLinePlaceholder":450},true,"\n",[157,453,454,457,459],{"class":159,"line":182},[157,455,456],{"class":163},"  modules",[157,458,175],{"class":174},[157,460,462],{"class":461},"s0W1g"," [\n",[157,464,465,468,471,474],{"class":159,"line":193},[157,466,467],{"class":174},"    '",[157,469,470],{"class":178},"@nuxt\u002Fcontent",[157,472,473],{"class":174},"'",[157,475,302],{"class":174},[157,477,478,481],{"class":159,"line":210},[157,479,480],{"class":461},"  ]",[157,482,302],{"class":174},[157,484,485],{"class":159,"line":231},[157,486,451],{"emptyLinePlaceholder":450},[157,488,489],{"class":159,"line":242},[157,490,445],{"class":174},[11,492,493,494,496],{},"そして",[53,495,55],{},"というディレクトリをプロジェクトルートに作成します。",[111,498,501],{"className":499,"code":500,"language":117},[114],".\n├── README.md\n├── assets\n├── components\n├── content # これをつくる\n├── layouts\n├── middleware\n├── node_modules\n├── nuxt.config.js\n├── package-lock.json\n├── package.json\n├── pages\n├── plugins\n├── static\n├── store\n",[53,502,500],{"__ignoreMap":118},[11,504,505,506,508],{},"マークダウンファイルは",[53,507,55],{},"配下に作成していくと、nuxt contentは自動的にそれらのファイルを解析してくれます。",[11,510,493,511,513,514,517,518,521,522,525,526,528,529,532],{},[53,512,55],{},"ディレクトリを作成したらさらに",[53,515,516],{},"articles\u002F","といったディレクトリを作っておくと良いです。別に",[53,519,520],{},"articles","としなくてもいいですが、サブディレクトリ を作ることで",[53,523,524],{},"$content('articles')","のように区別してコンテンツを取得できます。私の場合は",[53,527,516],{},"と",[53,530,531],{},"series\u002F","というサブディレクトリでコンテンツを区切っています。",[45,534,535],{"id":535},"記事を試しに作成してみる",[94,537,538],{"id":538},"マークダウン原稿を作成する",[11,540,541,542,544],{},"それでは",[53,543,516],{},"を作ったら何かマークダウンを作成してみましょう。",[111,546,551],{"className":547,"code":548,"filename":549,"language":550,"meta":118,"style":118},"language-markdown shiki shiki-themes material-theme-ocean","---\ntitle: テスト\ndescription:テスト\n---\nここに記事内容をマークダウン で記述します。\n\n## 見出し\n- リスト\n- リスト\n- リスト\n","articles\u002Ftest.md","markdown",[53,552,553,557,562,567,571,576,580,585,590,594],{"__ignoreMap":118},[157,554,555],{"class":159,"line":160},[157,556,164],{},[157,558,559],{"class":159,"line":167},[157,560,561],{},"title: テスト\n",[157,563,564],{"class":159,"line":182},[157,565,566],{},"description:テスト\n",[157,568,569],{"class":159,"line":193},[157,570,164],{},[157,572,573],{"class":159,"line":210},[157,574,575],{},"ここに記事内容をマークダウン で記述します。\n",[157,577,578],{"class":159,"line":231},[157,579,451],{"emptyLinePlaceholder":450},[157,581,582],{"class":159,"line":242},[157,583,584],{},"## 見出し\n",[157,586,587],{"class":159,"line":253},[157,588,589],{},"- リスト\n",[157,591,592],{"class":159,"line":265},[157,593,589],{},[157,595,596],{"class":159,"line":277},[157,597,589],{},[11,599,600,601,604],{},"まずnuxt contentでマークダウン原稿を作る際には、１・２行目に示されたように",[53,602,603],{},"---","で囲ったymlにて書かれたメタデータを記述します。メタデータをかけたら、マークダウン 形式で内容を記述していきます。",[94,606,607],{"id":607},"ページコンポーネントで読み込む",[11,609,610,611,613],{},"サンプルを作成したら",[53,612,138],{},"ディレクトリでページコンポーネントを作成します。今回は簡単に以下のような構成にしてみます。",[111,615,620],{"className":616,"code":617,"filename":618,"language":619,"meta":118,"style":118},"language-vue shiki shiki-themes material-theme-ocean","\u003Ctemplate>\n    \u003Cdiv>\n        {{content}}\n    \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\u003Cscript>\nexport default{\n    name:'test_page',\n    async asyncData({ store,$content, params }) {\n        const content = await $content('articles').fetch();\n\n        return {\n            content,\n        }\n    },\n}\n\u003C\u002Fscript>\n","pages\u002Ftest.vue","vue",[53,621,622,633,642,647,656,665,674,687,703,738,778,783,792,800,806,812,818],{"__ignoreMap":118},[157,623,624,627,630],{"class":159,"line":160},[157,625,626],{"class":174},"\u003C",[157,628,629],{"class":170},"template",[157,631,632],{"class":174},">\n",[157,634,635,638,640],{"class":159,"line":167},[157,636,637],{"class":174},"    \u003C",[157,639,406],{"class":170},[157,641,632],{"class":174},[157,643,644],{"class":159,"line":182},[157,645,646],{"class":461},"        {{content}}\n",[157,648,649,652,654],{"class":159,"line":193},[157,650,651],{"class":174},"    \u003C\u002F",[157,653,406],{"class":170},[157,655,632],{"class":174},[157,657,658,661,663],{"class":159,"line":210},[157,659,660],{"class":174},"\u003C\u002F",[157,662,629],{"class":170},[157,664,632],{"class":174},[157,666,667,669,672],{"class":159,"line":231},[157,668,626],{"class":174},[157,670,671],{"class":170},"script",[157,673,632],{"class":174},[157,675,676,680,684],{"class":159,"line":242},[157,677,679],{"class":678},"sJ14y","export",[157,681,683],{"class":682},"s6cf3"," default",[157,685,686],{"class":174},"{\n",[157,688,689,692,694,696,699,701],{"class":159,"line":253},[157,690,691],{"class":163},"    name",[157,693,175],{"class":174},[157,695,473],{"class":174},[157,697,698],{"class":178},"test_page",[157,700,473],{"class":174},[157,702,302],{"class":174},[157,704,705,708,712,715,718,721,723,725,727,730,733,736],{"class":159,"line":265},[157,706,707],{"class":461},"    async",[157,709,711],{"class":710},"sdLwU"," asyncData",[157,713,714],{"class":170},"(",[157,716,717],{"class":174},"{",[157,719,720],{"class":461}," store",[157,722,223],{"class":174},[157,724,61],{"class":461},[157,726,223],{"class":174},[157,728,729],{"class":461}," params",[157,731,732],{"class":174}," }",[157,734,735],{"class":170},") ",[157,737,686],{"class":174},[157,739,740,743,746,749,752,755,757,759,761,763,766,769,772,775],{"class":159,"line":277},[157,741,742],{"class":678},"        const",[157,744,745],{"class":461}," content",[157,747,748],{"class":174}," =",[157,750,751],{"class":682}," await",[157,753,754],{"class":710}," $content",[157,756,714],{"class":170},[157,758,473],{"class":174},[157,760,520],{"class":178},[157,762,473],{"class":174},[157,764,765],{"class":170},")",[157,767,768],{"class":174},".",[157,770,771],{"class":710},"fetch",[157,773,774],{"class":170},"()",[157,776,777],{"class":174},";\n",[157,779,781],{"class":159,"line":780},11,[157,782,451],{"emptyLinePlaceholder":450},[157,784,786,789],{"class":159,"line":785},12,[157,787,788],{"class":682},"        return",[157,790,791],{"class":174}," {\n",[157,793,795,798],{"class":159,"line":794},13,[157,796,797],{"class":461},"            content",[157,799,302],{"class":174},[157,801,803],{"class":159,"line":802},14,[157,804,805],{"class":174},"        }\n",[157,807,809],{"class":159,"line":808},15,[157,810,811],{"class":174},"    },\n",[157,813,815],{"class":159,"line":814},16,[157,816,817],{"class":174},"}\n",[157,819,821,823,825],{"class":159,"line":820},17,[157,822,660],{"class":174},[157,824,671],{"class":170},[157,826,632],{"class":174},[11,828,829],{},"画面は以下のように映ると思います。（私の場合はたくさん記事があるので、たくさんあります。）",[831,832],"image-render",{":src":833,":width":834,":center":835},"'_mix\u002Fsch-2021-05-05 8.44.11.png'","'400px'","true",[11,837,838,839,842,843,846],{},"変数",[53,840,841],{},"content","には",[53,844,845],{},"$content('articles').fetch()","によって取得されたページのデータがオブジェクト形式で入っています。",[831,848],{":src":849,":width":834,":center":835},"'_mix\u002Fsch-2021-05-05 8.48.11.png'",[11,851,852,854,855,858,859,862],{},[53,853,845],{},"では",[53,856,857],{},"aticles","配下のデータが配列でくるので、",[53,860,861],{},"$content('articles\u002Ftest').fetch()","としてみると単体の該当するファイルが提供されます。",[11,864,865,868,869,876,877,880,881,884,885,888],{},[53,866,867],{},"{{content}}","ではただのオブジェクトしか表示されません。",[870,871,875],"a",{"href":872,"rel":873},"https:\u002F\u002Fcontent.nuxtjs.org\u002Fja\u002Fdisplaying",[874],"nofollow","公式サイトのように"," ",[53,878,879],{},"\u003Cnuxt-content :document=\"content\" \u002F>","というコンポーネントの",[53,882,883],{},"document","プロップスに",[53,886,887],{},"$content()","で取得したものを渡すことで、HTMLでレンダーされます。",[45,890,891],{"id":891},"以上でセットアップ完了",[11,893,894,895,897],{},"以上がNuxt Contentのセットアップと基本的な使い方です。ひとまずモジュールをインストールして",[53,896,887],{},"を用いて対応するコンテンツを取得することで、ブログを作成できます。",[11,899,900,901,903],{},"次回は個別記事のレンダリングと",[53,902,887],{},"の詳細と静的書き出しを行っていこうと思います。",[905,906,907],"style",{},"html pre.shiki code .s5Dmg, html code.shiki .s5Dmg{--shiki-default:#FFCB6B}html pre.shiki code .s-wAU, html code.shiki .s-wAU{--shiki-default:#F07178}html pre.shiki code .sAklC, html code.shiki .sAklC{--shiki-default:#89DDFF}html pre.shiki code .sfyAc, html code.shiki .sfyAc{--shiki-default:#C3E88D}html pre.shiki code .sx098, html code.shiki .sx098{--shiki-default:#F78C6C}html pre.shiki code .sbqyR, html code.shiki .sbqyR{--shiki-default:#FF9CAC}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .s0W1g, html code.shiki .s0W1g{--shiki-default:#BABED8}html pre.shiki code .sJ14y, html code.shiki .sJ14y{--shiki-default:#C792EA}html pre.shiki code .s6cf3, html code.shiki .s6cf3{--shiki-default:#89DDFF;--shiki-default-font-style:italic}html pre.shiki code .sdLwU, html code.shiki .sdLwU{--shiki-default:#82AAFF}",{"title":118,"searchDepth":182,"depth":182,"links":909},[910,911,917,918,922],{"id":47,"depth":167,"text":48},{"id":68,"depth":167,"text":68,"children":912},[913,914,915,916],{"id":77,"depth":182,"text":77},{"id":142,"depth":182,"text":80},{"id":83,"depth":182,"text":83},{"id":89,"depth":182,"text":89},{"id":395,"depth":167,"text":395},{"id":535,"depth":167,"text":535,"children":919},[920,921],{"id":538,"depth":182,"text":538},{"id":607,"depth":182,"text":607},{"id":891,"depth":167,"text":891},[204],"2021-05-04","Nuxt Content × SSG で作る静的ブログ。概念とセットアップについてまずは解説","md",{},"\u002Fseries\u002Fnuxt-content-blog-1",{"title":6,"description":925},"nuxt-content-blog","Nuxt Content × SSG で作る静的ブログ。","series\u002Fnuxt-content-blog-1",[220,226],"_mix\u002Flogo-dark.jpg",null,"NqL_rCruXq92Ga0wFzu-aNSycgZTrVDwKB90Uio1hxw",{"id":938,"title":939,"body":940,"category":2685,"createdAt":2686,"description":2687,"extension":926,"index":167,"meta":2688,"navigation":450,"path":2689,"publish":450,"seo":2690,"series":930,"seriesTitle":931,"stem":2691,"tag":2692,"thumbnail":934,"updatedAt":935,"__hash__":2693},"series\u002Fseries\u002Fnuxt-content-blog-2.md","Nuxt Content × SSG で作る静的ブログ。２：基本的な記事項目のレンダリングと静的書き出し",{"type":8,"value":941,"toc":2669},[942,950,961,964,967,970,983,993,999,1015,1019,1025,1031,1053,1057,1063,1202,1218,1224,1242,1245,1254,1257,1260,1269,1280,1327,1340,1343,1602,1609,1626,1633,1637,1640,1660,1665,1668,1671,1677,1682,1743,1746,1749,1760,1766,1769,1772,1775,2393,2396,2411,2586,2602,2605,2610,2616,2623,2629,2635,2641,2650,2653,2666],[11,943,944,945,949],{},"こんにちはjunです。",[870,946,948],{"href":947},"\u002Fseries\u002Fnuxt-content-blog\u002F1","前回の記事","は概念と基本的なコンテンツの作成・取得・表示について解説しました。今回の記事では",[73,951,952,955,958],{},[26,953,954],{},"nuxt.jsにおけるpage構成の設定",[26,956,957],{},"目次生成、画像のレンダリング、どんな項目をレンダリングできるのか？",[26,959,960],{},"静的書き出しの設定",[11,962,963],{},"について解説していきます。それでは早速いきましょう。",[45,965,966],{"id":966},"サイトのルーティングを考えてpagesの構成を設定する",[94,968,969],{"id":969},"何をどう設定すればいいか",[11,971,972,973,976,977,979,980,982],{},"Nuxt.jsは",[53,974,975],{},"pages\u002F","というディレクトリ配下にファイルを作ることで、vue-routerの設定が自動で行われURLが生成されます。私のブログでは",[53,978,101],{},"というURLで対象の記事を呼び出します。そのURLが有効になるには",[53,981,975],{},"ディレクトリの構築をする必要があります。",[11,984,985,986,989,990,992],{},"一方、Nuxt Contentで任意の記事データを取得してみると",[53,987,988],{},"path:","というプロパティがあります。それは",[53,991,55],{},"ディレクトリをルートとしたパスになっています。以下のような構成の場合、",[111,994,997],{"className":995,"code":996,"language":117},[114],"├── content\n│   ├── articles\n│   │   ├── aaaaaa.md\n",[53,998,996],{"__ignoreMap":118},[11,1000,1001,1003,1004,1007,1008,1011,1012,1014],{},[53,1002,134],{},"のデータのパスは",[53,1005,1006],{},"\u002Farticles\u002Faaaaaa","となります。つまり",[53,1009,1010],{},"https:\u002F\u002Fexample.com\u002Farticles\u002Faaaaaa","というルートに対して、",[53,1013,134],{},"が呼び出されるように設定します。",[94,1016,1018],{"id":1017},"ひとまず以下のようにpageを作成","ひとまず以下のようにpage\u002Fを作成",[11,1020,1021,1022,1024],{},"ひとまず以下のように",[53,1023,975],{},"配下に作成してください。",[111,1026,1029],{"className":1027,"code":1028,"language":117},[114],"├── pages\n│   ├── articles\n│   　   ├── _slug.vue\n",[53,1030,1028],{"__ignoreMap":118},[11,1032,1033,1036,1037,102,1042,1044,1045,1048,1049,1052],{},[53,1034,1035],{},"_slug.vue","といものを作ることで",[870,1038,1041],{"href":1039,"rel":1040},"https:\u002F\u002Fja.nuxtjs.org\u002Fdocs\u002F2.x\u002Fdirectory-structure\u002Fpages",[874],"公式にある通り",[53,1043,101],{},"のルートに対して",[53,1046,1047],{},"params.sulg","で",[53,1050,1051],{},"{sulg}","の値を取得できるようになります。",[94,1054,1056],{"id":1055},"paramssulgで指定されたsulgのファイルfetchする","params.sulgで指定されたsulgのファイルfetchする",[11,1058,541,1059,1062],{},[53,1060,1061],{},"_sulg.vue","で以下のように記述します。",[111,1064,1067],{"className":616,"code":1065,"filename":1066,"language":619,"meta":118,"style":118},"\u003Ctemplate>\n  \u003Carticle>\n    \u003Cnuxt-content :document=\"content\" \u002F>\n  \u003C\u002Farticle>\n\u003C\u002Ftemplate>\n\u003Cscirpt>\nexport default {\n  async asyncData({ $content, params,redirect }) {\n    const content = await $content('articles').where({path:\"\u002Farticles\u002F\"+params.slug}).fetch();\n    if(content.length > 0){\n      return {\n        content:content[0],\n      }\n    }else{\n      redirect('\u002Farticles')\n    }\n  }\n}\n\u003C\u002Fscript>\n\n","\u002Farticles\u002F_sulg.vue",[53,1068,1069,1077,1087,1110,1119,1127,1136,1141,1146,1151,1156,1161,1166,1171,1176,1181,1186,1191,1196],{"__ignoreMap":118},[157,1070,1071,1073,1075],{"class":159,"line":160},[157,1072,626],{"class":174},[157,1074,629],{"class":170},[157,1076,632],{"class":174},[157,1078,1079,1082,1085],{"class":159,"line":167},[157,1080,1081],{"class":174},"  \u003C",[157,1083,1084],{"class":170},"article",[157,1086,632],{"class":174},[157,1088,1089,1091,1094,1097,1100,1103,1105,1107],{"class":159,"line":182},[157,1090,637],{"class":174},[157,1092,1093],{"class":170},"nuxt-content",[157,1095,1096],{"class":678}," :document",[157,1098,1099],{"class":174},"=",[157,1101,1102],{"class":174},"\"",[157,1104,841],{"class":178},[157,1106,1102],{"class":174},[157,1108,1109],{"class":174}," \u002F>\n",[157,1111,1112,1115,1117],{"class":159,"line":193},[157,1113,1114],{"class":174},"  \u003C\u002F",[157,1116,1084],{"class":170},[157,1118,632],{"class":174},[157,1120,1121,1123,1125],{"class":159,"line":210},[157,1122,660],{"class":174},[157,1124,629],{"class":170},[157,1126,632],{"class":174},[157,1128,1129,1131,1134],{"class":159,"line":231},[157,1130,626],{"class":174},[157,1132,1133],{"class":170},"scirpt",[157,1135,632],{"class":174},[157,1137,1138],{"class":159,"line":242},[157,1139,1140],{"class":461},"export default {\n",[157,1142,1143],{"class":159,"line":253},[157,1144,1145],{"class":461},"  async asyncData({ $content, params,redirect }) {\n",[157,1147,1148],{"class":159,"line":265},[157,1149,1150],{"class":461},"    const content = await $content('articles').where({path:\"\u002Farticles\u002F\"+params.slug}).fetch();\n",[157,1152,1153],{"class":159,"line":277},[157,1154,1155],{"class":461},"    if(content.length > 0){\n",[157,1157,1158],{"class":159,"line":780},[157,1159,1160],{"class":461},"      return {\n",[157,1162,1163],{"class":159,"line":785},[157,1164,1165],{"class":461},"        content:content[0],\n",[157,1167,1168],{"class":159,"line":794},[157,1169,1170],{"class":461},"      }\n",[157,1172,1173],{"class":159,"line":802},[157,1174,1175],{"class":461},"    }else{\n",[157,1177,1178],{"class":159,"line":808},[157,1179,1180],{"class":461},"      redirect('\u002Farticles')\n",[157,1182,1183],{"class":159,"line":814},[157,1184,1185],{"class":461},"    }\n",[157,1187,1188],{"class":159,"line":820},[157,1189,1190],{"class":461},"  }\n",[157,1192,1194],{"class":159,"line":1193},18,[157,1195,817],{"class":461},[157,1197,1199],{"class":159,"line":1198},19,[157,1200,1201],{"class":461},"\u003C\u002Fscript>\n",[11,1203,1204,1207,1208,1210,1211,1048,1214,1217],{},[53,1205,1206],{},"asyncData()","中で",[53,1209,887],{},"をフェッチします。そして",[53,1212,1213],{},"where()",[53,1215,1216],{},"\"\u002Farticles\u002F\"+params.slug","に一致するコンテンツを引っ張るようにします。",[11,1219,1220,1223],{},[53,1221,1222],{},"where","クエリを使用すると配列で結果が返るので、あれば一致した結果、なければ一覧ページにリダイレクトするようにします。以上でNuxtにおけるpagesディレクトリの設定は完了です。",[406,1225,1228,1230,1231,1233,1234,1236,1237],{"className":1226},[409,1227],"alert-info",[53,1229,1206],{},"はSSRの時の",[53,1232,138],{},"配下のファイルで使用できます。サーバーサイドで処理される箇所であり、そこで$contentをfetchします。静的書き出しを行うと、",[53,1235,1206],{},"内の処理は書き出し中に実行されます。\n",[870,1238,1241],{"href":1239,"target":1240},"https:\u002F\u002Fnuxtjs.org\u002Fdocs\u002F2.x\u002Ffeatures\u002Fdata-fetching","_blank","公式：Data Fetching",[45,1243,1244],{"id":1244},"コンテンツの作成",[11,1246,1247,1248,1253],{},"ブログ記事は単に文章だけでなく、太字、リンク、画像、見出し、目次が大体必要になります。文章の修飾はマークダウンの記述を行えば問題ありません。マークダウン記法は今回は解説しません。",[870,1249,1252],{"href":1250,"rel":1251},"https:\u002F\u002Fqiita.com\u002Fkamorits\u002Fitems\u002F6f342da395ad57468ae3",[874],"こちらの記事","がお世話になりました。",[94,1255,1256],{"id":1256},"画像をレンダリングする場合",[11,1258,1259],{},"マークダウンで画像を表示する場合は基本的に以下のように記述します。",[111,1261,1263],{"className":547,"code":1262,"language":550,"meta":118,"style":118},"![image alt text](\u002Fimage\u002Fsample.jpg)\n",[53,1264,1265],{"__ignoreMap":118},[157,1266,1267],{"class":159,"line":160},[157,1268,1262],{},[11,1270,1271,1272,1275,1276,1279],{},"Nuxtの場合は画像を",[53,1273,1274],{},"asset","あたりに入れておき、",[53,1277,1278],{},"require('~\u002Fasset\u002Fsample.jpg')","という感じで依存性を解決できます。しかしマークダウンでは以下のパターンで画像パスの解決ができません。",[111,1281,1283],{"className":547,"code":1282,"language":550,"meta":118,"style":118},"\n\u002F\u002F パターン１\n![image alt text](~\u002Fasset\u002Fsample.jpg)\n\n\u002F\u002F パターン２\n![image alt text](\u002Fasset\u002Fsample.jpg)\n\n\u002F\u002F パターン３\n![image alt text](require(~\u002Fasset\u002Fsample.jpg))\n\n",[53,1284,1285,1289,1294,1299,1303,1308,1313,1317,1322],{"__ignoreMap":118},[157,1286,1287],{"class":159,"line":160},[157,1288,451],{"emptyLinePlaceholder":450},[157,1290,1291],{"class":159,"line":167},[157,1292,1293],{},"\u002F\u002F パターン１\n",[157,1295,1296],{"class":159,"line":182},[157,1297,1298],{},"![image alt text](~\u002Fasset\u002Fsample.jpg)\n",[157,1300,1301],{"class":159,"line":193},[157,1302,451],{"emptyLinePlaceholder":450},[157,1304,1305],{"class":159,"line":210},[157,1306,1307],{},"\u002F\u002F パターン２\n",[157,1309,1310],{"class":159,"line":231},[157,1311,1312],{},"![image alt text](\u002Fasset\u002Fsample.jpg)\n",[157,1314,1315],{"class":159,"line":242},[157,1316,451],{"emptyLinePlaceholder":450},[157,1318,1319],{"class":159,"line":253},[157,1320,1321],{},"\u002F\u002F パターン３\n",[157,1323,1324],{"class":159,"line":265},[157,1325,1326],{},"![image alt text](require(~\u002Fasset\u002Fsample.jpg))\n",[11,1328,1329,1330,1333,1334,1339],{},"画像のレンダリングは",[53,1331,1332],{},"\"@nuxt\u002Fcontent\": \"^1.14.0\"","時点で特段に対応されておらず、ドキュメントにも書かれていませんでした。",[870,1335,1338],{"href":1336,"rel":1337},"https:\u002F\u002Fgithub.com\u002Fnuxt\u002Fcontent\u002Fissues\u002F106",[874],"Githubのissueでも報告されているよう","に議論となっています。",[11,1341,1342],{},"一応解決策としてはマークダウンファイルそのものにVueコンポーネントを書いてしまうことです。最初に画像レンダリング用のコンポーネントを作成します。",[111,1344,1347],{"className":616,"code":1345,"filename":1346,"language":619,"meta":118,"style":118},"\u003Ctemplate>\n  \u003Cimg :src=\"imgSrc()\" :alt=\"alt\"\u002F>\n\u003C\u002Ftemplate>\n\n\u003Cscript>\nexport default {\n  props: {\n    src: {\n      type: String,\n      required: true\n    },\n    alt: {\n      type: String,\n    },\n  },\n  methods: {\n    imgSrc() {\n      try {\n        return require(`~\u002Fassets\u002Fimage\u002F${this.src}`)\n      } catch (error) {\n        return null\n      }\n    }\n  },\n}\n\u003C\u002Fscript>\n","components\u002FimageRender.vue",[53,1348,1349,1357,1391,1399,1403,1411,1419,1428,1437,1449,1459,1463,1472,1482,1486,1491,1500,1509,1516,1546,1565,1573,1578,1583,1588,1593],{"__ignoreMap":118},[157,1350,1351,1353,1355],{"class":159,"line":160},[157,1352,626],{"class":174},[157,1354,629],{"class":170},[157,1356,632],{"class":174},[157,1358,1359,1361,1364,1367,1369,1371,1374,1376,1379,1381,1383,1386,1388],{"class":159,"line":167},[157,1360,1081],{"class":174},[157,1362,1363],{"class":170},"img",[157,1365,1366],{"class":678}," :src",[157,1368,1099],{"class":174},[157,1370,1102],{"class":174},[157,1372,1373],{"class":178},"imgSrc()",[157,1375,1102],{"class":174},[157,1377,1378],{"class":678}," :alt",[157,1380,1099],{"class":174},[157,1382,1102],{"class":174},[157,1384,1385],{"class":178},"alt",[157,1387,1102],{"class":174},[157,1389,1390],{"class":174},"\u002F>\n",[157,1392,1393,1395,1397],{"class":159,"line":182},[157,1394,660],{"class":174},[157,1396,629],{"class":170},[157,1398,632],{"class":174},[157,1400,1401],{"class":159,"line":193},[157,1402,451],{"emptyLinePlaceholder":450},[157,1404,1405,1407,1409],{"class":159,"line":210},[157,1406,626],{"class":174},[157,1408,671],{"class":170},[157,1410,632],{"class":174},[157,1412,1413,1415,1417],{"class":159,"line":231},[157,1414,679],{"class":682},[157,1416,683],{"class":682},[157,1418,791],{"class":174},[157,1420,1421,1424,1426],{"class":159,"line":242},[157,1422,1423],{"class":170},"  props",[157,1425,175],{"class":174},[157,1427,791],{"class":174},[157,1429,1430,1433,1435],{"class":159,"line":253},[157,1431,1432],{"class":170},"    src",[157,1434,175],{"class":174},[157,1436,791],{"class":174},[157,1438,1439,1442,1444,1447],{"class":159,"line":265},[157,1440,1441],{"class":170},"      type",[157,1443,175],{"class":174},[157,1445,1446],{"class":461}," String",[157,1448,302],{"class":174},[157,1450,1451,1454,1456],{"class":159,"line":277},[157,1452,1453],{"class":170},"      required",[157,1455,175],{"class":174},[157,1457,1458],{"class":273}," true\n",[157,1460,1461],{"class":159,"line":780},[157,1462,811],{"class":174},[157,1464,1465,1468,1470],{"class":159,"line":785},[157,1466,1467],{"class":170},"    alt",[157,1469,175],{"class":174},[157,1471,791],{"class":174},[157,1473,1474,1476,1478,1480],{"class":159,"line":794},[157,1475,1441],{"class":170},[157,1477,175],{"class":174},[157,1479,1446],{"class":461},[157,1481,302],{"class":174},[157,1483,1484],{"class":159,"line":802},[157,1485,811],{"class":174},[157,1487,1488],{"class":159,"line":808},[157,1489,1490],{"class":174},"  },\n",[157,1492,1493,1496,1498],{"class":159,"line":814},[157,1494,1495],{"class":170},"  methods",[157,1497,175],{"class":174},[157,1499,791],{"class":174},[157,1501,1502,1505,1507],{"class":159,"line":820},[157,1503,1504],{"class":170},"    imgSrc",[157,1506,774],{"class":174},[157,1508,791],{"class":174},[157,1510,1511,1514],{"class":159,"line":1193},[157,1512,1513],{"class":682},"      try",[157,1515,791],{"class":174},[157,1517,1518,1520,1523,1525,1528,1531,1534,1537,1540,1543],{"class":159,"line":1198},[157,1519,788],{"class":682},[157,1521,1522],{"class":710}," require",[157,1524,714],{"class":170},[157,1526,1527],{"class":174},"`",[157,1529,1530],{"class":178},"~\u002Fassets\u002Fimage\u002F",[157,1532,1533],{"class":174},"${",[157,1535,1536],{"class":174},"this.",[157,1538,1539],{"class":461},"src",[157,1541,1542],{"class":174},"}`",[157,1544,1545],{"class":170},")\n",[157,1547,1549,1552,1555,1558,1561,1563],{"class":159,"line":1548},20,[157,1550,1551],{"class":174},"      }",[157,1553,1554],{"class":682}," catch",[157,1556,1557],{"class":170}," (",[157,1559,1560],{"class":461},"error",[157,1562,735],{"class":170},[157,1564,686],{"class":174},[157,1566,1568,1570],{"class":159,"line":1567},21,[157,1569,788],{"class":682},[157,1571,1572],{"class":174}," null\n",[157,1574,1576],{"class":159,"line":1575},22,[157,1577,1170],{"class":174},[157,1579,1581],{"class":159,"line":1580},23,[157,1582,1185],{"class":174},[157,1584,1586],{"class":159,"line":1585},24,[157,1587,1490],{"class":174},[157,1589,1591],{"class":159,"line":1590},25,[157,1592,817],{"class":174},[157,1594,1596,1598,1600],{"class":159,"line":1595},26,[157,1597,660],{"class":174},[157,1599,671],{"class":170},[157,1601,632],{"class":174},[11,1603,1604,1605,1608],{},"上記のコンポーネントを ",[18,1606,1607],{},"マークダウン"," に記述します。",[111,1610,1614],{"className":1611,"code":1612,"language":1613,"meta":118,"style":118},"language-sample.md shiki shiki-themes material-theme-ocean","以下のようにします。\n\u003CimageRender src=\"sample.jpg\"\u002F>\n","sample.md",[53,1615,1616,1621],{"__ignoreMap":118},[157,1617,1618],{"class":159,"line":160},[157,1619,1620],{},"以下のようにします。\n",[157,1622,1623],{"class":159,"line":167},[157,1624,1625],{},"\u003CimageRender src=\"sample.jpg\"\u002F>\n",[11,1627,1628,1629,1632],{},"上記の記述はNuxt Contentがåいい感じにvueコンポーネントとして扱ってくれます。パスの解決はコンポーネント内の",[53,1630,1631],{},"require()","が行います。あまりかっこいい方法ではありませんが、一応これで画像をレンダリングできます。",[94,1634,1636],{"id":1635},"html要素をレンダリングする","HTML要素をレンダリングする",[11,1638,1639],{},"Nuxt Contentはマークダウン内のHTMLをHTMLとして扱ってくれますので、カスタムな要素を記述できます。",[111,1641,1643],{"className":1611,"code":1642,"language":1613,"meta":118,"style":118},"\u003Cdiv class=\"alert alert-warning\">\nこのアラートもこのようにHTMLをマークダウンに書いています！\n\u003C\u002Fdiv>\n",[53,1644,1645,1650,1655],{"__ignoreMap":118},[157,1646,1647],{"class":159,"line":160},[157,1648,1649],{},"\u003Cdiv class=\"alert alert-warning\">\n",[157,1651,1652],{"class":159,"line":167},[157,1653,1654],{},"このアラートもこのようにHTMLをマークダウンに書いています！\n",[157,1656,1657],{"class":159,"line":182},[157,1658,1659],{},"\u003C\u002Fdiv>\n",[406,1661,1664],{"className":1662},[409,1663],"alert-warning","\nこのアラートもこのようにHTMLをマークダウンに書いています！\n",[94,1666,1667],{"id":1667},"シンタックスハイライトを有効にする",[11,1669,1670],{},"Nuxt Contentは一応開発者向けなのか、簡単にコードブロックに対してシンタックスハイライトを有効にすることができます。prismJSを使用するのでまずはインストールします。",[111,1672,1675],{"className":1673,"code":1674,"language":117},[114],"npm install prism-themes\n\n",[53,1676,1674],{"__ignoreMap":118},[11,1678,493,1679,1681],{},[53,1680,429],{},"で以下のようにテーマのCSSを設定します。",[111,1683,1687],{"className":1684,"code":1685,"filename":429,"language":1686,"meta":118,"style":118},"language-javascript shiki shiki-themes material-theme-ocean","content: {\n    markdown: {\n      prism: {\n        theme: 'prism-themes\u002Fthemes\u002Fprism-material-oceanic.css'\n      }\n    }\n  },\n","javascript",[53,1688,1689,1697,1706,1715,1731,1735,1739],{"__ignoreMap":118},[157,1690,1691,1693,1695],{"class":159,"line":160},[157,1692,841],{"class":163},[157,1694,175],{"class":174},[157,1696,791],{"class":174},[157,1698,1699,1702,1704],{"class":159,"line":167},[157,1700,1701],{"class":163},"    markdown",[157,1703,175],{"class":174},[157,1705,791],{"class":174},[157,1707,1708,1711,1713],{"class":159,"line":182},[157,1709,1710],{"class":163},"      prism",[157,1712,175],{"class":174},[157,1714,791],{"class":174},[157,1716,1717,1720,1722,1725,1728],{"class":159,"line":193},[157,1718,1719],{"class":163},"        theme",[157,1721,175],{"class":174},[157,1723,1724],{"class":174}," '",[157,1726,1727],{"class":178},"prism-themes\u002Fthemes\u002Fprism-material-oceanic.css",[157,1729,1730],{"class":174},"'\n",[157,1732,1733],{"class":159,"line":210},[157,1734,1170],{"class":174},[157,1736,1737],{"class":159,"line":231},[157,1738,1185],{"class":174},[157,1740,1741],{"class":159,"line":242},[157,1742,1490],{"class":174},[11,1744,1745],{},"以上でコードブロック内にてシンタックスハイライトが有効になります。",[94,1747,1748],{"id":1748},"目次の作成",[11,1750,1751,1752,1755,1756,1759],{},"目次の作成、もとい見出しのデータの取得は簡単です。",[53,1753,1754],{},"const content = $content().fetch()","で取得した ",[53,1757,1758],{},"content.toc","で見出しのデータが取得できます。",[111,1761,1764],{"className":1762,"code":1763,"language":117},[114],"toc:Array[8]\n    0:Object\n        depth:2\n        id:\"サイトのルーティングを考えてpagesの構成を設定する\"\n        text:\"サイトのルーティングを考えてpagesの構成を設定する\"\n    1:Object\n",[53,1765,1763],{"__ignoreMap":118},[11,1767,1768],{},"私のブログの左サイドにある目次も、上記のようなオブジェクトを利用して作っています。",[94,1770,1771],{"id":1771},"その他の項目や要素について",[11,1773,1774],{},"以上がブログに必要であろう要素をNuxt Contentで記述しました。私の一般記事のtemplateは以下ようになっていますので、是非参考にしてください。",[111,1776,1779],{"className":616,"code":1777,"filename":1778,"language":619,"meta":118,"style":118},"\u003Ctemplate>\n  \u003Cdiv class=\"p-main-container\">\n    \u003Cdiv class=\"p-main-wrapper\">\n        \u002F\u002F目次のコンポーネント\n        \u003Ctoc :toc=\"content.toc\"\u002F>\n\n        \u002F\u002Fメインのエリア\n        \u003Cdiv id=\"l-center-area\">\n\n            \u002F\u002Fサムネイル\n            \u003Cimg v-if=\"thumbnail\" class=\"c-article-thumbnail\" :src=\"thumbnail\" :alt=\"content.title\">\n\n            \u002F\u002Fタグとカテゴリーのバッチ\n            \u003Cdiv class=\"p-article-badge p-badge-container\">\n                \u003Cnuxt-link class=\"c-tag-badge u-blue\" v-for=\"(c,index) in content.category\" :key=\"'category-'+index\" :to=\"'\u002Fcategory\u002F'+c\">\n                    \u003Cspan>{{$store.getters['getCategoryTextBySlug'](c)}}\u003C\u002Fspan>\n                \u003C\u002Fnuxt-link>\n                \u003Cnuxt-link class=\"c-tag-badge\" v-for=\"(t,index) in content.tag\" :key=\"'tag-'+index\" :to=\"'\u002Ftag\u002F'+t\">\n                    \u003Cspan>{{$store.getters['getTagTextBySlug'](t)}}\u003C\u002Fspan>\n                \u003C\u002Fnuxt-link>\n            \u003C\u002Fdiv>\n\n            \u003Ch1 class=\"c-article-header\">{{ content.title }}\u003C\u002Fh1>\n\n            \u002F\u002F 更新一時など\n            \u003Cdiv class=\"p-articler-date\">\n                \u003Cspan class=\"c-date\">\u003Cfa-icon :icon=\"['fa', 'history']\"\u002F>{{ updateAt }}\u003C\u002Fspan>\n                \u003Cspan class=\"c-date\">\u003Cfa-icon :icon=\"['far', 'clock']\"\u002F>{{ createdAt }}\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n\n            \u002F\u002F マークダウンのレンダリング箇所\n            \u003Cnuxt-content :document=\"content\" \u002F>\n        \u003C\u002Fdiv>\n\n        \u002F\u002Fサイドメニュー\n        \u003Csidemenu\u002F>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n","pages\u002Farticles\u002F_slug.vue",[53,1780,1781,1789,1809,1828,1833,1854,1858,1863,1883,1887,1892,1945,1949,1954,1973,2030,2049,2058,2110,2127,2135,2144,2148,2177,2181,2186,2205,2253,2296,2305,2310,2316,2335,2345,2350,2356,2366,2375,2384],{"__ignoreMap":118},[157,1782,1783,1785,1787],{"class":159,"line":160},[157,1784,626],{"class":174},[157,1786,629],{"class":170},[157,1788,632],{"class":174},[157,1790,1791,1793,1795,1798,1800,1802,1805,1807],{"class":159,"line":167},[157,1792,1081],{"class":174},[157,1794,406],{"class":170},[157,1796,1797],{"class":678}," class",[157,1799,1099],{"class":174},[157,1801,1102],{"class":174},[157,1803,1804],{"class":178},"p-main-container",[157,1806,1102],{"class":174},[157,1808,632],{"class":174},[157,1810,1811,1813,1815,1817,1819,1821,1824,1826],{"class":159,"line":182},[157,1812,637],{"class":174},[157,1814,406],{"class":170},[157,1816,1797],{"class":678},[157,1818,1099],{"class":174},[157,1820,1102],{"class":174},[157,1822,1823],{"class":178},"p-main-wrapper",[157,1825,1102],{"class":174},[157,1827,632],{"class":174},[157,1829,1830],{"class":159,"line":193},[157,1831,1832],{"class":461},"        \u002F\u002F目次のコンポーネント\n",[157,1834,1835,1838,1841,1844,1846,1848,1850,1852],{"class":159,"line":210},[157,1836,1837],{"class":174},"        \u003C",[157,1839,1840],{"class":170},"toc",[157,1842,1843],{"class":678}," :toc",[157,1845,1099],{"class":174},[157,1847,1102],{"class":174},[157,1849,1758],{"class":178},[157,1851,1102],{"class":174},[157,1853,1390],{"class":174},[157,1855,1856],{"class":159,"line":231},[157,1857,451],{"emptyLinePlaceholder":450},[157,1859,1860],{"class":159,"line":242},[157,1861,1862],{"class":461},"        \u002F\u002Fメインのエリア\n",[157,1864,1865,1867,1869,1872,1874,1876,1879,1881],{"class":159,"line":253},[157,1866,1837],{"class":174},[157,1868,406],{"class":170},[157,1870,1871],{"class":678}," id",[157,1873,1099],{"class":174},[157,1875,1102],{"class":174},[157,1877,1878],{"class":178},"l-center-area",[157,1880,1102],{"class":174},[157,1882,632],{"class":174},[157,1884,1885],{"class":159,"line":265},[157,1886,451],{"emptyLinePlaceholder":450},[157,1888,1889],{"class":159,"line":277},[157,1890,1891],{"class":461},"            \u002F\u002Fサムネイル\n",[157,1893,1894,1897,1899,1902,1904,1906,1909,1911,1913,1915,1917,1920,1922,1924,1926,1928,1930,1932,1934,1936,1938,1941,1943],{"class":159,"line":780},[157,1895,1896],{"class":174},"            \u003C",[157,1898,1363],{"class":170},[157,1900,1901],{"class":678}," v-if",[157,1903,1099],{"class":174},[157,1905,1102],{"class":174},[157,1907,1908],{"class":178},"thumbnail",[157,1910,1102],{"class":174},[157,1912,1797],{"class":678},[157,1914,1099],{"class":174},[157,1916,1102],{"class":174},[157,1918,1919],{"class":178},"c-article-thumbnail",[157,1921,1102],{"class":174},[157,1923,1366],{"class":678},[157,1925,1099],{"class":174},[157,1927,1102],{"class":174},[157,1929,1908],{"class":178},[157,1931,1102],{"class":174},[157,1933,1378],{"class":678},[157,1935,1099],{"class":174},[157,1937,1102],{"class":174},[157,1939,1940],{"class":178},"content.title",[157,1942,1102],{"class":174},[157,1944,632],{"class":174},[157,1946,1947],{"class":159,"line":785},[157,1948,451],{"emptyLinePlaceholder":450},[157,1950,1951],{"class":159,"line":794},[157,1952,1953],{"class":461},"            \u002F\u002Fタグとカテゴリーのバッチ\n",[157,1955,1956,1958,1960,1962,1964,1966,1969,1971],{"class":159,"line":802},[157,1957,1896],{"class":174},[157,1959,406],{"class":170},[157,1961,1797],{"class":678},[157,1963,1099],{"class":174},[157,1965,1102],{"class":174},[157,1967,1968],{"class":178},"p-article-badge p-badge-container",[157,1970,1102],{"class":174},[157,1972,632],{"class":174},[157,1974,1975,1978,1981,1983,1985,1987,1990,1992,1995,1997,1999,2002,2004,2007,2009,2011,2014,2016,2019,2021,2023,2026,2028],{"class":159,"line":808},[157,1976,1977],{"class":174},"                \u003C",[157,1979,1980],{"class":170},"nuxt-link",[157,1982,1797],{"class":678},[157,1984,1099],{"class":174},[157,1986,1102],{"class":174},[157,1988,1989],{"class":178},"c-tag-badge u-blue",[157,1991,1102],{"class":174},[157,1993,1994],{"class":678}," v-for",[157,1996,1099],{"class":174},[157,1998,1102],{"class":174},[157,2000,2001],{"class":178},"(c,index) in content.category",[157,2003,1102],{"class":174},[157,2005,2006],{"class":678}," :key",[157,2008,1099],{"class":174},[157,2010,1102],{"class":174},[157,2012,2013],{"class":178},"'category-'+index",[157,2015,1102],{"class":174},[157,2017,2018],{"class":678}," :to",[157,2020,1099],{"class":174},[157,2022,1102],{"class":174},[157,2024,2025],{"class":178},"'\u002Fcategory\u002F'+c",[157,2027,1102],{"class":174},[157,2029,632],{"class":174},[157,2031,2032,2035,2037,2040,2043,2045,2047],{"class":159,"line":814},[157,2033,2034],{"class":174},"                    \u003C",[157,2036,157],{"class":170},[157,2038,2039],{"class":174},">",[157,2041,2042],{"class":461},"{{$store.getters['getCategoryTextBySlug'](c)}}",[157,2044,660],{"class":174},[157,2046,157],{"class":170},[157,2048,632],{"class":174},[157,2050,2051,2054,2056],{"class":159,"line":820},[157,2052,2053],{"class":174},"                \u003C\u002F",[157,2055,1980],{"class":170},[157,2057,632],{"class":174},[157,2059,2060,2062,2064,2066,2068,2070,2073,2075,2077,2079,2081,2084,2086,2088,2090,2092,2095,2097,2099,2101,2103,2106,2108],{"class":159,"line":1193},[157,2061,1977],{"class":174},[157,2063,1980],{"class":170},[157,2065,1797],{"class":678},[157,2067,1099],{"class":174},[157,2069,1102],{"class":174},[157,2071,2072],{"class":178},"c-tag-badge",[157,2074,1102],{"class":174},[157,2076,1994],{"class":678},[157,2078,1099],{"class":174},[157,2080,1102],{"class":174},[157,2082,2083],{"class":178},"(t,index) in content.tag",[157,2085,1102],{"class":174},[157,2087,2006],{"class":678},[157,2089,1099],{"class":174},[157,2091,1102],{"class":174},[157,2093,2094],{"class":178},"'tag-'+index",[157,2096,1102],{"class":174},[157,2098,2018],{"class":678},[157,2100,1099],{"class":174},[157,2102,1102],{"class":174},[157,2104,2105],{"class":178},"'\u002Ftag\u002F'+t",[157,2107,1102],{"class":174},[157,2109,632],{"class":174},[157,2111,2112,2114,2116,2118,2121,2123,2125],{"class":159,"line":1198},[157,2113,2034],{"class":174},[157,2115,157],{"class":170},[157,2117,2039],{"class":174},[157,2119,2120],{"class":461},"{{$store.getters['getTagTextBySlug'](t)}}",[157,2122,660],{"class":174},[157,2124,157],{"class":170},[157,2126,632],{"class":174},[157,2128,2129,2131,2133],{"class":159,"line":1548},[157,2130,2053],{"class":174},[157,2132,1980],{"class":170},[157,2134,632],{"class":174},[157,2136,2137,2140,2142],{"class":159,"line":1567},[157,2138,2139],{"class":174},"            \u003C\u002F",[157,2141,406],{"class":170},[157,2143,632],{"class":174},[157,2145,2146],{"class":159,"line":1575},[157,2147,451],{"emptyLinePlaceholder":450},[157,2149,2150,2152,2155,2157,2159,2161,2164,2166,2168,2171,2173,2175],{"class":159,"line":1580},[157,2151,1896],{"class":174},[157,2153,2154],{"class":170},"h1",[157,2156,1797],{"class":678},[157,2158,1099],{"class":174},[157,2160,1102],{"class":174},[157,2162,2163],{"class":178},"c-article-header",[157,2165,1102],{"class":174},[157,2167,2039],{"class":174},[157,2169,2170],{"class":461},"{{ content.title }}",[157,2172,660],{"class":174},[157,2174,2154],{"class":170},[157,2176,632],{"class":174},[157,2178,2179],{"class":159,"line":1585},[157,2180,451],{"emptyLinePlaceholder":450},[157,2182,2183],{"class":159,"line":1590},[157,2184,2185],{"class":461},"            \u002F\u002F 更新一時など\n",[157,2187,2188,2190,2192,2194,2196,2198,2201,2203],{"class":159,"line":1595},[157,2189,1896],{"class":174},[157,2191,406],{"class":170},[157,2193,1797],{"class":678},[157,2195,1099],{"class":174},[157,2197,1102],{"class":174},[157,2199,2200],{"class":178},"p-articler-date",[157,2202,1102],{"class":174},[157,2204,632],{"class":174},[157,2206,2208,2210,2212,2214,2216,2218,2221,2223,2226,2229,2232,2234,2236,2239,2241,2244,2247,2249,2251],{"class":159,"line":2207},27,[157,2209,1977],{"class":174},[157,2211,157],{"class":170},[157,2213,1797],{"class":678},[157,2215,1099],{"class":174},[157,2217,1102],{"class":174},[157,2219,2220],{"class":178},"c-date",[157,2222,1102],{"class":174},[157,2224,2225],{"class":174},">\u003C",[157,2227,2228],{"class":170},"fa-icon",[157,2230,2231],{"class":678}," :icon",[157,2233,1099],{"class":174},[157,2235,1102],{"class":174},[157,2237,2238],{"class":178},"['fa', 'history']",[157,2240,1102],{"class":174},[157,2242,2243],{"class":174},"\u002F>",[157,2245,2246],{"class":461},"{{ updateAt }}",[157,2248,660],{"class":174},[157,2250,157],{"class":170},[157,2252,632],{"class":174},[157,2254,2256,2258,2260,2262,2264,2266,2268,2270,2272,2274,2276,2278,2280,2283,2285,2287,2290,2292,2294],{"class":159,"line":2255},28,[157,2257,1977],{"class":174},[157,2259,157],{"class":170},[157,2261,1797],{"class":678},[157,2263,1099],{"class":174},[157,2265,1102],{"class":174},[157,2267,2220],{"class":178},[157,2269,1102],{"class":174},[157,2271,2225],{"class":174},[157,2273,2228],{"class":170},[157,2275,2231],{"class":678},[157,2277,1099],{"class":174},[157,2279,1102],{"class":174},[157,2281,2282],{"class":178},"['far', 'clock']",[157,2284,1102],{"class":174},[157,2286,2243],{"class":174},[157,2288,2289],{"class":461},"{{ createdAt }}",[157,2291,660],{"class":174},[157,2293,157],{"class":170},[157,2295,632],{"class":174},[157,2297,2299,2301,2303],{"class":159,"line":2298},29,[157,2300,2139],{"class":174},[157,2302,406],{"class":170},[157,2304,632],{"class":174},[157,2306,2308],{"class":159,"line":2307},30,[157,2309,451],{"emptyLinePlaceholder":450},[157,2311,2313],{"class":159,"line":2312},31,[157,2314,2315],{"class":461},"            \u002F\u002F マークダウンのレンダリング箇所\n",[157,2317,2319,2321,2323,2325,2327,2329,2331,2333],{"class":159,"line":2318},32,[157,2320,1896],{"class":174},[157,2322,1093],{"class":170},[157,2324,1096],{"class":678},[157,2326,1099],{"class":174},[157,2328,1102],{"class":174},[157,2330,841],{"class":178},[157,2332,1102],{"class":174},[157,2334,1109],{"class":174},[157,2336,2338,2341,2343],{"class":159,"line":2337},33,[157,2339,2340],{"class":174},"        \u003C\u002F",[157,2342,406],{"class":170},[157,2344,632],{"class":174},[157,2346,2348],{"class":159,"line":2347},34,[157,2349,451],{"emptyLinePlaceholder":450},[157,2351,2353],{"class":159,"line":2352},35,[157,2354,2355],{"class":461},"        \u002F\u002Fサイドメニュー\n",[157,2357,2359,2361,2364],{"class":159,"line":2358},36,[157,2360,1837],{"class":174},[157,2362,2363],{"class":170},"sidemenu",[157,2365,1390],{"class":174},[157,2367,2369,2371,2373],{"class":159,"line":2368},37,[157,2370,651],{"class":174},[157,2372,406],{"class":170},[157,2374,632],{"class":174},[157,2376,2378,2380,2382],{"class":159,"line":2377},38,[157,2379,1114],{"class":174},[157,2381,406],{"class":170},[157,2383,632],{"class":174},[157,2385,2387,2389,2391],{"class":159,"line":2386},39,[157,2388,660],{"class":174},[157,2390,629],{"class":170},[157,2392,632],{"class":174},[45,2394,2395],{"id":2395},"静的書き出しをしてみる",[11,2397,2398,2399,2404,2405,1048,2407,2410],{},"それではpagesファイル、マークダウンも作成したのでとりあえずある分だけ静的書き出ししてみましょう。",[870,2400,2403],{"href":2401,"rel":2402},"https:\u002F\u002Fcontent.nuxtjs.org\u002Fja\u002Fadvanced#%E9%9D%99%E7%9A%84%E3%82%B5%E3%82%A4%E3%83%88%E7%94%9F%E6%88%90",[874],"公式の説明","がありますが",[53,2406,429],{},[53,2408,2409],{},"generate","オプションを設定必要があります。では以下のように設定します。",[111,2412,2414],{"className":1684,"code":2413,"filename":429,"language":1686,"meta":118,"style":118},"generate: {\n    async routes () {\n      const { $content } = require('@nuxt\u002Fcontent')\n      const files = await $content({ deep: true }).only(['path']).fetch()\n      return files.map(file => file.path === '\u002Findex' ? '\u002F' : file.path);\n    }\n},\n",[53,2415,2416,2424,2436,2462,2516,2577,2581],{"__ignoreMap":118},[157,2417,2418,2420,2422],{"class":159,"line":160},[157,2419,2409],{"class":163},[157,2421,175],{"class":174},[157,2423,791],{"class":174},[157,2425,2426,2428,2431,2434],{"class":159,"line":167},[157,2427,707],{"class":461},[157,2429,2430],{"class":710}," routes",[157,2432,2433],{"class":170}," () ",[157,2435,686],{"class":174},[157,2437,2438,2441,2444,2446,2448,2450,2452,2454,2456,2458,2460],{"class":159,"line":182},[157,2439,2440],{"class":678},"      const",[157,2442,2443],{"class":174}," {",[157,2445,754],{"class":461},[157,2447,732],{"class":174},[157,2449,748],{"class":174},[157,2451,1522],{"class":710},[157,2453,714],{"class":170},[157,2455,473],{"class":174},[157,2457,470],{"class":178},[157,2459,473],{"class":174},[157,2461,1545],{"class":170},[157,2463,2464,2466,2469,2471,2473,2475,2477,2479,2482,2484,2487,2489,2491,2493,2496,2499,2501,2504,2506,2509,2511,2513],{"class":159,"line":193},[157,2465,2440],{"class":678},[157,2467,2468],{"class":461}," files",[157,2470,748],{"class":174},[157,2472,751],{"class":682},[157,2474,754],{"class":710},[157,2476,714],{"class":170},[157,2478,717],{"class":174},[157,2480,2481],{"class":170}," deep",[157,2483,175],{"class":174},[157,2485,2486],{"class":273}," true",[157,2488,732],{"class":174},[157,2490,765],{"class":170},[157,2492,768],{"class":174},[157,2494,2495],{"class":710},"only",[157,2497,2498],{"class":170},"([",[157,2500,473],{"class":174},[157,2502,2503],{"class":178},"path",[157,2505,473],{"class":174},[157,2507,2508],{"class":170},"])",[157,2510,768],{"class":174},[157,2512,771],{"class":710},[157,2514,2515],{"class":170},"()\n",[157,2517,2518,2521,2523,2525,2528,2530,2534,2537,2540,2542,2544,2547,2549,2552,2554,2557,2559,2562,2564,2567,2569,2571,2573,2575],{"class":159,"line":210},[157,2519,2520],{"class":682},"      return",[157,2522,2468],{"class":461},[157,2524,768],{"class":174},[157,2526,2527],{"class":710},"map",[157,2529,714],{"class":170},[157,2531,2533],{"class":2532},"s7ZW3","file",[157,2535,2536],{"class":678}," =>",[157,2538,2539],{"class":461}," file",[157,2541,768],{"class":174},[157,2543,2503],{"class":461},[157,2545,2546],{"class":174}," ===",[157,2548,1724],{"class":174},[157,2550,2551],{"class":178},"\u002Findex",[157,2553,473],{"class":174},[157,2555,2556],{"class":174}," ?",[157,2558,1724],{"class":174},[157,2560,2561],{"class":178},"\u002F",[157,2563,473],{"class":174},[157,2565,2566],{"class":174}," :",[157,2568,2539],{"class":461},[157,2570,768],{"class":174},[157,2572,2503],{"class":461},[157,2574,765],{"class":170},[157,2576,777],{"class":174},[157,2578,2579],{"class":159,"line":231},[157,2580,1185],{"class":174},[157,2582,2583],{"class":159,"line":242},[157,2584,2585],{"class":174},"},\n",[11,2587,2588,2589,2592,2593,2595,2596,2598,2599,2601],{},"これは何をやっているかというと、",[53,2590,2591],{},"$content({ deep: true })","を使用してcontent配下にあるマークダウン一式とそのパスを全て取得して、Nuxtに生成すべきルートを伝えています。なぜこれを行う必要があるのかという理由ですが、Nuxt.jsは",[53,2594,975],{},"配下の構成を元にして必要なページを生成します。しかしどんなルート名になるかわからない",[53,2597,1061],{},"というファイル（動的ルート）がある場合は、とりうるルートを",[53,2600,2409],{},"オプション内で明示的に指定する必要があります。",[11,2603,2604],{},"Nuxt.js自身はcontents配下の構成とパスがどうなっているのかわからないので、Nuxt Contentから取得します。",[11,2606,2607,2609],{},[53,2608,429],{},"でSSGができる設定にしたら",[111,2611,2614],{"className":2612,"code":2613,"language":117},[114],"npm run generate\n",[53,2615,2613],{"__ignoreMap":118},[11,2617,2618,2619,2622],{},"を叩くことで静的書き出しが行われます。書き出し後には",[53,2620,2621],{},"dist\u002F","というビルドファイルが作成されます。",[111,2624,2627],{"className":2625,"code":2626,"language":117},[114],"npm run start\n",[53,2628,2626],{"__ignoreMap":118},[11,2630,2631,2632,2634],{},"でひとまずローカル環境で",[53,2633,2621],{},"をドキュメントルートとしてみることができます。以下のような構成で作っていた場合、",[111,2636,2639],{"className":2637,"code":2638,"language":117},[114],"├── content\n│   ├── articles\n│   │   ├── sample.md\n│\n├── pages\n│   ├── articles\n│   　   ├── _slug.vue\n",[53,2640,2638],{"__ignoreMap":118},[11,2642,2643,2646,2647,2649],{},[53,2644,2645],{},"http:\u002F\u002Flocalhost:3000\u002Farticles\u002Fsample","にアクセスすると内容が見れると思います。curlで",[53,2648,2645],{},"でアクセスしてきちんと静的HTMLが書き出されているかを確認してみましょう。",[45,2651,2652],{"id":2652},"以上で基本的な構成の作成が完了",[11,2654,2655,2656,2659,2660,2662,2663,2665],{},"スタイルとかの問題はあるかもしれませんが、ひとまず",[53,2657,2658],{},"pages","・",[53,2661,841],{},"ディレクトリ、",[53,2664,429],{},"の設定を行えばブログ的な構成とCMSとしての機能が実装できました。次回は記事の一覧ページとページング処理について解説していきます。",[905,2667,2668],{},"html pre.shiki code .sAklC, html code.shiki .sAklC{--shiki-default:#89DDFF}html pre.shiki code .s-wAU, html code.shiki .s-wAU{--shiki-default:#F07178}html pre.shiki code .sJ14y, html code.shiki .sJ14y{--shiki-default:#C792EA}html pre.shiki code .sfyAc, html code.shiki .sfyAc{--shiki-default:#C3E88D}html pre.shiki code .s0W1g, html code.shiki .s0W1g{--shiki-default:#BABED8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .s6cf3, html code.shiki .s6cf3{--shiki-default:#89DDFF;--shiki-default-font-style:italic}html pre.shiki code .sbqyR, html code.shiki .sbqyR{--shiki-default:#FF9CAC}html pre.shiki code .sdLwU, html code.shiki .sdLwU{--shiki-default:#82AAFF}html pre.shiki code .s5Dmg, html code.shiki .s5Dmg{--shiki-default:#FFCB6B}html pre.shiki code .s7ZW3, html code.shiki .s7ZW3{--shiki-default:#BABED8;--shiki-default-font-style:italic}",{"title":118,"searchDepth":182,"depth":182,"links":2670},[2671,2676,2683,2684],{"id":966,"depth":167,"text":966,"children":2672},[2673,2674,2675],{"id":969,"depth":182,"text":969},{"id":1017,"depth":182,"text":1018},{"id":1055,"depth":182,"text":1056},{"id":1244,"depth":167,"text":1244,"children":2677},[2678,2679,2680,2681,2682],{"id":1256,"depth":182,"text":1256},{"id":1635,"depth":182,"text":1636},{"id":1667,"depth":182,"text":1667},{"id":1748,"depth":182,"text":1748},{"id":1771,"depth":182,"text":1771},{"id":2395,"depth":167,"text":2395},{"id":2652,"depth":167,"text":2652},[204],"2021-05-05","Nuxt Content × SSG で作る静的ブログ。目次、記事内画像、どんな項目を記事にレンダーできるかと静的書き出しについて説明。",{},"\u002Fseries\u002Fnuxt-content-blog-2",{"title":939,"description":2687},"series\u002Fnuxt-content-blog-2",[220,226],"G0AV4H-Vu8cOAUAeRcjFkqt5-eZKAcs9pHDQjdPhG4E",1780987144928]