.../articles/

Nuxt.js + Contentful + Prism

Nuxt.js + ContentfulのサイトにPrismを導入してシンタックスハイライトできるようにしました。

こちらの記事でも紹介していますが、このサイトはNuxt.jsとContentfulで作られています。

記事本文はContentful上のエディタでMarkdownベースで編集し、それをNuxtで取得後HTMLに変換し描画しています。

ただ、公開当初のコードブロックはシンプルなスタイルのみで少し物足りない感じだったので、シンタックスハイライトできるように Prism を導入してみました。

使い方自体はBasic Usageにあるように単純ですが、Nuxtで使用するためにすこし手間取ったので方法をまとめます。

ちなみにvue + prismで探すとvue-prism-componentというのもありましたが、Contentfulから取得した本文のうちコードブロックだけ部分的に適用する、という使い方は難しそうだったので使いませんでした。


Nuxtのセットアップ

yarn(or npm)でprismjsをインストール

$ yarn add prismjs

pluginsにprismjsを追加(テーマや言語の設定はお好みで)

// app/plugins/prism.js
import Prism from 'prismjs'
import 'prismjs/themes/prism-tomorrow.css'
export default Prism

// nuxt.config.js
  plugins: [
    '~/plugins/prism',
  ],

シンタックスハイライトを有効にしたいpagesでprismを読み込む

// app/pages/articles/_slug.vue
...
<script>
import Prism from '~/plugins/prism'
...
  mounted() {
    Prism.highlightAll()
  },
...

以上でNuxtの準備はできました。

最初うまくシンタックスハイライトが効かずにハマりましたが、 mountedPrism.highlightAll() とすることで解決しました。


Contentfulでのコードブロックの書き方

Contentful上でコードブロックを書くときはMarkdown記法に従ってバッククォート3つで上下を囲いますが、上部のバッククォート3つの後ろに言語を指定してあげると対応してclassを付与してくれます。

下の例では js としているので、code要素には language-js というclassが付与された状態になります。

language- で始まるclassはPrismのSupported languagesに載っているものであれば基本的にシンタックスハイライトできるようになると思います。

  • Markdown上の記述
    ```js
    const posts = await client.getEntries({
      content_type: process.env.CTF_BLOG_POST_TYPE_ID,
      'fields.slug': slug,
    })
    ```
  • 変換したHTML
<pre><code class="language-js">
const posts = await client.getEntries({
  content_type: process.env.CTF_BLOG_POST_TYPE_ID,
  'fields.slug': slug,
})
</code></pre>

Prism導入のビフォーアフター

  • Before
      const posts = await client.getEntries({
        content_type: process.env.CTF_BLOG_POST_TYPE_ID,
        'fields.slug': slug,
      })
  • After 🎉
      const posts = await client.getEntries({
        content_type: process.env.CTF_BLOG_POST_TYPE_ID,
        'fields.slug': slug,
      })

おまけ

ちょっとしたコードをシェアしたりブログに載せたいのであれば Carbon というサービスも使えそうです。

ブラウザ上でコードを入力してテーマや言語を選択するだけという簡単な使い方で、PNGやSVGでエクスポートしたり埋め込み用のコードを生成できます。

.../articles/

Articles

記事

AWS AmplifyにmonorepoのNext.js(App Router)をデプロイする

AWS AmplifyにmonorepoのNext.js(App Router)をデプロイする

monorepo管理しているNext.jsをAmplifyにデプロイしようとした際にいくつか躓く内容があったのでまとめておきます。

リモートワーク・オンライン会議でも、スムーズに制作を進めるために大切なこと[資料編]

リモートワーク・オンライン会議でも、スムーズに制作を進めるために大切なこと[資料編]

コロナ禍の影響により、リモートワークの導入をおこなっている制作会社も多く、実際に弊社でも導入しています。

売れるECサイトデザインを作るために。参考にしたいおしゃれな事例の探し方。

売れるECサイトデザインを作るために。参考にしたいおしゃれな事例の探し方。

売れるECサイトのデザインは、「この形式」という決まりはありません。ECサイトで売り上げを上げるなら、しっかりとしたコンセプトと、コンセプトを決定するまでのリサーチが必要です。

制作会社の考える、業務効率化ツールのおすすめ。個人でも使いやすいサービスなど。

制作会社の考える、業務効率化ツールのおすすめ。個人でも使いやすいサービスなど。

新型コロナウイルス感染拡大の影響で、リモートワークが主流になり、弊社でも週のほとんどは各自宅で作業をしています。

Figmaでデザインのコミット履歴を残せるプラグイン【Thought Recorder】をリリースしました

Figmaでデザインのコミット履歴を残せるプラグイン【Thought Recorder】をリリースしました

Figmaを利用するWebデザイナーの助けになれると嬉しいです。使い方は本記事をご覧ください。

ECの構築方法、おすすめのECサービス。

ECの構築方法、おすすめのECサービス。

ファッションや家電、スーパーの買い物でさえもECサイトを利用することが当たり前になりました。加えて新型コロナウイルスの影響もあり、弊社にも「どんなプラットフォームを利用したら良いか」「どれくらいコストがかかるのか」などECに関するさまざまなご相談を頂きます。

FastAPIのスキーマクラスをOpenAPIから生成する方法

FastAPIのスキーマクラスをOpenAPIから生成する方法

PythonでAPIを構築する要件があり、フレームワークに比較的モダンなFastAPIを採用しました。FastAPIはバックエンドの開発を行えば自動でOepnApi定義を生成する機能が備わっていますが、今回はこれを使わず、事前に用意したOepnApi定義からFastAPIで利用するスキーマクラスを生成する方法を紹介します。

Laravel 日本一解りやすい全文検索のマイグレーション記載方法解説

Laravel 日本一解りやすい全文検索のマイグレーション記載方法解説

Laravel + MySQLで全文検索を実装する

GiFT1号目新卒デザイナーの2021年振り返り

GiFT1号目新卒デザイナーの2021年振り返り

いつの間に、年末ですね。入社してもう、9ヶ月も立っていたようです。2021年の振り返りを記事にしました。

TimesclaeDBのデータ圧縮に関して

TimesclaeDBのデータ圧縮に関して

TimescaleDBはデータベース内の一部のテーブルを時系列データとして扱えるPostgreSQLの拡張です。PostgreSQLの機能拡張なので非常に手軽に導入できます。今回はこのTimesaceDBの圧縮について調べたので備忘録として書き綴りました。

すべての記事

お問い合わせ