ろぼいんブログ
更新:

Markdownでリンクカードを表示する「remark-link-card」の使い方

ブログなどでは、リンクを埋め込む際にリンクカードを表示することがあります。リンクカードは、リンク先のページのタイトルやサムネイル、概要などを一覧表示でき、リンク先の情報を簡単に把握できるため、ユーザーにとって便利な機能です。

この記事では、Markdownでリンクカードを表示するための 「remark-link-card」の使い方について解説します。

remark-link-cardとは?

remark-link-cardのnpmページ
remark-link-cardのnpmページ

remark-link-card は、 OGP のリンクカードを表示するための、Markdownパーサーの remark 用のプラグインです。

remark-link-cardを使うと、Markdownファイル内のベアリンクを自動でリンクカードに変換できます。リンクカードにはサムネイルやタイトル、概要、favicon、リンク先のURLが表示されます。

remark-link-cardの使い方

remak-link-cardを使うには、まずプロジェクトにインストールします。

try{(()=>{function a(e){if(!e)return;let t=e.getAttribute("tabindex")!==null,n=e.scrollWidth>e.clientWidth;n&&!t?e.setAttribute("tabindex","0"):!n&&t&&e.removeAttribute("tabindex")}var u=window.requestIdleCallback||(e=>setTimeout(e,1)),i=window.cancelIdleCallback||clearTimeout;function l(e){let t=new Set,n,r;return new ResizeObserver(c=>{c.forEach(o=>t.add(o.target)),n&&clearTimeout(n),r&&i(r),n=setTimeout(()=>{r&&i(r),r=u(()=>{t.forEach(o=>e(o)),t.clear()})},250)})}function d(e,t){e.querySelectorAll?.(".expressive-code pre > code").forEach(n=>{let r=n.parentElement;r&&t.observe(r)})}var s=l(a);d(document,s);var b=new MutationObserver(e=>e.forEach(t=>t.addedNodes.forEach(n=>{d(n,s)})));b.observe(document.body,{childList:!0,subtree:!0});document.addEventListener("astro:page-load",()=>{d(document,s)});})();}catch(e){console.error("[EC] tabindex-js-module failed:",e)}try{(()=>{function i(o){let e=document.createElement("pre");Object.assign(e.style,{opacity:"0",pointerEvents:"none",position:"absolute",overflow:"hidden",left:"0",top:"0",width:"20px",height:"20px",webkitUserSelect:"auto",userSelect:"all"}),e.ariaHidden="true",e.textContent=o,document.body.appendChild(e);let a=document.createRange();a.selectNode(e);let n=getSelection();if(!n)return!1;n.removeAllRanges(),n.addRange(a);let r=!1;try{r=document.execCommand("copy")}finally{n.removeAllRanges(),document.body.removeChild(e)}return r}async function l(o){let e=o.currentTarget,a=e.dataset,n=!1,r=a.code.replace(/\u007f/g,` `);try{await navigator.clipboard.writeText(r),n=!0}catch{n=i(r)}if(!n||e.parentNode?.querySelector(".feedback"))return;let t=document.createElement("div");t.classList.add("feedback"),t.append(a.copied),e.before(t),t.offsetWidth,requestAnimationFrame(()=>t?.classList.add("show"));let c=()=>!t||t.classList.remove("show"),d=()=>{!t||parseFloat(getComputedStyle(t).opacity)>0||(t.remove(),t=void 0)};setTimeout(c,1500),setTimeout(d,2500),e.addEventListener("blur",c),t.addEventListener("transitioncancel",d),t.addEventListener("transitionend",d)}function s(o){o.querySelectorAll?.(".expressive-code .copy button").forEach(e=>e.addEventListener("click",l))}s(document);var u=new MutationObserver(o=>o.forEach(e=>e.addedNodes.forEach(a=>{s(a)})));u.observe(document.body,{childList:!0,subtree:!0});document.addEventListener("astro:page-load",()=>{s(document)});})();}catch(e){console.error("[EC] copy-js-module failed:",e)}
Terminal window
npm install remark-link-card

インストールが完了したら、remarkにremark-link-cardを追加します。

import remark from "remark";
import rlc from "remark-link-card";
(async () => {
const result = await remark()
.use(rlc)
.process(exampleMarkdown)
console.log(result.contents);
})();

Astro を使っている場合は、astro.config.mjsにremark-link-cardを追加します。

astro.config.mjs
import { defineConfig } from "astro/config";
import rlc from "remark-link-card";
// https://astro.build/config
export default defineConfig({
// ...
markdown: {
remarkPlugins: [rlc]
}
});

オプション

remark-link-cardには、次のオプションがあります。

  • cachetrueに設定すると、faviconやサムネイルなどのデータを./public/remark-link-card/にキャッシュします。デフォルトはfalseです
  • shortenUrltrueに設定すると、リンクカードに表示するURLをホスト名のみにします。デフォルトはfalseで、完全なURLを表示します

オプションを利用する場合は、次のように設定します。

import remark from "remark";
import rlc from "remark-link-card";
(async () => {
const result = await remark()
.use(rlc, {
cache: true,
shortenUrl: true
})
.process(exampleMarkdown)
console.log(result.contents);
})();
astro.config.mjs
import { defineConfig } from "astro/config";
import rlc from "remark-link-card";
// https://astro.build/config
export default defineConfig({
// ...
markdown: {
remarkPlugins: [
[
rlc,
{
cache: true,
shortenUrl: true
}
]
]
}
});

リンクカードを表示する方法

リンクカードを表示するには、Markdownファイル内にベアリンク(むき出しのURL)を記述します。ベアリンクではないリンクは、カードに変換されません。また、1行に複数のリンクがある場合も変換されません。

次のコードは、リンクカードが表示される例です。

## リンクカードが表示される
https://example.com
<https://example.com>

次のコードは、リンクカードが表示されない例です。

## リンクカードが表示されない
[リンクカードが表示されない](https://example.com)
https://example.com https://example.com

Markdownではリンクを< >で囲っても囲わなくても動作します。MDXではエラーが出るため、リンクを< >囲わないことをオススメします。

まとめ

この記事では、Markdownでリンクカードを表示するための「remark-link-card」の使い方について解説しました。

リンクカードを手軽に実装できるので、ぜひ使ってみてください。

参考

おすすめアイテム

※このリンクを経由して商品を購入すると、当サイトの運営者が報酬を得ることがあります。詳細はこちら

このサイトを支援する

Buy Me a CoffeeまたはGitHub Sponsorsで支援していただけると、サイトの運営やコンテンツ制作の励みになります。定期的な支援と一度限りの支援がありますので、お間違いのないようにお願いします。

Buy me a coffee

著者のアイコン画像

生まれた時から、母国語よりも先にJavaScriptを使っていました。ネットの海のどこにもいなくてどこにでもいます。

Webフロントエンドプログラマーで、テクノロジーに関する話題を追いかけています。動画編集やプログラミングが趣味で、たまにデザインなどもやっています。主にTypeScriptを使用したWebフロントエンド開発を専門とし、便利で実用的なブラウザー拡張機能を作成しています。また、個人ブログを通じて、IT関連のニュースやハウツー、技術的なプログラミング情報を発信しています。