在Storybook中无法通过类名为React组件添加样式

4

我无法通过类名在storybook中为我的React组件设置样式!

如果我使用像

等通用元素,那么我就可以对其进行样式设置。这可能与我的webpack配置有关,但我不知道具体原因。

我的rules.js将传递给webpack.config.js:

rules.js

const { configureBabel } = require('../_babel.config');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const path = require('path');

/**
 * @param themePaths {ThemePaths}
 * @param selectMode {SelectMode}
 * @param selectTarget {SelectTarget}
 * @returns {*[]}
 */
function rules(themePaths, selectMode, selectTarget) {
    const babelOptions = configureBabel(selectMode, selectTarget);
    const babelEnvDeps = require('webpack-babel-env-deps');
    return [
        {
            test: /\.graphql$/,
            exclude: /node_modules/,
            use: [
                {
                    loader: 'graphql-tag/loader',
                },
            ],
        },
        {
            include: [
                path.resolve(__dirname, '..', 'server'),
                path.resolve(__dirname, '..', 'runtime'),
                themePaths.src,
                themePaths.generated,
                path.resolve(__dirname, '..', '..', 'swagger'),
                path.resolve(__dirname, '..', 'node_modules', 'debug'),
                babelEnvDeps.include(),
            ],
            // exclude: [/node_modules/],
            test: /\.(ts|tsx|mjs|js|svg|graphql)$/,
            use: [
                {
                    loader: 'babel-loader',
                    options: babelOptions,
                },
            ],
        },
        {
            test: [/\.scss$/],
            use: [
                selectMode({ development: 'style-loader' }),
                selectMode({ production: MiniCssExtractPlugin.loader }),
                {
                    loader: 'css-loader',
                    options: {
                        importLoaders: 1,
                        localIdentName: '[name]-[local]-[hash:base64:3]',
                        modules: true,
                    },
                },
                {
                    loader: 'sass-loader',
                    options: {
                        data: `
                        @import "_vars";
                        @import "_mixins";
                        @import "_normalize";
                        @import "_reset";
                        `,
                        includePaths: ['src/scss'],
                    },
                },
                {
                    loader: 'postcss-loader',
                    options: {
                        ident: 'postcss',
                        plugins: [require('autoprefixer')()],
                    },
                },
                'resolve-url-loader',
            ].filter(Boolean),
        },
        {
            test: /\.(jpe?g|png|svg|gif)$/,
            use: [
                {
                    loader: 'file-loader',
                    options: {},
                },
            ],
        },
        {
            test: /\.(woff2?)$/,
            use: [
                {
                    loader: 'file-loader',
                    options: {
                        name: '[path][name].[ext]',
                    },
                },
            ],
        },
    ];
}

module.exports.rules = rules;

我的webpack.config.js文件
const { resolve } = require('path');

module.exports = (baseConfig, env, defaultConfig) => {
    const rulesFn = require('../.webpack/rules').rules;
    const rules = rulesFn(
        {
            outputLegacy: '',
            generated: '',
            output: '',
            src: '',
        },
        input => input['development'],
        input => input['modern'],
    );
    delete rules[1].include;
    defaultConfig.module.rules = rules;
    defaultConfig.resolve.extensions = ['.ts', '.tsx', '.js'];
    defaultConfig.resolve.alias = {
        ...(defaultConfig.resolve.alias || {}),
        swagger: resolve(__dirname, '..', '..', 'swagger'),
    };

    return defaultConfig;
};

我的config.ts

import { configure } from "@storybook/react";

const req = require.context('../src/', true, /.stories.tsx$/);

function loadStories() {
    req.keys().forEach((filename) => req(filename))
}

configure(loadStories, module);

我的 React 组件 EateryItem.tsx

import React from "react";
import "./EateryItem.scss";

export const EateryItem: React.SFC<any> = props => {
  return (
    <div className="Eatery" key={props.id}>
      <h3 className="name">{props.name}</h3>
      <p className="address">{props.address}</p>
      <p className="type">{props.foodType}</p>
    </div>
  );
};

我有一个 EateryItem.scss 文件,我似乎无法通过类名来对其进行样式设置。

.Eatery {
    border: 5px dashed $color-primary;
    margin: $base-spacing;
}

.name {
    background: red;
}

不确定为什么我无法对这些类名进行样式设置?

1个回答

4

在检查了 Storybook Webpack 中注入的 .js 文件中的类名后,我意识到它正在对类名进行哈希处理。

我进入了我的 rules.js 文件,并将其设置为 false 来关闭 CSS 模块。

loader: 'css-loader',
options: {
  importLoaders: 1,
  localIdentName: '[name]-[local]-[hash:base64:3]',
  modules: false,
},

然后它停止对 className 进行哈希,这样它就能正常工作了!


你的规则文件在哪里?这是你自己写的吗? - lharby
1
是的,你可以在这里查看我的代码仓库,它在一个单独的.webpack文件夹中。我已经为每个人提供了这个脚手架https://github.com/hghazni/killer-storybook-config - Harry
1
谢谢。最近几天我经历了一些困难,但我已经收藏了你的Github,非常感谢。 - lharby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接