storybook: Problem with using external scss files

Describe the bug Problem with using scss variables from external .scss files in components.

ERROR in ./components/ButtonDefault.vue?vue&type=style&index=0&id=1c1779e4&lang=scss&scoped=true& (./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/sass-loader/dist/cjs.js!./node_modules/vue-loader/lib??vue-loader-options!./components/ButtonDefault.vue?vue&type=style&index=0&id=1c1779e4&lang=scss&scoped=true&)
Module build failed (from ./node_modules/sass-loader/dist/cjs.js):
SassError: Undefined variable: "$colorblue".
        on line 34 of /Applications/MAMP/htdocs/storybook-test/components/ButtonDefault.vue
>>     background-color: $colorblue;

   ----------------------^

 @ ./components/ButtonDefault.vue?vue&type=style&index=0&id=1c1779e4&lang=scss&scoped=true& (./node_modules/vue-style-loader!./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/sass-loader/dist/cjs.js!./node_modules/vue-loader/lib??vue-loader-options!./components/ButtonDefault.vue?vue&type=style&index=0&id=1c1779e4&lang=scss&scoped=true&) 4:14-301 14:3-18:5 15:22-309
 @ ./components/ButtonDefault.vue?vue&type=style&index=0&id=1c1779e4&lang=scss&scoped=true&
 @ ./components/ButtonDefault.vue
 @ ./.stories/ButtonDefault.stories.js
 @ ./.stories sync nonrecursive ^\.\/(?:(?!\.)(?=.)[^\/]*?\.stories\.js\/?)$
 @ ./.storybook/generated-entry.js
 @ multi ./node_modules/@storybook/core/dist/server/common/polyfills.js ./node_modules/@storybook/core/dist/server/preview/globals.js ./node_modules/@storybook/addon-knobs/dist/preset/addDecorator.js ./.storybook/generated-entry.js (webpack)-hot-middleware/client.js?reload=true&quiet=true

To Reproduce Copy code from Code snippets and run comand: storybook from package.json scripts

Expected behavior I want to use external scss file with variables, mixins, functions etc in all components

Code snippets

// package.json
{
  "name": "storybook-test",
  "version": "1.0.0",
  "description": "My gnarly Nuxt.js project",
  "author": "xxx",
  "private": true,
  "scripts": {
    "dev": "nuxt",
    "build": "nuxt build",
    "start": "nuxt start",
    "generate": "nuxt generate",
    "storybook": "NODE_PATH=src start-storybook"
  },
  "dependencies": {
    "nuxt": "^2.5.1"
  },
  "devDependencies": {
    "@storybook/addon-knobs": "^5.3.19",
    "@storybook/addon-viewport": "^5.3.19",
    "@nuxtjs/style-resources": "^1.0.0",
    "@storybook/cli": "^5.3.19",
    "@storybook/vue": "^5.3.19",
    "sass-resources-loader": "^2.0.3",
    "babel-preset-vue": "^2.0.2",
    "css-loader": "^3.5.3",
    "node-sass": "^4.14.1",
    "resolve-url-loader": "^3.1.1",
    "sass-loader": "^8.0.2",
    "style-loader": "^1.2.1",
    "vue-style-loader": "^4.1.2"
  }
}
// main.js
const path = require('path');


module.exports = {
  stories: ['../.stories/*.stories.js'],
  addons: [
    '@storybook/addon-knobs',
    '@storybook/addon-viewport/register'
  ],

  webpackFinal: async (config, { configType }) => {
    config.module.rules.push({
      test: /\.scss$/,
      loaders: ["vue-style-loader", "css-loader", "sass-loader"],
      include: path.resolve(__dirname, "../")
    });

    return config;
  }
};
// ButtonDefault.js
<template>
    <button :class="classes">
        <slot></slot>
    </button>
</template>

<script>
export default {
    name: 'button-default',
    props: {
        size: {
            type: String,
            default: 'medium',
            validator: prop => [
                'small',
                'medium',
                'big'
            ].includes(prop)
        }
    },
    computed: {
        classes () {
            return [
                'c-btn',
                this.size ? `c-btn--${this.size}` : ''
            ]
        }
    }
}
</script>

<style lang="scss" scoped>
    .c-btn {
        background-color: $colorblue;
        border-radius: 2rem;
    }

    .c-btn--small {
        padding: .5rem 1rem;
    }

    .c-btn--medium {
        padding: 1rem 2rem;
    }

    .c-btn--big {
        padding: 1.5rem 3rem;
    }
</style>
// /assets/styles/main.scss
$colorblue: #123456;

