コンテンツにスキップ

urlImports

この機能は現在実験段階であり、変更される可能性があります。本番環境での使用は推奨されません。GitHubでお試しいただき、フィードバックを共有してください。

URLインポートは、外部サーバーから直接モジュールをインポートできる(ローカルディスクからではなく)実験的な機能です。

警告: 信頼できるドメインのみを使用し、ご自身のマシンでダウンロードおよび実行してください。この機能が安定版としてフラグ付けされるまでは、慎重にご利用ください。

有効にするには、next.config.js内に許可するURLプレフィックスを追加します。

next.config.js
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インポートの実行を制限するよう取り組んでいます。

ロックファイル

URLインポートを使用すると、Next.jsはロックファイルとフェッチされたアセットを含むnext.lockディレクトリを作成します。このディレクトリは、.gitignoreで無視されずにGitにコミットする必要があります

  • 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)
 
// prints "/_next/static/media/file.a9727b5d.txt"