如何在 Storybook 中模拟 Next.js 图片组件?
How to mock Next.js Image component in Storybook?
Next.js 在 v10 中引入了一个新的 Image
组件,它应该是 <img>
标签的替代品。
我在尝试查看将 next/image
导入 Storybook 的组件时遇到错误:
TypeError: imageData is undefined
我一直在尝试覆盖 preview.js
中的图像对象(我在 next/router
中使用的一种技术,如 here 所述)但我得到了同样的错误:
// .storybook/preview.js
import Image from 'next/image';
Image = ({ src }) => <img src={src} />;
知道如何覆盖 Storybook 中 next/image
包的行为吗?
我终于成功了。
首先我们需要定义一个具有默认设置的环境变量来消除错误。我们可以通过在 .storybook/main.js
:
中插入 webpack 来做到这一点
// .storybook/main.js
var webpack = require('webpack');
module.exports = {
...
webpackFinal: (config) => {
config.plugins.push(new webpack.DefinePlugin({
'process.env.__NEXT_IMAGE_OPTS': JSON.stringify({
deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
domains: [],
path: '/',
loader: 'default',
}),
}));
return config;
},
};
现在我们可以使用 returns 一个简单的 <img/>
标签的功能组件覆盖 next/image
包的默认导出。
// .storybook/preview.js
import * as nextImage from 'next/image';
Object.defineProperty(nextImage, 'default', {
configurable: true,
value: (props) => {
return <img {...props} />;
},
});
我正在为此 (link to MDN article) 使用 defineProperty
静态方法,因为我不能只为 Image.default
.
分配一个新值
作为已接受答案的补充:
在main.js
内添加var webpack = require('webpack');
Next.js 在 v10 中引入了一个新的 Image
组件,它应该是 <img>
标签的替代品。
我在尝试查看将 next/image
导入 Storybook 的组件时遇到错误:
TypeError: imageData is undefined
我一直在尝试覆盖 preview.js
中的图像对象(我在 next/router
中使用的一种技术,如 here 所述)但我得到了同样的错误:
// .storybook/preview.js
import Image from 'next/image';
Image = ({ src }) => <img src={src} />;
知道如何覆盖 Storybook 中 next/image
包的行为吗?
我终于成功了。
首先我们需要定义一个具有默认设置的环境变量来消除错误。我们可以通过在 .storybook/main.js
:
// .storybook/main.js
var webpack = require('webpack');
module.exports = {
...
webpackFinal: (config) => {
config.plugins.push(new webpack.DefinePlugin({
'process.env.__NEXT_IMAGE_OPTS': JSON.stringify({
deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
domains: [],
path: '/',
loader: 'default',
}),
}));
return config;
},
};
现在我们可以使用 returns 一个简单的 <img/>
标签的功能组件覆盖 next/image
包的默认导出。
// .storybook/preview.js
import * as nextImage from 'next/image';
Object.defineProperty(nextImage, 'default', {
configurable: true,
value: (props) => {
return <img {...props} />;
},
});
我正在为此 (link to MDN article) 使用 defineProperty
静态方法,因为我不能只为 Image.default
.
作为已接受答案的补充:
在main.js
内添加var webpack = require('webpack');