javascript - TypeScript 中带有 Vue 的 Storybook 如何从 .storybook.ts 文件(Webpack 配置)导入?
问题描述
我在 TypeScript 中使用 Storybook 和 Vue。目前还没有官方的 TypeScript 配置可以将 Vue 与 storybook 结合使用。
如何配置 Webpack 以便在 .storybook.ts 中我可以从另一个 .storybook.ts 文件导入?
目前我收到一个错误:
ERROR in ./src/components/Button/Button.stories.ts
Module not found: Error: Can't resolve '../Icon/Icon.stories'
in '/Users/dude/monorepo/frontend/storybook/src/components/Button'
通过此导入:
import AppButton from './Button.vue';
import { iconPackOptions, iconPackDefaultValue } from '../Icon/Icon.stories';
当src/components/Icon/Icon.stories.ts文件具有如下内容时:
import { storiesOf } from '@storybook/vue';
import { withKnobs, text, select } from '@storybook/addon-knobs';
import AppIcon from './Icon.vue';
// Knobs grouping
const groupId01 = 'icon';
// Icon Pack
export const iconPackOptions = {
None: false,
FontAwesomeProRegular: 'far',
FontAwesomeFreeBrands: 'fab'
};
export const iconPackDefaultValue = iconPackOptions.FontAwesomeProRegular;
使用./.storybook/webpack.config.js文件内容:
const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');
const path = require('path');
module.exports = async ({ config }) => {
config.module.rules.push({
test: /\.css$/,
loaders: ['style-loader', 'css-loader', 'postcss-loader'],
include: path.resolve(__dirname, '../'),
});
config.module.rules.push({
test: /\.scss$/,
use: ['style-loader', 'css-loader', 'sass-loader'],
include: path.resolve(__dirname, '../assets/styles')
});
config.resolve = {
extensions: ['.js', '.vue', '.json'],
alias: {
vue$: 'vue/dist/vue.esm.js',
'assets': path.resolve('../src/assets'),
'@': path.join(__dirname, '../src'),
}
};
config.module.rules.push({
test: /\.ts$/,
exclude: /node_modules/,
use: [
{
loader: 'ts-loader',
options: {
appendTsSuffixTo: [/\.vue$/],
transpileOnly: true
},
}
]
});
config.plugins.push(new ForkTsCheckerWebpackPlugin());
return config;
};
使用./.storybook/config.js文件内容:
import { configure } from '@storybook/vue';
import '../src/plugins';
import '../src/assets/styles/main.scss';
const req = require.context('../src/components', true, /.stories.ts$/);
function loadStories() {
req.keys().forEach(filename => req(filename));
}
configure(loadStories, module);
解决方案
这个.storybook/webpack.config.js和 storysource 插件一起为我工作。如果您不需要故事源,只需删除 use loader 对象@storybook/addon-storysource/loader
:
const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');
const path = require('path');
module.exports = async ({ config }) => {
config.module.rules.push({
test: /\.css$/,
loaders: ['style-loader', 'css-loader', 'postcss-loader'],
include: path.resolve(__dirname, '../'),
});
config.module.rules.push({
test: /\.scss$/,
use: ['style-loader', 'css-loader', 'sass-loader'],
include: path.resolve(__dirname, '../assets/styles')
});
config.resolve = {
extensions: ['.js', '.vue', '.json'],
alias: {
vue$: 'vue/dist/vue.esm.js',
'assets': path.resolve('../src/assets'),
'@': path.join(__dirname, '../src'),
}
};
config.module.rules.push({
test: /\.stories\.ts?$/,
exclude: /node_modules/,
use: [
{
loader: require.resolve('babel-loader')
},
{
loader: require.resolve('@storybook/addon-storysource/loader')
}
]
});
config.module.rules.push({
test: /\.ts$/,
exclude: /node_modules/,
use: [
{
loader: 'ts-loader',
options: {
appendTsSuffixTo: [/\.vue$/],
transpileOnly: true
},
}
]
});
config.plugins.push(new ForkTsCheckerWebpackPlugin());
return config;
};
推荐阅读
- angular - 具有原始值的角度 onpush 更改检测策略
- javascript - 如何使用输入范围值显示/隐藏 div
- wordpress - 将帐单国家名称发送给 Woocommerce 管理员电子邮件 Wordpress
- angular - 棱镜 - 在 Angular 6 中搜索文本突出显示
- ios - 在 Swift 中播放一系列视频,而无需同时播放视频
- spring-security - Spring Security 是否包括基于令牌的身份验证
- php - 从 MultiArray 中删除所有重复的键和值
- azure - 我无法 RDP 到我的 Azure VM 的原因可能是什么?
- javascript - 触发 DIV 容器 onclick 而不是在内容内
- reactjs - 测试选项卡和选项卡组件