Next.jsは基本的にReactコンポーネントでページを構成しますが、外部で作られた
.htmlをそのまま表示したい場合もあります。
ドキュメントを見せたり、外部から受け取った結果ページを描画したりする場合です。
今回は
Next.js App Router
で静的HTMLを読み込み、ユーザーへ表示する方法を順に見ていきます。
Next.jsでは
public内のファイルを静的アセットとして扱い、ブラウザーから直接アクセスできます。
次の構成を例にします。
my-app/
├─ public/
│ └─ static-page.html
├─ app/
│ └─ html-viewer/page.tsx
この場合、
http://localhost:3000/static-page.htmlへアクセスすると、HTMLを直接読み込みます。
次に、このHTMLをNext.jsページ内でiframeに表示します。
App Routerで特定のHTMLをiframeに表示するには、次のように書けます。
// app/html-viewer/page.tsx
export default function HtmlViewerPage() {
return (
<div style={{ width: '100%', height: '100vh' }}>
<iframe
src="/static-page.html"
width="100%"
height="100%"
style={{ border: 'none' }}
title="Static HTML Page"
/>
</div>
);
}
app/html-viewerへアクセスすると、public/static-page.htmlの内容をiframe経由で表示します。
PDFをウェブ上に表示したい場合、HTMLへ変換してからiframeで表示する方法もあります。
CloudConvert PDF to HTML↗のようなサイトで簡単に変換できます。
変換後のHTMLを
publicへ配置すれば、iframeで表示できます。
my-app/
├─ public/
│ └─ my-pdf.html
├─ app/
│ └─ pdf-viewer/page.tsx
// app/pdf-viewer/page.tsx
export default function PdfViewerPage() {
return (
<div style={{ width: '100%', height: '100vh' }}>
<iframe
src="/my-pdf.html"
width="100%"
height="100%"
style={{ border: 'none' }}
title="Converted PDF"
/>
</div>
);
}
PDFが重い場合や、ブラウザー内蔵ビューアーを使えない場合に特に便利です。
ユーザーがPDFビューアーなしで内容を見られる利点もあります。
iframeによる読み込みは簡単ですが、次の点に注意が必要です。
相対パスに注意
:HTML内のCSS、画像、JavaScriptが相対パスを使うと、正しく表示されない場合があります。/images/test.pngのような絶対パスへ修正するとよいでしょう。
セキュリティーポリシー(CSP)
:社内の設定やブラウザーのセキュリティーポリシーで、iframeの内容が遮断される場合があります。サーバー設定やセキュリティーヘッダーの調整が必要です。
SEOには反映されない
:iframe内のHTMLは検索エンジンが認識しづらいため、SEO上の助けにはなりません。
App Routerで外部HTMLを見せる最も簡単で直感的な方法は、
publicへHTMLを配置し、iframeで描画すること
です。
PDFのように直接表示しにくい形式も、HTMLへ変換して同じ方法で提供できます。
ただし、目的が明確な場合に使うのがよく、可能ならHTMLの内容をReactへ移行するほうが適切なこともあります。
- HTMLからReactへの自動変換ツールを利用できるでしょうか。
- iframeを使わず、HTMLをfetchしてdangerouslySetInnerHTMLで表示する方法はどうでしょうか。
- PDFを直接表示するビューアーライブラリも検討できるでしょうか。