我们很高兴地宣布 Nuxt Image v2!🎉 此版本重点提升了 TypeScript 支持、性能以及开发者体验。
v2 最大的改进是模块全局的 TypeScript 支持 (#1802)。
$img 助手和 useImage() 组合式函数拥有完整的类型推断 (#1844):
const img = useImage()
// 修饰符完全自动补全
const url = img('/image.jpg', {
width: 300,
height: 200,
fit: 'cover' // TypeScript 知道有效的值!
})
模块选项现在完全支持类型。例如,对需要 baseURL 的提供者,nuxt.config.ts 会在类型层级强制要求:
export default defineNuxtConfig({
image: {
provider: 'bunny',
bunny: {
baseURL: '...' // 缺失会产生 TypeScript 错误!
}
}
})
最后,如果你使用自定义图片提供者,建议使用新的 defineProvider 来实现类型安全配置:
// 之前 (v1)
export const getImage = (src, { modifiers, baseURL }) => {
// ...
return { url }
}
// 现在 (v2)
import { defineProvider } from '@nuxt/image/runtime'
export default defineProvider({
getImage(src, { modifiers, baseURL }) {
// 修饰符拥有完整类型
// ...
return { url }
}
})
我们已升级至 IPX v3 (#1799),带来更高性能以及更好的 sharp 二进制处理。升级支持自动检测适合部署架构的 sharp 二进制。
现在你可以直接在 Nitro 服务器端点中使用图片助手 (#1473)。
export default defineEventHandler((event) => {
const img = useImage()
return {
url: img('/hero.jpg', {
width: 1200,
height: 630,
fit: 'cover'
})
}
})
<NuxtImg> 现通过模板引用暴露底层 <img> 元素:
<script setup>
const img = useTemplateRef('img')
onMounted(() => {
// 直接访问原生 img 元素
console.log(img.value.imgEl)
})
</script>
<template>
<NuxtImg ref="img" src="/image.jpg" />
</template>
<NuxtImg> 和 <NuxtPicture> 均提供了类型化的默认插槽。
<template>
<NuxtImg src="/image.jpg" custom>
<template #default="{ imgAttrs, isLoaded, src }">
<img v-bind="imgAttrs" :src="src">
<span v-if="!isLoaded">加载中...</span>
</template>
</NuxtImg>
</template>
插槽参数说明:
imgAttrs - 所有计算后的图片属性(sizes、srcset 等)isLoaded - 占位符是否已加载src - 计算得到的图片源 URL现在可以配置 Shopify 提供者 (#1890):
export default defineNuxtConfig({
image: {
provider: 'shopify',
shopify: {
baseURL: 'https://your-store.myshopify.com'
}
}
})
此提供者支持注入 GitHub 头像及用户内容 (#1990):
<!-- 宽高都设置 -->
<NuxtImg provider="github" src="nuxt" height="50" width="50" />
<!-- 仅设置宽度 -->
<NuxtImg provider="github" src="unjs" width="512" />
<!-- 默认尺寸 -->
<NuxtImg provider="github" src="npm" />
我们做了多项优化以减少包体积并提升运行时性能:
URLSearchParams,更可靠地处理参数Nuxt Image 现在支持 Nuxt 层中的自定义图片目录 (#1880),更方便模块化项目中组织图片。
最大变更是提供者定义方式。所有提供者现在使用默认导出并配合 defineProvider:
- export const getImage = (src, { modifiers }) => { ... }
+ export default defineProvider({
+ name: 'my-provider',
+ getImage(src, { modifiers }) { ... }
+ })
如果你维护自定义提供者,需要更新代码。但回报是完整的 TypeScript 支持!
废弃的 layer0 和 edgio 提供者已被移除。
如果你有使用过 joinWith 进行参数格式化的自定义提供者,请改用带有 createOperationsGenerator 的 formatter 函数。详情请参见迁移指南。
默认屏幕尺寸调整为匹配 Tailwind CSS,移除了 xs (320px) 和 xxl (2560px)。关于如何恢复这些尺寸,请见迁移指南。
删除了若干未使用的运行时工具。如果你直接引入了内部工具,请检查它们是否仍然存在。
请查看我们详尽的迁移指南,获取一步步的升级说明。
快速更新命令:
npm install @nuxt/image@latest
大多数应用无需更改代码即可升级。如果有自定义提供者,需要更新为使用 defineProvider —— 示例请参考迁移指南。
本版本修复了若干问题:
sizes 未定义时预设尺寸未应用的问题 (#1919)感谢所有为此次发布贡献力量的开发者!包括数十位社区成员,他们在功能开发、修复问题、文档完善和反馈方面做出了贡献。
祝你优化愉快!🖼️✨