具有绝对路径的故事书
Storybook with absolute paths
在我们的应用程序中,我们使用绝对路径进行导入。例如,如果我们有一个相对于 src
文件夹的路径,我们可以只写 import module from "components/myComponent"
。
问题是这在故事书中不起作用。经过一番挖掘后发现,您可以采用默认的 webpack 配置并根据需要扩展它,如文档 here 中所示。我基于此的思考过程是简单地将我的 src
目录推送到模块数组上,
module.exports = (baseConfig, env, defaultConfig) => {
// Extend defaultConfig as you need.
defaultConfig.resolve.modules.push("src");
return defaultConfig;
};
然而,在这样做之后,我在尝试 运行 故事书时最终收到以下错误。
ERROR in ./node_modules/@storybook/addon-knobs/src/react/index.js
Module parse failed: Unexpected token (26:9) You may need an
appropriate loader to handle this file type. | const initialContent
= getStory(context); | const props = { context, storyFn: getStory, channel, knobStore, initialContent }; | return ; | }; |
真的不知道从这里去哪里。
这看起来与这个 GitHub 问题 https://github.com/storybooks/storybook/issues/2704 非常相似,其中建议的修复是在您的 webpack 配置中使 src 目录成为绝对目录。
module.exports = {
//...
resolve: {
modules: [path.resolve(__dirname, 'src'), 'node_modules']
}
};
我在使用 CLI 后遇到了这个问题,我能够通过将我的 .storybook/main.js 修改为:
来解决它
const path = require('path');
module.exports = {
...other settings....,
webpackFinal: async (config) => {
config.resolve.modules = [
...(config.resolve.modules || []),
path.resolve(__dirname, "../src"),
];
return config;
},
}
请注意,我使用的是 Typescript 和 ReactJS,我的 Typescript 文件的基础 URL 设置为 src
。那是我的 tsconfig 有这个:
{
...,
"baseUrl": "./src/",
}
我试过其他解决方案,但没有用。所以我为我的案例使用了一个 webpack 插件来解决这个问题。
按照此处的说明进行操作后:https://storybook.js.org/docs/riot/configure/webpack#extending-storybooks-webpack-config
我使用的是 TypeScript 版本,并将 webpackFinal 字段更改如下:
// main.ts
import { TsconfigPathsPlugin } from 'tsconfig-paths-webpack-plugin';
import type { Configuration } from 'webpack';
export default {
// ... other fields
webpackFinal: async (config: Configuration) => {
if (!config.resolve) {
config.resolve = {};
}
config.resolve.plugins = [
...(config.resolve.plugins || []),
new TsconfigPathsPlugin(),
];
return config;
},
};
与上面@Sahin D. 的回答类似,但似乎已更新。
// .storybook/main.js
const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin');
module.exports = {
webpackFinal: async (config) => {
config.resolve.plugins = [
...(config.resolve.plugins || []),
new TsconfigPathsPlugin({
extensions: config.resolve.extensions,
}),
];
return config;
},
};
来源:https://storybook.js.org/docs/react/configure/webpack#typescript-module-resolution
在我们的应用程序中,我们使用绝对路径进行导入。例如,如果我们有一个相对于 src
文件夹的路径,我们可以只写 import module from "components/myComponent"
。
问题是这在故事书中不起作用。经过一番挖掘后发现,您可以采用默认的 webpack 配置并根据需要扩展它,如文档 here 中所示。我基于此的思考过程是简单地将我的 src
目录推送到模块数组上,
module.exports = (baseConfig, env, defaultConfig) => {
// Extend defaultConfig as you need.
defaultConfig.resolve.modules.push("src");
return defaultConfig;
};
然而,在这样做之后,我在尝试 运行 故事书时最终收到以下错误。
ERROR in ./node_modules/@storybook/addon-knobs/src/react/index.js Module parse failed: Unexpected token (26:9) You may need an appropriate loader to handle this file type. | const initialContent = getStory(context); | const props = { context, storyFn: getStory, channel, knobStore, initialContent }; | return ; | }; |
真的不知道从这里去哪里。
这看起来与这个 GitHub 问题 https://github.com/storybooks/storybook/issues/2704 非常相似,其中建议的修复是在您的 webpack 配置中使 src 目录成为绝对目录。
module.exports = {
//...
resolve: {
modules: [path.resolve(__dirname, 'src'), 'node_modules']
}
};
我在使用 CLI 后遇到了这个问题,我能够通过将我的 .storybook/main.js 修改为:
来解决它const path = require('path');
module.exports = {
...other settings....,
webpackFinal: async (config) => {
config.resolve.modules = [
...(config.resolve.modules || []),
path.resolve(__dirname, "../src"),
];
return config;
},
}
请注意,我使用的是 Typescript 和 ReactJS,我的 Typescript 文件的基础 URL 设置为 src
。那是我的 tsconfig 有这个:
{
...,
"baseUrl": "./src/",
}
我试过其他解决方案,但没有用。所以我为我的案例使用了一个 webpack 插件来解决这个问题。
按照此处的说明进行操作后:https://storybook.js.org/docs/riot/configure/webpack#extending-storybooks-webpack-config
我使用的是 TypeScript 版本,并将 webpackFinal 字段更改如下:
// main.ts
import { TsconfigPathsPlugin } from 'tsconfig-paths-webpack-plugin';
import type { Configuration } from 'webpack';
export default {
// ... other fields
webpackFinal: async (config: Configuration) => {
if (!config.resolve) {
config.resolve = {};
}
config.resolve.plugins = [
...(config.resolve.plugins || []),
new TsconfigPathsPlugin(),
];
return config;
},
};
与上面@Sahin D. 的回答类似,但似乎已更新。
// .storybook/main.js
const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin');
module.exports = {
webpackFinal: async (config) => {
config.resolve.plugins = [
...(config.resolve.plugins || []),
new TsconfigPathsPlugin({
extensions: config.resolve.extensions,
}),
];
return config;
},
};
来源:https://storybook.js.org/docs/react/configure/webpack#typescript-module-resolution