初次使用 Remix,搭配 mdx-bundler

Remix 的標誌

"remix": "^1.2.3",
"mdx-bundler": "^8.0.1",
"@stitches/react": "^1.2.6"

看到 Remix 可以用 MDX 當成頁面,且 CSS 樣式方面已經有 Stitches 新手包,想拿來做部落格,並發布至 Vercel。然而,目前的做法是:要用 mdx-bundler 搭配付費服務 fly.io

這篇文章不會再講一次 Remix 文件提到的功能,而是文件上找不到參考,只好到處從社群爬文記下來的做法。


接下來的內容


選擇付費服務 fly.io 的原因 & 費用

目前只有 fly.io 順利使用

想要使用 MDX 撰寫內容,但是 Remix 目前把 .mdx 檔案當做是頁面的功能還非常陽春,例如:無法取得路徑名稱,這樣連基本的 SEO 設定都無法滿足。因此,以 Remix 做的網站(部落格),有許多是透過 mdx-bundler,這也是 Remix 開發者做的套件。

mdx-bundler 要用到的 Node 指令 fs 在開發環境可以使用,推上 Vercel 也 build 成功,打開預覽網址才遇到錯誤訊息:

There was an error
ENOENT: no such file or directory, open '/var/task/content/postname.mdx'

Discord 群組裡也有人嘗試過:MDX blog in Remix.run,但最後結論就是改用 fly.io

調整記憶體

Remix 在安裝的時候就有提供 fly.io 的設定,要能夠跑 Remix,Memory 必須調整為 512MB 才跑得動。

在 fly.io 設定 Memory 為 512MB

費用

2022 年 2 月使用一個月的費用是:0.95 鎂。

fly.io 使用一個月的帳單是 0.95 鎂


Markdown 判斷外部連結

Markdown 的超連結語法:

[Remix 首頁](https://remix.run)

會產生基本的超連結:

<a href="https://remix.run">Remix 首頁</a>

但是,外部連結想要以新開分頁的方式開啟,必須滿足安全性,應該要:

<a href="https://remix.run" target="_blank" rel="noopener">Remix 首頁</a>

有兩種方式達成這個願望:

先放 Component Substitution 的方法。

目標:判斷「外部連結」都是以 http 開頭,就回傳有 targetrel<AnchorLink> 元件。

import { getMDXComponent, getMDXExport } from 'mdx-bundler/client';
import { useMemo } from 'react';

function TagForAnchor({ children, href }) {
  if (!href.startsWith('http')) {
    return <AnchorLink href={href}>{...children}</AnchorLink>
  }

  return <AnchorLink href={href} target="_blank" rel="noopener">{children}</AnchorLink>
}

export default function Post() {
  const { code } = useLoaderData<LoaderData>();
  const Component = useMemo(() => getMDXComponent(code), [code]);
  return (
    <Component components={{
      a: TagForAnchor
    }} />
  );
}

結尾

想要關注 Remix 的發展,除了 DiscordRemix Guide 很積極搜集文章、套件與範本。

本篇文章沒有從 fly.io 獲得任何好處。


💬 討論

新增討論 👆連至 Github 的 Discussions 參與