tag:crieit.net,2005:https://crieit.net/users/mono7555e/feed mono7555eの投稿 - Crieit Crieitでユーザーmono7555eによる最近の投稿 2019-10-08T08:41:01+09:00 https://crieit.net/users/mono7555e/feed tag:crieit.net,2005:PublicArticle/15463 2019-10-08T08:41:01+09:00 2019-10-08T08:41:01+09:00 https://crieit.net/posts/GatsbyJS-5d9bcd0d8d744 GatsbyJSで次の記事、前の記事へのリンクを生成する方法 <p><strong>オリジナルの記事は<a target="_blank" rel="nofollow noopener" href="https://www.mono7555e.com/implement-next-and-previous-links-in-gatsbyjs/">こちら</a></strong></p> <hr /> <p>こんにちは。mono(<a target="_blank" rel="nofollow noopener" href="https://twitter.com/mono7555e" target="_blank" rel="noopener">@mono7555e</a>)です。</p> <p>記事ページで他の記事へ行く術がなく直帰率が高くなっていたので他の記事への遷移を追加することにしました。</p> <p>ちょっとひと手間かかりますがGatsbyJSでも実現できましたのでご紹介したいと思います。</p> <h2 id="ページ生成時に前後の記事情報を渡す"><a href="#%E3%83%9A%E3%83%BC%E3%82%B8%E7%94%9F%E6%88%90%E6%99%82%E3%81%AB%E5%89%8D%E5%BE%8C%E3%81%AE%E8%A8%98%E4%BA%8B%E6%83%85%E5%A0%B1%E3%82%92%E6%B8%A1%E3%81%99">ページ生成時に前後の記事情報を渡す</a></h2> <pre><code class="js">exports.createPages = async ({ actions, graphql }) => { const { createPage } = actions const template = path.resolve(`src/templates/blog.tsx`) await graphql(` { allMarkdownRemark( sort: { order: DESC, fields: [frontmatter___published_at] } limit: 2000 ) { edges { node { fields { slug } frontmatter { title image } } } } } `).then(result => { if (result.errors) { return Promise.reject(result.errors) } const pages = result.data.allMarkdownRemark.edges pages.forEach(({ node }, index) => { const prev = index === 0 ? null : pages[index - 1].node const next = index === pages.length - 1 ? null : pages[index + 1].node createPage({ path: node.fields.slug, component: template, context: { slug: node.fields.slug, prev, next, }, }) }) }) } </code></pre> <p>重要なのは<code>const prev = ~</code>と<code>const next ~</code>の部分と、contextでそれを設定している部分です。<br /> それ以外のところは自由です。</p> <h2 id="設定された前後の記事情報を元にリンクを生成"><a href="#%E8%A8%AD%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%9F%E5%89%8D%E5%BE%8C%E3%81%AE%E8%A8%98%E4%BA%8B%E6%83%85%E5%A0%B1%E3%82%92%E5%85%83%E3%81%AB%E3%83%AA%E3%83%B3%E3%82%AF%E3%82%92%E7%94%9F%E6%88%90">設定された前後の記事情報を元にリンクを生成</a></h2> <p>ちょっとごちゃごちゃしてしまったので前後の記事用のコンポーネントに分割しました。</p> <pre><code class="jsx">import React from "react" import { Box, Card, CardActionArea, CardContent, Typography } from "@material-ui/core" import Image from "../atoms/image" const PrevNext = ({ prev, next }) => { return( <Box mt={5} display="flex" justifyContent="space-between"> { prev == null ? null : _link(prev, `prev`)} { next == null ? null : _link(next, `next`)} </Box> ) } export default PrevNext const _link = ({ fields, frontmatter }, direction) =>{ return( <Box display="flex" flexDirection="column" style=<span>{</span><span>{</span> width: `40%` <span>}</span><span>}</span>> <Typography gutterBottom variant="body2" component="h6"> { direction == 'prev' ? '前の記事' : '次の記事'} </Typography> <Card style=<span>{</span><span>{</span> width: `100%`, height: `100%`<span>}</span><span>}</span>> <CardActionArea href={fields.slug} style=<span>{</span><span>{</span> display: 'flex', alignItems: `stretch`, height: `100%` <span>}</span><span>}</span>> <Box style=<span>{</span><span>{</span> width: `35%` <span>}</span><span>}</span>> <Image filename={frontmatter.image} style=<span>{</span><span>{</span> height: `100%` <span>}</span><span>}</span> /> </Box> <CardContent style=<span>{</span><span>{</span> flex: `1` <span>}</span><span>}</span>> <Typography variant="body2" component="p"> {frontmatter.title} </Typography> </CardContent> </CardActionArea> </Card> </Box> ) } </code></pre> <p>このブログは<a target="_blank" rel="nofollow noopener" href="https://material-ui.com/" target="_blank" rel="noopener">Material-UI</a>を使っているのでちょっとややこしい感じになりますが、単純にリンクをするだけであればもう少し簡単に書けると思います。</p> <p>あとは作った前後の記事用のコンポーネントをテンプレートから呼び出すだけです。</p> <pre><code class="jsx">// importなどなど export default function Template({ data, pageContext }) { // 中略 return ( <Layout> <Container maxWidth="md" component="article"> {/* その他コンポーネント読み込み */} <PrevNext prev={pageContext.prev} next={pageContext.next} /> </Container> </Layout> ) } </code></pre> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>やってみると結構かんたんでした。</p> <p>今はイメージとタイトルだけですが、タグや日付など各記事が持っている情報を利用できるのでよりリッチな前後の記事へのリンクが設置できると思います。</p> mono7555e tag:crieit.net,2005:PublicArticle/15462 2019-10-08T08:32:43+09:00 2019-10-08T08:46:46+09:00 https://crieit.net/posts/gatsby-transformer-remark gatsby-transformer-remarkで出力されるコンポーネントをカスタマイズする方法 <p><strong>オリジナルの記事は<a target="_blank" rel="nofollow noopener" href="https://www.mono7555e.com/customize-gatsby-transfer-remark/">こちら</a></strong></p> <hr /> <p>こんにちは。mono(<a target="_blank" rel="nofollow noopener" href="https://twitter.com/mono7555e" target="_blank" rel="noopener">@mono7555e</a>)です。</p> <p>このブログがGatsbyJSで作られていること、<a target="_blank" rel="nofollow noopener" href="https://www.gatsbyjs.org/packages/gatsby-transformer-remark/" target="_blank" rel="noopener">gatsby-transformer-remark</a>を使ってMakrdownを読み込んでいることは以前にもご紹介しましたが、今回はそこで出力されるHTML(コンポーネント)をカスタマイズする方法をご紹介したいと思います。</p> <p>かなり簡単で、ずばり<a target="_blank" rel="nofollow noopener" href="https://github.com/rehypejs/rehype-react" target="_blank" rel="noopener">rehype-react</a>を使うとやりたいことが出来ます。</p> <h2 id="既存コンポーネントを独自コンポーネントに置き換える"><a href="#%E6%97%A2%E5%AD%98%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%82%92%E7%8B%AC%E8%87%AA%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%AB%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%82%8B">既存コンポーネントを独自コンポーネントに置き換える</a></h2> <p>まずは<code>h1</code>や<code>p</code>などの既存コンポーネントを置き換える方法についてです。</p> <p>私が実際に使っているものを例にするとこんな感じになります。</p> <pre><code class="tsx">import rehypeReact from "rehype-react" import { Box, Typography } from "@material-ui/core" // 中略 export const renderAst = new rehypeReact({ createElement: React.createElement, components: { 'h2': (props: TypographyProps) => { return ( <Box mt={4} mb={2} py={2} px={3} bgcolor="primary.400" color="common.white"> <Typography variant="h6" component="h2" {...props}></Typography> </Box> ) }, 'h3': (props: TypographyProps) => { return ( <Box mt={4} mb={2} py={1} px={2} borderLeft={4} borderColor="primary.500"> <Typography variant="h6" component="h3" {...props}></Typography> </Box> ) }, 'h4': (props: TypographyProps) => { return ( <Box mt={4} mb={2} py={1} px={1} borderBottom={1} borderColor="primary.500"> <Typography variant="body1" component="h4" {...props}></Typography> </Box> ) }, 'p': (props: TypographyProps) => { return ( <Typography variant="body2" component="p" style=<span>{</span><span>{</span> marginTop: `1rem`, marginBottom: `1rem`, lineHeight: 1.8 <span>}</span><span>}</span> {...props}></Typography> ) }, // などなど }, }).Compiler </code></pre> <p>全体的に<a target="_blank" rel="nofollow noopener" href="https://material-ui.com/" target="_blank" rel="noopener">Material-UI</a>を使っているので、そのコンポーネントに各既存コンポーネントを置き換えています。</p> <p>あとは、GraphQLで取得するデータを<code>html</code>から<code>htmlAst</code>に変更し、定義した<code>renderAst</code>を使うように書き換えます。</p> <p>具体的には</p> <pre><code class="jsx"><div dangerouslySetInnerHTML=<span>{</span><span>{</span> __html: html <span>}</span><span>}</span> /> </code></pre> <p>を↓に置き換える感じです。</p> <pre><code class="jsx"><div>{renderAst(htmlAst)}</div> </code></pre> <p>ここまで来ればあとは自由にカスタマイズ可能です。</p> <h2 id="独自コンポーネントを読み込む"><a href="#%E7%8B%AC%E8%87%AA%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%80">独自コンポーネントを読み込む</a></h2> <p>前述の例では、既存コンポーネントを独自コンポーネントに置き換える方法でしたが、独自コンポーネントを追加することも出来ます。</p> <p>まずは読み込みたいコンポーネントを作ります。</p> <p>```jsx:title=src/components/atoms/custom.tsx<br /> import React from 'react'</p> <p>const Custom = () => {<br /> return(<br /> <div><br /> <p>独自コンポーネント</p><br /> </div><br /> )<br /> }<br /> export default Custom</p> <pre><code><br />Markdownファイルのコンポーネントを読み込みたい場所にタグを追加します。 ```md ↓コンポーネント読み込み↓ <custom></custom> ↑コンポーネント読み込み↑ </code></pre> <p>※ちなみに<code><custom /></code>と書きたくなりますがこれだとダメでした</p> <p>それが置き換えられるように<code>rehypeReact</code>を設定します。</p> <pre><code class="jsx">import rehypeReact from "rehype-react" import Custom from "../components/custom" // 中略 export const renderAst = new rehypeReact({ createElement: React.createElement, components: { 'custom': Custom, }, }).Compiler </code></pre> <p>これで<code><custom></custom></code>と書かれたところ<code>Custom</code>コンポーネントになって出力されるようになります。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p><code>gatsby-transformer-remark</code>を使っている際にカスタマイズをしたい場合<code>rehype-react</code>を使えば簡単なことであれば大体のことは出来ると思います。</p> <p>もし、さらにより細かいカスタマイズを行いたい場合は今回のように置き換えるのではなくて、コンポーネント自体を読み込めるようになる<a target="_blank" rel="nofollow noopener" href="https://mdxjs.com/" target="_blank" rel="noopener">MDX</a>を使うと良さそうです。</p> mono7555e tag:crieit.net,2005:PublicArticle/15461 2019-10-08T08:27:14+09:00 2019-10-08T08:27:14+09:00 https://crieit.net/posts/Netlify-Forms お問い合わせフォームを作るならNetlify Formsがオススメ! <p><strong>オリジナルの記事は<a target="_blank" rel="nofollow noopener" href="https://www.mono7555e.com/netlify-forms/">こちら</a></strong></p> <hr /> <p>こんにちは。mono(<a target="_blank" rel="nofollow noopener" href="https://twitter.com/mono7555e" target="_blank" rel="noopener">@mono7555e</a>)です。</p> <p>今回は私のブログのお問い合わせフォームにも使っている<strong>Netlify Forms</strong>のご紹介です。<br /> ブログやサイトにお問い合わせフォームを設置したい時に簡単に使えるのでオススメです。</p> <h2 id="Netlify Formsとは"><a href="#Netlify+Forms%E3%81%A8%E3%81%AF">Netlify Formsとは</a></h2> <p>Netlifyについては以前ご紹介していますのでそちらをご覧ください。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.mono7555e.com/gatsbyjs-and-netlify/">https://www.mono7555e.com/gatsbyjs-and-netlify/</a></p> <p>そのNetlifyのサービスの1つで「Forms」というフォームの送信内容を受け取ってくれるサービスがあります。</p> <p>利用方法は簡単で、<code><form></code>タグに<code>netlify</code>または<code>data-netlify="true"</code>要素を追加して、Netlifyに反映するだけです。</p> <p>以下、<a target="_blank" rel="nofollow noopener" href="https://www.netlify.com/docs/form-handling/" target="_blank" rel="noopener">公式ドキュメント</a>のサンプルです。</p> <pre><code class="html"><form name="contact" method="POST" data-netlify="true"> <p> <label>Your Name: <input type="text" name="name" /></label> </p> <p> <label>Your Email: <input type="email" name="email" /></label> </p> <p> <label>Your Role: <select name="role[]" multiple> <option value="leader">Leader</option> <option value="follower">Follower</option> </select></label> </p> <p> <label>Message: <textarea name="message"></textarea></label> </p> <p> <button type="submit">Send</button> </p> </form> </code></pre> <p><code><form></code>タグの<code>data-netlify="true"</code>以外は普通のフォームなのが分かると思います。</p> <p><code><form></code>タグに<code>data-netlify="true"</code>をつける以外に制約はないので、フォームの見た目などのカスタマイズは自由です。</p> <h3 id="価格"><a href="#%E4%BE%A1%E6%A0%BC">価格</a></h3> <p>月に<strong>100件</strong>、アップロードデータサイズ<strong>10MB</strong>までは<strong>無料</strong>で使えます。</p> <p>それ以上になると、19ドル/月の費用がかかります。詳しくは<a target="_blank" rel="nofollow noopener" href="https://www.netlify.com/pricing/" target="_blank" rel="noopener">公式サイト</a>をご覧ください。</p> <h3 id="主な機能"><a href="#%E4%B8%BB%E3%81%AA%E6%A9%9F%E8%83%BD">主な機能</a></h3> <h4 id="ファイル添付"><a href="#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E6%B7%BB%E4%BB%98">ファイル添付</a></h4> <p><code>type="file"</code>のフィールドを追加すれば、それだけでファイルもアップロードできるようになります。</p> <pre><code class="html"><form name="contact" method="post" data-netlify="true"> ... <input type="file" name="screenshot" /> ... </form> </code></pre> <h4 id="スパムフィルタリング"><a href="#%E3%82%B9%E3%83%91%E3%83%A0%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0">スパムフィルタリング</a></h4> <p>送信された内容はAkismetを使ってフィルタリングされます。</p> <p>フィルタリングされたものはダッシュボード画面から確認出来るので、誤ってスパム判定されて確認できないということはないです。</p> <p>メールアドレスの形式が間違っている場合などもフィルタリングされて弾かれるみたいです。</p> <p>さらに、「reCAPTCHA 2」などを使ってフォームを保護することができるので必要であれば使ってみると良さそうです。</p> <p>詳しくは<a target="_blank" rel="nofollow noopener" href="https://www.netlify.com/docs/form-handling/" target="_blank" rel="noopener">公式ドキュメント</a>をご覧ください。</p> <h4 id="エクスポート"><a href="#%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88">エクスポート</a></h4> <p>送られてきた内容は基本的にはNetlifyのダッシュボード画面から確認することになりますが、CSV形式でのエクスポート機能もあります。</p> <p>ダウンロードできるのはスパム判定されていないもののみです。</p> <h4 id="通知"><a href="#%E9%80%9A%E7%9F%A5">通知</a></h4> <p>メールやSlackで通知を飛ばすことができます。</p> <p><code>name="subject"</code>の要素をフォームに追加しておけば、通知のタイトルに入力された内容が使われるようになるのでオススメです。</p> <pre><code class="html"><form name="contact" method="post" data-netlify="true"> ... <input type="input" name="subject" /> ... </form> </code></pre> <p>こちらもエクスポートと同様、スパム判定されていない場合のみ通知されます。</p> <h4 id="サンクスページ"><a href="#%E3%82%B5%E3%83%B3%E3%82%AF%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B8">サンクスページ</a></h4> <p>サンクスページを用意して<code><form></code>タグの<code>action</code>にサンクスページのパスを設定するだけでOKです。</p> <pre><code class="html"><form name="contact" method="post" action="/success.html" data-netlify="true"> ... <input type="input" name="subject" /> ... </form> </code></pre> <p>何も設定していない場合はNetlifyが用意した画面が表示されます。</p> <p>カスタマイズ等はできないので自前で用意する方が良いでしょう。</p> <h2 id="GatsbyJSで利用する場合の注意点"><a href="#GatsbyJS%E3%81%A7%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AE%E6%B3%A8%E6%84%8F%E7%82%B9">GatsbyJSで利用する場合の注意点</a></h2> <p>GatsbyJSやその他静的サイトジェネレーターからも利用可能ですが、サンプルのままだと動かないので一部コードの追加が必要になります。</p> <p>以下のようなコードを<code><form></code>に追加します。</p> <pre><code class="jsx"><input type="hidden" name="form-name" value="contact" /> </code></pre> <p>valueの内容は<code><form></code>タグの<code>name</code>属性に合わせて変更してください。</p> <h4 id="サンプル"><a href="#%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB">サンプル</a></h4> <pre><code class="jsx"><form name="contact" method="post" data-netlify="true" data-netlify-honeypot="bot-field"> {/* 以下のコードを追加 */} <input type="hidden" name="form-name" value="contact" /> ... </form> </code></pre> <h2 id="Netlify Forms以外の選択肢"><a href="#Netlify+Forms%E4%BB%A5%E5%A4%96%E3%81%AE%E9%81%B8%E6%8A%9E%E8%82%A2">Netlify Forms以外の選択肢</a></h2> <p>このブログがGatsbyJS+Netlifyという構成で作られていたのでNetlify Formsを使ってお問い合わせフォームを構築しましたが、Netlifyを使っていない場合や難しく感じた場合は<a target="_blank" rel="nofollow noopener" href="https://www.google.com/intl/ja_jp/forms/about/" target="_blank" rel="noopener">Googleフォーム</a>を使うのが良いと思います。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>以前からTwitterのDMにてご依頼等いただくことがありましたが、企業さまだと少々お手間だったようなので、お問い合わせフォームを設置することにしました。</p> <p>Netlify Formsなら簡単に設置できますし、スパムも自動で判別してくれるので管理の手間も少なくオススメです。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <h3 id="公式ドキュメント"><a href="#%E5%85%AC%E5%BC%8F%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88">公式ドキュメント</a></h3> <p><a target="_blank" rel="nofollow noopener" href="https://www.netlify.com/docs/form-handling/">https://www.netlify.com/docs/form-handling/</a></p> <h3 id="ReactアプリにNetlify Formsを入れる方法(公式ブログ)"><a href="#React%E3%82%A2%E3%83%97%E3%83%AA%E3%81%ABNetlify+Forms%E3%82%92%E5%85%A5%E3%82%8C%E3%82%8B%E6%96%B9%E6%B3%95%EF%BC%88%E5%85%AC%E5%BC%8F%E3%83%96%E3%83%AD%E3%82%B0%EF%BC%89">ReactアプリにNetlify Formsを入れる方法(公式ブログ)</a></h3> <p><a target="_blank" rel="nofollow noopener" href="https://www.netlify.com/blog/2017/07/20/how-to-integrate-netlifys-form-handling-in-a-react-app/">https://www.netlify.com/blog/2017/07/20/how-to-integrate-netlifys-form-handling-in-a-react-app/</a></p> mono7555e tag:crieit.net,2005:PublicArticle/15460 2019-10-08T08:07:21+09:00 2019-10-08T08:11:32+09:00 https://crieit.net/posts/GatsbyJS-Netlify-5d9bc529145a3 いまブログを始めるならGatsbyJS+Netlifyがオススメ! <p><strong>オリジナルの記事は<a target="_blank" rel="nofollow noopener" href="https://www.mono7555e.com/gatsbyjs-and-netlify/">こちら</a></strong></p> <hr /> <p>こんにちは。mono(<a target="_blank" rel="nofollow noopener" href="https://twitter.com/mono7555e" target="_blank" rel="noopener">@mono7555e</a>)です。</p> <p>今回は新しくブログを立ち上げた際に使ったGatsbyJSとNetlifyのご紹介です。<br /> 新しくブログを立ち上げようとしている方やWordPressに疲れた方には参考になるんじゃないかと思います。</p> <h2 id="GatsbyJSとは"><a href="#GatsbyJS%E3%81%A8%E3%81%AF">GatsbyJSとは</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://www.gatsbyjs.org/">https://www.gatsbyjs.org/</a></p> <p>GatsbyJSは<a target="_blank" rel="nofollow noopener" href="https://reactjs.org/" target="_blank" rel="noopener">React</a>で作られた静的サイトジェネレーターです。<br /> JSONやYAML、XMLなど扱うデータを全て一回GraphQLで取り出せるように変換してくれるので、様々なデータが扱いやすく、コンポーネント化がしやすいという特長があります。</p> <p>また、プラグインも豊富で大抵の場合、既にプラグインがあるのでそれを使うように設定してあげればOKです。</p> <p>今回のブログ立ち上げの際にも<strong>Markdownで記事が書ける</strong>というのを必須事項にあげていたので<code>gatsby-transformer-remark</code>というプラグインを利用してMakrdownファイルをGraphQLで扱えるようにしました。</p> <p>他にもsitemap.xmlを生成してくれる<code>gatsby-plugin-sitemap</code>、Google Tag Managerのタグを入れてくれる<code>gatsby-plugin-google-tagmanager</code>など利用しています。</p> <h2 id="なぜWordPressを使わなかったのか"><a href="#%E3%81%AA%E3%81%9CWordPress%E3%82%92%E4%BD%BF%E3%82%8F%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%8B">なぜWordPressを使わなかったのか</a></h2> <p>ブログを立ち上げるとなると真っ先に思い浮かぶのがWordPressだと思います。<br /> ですが、今回は使うのをやめました。<br /> WordPressを使った経験はある方なら分かると思うのですが色々つらみを感じているからです。</p> <h3 id="セキュリティが不安"><a href="#%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%81%8C%E4%B8%8D%E5%AE%89">セキュリティが不安</a></h3> <p>WordPressはかなり使われているので様々な方面から狙われやすいです。<br /> セキュリティパッチ等のアップデートを忘れているとすぐに狙われて乗っ取られたり、悪意のあるコードを埋め込められたりする恐れがあります。</p> <h3 id="管理が大変"><a href="#%E7%AE%A1%E7%90%86%E3%81%8C%E5%A4%A7%E5%A4%89">管理が大変</a></h3> <p>前述の通りセキュリティが不安なのでセキュリティパッチが降ってきたらすぐに適用したいのですがカスタマイズをバリバリやっていたりプラグインを使っている場合、それらが邪魔をしてアップデートが出来ないことがままあります。<br /> また、WordPressだけでなくPHPやWebサーバーの管理等も必要なのでその辺りも大変です(レンタルサーバーの場合はその辺り任せられるので楽ですが、カスタマイズがしづらい場合もあります。)</p> <h3 id="PHP書くの辛い"><a href="#PHP%E6%9B%B8%E3%81%8F%E3%81%AE%E8%BE%9B%E3%81%84">PHP書くの辛い</a></h3> <p>最後はかなり個人的な理由です。<br /> WordPressはPHPで作られているので、ある程度カスタマイズをしようと思うとPHPでコードを書く必要があるのですが、PHPは書いててあまり楽しい言語ではないので出来れば避けたいと思っています。</p> <h2 id="なぜブログサービスを使わなかったのか"><a href="#%E3%81%AA%E3%81%9C%E3%83%96%E3%83%AD%E3%82%B0%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E4%BD%BF%E3%82%8F%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%8B">なぜブログサービスを使わなかったのか</a></h2> <p>WordPress以外にもブログをはじめるのに使えるサービスがいくつかありますが、Markdown、アフィリエイト、カスタマイズ性の辺りがマッチせず使うのを諦めました。</p> <p>有名なところだとAmebaブログ、ライブドアブログ、fc2ブログなどがありますが、それらのブログサービスはMarkdownで記事が書けないので除外しました。</p> <p>Markdownが使えるのは、調べた限りだとMedium、note、Qiita、はてなブログぐらいですが、それらも他の部分がネックになりました。</p> <h3 id="Medium"><a href="#Medium">Medium</a></h3> <p>使ったことがないので何とも言えないところですが、日本で使っている人が少ない印象で、検索に引っかかることもないのでSEOにも強くなさそうな印象です。<br /> <a target="_blank" rel="nofollow noopener" href="https://medium.com/@MEJapan/from-medium-japan-ad346bee2a9b">2017年に日本から撤退</a>しているのも気になりました。</p> <h3 id="note"><a href="#note">note</a></h3> <p>アフィリエイトが貼れなかったり、カスタマイズも出来ないのがちょっと辛いかなと。<br /> ただ、有料記事が販売できたりするのでブログとは別に利用しようと思っています。</p> <p><a target="_blank" rel="nofollow noopener" href="https://note.mu/mono7555e">https://note.mu/mono7555e</a></p> <h3 id="Qiita"><a href="#Qiita">Qiita</a></h3> <p>noteと同様にアフィリエイト、カスタマイズが出来ないのと、プログラミングに関するものしか投稿できないというのがネックです。<br /> もしかしたらめちゃくちゃコードを見せるような記事はQiitaに書くかもしれません。</p> <p>一応登録だけはしました。</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/mono7555e">https://qiita.com/mono7555e</a></p> <h3 id="はてなブログ"><a href="#%E3%81%AF%E3%81%A6%E3%81%AA%E3%83%96%E3%83%AD%E3%82%B0">はてなブログ</a></h3> <p>4つの中だと、<a target="_blank" rel="nofollow noopener" href="https://hatenablog.com/" target="_blank" rel="noopener">はてなブログ</a>は結構良くてサクッと立ち上げるならオススメです。<br /> 独自ドメインを設定する場合は有料プランになってしまいますが気にしない方なら無料版で事足りると思います。<br /> 今回はガッツリカスタマイズしたかったのでやめました。</p> <h2 id="GatsbyJSを選んだ理由"><a href="#GatsbyJS%E3%82%92%E9%81%B8%E3%82%93%E3%81%A0%E7%90%86%E7%94%B1">GatsbyJSを選んだ理由</a></h2> <p>ということでGatsbyJSです。</p> <p>GatsbyJSはReactベースでGraphQLでデータを扱うというのが当時、流行っていたというのもあって採用することにしました。</p> <h2 id="GatsbyJSの良いところ、悪いところ"><a href="#GatsbyJS%E3%81%AE%E8%89%AF%E3%81%84%E3%81%A8%E3%81%93%E3%82%8D%E3%80%81%E6%82%AA%E3%81%84%E3%81%A8%E3%81%93%E3%82%8D">GatsbyJSの良いところ、悪いところ</a></h2> <h3 id="高速"><a href="#%E9%AB%98%E9%80%9F">高速</a></h3> <p>WordPressなどと違い事前にHTMLを生成してあるのでレスポンスが高速です。</p> <h3 id="維持費が安い"><a href="#%E7%B6%AD%E6%8C%81%E8%B2%BB%E3%81%8C%E5%AE%89%E3%81%84">維持費が安い</a></h3> <p>基本的には静的HTMLを置いておくだけでOKなので、AppサーバーやDBは不要。<br /> 後述するNetlify等の静的サイトをホスティングするサービスを使うだけでほとんどの場合事足ります。</p> <h3 id="豊富なプラグイン、ライブラリ"><a href="#%E8%B1%8A%E5%AF%8C%E3%81%AA%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%80%81%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA">豊富なプラグイン、ライブラリ</a></h3> <p>公式、非公式に関わらずプラグインが多数あるのと、npmも使えます。<br /> それらの組み合わせで作ることが出来ます。</p> <h3 id="専門知識が必要"><a href="#%E5%B0%82%E9%96%80%E7%9F%A5%E8%AD%98%E3%81%8C%E5%BF%85%E8%A6%81">専門知識が必要</a></h3> <p>一方で、ReactやGraphQL、ES6等の知識が必要です。<br /> フロントエンドエンジニアの方であれば問題ないと思いますが、そうでない場合は少しキャッチアップが必要かもしれません。</p> <p>GatsbyJSを採用したのでホスティングを考えなければなりませんが、GatsbyJSを使うならNetlifyを使うというのがデファクトスタンダードになっています。<br /> なので私も例に漏れずNetlifyを使うことにしました。</p> <h2 id="Netlifyとは"><a href="#Netlify%E3%81%A8%E3%81%AF">Netlifyとは</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://www.netlify.com/">https://www.netlify.com/</a></p> <p>静的サイトをホスティングしてくれるサービスです。<br /> GitHubやBitbucketのリポジトリと連携するだけで、pushを検知して自動でビルド、デプロイしてくれます。</p> <h2 id="Netlifyの良いところ"><a href="#Netlify%E3%81%AE%E8%89%AF%E3%81%84%E3%81%A8%E3%81%93%E3%82%8D">Netlifyの良いところ</a></h2> <h3 id="無料で独自ドメインを設定できる"><a href="#%E7%84%A1%E6%96%99%E3%81%A7%E7%8B%AC%E8%87%AA%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%A7%E3%81%8D%E3%82%8B">無料で独自ドメインを設定できる</a></h3> <p>基本的には<code>.netlify.com</code>のサブドメインが設定されますが、独自ドメインを持っていればそれを無料で設定できます。</p> <h3 id="無料でHTTPSにできる"><a href="#%E7%84%A1%E6%96%99%E3%81%A7HTTPS%E3%81%AB%E3%81%A7%E3%81%8D%E3%82%8B">無料でHTTPSにできる</a></h3> <p><code>.netlify.com</code>のサブドメインであっても、独自ドメインであってもHTTPSにするのは無料で出来ます。</p> <h3 id="デプロイ前にプレビューできる"><a href="#%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E5%89%8D%E3%81%AB%E3%83%97%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%81%A7%E3%81%8D%E3%82%8B">デプロイ前にプレビューできる</a></h3> <p>ブランチを切ると自動的にプレビュー用のサイトが自動で作られるので変更内容を公開前に確認できます。</p> <p>悪いところも書こうと思ったんですが思いつかないですね…<br /> 一応、無料だと100GBまでの転送量の制限がありますが、多くても数100MBぐらいしか使わないと思うので全然問題ないかなと思います。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>私はブログを立ち上げるときの条件</p> <ul> <li>WordPress以外</li> <li>独自ドメインが使える</li> <li>Markdownで書ける</li> <li>カスタマイズしやすい</li> </ul> <p>これらを満たすのがGatsbyJSとNetlifyの組み合わせだったので使用しています。</p> <p>同じような条件で検討されている方はGatsbyJSとNetlifyの組み合わせがオススメなので是非試してみてください。</p> mono7555e