跳到主要内容

urlImports

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 导入的域名。我们正在努力通过使用 边缘运行时 将 URL 导入限制在浏览器沙盒中执行来进一步改进这一点。

锁文件

使用 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"