System: System: OS: macOS Mojave 10.14.6 CPU: (4) x64 Intel® Core™ i7-5557U CPU @ 3.10GHz Binaries: Node: 10.15.2 - /var/folders/vc/ygvd8psn5sx0cqmc2rffwvdm0000gn/T/yarn–1591710521546-0.17786686071177726/node Yarn: 1.22.4 - /var/folders/vc/ygvd8psn5sx0cqmc2rffwvdm0000gn/T/yarn–1591710521546-0.17786686071177726/yarn Browsers: Chrome: 83.0.4103.97 Firefox: 75.0 Safari: 13.1.1 npmPackages: @storybook/addon-knobs: ^5.3.19 => 5.3.19 @storybook/addon-viewport: ^5.3.19 => 5.3.19 @storybook/cli: ^5.3.19 => 5.3.19 @storybook/vue: ^5.3.19 => 5.3.19

About this issue

  • Original URL
  • State: closed
  • Created 4 years ago
  • Reactions: 3
  • Comments: 15

Most upvoted comments

I had a same issue, and I have solved this problem. I am not sure that it’s best solution, but I solved by using additionalData in sass-loader’s option. In my case, _[[name]].scss files (imported at entry) cannot be imported properly when I build storybook.

.storybook/main.js

const path = require('path');
module.exports = {
  "stories": [
    "../src/**/*.stories.mdx",
    "../src/**/*.stories.@(js|jsx|ts|tsx)"
  ],
  "addons": [
    "@storybook/addon-links",
    "@storybook/addon-essentials",
    "@storybook/addon-interactions",
  ],
  "framework": "@storybook/vue3",
  "core": {
    "builder": "@storybook/builder-webpack5"
  },
  webpackFinal: async (config, { configType }) => {
    // `configType` has a value of 'DEVELOPMENT' or 'PRODUCTION'
    // You can change the configuration based on that.
    // 'PRODUCTION' is used when building the static version of storybook.


    config.resolve.alias = {
      ...config.resolve.alias,
      '@': path.resolve(__dirname, "../"),
      '@css': path.resolve(__dirname, '../src/css'),
      // ...
    };

    // ...

    // Make whatever fine-grained changes you need
    config.module.rules.push({
      test: /\.s(a|c)ss$/,
      use: [
        'style-loader',
        'css-loader',
        {
          loader: 'sass-loader',
          options: {
            additionalData: `
              @import "@css/_colors.scss";
              @import "@css/_components.scss";
              @import "@css/_mediaQuery.scss";
              @import "@css/_variables.scss";
            `
          },
        },
      ],
    });

    // Return the altered config
    return config;
  },
}

Maybe I’m on different environment with you(vue v3 + quasar v2 + storybook v6)… but I hope that it can be your issue’s solution key. 🙏🏻

++ Here is my package.json dependencies.

  "dependencies": {
    "@quasar/extras": "^1.0.0",
    "axios": "^0.21.1",
    "core-js": "^3.6.5",
    "pinia": "^2.0.11",
    "quasar": "^2.6.0",
    "vue": "^3.0.0",
    "vue-i18n": "^9.0.0",
    "vue-router": "^4.0.0"
  },
  "devDependencies": {
    "@babel/core": "^7.18.6",
    "@quasar/app-webpack": "^3.0.0",
    "@storybook/addon-actions": "^6.5.9",
    "@storybook/addon-essentials": "^6.5.9",
    "@storybook/addon-interactions": "^6.5.9",
    "@storybook/addon-links": "^6.5.9",
    "@storybook/builder-webpack5": "^6.5.9",
    "@storybook/manager-webpack5": "^6.5.9",
    "@storybook/preset-scss": "^1.0.3",
    "@storybook/testing-library": "^0.0.13",
    "@storybook/vue3": "^6.5.9",
    "@types/node": "^12.20.21",
    "@typescript-eslint/eslint-plugin": "^5.10.0",
    "@typescript-eslint/parser": "^5.10.0",
    "babel-loader": "^8.2.5",
    "eslint": "^8.10.0",
    "eslint-config-airbnb-base": "^15.0.0",
    "eslint-config-prettier": "^8.5.0",
    "eslint-plugin-import": "^2.20.1",
    "eslint-plugin-storybook": "^0.5.13",
    "eslint-plugin-vue": "^8.5.0",
    "husky": "^8.0.1",
    "lint-staged": ">=10",
    "postcss-html": "^1.4.1",
    "prettier": "^2.7.1",
    "sass-loader": "^13.0.2",
    "stylelint": "^14.9.1",
    "stylelint-config-prettier": "^9.0.3",
    "stylelint-config-prettier-scss": "^0.0.1",
    "stylelint-config-recess-order": "^3.0.0",
    "stylelint-config-recommended-vue": "^1.4.0",
    "stylelint-config-standard-scss": "^4.0.0",
    "stylelint-order": "^5.0.0",
    "stylelint-prettier": "^2.0.0",
    "vue-loader": "^16.8.3",
    "vue-style-loader": "^4.1.3"
}