简体   繁体   English

故事书:组件级别 styles 因 sass-loader 12 而失败

[英]Storybook: component level styles failing with sass-loader 12

I have Storybook setup in my project.我的项目中有 Storybook 设置。 The following is the main.js file:以下是main.js文件:

const path = require('path');
const {
  webpack
} = require('../craco.config');

module.exports = {
  stories: ['../src/components/**/*.stories.@(js|jsx|ts|tsx)', '../src/components/**/*.stories.mdx'],
  addons: ['@storybook/addon-essentials'],
  framework: '@storybook/react',

  webpackFinal: async config => {
    config.resolve.alias = {
      ...config.resolve.alias,
      ...webpack.alias
    };

    config.module.rules.push({
      test: /.scss$/,
      use: [
        'style-loader',
        {
          loader: 'css-loader',
          options: {
            modules: true
          }
        },
        'sass-loader',
        {
          loader: 'sass-resources-loader',
          options: {
            resources: [path.resolve(__dirname, '../src/styles/_variables.scss')]
          }
        }
      ]
    });
    
    return config;
  },
  

  core: {
    builder: 'webpack5'
  }
};

This config enables the modules (so scss modules work as expected) but the regular scss does not work at all.此配置启用模块(因此 scss 模块按预期工作)但常规 scss 根本不起作用。 The opposite happens if modules: true is not there but I cannot make it work both at the same time.如果modules: true不存在但我不能让它同时工作,则会发生相反的情况。

If I create two rules (one for .modules.scss and another for *.scss (not including modules):如果我创建两条规则(一条用于.modules.scss ,另一条用于*.scss (不包括模块)):

const patterns = [
      '.module.scss',
      '(?!.*\.module\.scss$).*\.scss'
    ];
    
    patterns.forEach(pattern => {
      const rule = {
        test: new RegExp(`${pattern}$`),
        use: [
          'style-loader',
          {
            loader: 'css-loader',
            options: {
              modules: pattern === '.module.scss',
            }
          },
          'sass-loader',
          {
            loader: 'sass-resources-loader',
            options: {
              resources: [path.resolve(__dirname, '../src/styles/_variables.scss')]
            }
          }
        ]
      };

      console.log(rule);
      config.module.rules.push(rule);
    });

I get the following error:我收到以下错误:

ModuleBuildError: Module build failed (from ./node_modules/sass-loader/dist/cjs.js):
SassError: expected "{".
   ╷
33 │ var api = require("!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js");
   │                                                                                                  ^
   ╵
  src/components/button/style.module.scss 33:98  root stylesheet
    at processResult (/Users/nkivatinetz/src/forseti/node_modules/webpack/lib/NormalModule.js:758:19)
    at /Users/nkivatinetz/src/forseti/node_modules/webpack/lib/NormalModule.js:860:5
    at /Users/nkivatinetz/src/forseti/node_modules/loader-runner/lib/LoaderRunner.js:400:11
    at /Users/nkivatinetz/src/forseti/node_modules/loader-runner/lib/LoaderRunner.js:252:18
    at context.callback (/Users/nkivatinetz/src/forseti/node_modules/loader-runner/lib/LoaderRunner.js:124:13)
    at Object.loader (/Users/nkivatinetz/src/forseti/node_modules/sass-loader/dist/index.js:69:5)
SassError: SassError: expected "{".
   ╷
33 │ var api = require("!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js");
   │                                                                                                  ^
   ╵
  src/components/button/style.module.scss 33:98  root stylesheet
    at Object.loader (/Users/nkivatinetz/src/forseti/node_modules/sass-loader/dist/index.js:69:14)
ModuleBuildError: Module build failed (from ./node_modules/sass-loader/dist/cjs.js):
SassError: expected "{".
   ╷
33 │ var api = require("!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js");
   │                                                                                                  ^
   ╵
  src/components/modal/style.module.scss 33:98  root stylesheet
    at processResult (/Users/nkivatinetz/src/forseti/node_modules/webpack/lib/NormalModule.js:758:19)
    at /Users/nkivatinetz/src/forseti/node_modules/webpack/lib/NormalModule.js:860:5
    at /Users/nkivatinetz/src/forseti/node_modules/loader-runner/lib/LoaderRunner.js:400:11
    at /Users/nkivatinetz/src/forseti/node_modules/loader-runner/lib/LoaderRunner.js:252:18
    at context.callback (/Users/nkivatinetz/src/forseti/node_modules/loader-runner/lib/LoaderRunner.js:124:13)
    at Object.loader (/Users/nkivatinetz/src/forseti/node_modules/sass-loader/dist/index.js:69:5)
SassError: SassError: expected "{".
   ╷
33 │ var api = require("!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js");
   │                                                                                                  ^
   ╵
  src/components/modal/style.module.scss 33:98  root stylesheet
    at Object.loader (/Users/nkivatinetz/src/forseti/node_modules/sass-loader/dist/index.js:69:14)
ModuleBuildError: Module build failed (from ./node_modules/sass-loader/dist/cjs.js):
SassError: expected "{".
   ╷
33 │ var api = require("!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js");
   │                                                                                                  ^
   ╵
  src/components/text-area/style.module.scss 33:98  root stylesheet
    at processResult (/Users/nkivatinetz/src/forseti/node_modules/webpack/lib/NormalModule.js:758:19)
    at /Users/nkivatinetz/src/forseti/node_modules/webpack/lib/NormalModule.js:860:5
    at /Users/nkivatinetz/src/forseti/node_modules/loader-runner/lib/LoaderRunner.js:400:11
    at /Users/nkivatinetz/src/forseti/node_modules/loader-runner/lib/LoaderRunner.js:252:18
    at context.callback (/Users/nkivatinetz/src/forseti/node_modules/loader-runner/lib/LoaderRunner.js:124:13)
    at Object.loader (/Users/nkivatinetz/src/forseti/node_modules/sass-loader/dist/index.js:69:5)
SassError: SassError: expected "{".
   ╷
33 │ var api = require("!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js");
   │                                                                                                  ^
   ╵
  src/components/text-area/style.module.scss 33:98  root stylesheet
    at Object.loader (/Users/nkivatinetz/src/forseti/node_modules/sass-loader/dist/index.js:69:14)

After doing some research I found that it may be a duplication of the loader but those files should be landing in only one rule.在做了一些研究之后,我发现它可能是加载程序的重复,但这些文件应该只在一个规则中登陆。

Oh, I finally made it work.哦,我终于成功了。 I had to add to the rules:我必须添加规则:

{
   loader: 'css-loader',
   options: {
        modules: true, // Enable modules to help you using className
   }
},

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM