2018年5月に公開を始めた当ブログですが、Gatsbyをより多くの人に使ってもらいたいと考えソースコードをオープンにしたので、ブログで用いている技術について説明します。
Gatsbyでesa.ioのデータを使って静的サイトをビルドする構成のリポジトリです。Netlifyでホスティングしています。
https://github.com/mottox2/website
スターがつくとやる気がでます。
Gatsbyについて少し知っている前提で中身を説明します。
Gatsbyではファイルシステム上のファイルだけでなく、Web APIなどを経由した様々なデータをソースとして扱う仕組みを持っています。
ソースとして扱われるデータはビルド中に処理され、静的ファイルとして書き出され、本番に公開されてもデータ元へのアクセスは不要になります。しかもCDNに乗せることができ早いです。
esa.ioは情報共有ツールですが、Web APIやWebhookといった開発者に馴染みの深い仕組みをもっています。しかし、APIには15分に75リクエストという制限があります。
ただ、Gatsbyのソースとして扱えば、ビルド時にしかAPIを叩くことはないので、APIの利用制限はほとんど影響がなく利用することができます。
そのesa.ioの記事をsourceとして扱うためのプラグインがgatsby-source-esaです。
GatsbyはReactでViewを書いていきます。近年React+TypeScriptは流行っている印象があって、ReactコンポーネントのPropsに型をちゃんと設定しておくと呼び出し時に型チェックをしてくれます。
開発初期にはあまり効果を発揮しませんが、改修をする際にPropsのチェックがあることで安心してコードの変更を行うことができます。
Gatsbyは標準ではTypeScriptは採用していませんが、内部で利用しているwebpackの設定をいじるAPIがあり、そのAPIを叩いてくれるのがgatsby-plugin-typescriptです。
gatsbyjs/gatsby: /packages/gatsby-plugin-typescript
このブログを始める前にnoteで少し記事を書いていたので、水増しのためにnoteの記事もブログに掲載しています。
gatsbyにはgatsby-node.jsという挙動をいじるファイルがあるので、そのファイル内でnoteのRSSから得られたファイルをGatsbyのAPIを叩いてソースとして登録しています。
RSSを扱うプラグインはあったのですが、あまりイケてると思わなかったのでリポジトリ内で対応しました。f
該当コード: gatsby-node.js
exports.sourceNodes = async ({ actions, createNodeId }) => {
await parser.parseURL('https://note.mu/mottox2/rss').then((feed) => {
feed.items.forEach(item => {
const digest = createNodeId(`${item.link}`)
actions.createNode({
...item,
id: digest,
parent: null,
children: [],
internal: {
contentDigest: digest,
type: 'Note',
},
})
})
})
};
「情報共有ツールesa.ioをCMSとして使って1ヶ月運用してみた」の記事でも書いたのですが、esaにはTitle, Category, Tag, Contentぐらいしか入力項目がありません。
ブログとして必須と思われる公開日時が欲しいのでタイトルに「[2018-12-01] Gatsby+esaブログのソースコードを公開しました」と入力することで、公開日を指定する方式を採用しています。
これもgatsby-node.jsで挙動をいじることで実現しています。
該当コード: gatsby-node.js
const DATE_REGEXP = / ?\[(.*?)\] ?/
exports.onCreateNode = ({ node, actions, createNodeId }) => {
const { createNode, createParentChildLink, createNodeField } = actions
if (node.internal.type === 'EsaPost') {
createNodeField({ node, name: 'title', value: node.name.replace(DATE_REGEXP, '') })
createNodeField({ node, name: 'excerpt', value: h2p(node.body_html)})
// Extract the date part from node.name (ex. "[2018-10-08] I participated in Techbook Festival")
const matched = node.name.match(DATE_REGEXP)
const day = matched ? dayjs(matched[1]) : dayjs(node.updated_at)
const dateNode = buildDateNode({ nodeId: node.id, day, createNodeId })
createNode(dateNode)
createParentChildLink({parent: node, child: dateNode})
}
}
2018年12月1日現在の展望です。
このような技術でブログを半年続けることができました。技術ブログを書くことで知識のインプット・アウトプットが行え、技術ブログを作ることでソースコードとしてのアウトプットを行えました。
ぜひ皆さんも「俺の考えた最強のブログ」をつくって、継続してみてください。
ここ最近、Web技術を利用した画像生成に興味があります。本記事では、日本語における表現の一種である縦書きに焦点を当て、Web技術を使った縦書きを含む画像生成方法についての調査をまとめました。 > 現
追記(2022/12/29): 問い合わせに対応する窓口をTwitterに統一したいので、フォームページは削除しました。 当ブログは静的サイトホスティングサービスのNetlifyでホスティングされ
毎年10月に開催されるHacktoberfestに参加しました。このイベントはOSSへの貢献を行い、期間中に規定数(4つ)の貢献を行った人に特典がプレゼントされるものになっています。 自分はドキュメ