为了提高页面访问速度,通常会把文件上传到CDN,nextjs提供了一个配置 assetPrefix
来实现,我们只需要在 next.config.js
里面配置 assetPrefix
即可:
const isProd = process.env.NODE_ENV === 'production'
module.exports = {
// 生产环境CDN域名
assetPrefix: isProd ? 'https://static.kelen.com' : undefined,
}
这样请求的资源就会从原先的「服务域名」变成「CDN域名」,举个例子,原来的资源路径是:
https://www.kelen.cc/_next/static/chunks/123456.js
新的资源路径就变成:
https://static.kelen.com/_next/static/chunks/123456.js
注意:上传CDN的资源应该只限制 .next/static/
目录下的资源,不应该上传其他资源,防止服务敏感信息泄漏。
url parameter not allowed
配置完上线后访问页面,发现某些有一些图片404,图片的格式一般是 https://www.kelen.cc/_next/image?url=https%3A%2F%2Fstatic.kelen.com%2Fimages%2Favatar.jpg&w=384&q=75 ,报错 url parameter not allowed
,那么为什么有些图片可以正常访问,有些图片就报错呢?
通过阅读源码可以发现,nextjs 对 Image 组件的图片,会通过自己的服务做中转请求,然后返回给客户端,相当于通过 _next/image 这个接口来获取静态资源的图片,然而并非所有的图片都会去获取,只有指定域名才行。所以解决这个问题的方法就是在 next.config.js
里面配置 images
选项,指定允许的域名:
const isProd = process.env.NODE_ENV === 'production'
module.exports = {
// 生产环境CDN域名
assetPrefix: isProd ? 'https://static.kelen.com' : undefined,
images: {
domains: ['static.kelen.com'],
},
}
通过上述配置后,就可以正常解决问题了,不过 domains
这个配置在 Nextjs14 之后会废弃,取而代之的是 remotePatterns
。
remotePatterns
Nextjs 集成了 Image 组件的一些优化功能,为了防止用户恶意攻击,我们需要确保只有信任来源的图片才进行图片优化,remotePatterns
配置项就可以解决这个问题。
module.exports = {
images: {
remotePatterns: [
{
protocol: 'https',
hostname: 'static.kelen.cc',
port: '',
pathname: '/',
},
],
},
}
通过上述配置,重新部署,问题即可完美解决。