我可以将CSS模块与Storybook 5(反应性)一起使用吗?

时间:2019-03-12 10:37:06

标签: webpack css-modules storybook react-css-modules

我试图在我的项目中使用Storybook v5.0,并且正在使用React + Webpack4 + CSS模块。 (我没有使用CreateReactApp)

我的设置非常简单,即使没有CSS模块也可以设置Storybook。

但是,如果我尝试编辑自定义故事书的webpack配置以支持CSS模块,则会出错。

我运行npm run storybook时遇到的错误是:

ERROR in ./src/components/Test/index.css (./node_modules/css-loader/dist/cjs.js??ref--6-1!./node_modules/postcss-loader/src??postcss!./node_modules/style-loader!./node_modules/css-loader/dist/cjs.js??ref--9-1!./node_modules/postcss-loader/src!./src/components/Test/index.css)
Module build failed (from ./node_modules/postcss-loader/src/index.js):
SyntaxError

(2:1) Unknown word

  1 |
> 2 | var content = require("!!../../../node_modules/css-loader/dist/cjs.js??ref--9-1!../../../node_modules/postcss-loader/src/index.js!./index.css");
    | ^
  3 |
  4 | if(typeof content === 'string') content = [[module.id, content, '']];

在我的package.json中:

"@storybook/addon-actions": "^5.0.0",
"@storybook/addons": "^5.0.0",
"@storybook/react": "^5.0.0",

我的.storybook/webpack.config.js遵循其网站上的示例,如下所示:

const path = require("path");

const stylesLoaders = [
  "style-loader",
  {
    loader: "css-loader",
    options: {
      modules: true,
      localIdentName: "[path]__[local]--[hash:base64:5]"
    }
  },
  "postcss-loader"
];

module.exports = {
  module: {
    rules: [
      {
        test: /\.css$/,
        loaders: stylesLoaders,
        include: path.resolve(__dirname, "../")
      }
    ]
  }
};

任何帮助将不胜感激,因为我想使用最新版本的Storybook!

3 个答案:

答案 0 :(得分:1)

我在新故事书(v5)中遇到了同样的问题。最后,我不得不在.storybook / webpack.config.js

中散布config和config.module之后,才开始工作

根据Storybook的文档,我使用了一个用于webpack的函数,而不是一个对象:https://storybook.js.org/docs/configurations/custom-webpack-config/

这是一个例子:

module.exports = ({ config }) => ({
  ...config,
  module: {
    ...config.module,
    rules: [
      {
        test: /\.(ts|tsx)$/,
        exclude: /node_modules/,
        use:[
          {
            loader: require.resolve("babel-loader"),
            options: {
            presets: [["react-app", { flow: false, typescript: true }]]
            }
          }
        ],
        include: path.resolve(__dirname, "../")
      },
      {
        test: /\.css$/,
        use: [
          {
            loader: "style-loader",
            options: { sourceMap: true }
          },
          {
            loader: "css-loader",
            options: {
              importLoaders: 1,
              modules: true,
              localIdentName: "[name]__[local]__[hash:base64:5]"
            }
          },
          {
            loader: require.resolve("postcss-loader"),
            options: {
              ident: "postcss",
              plugins: () => [
                require("postcss-flexbugs-fixes"),
                require("postcss-inline-svg"),
                require("postcss-svgo"),
                autoprefixer({
                  browsers: [
                    ">1%",
                    "last 4 versions",
                    "Firefox ESR",
                    "not ie < 9"
                  ],
                  flexbox: "no-2009"
                })
              ]
            }
          }
        ],
        include: path.resolve(__dirname, "../")
      }
    ]
  }
});

我希望它会对您有所帮助:)

答案 1 :(得分:0)

这对我有用:

// ./.storybook/main.js
module.exports = {
  //
  webpackFinal: (config, {configType}) => {
    const path  = require('path');

    config.module.rules.push({
      test: /\.css$/,
      use: ['style-loader', 'css-loader?modules=true'],
      include: path.resolve(__dirname, '../'),
    });
    
    return config;
  }
  //
}

AND

将我的CSS文件从<filename>.css重命名为<filename>.module.css

祝你好运...

答案 2 :(得分:0)

我在使用新故事书 (v6) 时遇到了同样的问题。最后,当我应用此解决方案时,我能够解决错误

https://github.com/GVanderLugt/storybook-next-antd-less-typescript-config/blob/master/.storybook/next-preset.js

非常感谢他!