Опишите ошибку
Я пробовал несколько способов включить глобальные стили (scss) один раз для всех фреймов Storybook, но безуспешно. Кажется, нет четкого и лаконичного способа сделать это.
Воспроизводить
Попытки:
Ожидаемое поведение
Я бы ожидал, что смогу импортировать глобальные (scss) файлы в одном месте, чтобы их можно было применить к каждому iframe истории. Мог ли быть параметр конфигурации, о котором я не знаю?
Система:
Дополнительный контекст
Я надеюсь, что мне не хватает какой-то конфигурации в сборнике рассказов, которая упростила бы эту проблему.
Попробуйте добавить файл global.scss в angular.json
Проверьте свой defaultProject (внутри json есть свойство defaultProject) и добавьте его в список стилей
"styles": [
"projects/your-cli-project/src/lib/styles/your-styles.scss"
],
Я так и делаю, и он отлично работает. Это вариант для вас?
Всем привет! Похоже, что в последнее время в этом вопросе особо ничего не происходит. Если все еще есть вопросы, комментарии или ошибки, пожалуйста, продолжайте обсуждение. К сожалению, у нас нет времени разбираться в каждой проблеме. Мы всегда открыты для предложений, поэтому, если вы хотите помочь, отправьте нам запрос на включение. Неактивные вопросы будут закрыты через 30 дней. Благодаря!
Привет, @omaracrystal, вот как я это сделал:
в файлы .storybook/config.js
добавьте импорт с правильными встроенными загрузчиками:
import '!style-loader!css-loader!sass-loader!./scss-loader.scss';
Затем добавьте / импортируйте все нужные стили в файл scss-loader.scss
:
$font-path: '../projects/lib/src/theming/fonts/OpenSans/';
<strong i="13">@import</strong> '../projects/lib/src/theming/reset.scss';
<strong i="14">@import</strong> '../projects/lib/src/theming/main.scss';
html {
font-family: $font-name;
font-size: $font-size--small;
}
Решение, предложенное @kroeder, работает до тех пор, пока вы используете компоненты из приложения Angular, но для библиотек вы не можете добавить свойство styles
в файл angular.json
Попробуйте добавить файл global.scss в
angular.json
Проверьте свой defaultProject (внутри json есть свойство defaultProject) и добавьте его в список стилей
"styles": [ "projects/your-cli-project/src/lib/styles/your-styles.scss" ],
Я так и делаю, и он отлично работает. Это вариант для вас?
Я сделал именно это, но, похоже, это не загружает меня, когда я запускаю сборник рассказов
Всем привет! Похоже, что в последнее время в этом вопросе особо ничего не происходит. Если все еще есть вопросы, комментарии или ошибки, пожалуйста, продолжайте обсуждение. К сожалению, у нас нет времени разбираться в каждой проблеме. Мы всегда открыты для предложений, поэтому, если вы хотите помочь, отправьте нам запрос на включение. Неактивные вопросы будут закрыты через 30 дней. Благодаря!
Привет, это снова я! Я собираюсь закрыть эту проблему, чтобы помочь нашим сопровождающим сосредоточиться на текущей дорожной карте разработки. Если упомянутая проблема по-прежнему вызывает беспокойство, откройте новую заявку и укажите эту старую. Ура и спасибо за использование Storybook!
Привет, @omaracrystal, вот как я это сделал:
в файлы.storybook/config.js
добавьте импорт с правильными встроенными загрузчиками:import '!style-loader!css-loader!sass-loader!./scss-loader.scss';
Затем добавьте / импортируйте все нужные стили в файл
scss-loader.scss
:$font-path: '../projects/lib/src/theming/fonts/OpenSans/'; <strong i="14">@import</strong> '../projects/lib/src/theming/reset.scss'; <strong i="15">@import</strong> '../projects/lib/src/theming/main.scss'; html { font-family: $font-name; font-size: $font-size--small; }
Решение, предложенное @kroeder, работает до тех пор, пока вы используете компоненты из приложения Angular, но для библиотек вы не можете добавить свойство
styles
в файл angular.json
Это работает для всех? Не работает моя сторона :(
@ozanmanav вы пробовали импортировать его в .storybook/config.js
?
PS: потому что для меня это работает, но я импортирую только файл .css
без веб-загрузчиков
Похоже, это больше не работает с файловой структурой main.js в Storybook v5.3.
@garrettmaring вы пробовали использовать .storybook/preview.js
вместо .storybook/config.js
?
@garrettmaring
Наконец-то я заставил его работать для файлов .css
используя import '!style-loader!css-loader!./main.css'
.
Сначала я попытался поиграть с конфигурацией webpack, но удалил все свои собственные правила и встроил их, как указано выше. Очевидно npm устанавливает загрузчики.
@shilman да, это сработало 👍 Совершенно ясно, когда я увидел документацию по нему. В основной документации Storybook может быть место для более ясных документов. Я нашел эту статью ясной.
@garrettmaring Вы хотите отправить PR, чтобы помочь улучшить документы?
@garrettmaring
Наконец-то я заставил его работать для файлов.css
используяimport '!style-loader!css-loader!./main.css'
.
Сначала я попытался поиграть с конфигурацией webpack, но удалил все свои собственные правила и встроил их, как указано выше. Очевидно npm устанавливает загрузчики.
Просто к вашему сведению, что я только что понял, этот подход творит чудеса при локальном обслуживании сборника рассказов, но он не работает (из того, что я видел) с сборочным сборником рассказов.
Мое решение
Добавьте <link rel="stylesheet" href="./your-global-styles.css" />
в файл preview-head.html. Затем используйте флаг -s в каталоге your-global-styles.css
, скопируйте стили в каталог сборки сборника рассказов. Теперь iframe.html «должен» ссылаться на your-global-styles.css
из того же каталога.
Единственная проблема с этим заключается в том, что при локальном запуске консоль браузера сообщит, что не может найти localhost/your-global-styles.css
но все равно работает по назначению.
Если у кого-то есть лучший способ подойти к этому или знает правильное решение, дайте мне знать :)
мы обслуживаем scss-файлы в сборнике рассказов, используя следующее:
import '! style-loader! css-loader! sass-loader! ./ main.scss';
Это отлично работает для нас
@blemaire Где вы используете эту строчку?
@blemaire Где вы используете эту строчку?
@lopis просто создайте preview.js
в папке .storybook
и поместите в нее эту строку
Всем спасибо. Подтверждая, что
.storybook
(или в любое другое место, куда вы хотите его поместить)..storybook/preview.js
import '!style-loader!css-loader!sass-loader!./styles.scss';
в каталог preview.js
"css-loader"
как devDependency к package.json
у нас работает; Storybook icw библиотека Angular 9 (поэтому нет возможности добавить ее в файл angular.json
)
В настройке на основе nextjs простая строка от import "../styles/main.css";
(как в основном приложении) до .storybook/preview.js
правильно добавляет стили.
Вышеупомянутые решения работают, если все ваши пути являются относительными ../../src/main.scss
но в моем текущем проекте используется глобальный / псевдоним SCSS.
Моя конфигурация main.js
webpack для Storybook может компилировать псевдоним. Но когда я пытаюсь импортировать глобальный / псевдоним SCSS в свой preview.js
он не может разрешить пути.
Не уверен, куда идти.
import '!style-loader!css-loader!sass-loader!./scss-loader.scss';
Я пробовал это, но получаю ошибку. Мне нужен Storybook, чтобы знать о моих глобальных переменных CSS и миксинах.
ERR! import '!style-loader!css-loader!sass-loader!./scss-loader.scss';
ERR! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ERR!
ERR! SyntaxError: Unexpected string
В настройке на основе nextjs простая строка от
import "../styles/main.css";
(как в основном приложении) до.storybook/preview.js
правильно добавляет стили.
Содержит ли этот файл styles / main.css ваши глобальные переменные SCSS? Применяются ли они вообще в Storybook? Я пробовал это, но все равно получаю SassError: Undefined variable: $my-variable-here
Привет, @omaracrystal, вот как я это сделал:
в файлы.storybook/config.js
добавьте импорт с правильными встроенными загрузчиками:import '!style-loader!css-loader!sass-loader!./scss-loader.scss';
Затем добавьте / импортируйте все нужные стили в файл
scss-loader.scss
:$font-path: '../projects/lib/src/theming/fonts/OpenSans/'; <strong i="15">@import</strong> '../projects/lib/src/theming/reset.scss'; <strong i="16">@import</strong> '../projects/lib/src/theming/main.scss'; html { font-family: $font-name; font-size: $font-size--small; }
Решение, предложенное @kroeder, работает до тех пор, пока вы используете компоненты из приложения Angular, но для библиотек вы не можете добавить свойство
styles
в файл angular.jsonЭто работает для всех? Не работает моя сторона :(
Нет. Мне тоже не помогает. Теперь я получаю эту ошибку:
ERR! import '!style-loader!css-loader!sass-loader!./scss-loader.scss';
ERR! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ERR!
ERR! SyntaxError: Unexpected string
Опишите ошибку
Я пробовал несколько способов включить глобальные стили (scss) один раз для всех фреймов Storybook, но безуспешно. Кажется, нет четкого и лаконичного способа сделать это.Воспроизводить
Попытки:
- Импортируйте глобальные стили в каждый компонент.
- Результаты: стили применяются, но несколько стилей global.scss повторяются {story #} x раз.
- Следуйте инструкциям здесь для настраиваемой конфигурации веб-пакета: https://storybook.js.org/docs/configurations/custom-webpack-config/
- Результаты: Похоже, это только говорит Storybook читать scss, на самом деле не создает глобальный файл, который применяется ко всем историям
- В одном месте рекомендуют создать декоратор для Storybook и таким образом применить «глобальный» CSS.
- Результат: не работает для того, что я пытаюсь сделать (несколько стилей, миксинов, переменных и т. Д.). Это работает только для небольших изменений CSS.
- В конфигурации под .storybook require ('../ libs / storybook / global-styles.scss'); в функции loadStories
- Результат: ничего
- Пытался импортировать глобальные стили в Storybook index.ts
- Результат: ничего
Пытался добавить глобальные стили через файл angular.json
- Результат: ничего
Ожидаемое поведение
Я бы ожидал, что смогу импортировать глобальные (scss) файлы в одном месте, чтобы их можно было применить к каждому iframe истории. Мог ли быть параметр конфигурации, о котором я не знаю?Система:
- ОС: MacOS
- Устройство: Macbook Pro 2015
- Браузер: Chrome
- Фреймворк: угловой
- Аддоны: - [в центре аддона, аддон-область просмотра, аддон-информация]
- Версия: [^ 5.0.1]
Дополнительный контекст
Я надеюсь, что мне не хватает какой-то конфигурации в сборнике рассказов, которая упростила бы эту проблему.
Вы когда-нибудь решали эту проблему? Если да, то каково было решение? Благодаря!
@caseytrombley Решение - добавить import '!style-loader!css-loader!sass-loader!./styles.scss';
в файл preview.js.
Для Create React App + Storybook я добавил следующее в config.js
чтобы мой сброс CSS применился к Storybook.
import '!style-loader!css-loader!../src/reset.css';
У кого-нибудь есть решение, работающее для postcss-scss?
Вы можете прочитать блог, который я написал, в котором точно говорится о реализации констант SCSS для вашего сборника рассказов через настраиваемую конфигурацию webpack.
Есть дефект, который я зарегистрировал, объясняя текущую ошибку конфигурации https://github.com/storybookjs/storybook/issues/11052 и блог, который я написал в качестве обходного пути.
Надеюсь это поможет!
Для установок с main.js
(т.е. вы запустили npx -p @storybook/cli sb init
в проекте CreateReactApp) просто добавьте preview.js
в качестве родственного брата, а затем сделайте следующее:
// .storybook/preview.js
require('!style-loader!css-loader!../src/css/tailwind-utility-classes.css')
Если он жалуется, что один из этих загрузчиков не установлен (они должны быть установлены, если это проект CRA), просто установите их вручную (например, yarn add style-loader css-loader
).
Заблокировать ветку, чтобы люди могли просто перейти к нижней части для решения, когда решение, за которое проголосовали / устарело, дает сбой?
@garrettmaring вы пробовали использовать
.storybook/preview.js
вместо.storybook/config.js
?
Когда я создаю файл styles.css
внутри того же каталога и импортирую его с import './styles.css';
внутри моего файла preview.js
, мой сборник рассказов внезапно застревает в состоянии загрузки ... :(
Есть идеи, как это решить?
Я использую сборник рассказов с конфигурацией open-wc для веб-компонентов, и у меня есть preview.js
и main.js
внутри моей папки .storybook
.
@dcts, что может быть связано с тем, что ваш ./styles.css
ссылается на утилиты Tailwind, используя некоторые функции, которые необходимо предварительно обработать, или каким-то другим образом "сломан" как отдельный файл.
Мне нужно было сделать три вещи:
css/tailwind.css
куда я импортирую все, что нужно для моей настройки Tailwind.postcss css/tailwind.css -o css/index.css
.storybook/preview.js
(при необходимости создайте этот файл) добавьте import '../css/index.css
Я использую Twin, и я могу использовать этот компонент, как и ожидалось:
import tw, { styled } from 'twin.macro'
const StyledReactionButton = styled.button`
${tw`bg-blue-400 bg-opacity-25`}
`
Я думаю, что лучшим решением было бы отредактировать конфигурацию webpack сборника рассказов для обработки шага postcss.
Я использую Vue.js с scss. Моя проблема в том, что при импорте глобального scss в preview.js мои chrome devtolls работают очень медленно и непригодны для использования. У кого-нибудь такая же проблема? Есть альтернативы? Я стараюсь не импортировать глобальный scss в каждый из своих рассказов.
Вышеупомянутые решения работали определенным образом, но этот метод __ из официальных документов__ устраняет проблему во всем проекте.
Короче говоря, нам нужно расширить конфигурацию Webpack, чтобы установить загрузчики scss.
// .storybook/main.js
const path = require('path');
// Export a function. Accept the base config as the only param.
module.exports = {
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.
// Make whatever fine-grained changes you need
config.module.rules.push({
test: /\.scss$/,
use: ['style-loader', 'css-loader', 'sass-loader'],
include: path.resolve(__dirname, '../'),
});
// Return the altered config
return config;
},
};
Теперь вы можете импортировать scss-файлы как всегда в .storybook/preview.js
:
// .storybook/preview.js
import "../src/styles/main.scss";
// ...
... и даже в ваших компонентах:
<!-- src/components/MyComponent.vue -->
<template>
...
</template>
<script>
// ...
</script>
<style lang="scss">
<strong i="18">@import</strong> "../styles/components/components.my-component";
</style>
Я столкнулся с проблемой, когда импорт большого проекта SCSS из preview.js
вызывает 5+ секунд перекомпиляции при любом изменении чего-либо в проекте. Перенос этого в историю каким-то образом сокращает время перекомпиляции до <1 с ..
Я использую Storybook с Gatsby и стандартными предустановками scss . После импорта файла global.scss
в preview.js
стили подбираются, но если я определяю переменные в global.scss
и использую их в компоненте, возникает следующая ошибка:
ERROR in ./src/stories/button.scss (./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/stories/button.scss)
Module build failed (from ./node_modules/sass-loader/dist/cjs.js):
SassError: Undefined variable: "$black".
Я подозреваю, что файл global.scss загружается слишком поздно, но я не знаю, как его правильно настроить. Возможно, это даже ошибка, потому что добавление глобальных стилей в preview.js
- рекомендуемый метод.
Обновить
Это не порядок. Если я напишу в global.scss следующее.
body {
background-color: black;
}
и следующее в Button.scss:
body {
background-color:green;
}
Цвет фона на самом деле зеленый. Это означает, что Buttons.scss загружается после Global.scss, как и должен, но переменные по-прежнему не обрабатываются.
Решение
Да уж, сегодня я многому научился. Основная проблема заключалась в том, что переменные sass определены только в том файле, в котором они объявлены по умолчанию. Если вы хотите использовать переменные в файлах, вы должны использовать sass-модули. Старый способ заключался в использовании @import , но новый предпочтительный способ - @use. Я начинаю каждый модуль вроде button.scss
с @use pathtomodule/global.scss
. В моем случае это делает импорт в preview.js
избыточным.
Была еще одна загвоздка. @use в настоящее время поддерживается только dart sass. У меня был установлен node-sass ( npm i node-sass --save-dev
). Существует пакет под названием dart-sass
( npm i dart-sass --save-dev
), но он не подходит для ранее упомянутых пресетов. Dart sass превратился в обычную дерзость . Вы можете просто установить его с помощью npm i sass --save-dev
.
Привет @Piepongwong!
Я не использую Gatsby, но в Vue я решил эту проблему, поместив весь импорт миксинов и переменных в один файл с именем _common.scss
и импортируя его в такие компоненты:
<style lang="scss">
<strong i="9">@import</strong> 'path/to/styles/_common.scss';
<strong i="10">@import</strong> 'path/to/styles/components/_components.component.scss';
</style>
Таким образом, я всегда уверен, что мои миксины и переменные существуют, но имейте в виду, что вам нужно правильно абстрагировать все свои компоненты и переменные. Вы можете посмотреть на inuitcss лучшие практики.
Надеюсь это поможет.
Привет, @omaracrystal, вот как я это сделал:
в файлы.storybook/config.js
добавьте импорт с правильными встроенными загрузчиками:import '!style-loader!css-loader!sass-loader!./scss-loader.scss';
Затем добавьте / импортируйте все нужные стили в файл
scss-loader.scss
:$font-path: '../projects/lib/src/theming/fonts/OpenSans/'; <strong i="15">@import</strong> '../projects/lib/src/theming/reset.scss'; <strong i="16">@import</strong> '../projects/lib/src/theming/main.scss'; html { font-family: $font-name; font-size: $font-size--small; }
Решение, предложенное @kroeder, работает до тех пор, пока вы используете компоненты из приложения Angular, но для библиотек вы не можете добавить свойство
styles
в файл angular.jsonЭто работает для всех? Не работает моя сторона :(
не для меня :( Я пробовал использовать next.js и responsestrap, но он не загрузил app.scss из моей папки стилей: /
Привет, @omaracrystal, вот как я это сделал:
в файлы.storybook/config.js
добавьте импорт с правильными встроенными загрузчиками:import '!style-loader!css-loader!sass-loader!./scss-loader.scss';
Затем добавьте / импортируйте все нужные стили в файл
scss-loader.scss
:$font-path: '../projects/lib/src/theming/fonts/OpenSans/'; <strong i="16">@import</strong> '../projects/lib/src/theming/reset.scss'; <strong i="17">@import</strong> '../projects/lib/src/theming/main.scss'; html { font-family: $font-name; font-size: $font-size--small; }
Решение, предложенное @kroeder, работает до тех пор, пока вы используете компоненты из приложения Angular, но для библиотек вы не можете добавить свойство
styles
в файл angular.jsonЭто работает для всех? Не работает моя сторона :(
не для меня :( Я пробовал использовать next.js и responsestrap, но он не загрузил app.scss из моей папки стилей: /
Попробуйте способ @hayatbiralem - он должен работать.
Это сработало для меня в последней версии сборника рассказов @storybook/[email protected]
Надеюсь, это кому-то поможет!
// .storybook/main.js
const path = require('path');
module.exports = {
"stories": [
"../stories/**/*.stories.mdx",
"../stories/**/*.stories.@(js|jsx|ts|tsx)",
"../app/frontend/components/**/*.stories.@(js|jsx|ts|tsx)"
],
"addons": [
"@storybook/addon-links",
"@storybook/addon-essentials",
'@storybook/preset-scss'
],
webpackFinal: async (config) => {
// this sets the default path for modules
config.resolve.modules = [
...(config.resolve.modules || []),
path.resolve(__dirname, "../app/frontend"),
];
config.module.rules.map(rule => {
if (rule.test instanceof RegExp && rule.test.toString() === '/\\.s[ca]ss$/') {
rule.use.push({
loader: require.resolve('sass-resources-loader'),
options: {
resources: [
path.resolve(__dirname, '../app/frontend/styles/base/_variables.scss')
]
}
})
}
return rule
})
return config;
},
}
Самый полезный комментарий
Привет, @omaracrystal, вот как я это сделал:
в файлы
.storybook/config.js
добавьте импорт с правильными встроенными загрузчиками:Затем добавьте / импортируйте все нужные стили в файл
scss-loader.scss
:Решение, предложенное @kroeder, работает до тех пор, пока вы используете компоненты из приложения Angular, но для библиотек вы не можете добавить свойство
styles
в файл angular.json