URLインポート
URLインポートは、モジュールをローカルディスクではなく外部サーバーから直接インポートできる実験的機能です。
警告: この機能は実験的です。信頼できるドメインのみを使用し、マシン上でダウンロード・実行するようにしてください。機能が安定版としてリリースされるまでは慎重に使用してください。
この機能を有効にするには、next.config.js
で許可するURLプレフィックスを指定します:
module.exports = {
experimental: {
urlImports: ['https://example.com/assets/', 'https://cdn.skypack.dev'],
},
}
設定後、URLから直接モジュールをインポートできます:
import { a, b, c } from 'https://example.com/assets/some/module.js'
URLインポートは通常のパッケージインポートが可能な場所ならどこでも使用できます。
セキュリティモデル
この機能はセキュリティを最優先に設計されています。まず、URLインポートを許可するドメインを明示的に指定する実験的フラグを導入しました。さらにEdge Runtimeを使用してブラウザのサンドボックス内でのみ実行されるように制限する取り組みを進めています。
ロックファイル
URLインポートを使用すると、Next.jsはロックファイルと取得したアセットを含むnext.lock
ディレクトリを作成します。
このディレクトリはGitにコミットする必要があり、.gitignore
で無視してはいけません。
next dev
実行時、Next.jsは新しく発見されたURLインポートをダウンロードしてロックファイルに追加しますnext build
実行時、Next.jsはロックファイルのみを使用して本番用アプリケーションをビルドします
通常、ネットワークリクエストは不要で、古いロックファイルがあるとビルドが失敗します。
例外はCache-Control: no-cache
で応答するリソースで、ロックファイルにno-cache
エントリが記録され、毎回ビルド時にネットワークから取得されます。
使用例
Skypack
import confetti from 'https://cdn.skypack.dev/canvas-confetti'
import { useEffect } from 'react'
export default () => {
useEffect(() => {
confetti()
})
return <p>Hello</p>
}
静的画像インポート
import Image from 'next/image'
import logo from 'https://example.com/assets/logo.png'
export default () => (
<div>
<Image src={logo} placeholder="blur" />
</div>
)
CSS内のURL
.className {
background: url('https://example.com/assets/hero.jpg');
}
アセットインポート
const logo = new URL('https://example.com/assets/file.txt', import.meta.url)
console.log(logo.pathname)
// "/_next/static/media/file.a9727b5d.txt" と表示