urlImports
URL インポートは、エクスペリメンタルな機能で、これにより外部 server から直接 import modules できます(ローカルディスクからではなく)。
警告: この機能は実験的なものです。ダウンロードして自分のマシンで実行するための domains は信頼できるものだけを使用してください。注意を払って使用してください。 ディスクレーションと慎重さが求められます、その機能が安定版としてフラグが付くまで。
オプトインするには、next.config.js
内に許可された URL プレフィックスを追加してください:
module.exports = {
experimental: {
urlImports: ['https://example.com/assets/', 'https://cdn.skypack.dev'],
},
}
その後、URL から直接 import modules を行うことができます。
import { a, b, c } from "https://example.com/assets/some/module.js";
URL インポートは、通常のパッケージインポートが使用できるどこでも使用できます。
Security Model
この機能はセキュリティを最優先の priorityとして設計されています。始めるための start は、明示的に許可する domains からの URL インポートを強制する実験フラグを追加しました。私たちは、Edge Runtime を使用してブラウザのサンドボックスで実行するための URL インポートを制限することで、これをさらに進めることを計画しています。
Lockfile
URL インポートを使用すると、 Next.js はロックファイルと取得したアセットを含む next.lock
ディレクトリを作成します。このディレクトリは Git にコミットする必要があります、.gitignore
で無視してはいけません。
next dev
を実行するとき、Next.js は新たに発見した全ての URL インポートをロックファイルにダウンロードして追加します。next build
を実行するとき、Next.js はロックファイルのみを使用して、アプリケーションを production 用に build します。
通常、ネットワークリクエストは必要なく、古いロックファイルが存在すると build が失敗します。例外はCache-Control: no-cache
で応答するリソースです。これらのリソースにはロックファイルにno-cache
エントリがあり、毎回 build の際にネットワークからフェッチされます。
Examples
Skypack
import confetti from "https://cdn.skypack.dev/canvas-confetti";
import { useEffect } from "react";
export default () => {
useEffect(() => {
confetti();
});
return <p>Hello</p>;
};
静的な Image インポート
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"