ãã°ã説æãã
ç§ã¯ãã¹ãŠã®StorybookIframeã«å¯ŸããŠã°ããŒãã«ã¹ã¿ã€ã«ïŒscssïŒãçµã¿èŸŒãè€æ°ã®æ¹æ³ãäžåºŠè©ŠããŸãããã倱æããŸããã ãããè¡ãããã®æ確ã§ç°¡æœãªæ¹æ³ã¯ãªãããã§ãã
åçŸããã«ã¯
è©Šã¿ïŒ
äºæ³ãããè¡å
ãã¹ãŠã®ã¹ããŒãªãŒã®Iframeã«é©çšã§ããããã«ãã°ããŒãã«ïŒscssïŒãã¡ã€ã«ã1ãæã«ã€ã³ããŒãã§ãããšæåŸ
ããŠããŸãã ç§ãç¥ããªãèšå®èšå®ãããã§ããããïŒ
ã·ã¹ãã ïŒ
è¿œå ã®ã³ã³ããã¹ã
ãããç°¡åã«è§£æ±ºã§ããã¹ããŒãªãŒããã¯å
ã®æ§æãæ¬ èœããŠããããšãé¡ã£ãŠããŸãã
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ã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ããŒãã³ãã䜿çšããŠããéãæ©èœããŸãããã©ã€ãã©ãªã®å Žåãangular.jsonãã¡ã€ã«ã«styles
ããããã£ãè¿œå ããããšã¯ã§ããŸããã
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ã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ããŒãã³ãã䜿çšããŠããéãæ©èœããŸãããã©ã€ãã©ãªã®å Žåãangular.jsonãã¡ã€ã«ã«
styles
ããããã£ãè¿œå ããããšã¯ã§ããŸããã
ããã¯çã®ããã«åããŠããŸããïŒ ç§ã®åŽã§åããŠããªã:(
@ozanmanav .storybook/config.js
ã€ã³ããŒãããŠã¿ãŸãããïŒ
PSïŒç§ã«ãšã£ãŠã¯æ©èœããŸãããwebpack-loadersãªãã§.css
ãã¡ã€ã«ã ããã€ã³ããŒãããããã§ã
ããã¯ãStorybookv5.3ã®main.jsãã¡ã€ã«æ§é ã䜿çšããŠæ©èœããªããªã£ãããã§ãã
@garrettmaringããªããããããšããªãã£ã.storybook/preview.js
ã§ã¯ãªã.storybook/config.js
ïŒ
@garrettmaring
ç§ã¯ã€ãã«import '!style-loader!css-loader!./main.css'
ã䜿çšããŠ.css
ãã¡ã€ã«ã§åäœããããã«ãªããŸããã
æåã¯webpackconfigãããã£ãŠã¿ãŸããããã«ã¹ã¿ã ã«ãŒã«ããã¹ãŠåé€ããäžèšã®ããã«ã€ã³ã©ã€ã³åããŸããã æããã«ãnpmã¯ããŒããŒãã€ã³ã¹ããŒã«ããŸãã
@shilmanã¯ãããã®èšäºã¯æ確ã ãšæããŸããã
@garrettmaringããã¥ã¡ã³ãã®æ¹åã«åœ¹ç«ã€PRãæåºããããšãã
@garrettmaring
ç§ã¯ã€ãã«import '!style-loader!css-loader!./main.css'
ã䜿çšããŠ.css
ãã¡ã€ã«ã§åäœããããã«ãªããŸããã
æåã¯webpackconfigãããã£ãŠã¿ãŸããããã«ã¹ã¿ã ã«ãŒã«ããã¹ãŠåé€ããäžèšã®ããã«ã€ã³ã©ã€ã³åããŸããã æããã«ãnpmã¯ããŒããŒãã€ã³ã¹ããŒã«ããŸãã
ç§ãã¡ããã©ç解ããã»ãã®äžéšã®åèãŸã§ã«ããã®ã¢ãããŒãã¯ã¹ããŒãªãŒããã¯ãããŒã«ã«ã§æäŸãããšãã«äžæè°ã«æ©èœããŸããããã«ãã¹ããŒãªãŒããã¯ã§ã¯ïŒç§ãèŠããã®ããïŒæ©èœããŸããã
ç§ã®è§£æ±ºç
<link rel="stylesheet" href="./your-global-styles.css" />
ãpreview-head.htmlã«è¿œå ããŸãã 次ã«ã your-global-styles.css
ã®ãã£ã¬ã¯ããªã§-sãã©ã°ã䜿çšããŠãã¹ã¿ã€ã«ãã¹ããŒãªãŒããã¯ã®ãã«ããã£ã¬ã¯ããªã«ã³ããŒããŸãã ããã§ãiframe.htmlã¯åããã£ã¬ã¯ããªããyour-global-styles.css
ãåç
§ããå¿
èŠããããŸãã
ããã«é¢ããå¯äžã®åé¡ã¯ãããŒã«ã«ã§å®è¡ããŠããå Žåã§ãããã©ãŠã¶ã³ã³ãœãŒã«ã¯localhost/your-global-styles.css
ãèŠã€ãããªããšè¡šç€ºããŸãããããã§ãæå³ãããšããã«æ©èœããŸãã
誰ããããã«ã¢ãããŒãããããè¯ãæ¹æ³ãæã£ãŠããããé©åãªè§£æ±ºçãç¥ã£ãŠãããªããç§ã«ç¥ãããŠãã ãã:)
以äžã䜿çšããŠãã¹ããŒãªãŒããã¯ã§scssãã¡ã€ã«ãæäŸããŸãã
import 'ïŒstyle-loaderïŒcss-loaderïŒsass-loaderïŒ./ main.scss';
ããã¯ç§ãã¡ã«ãšã£ãŠã¯ããŸããããŸã
@blemaireã©ãã§ãã®è¡ã䜿çšããŠããŸããïŒ
@blemaireã©ãã§ãã®è¡ã䜿çšããŠããŸããïŒ
@lopisã¯.storybook
ãã©ã«ããŒã«preview.js
ãäœæãããã®è¡ããã®äžã«å
¥ããŸãã
ã¿ããªãããããšãã ããã確èªãã
.storybook
ïŒãŸãã¯é
眮ãããå ŽæïŒã«è¿œå ããŸãã.storybook/preview.js
äœæããpreview.js
ãã£ã¬ã¯ããªã«import '!style-loader!css-loader!sass-loader!./styles.scss';
ãè¿œå ããpackage.json
devDependencyãšããŠ"css-loader"
ãè¿œå ããŸãç§ãã¡ã®ããã«åããŸãã storybook icw Angular 9ã©ã€ãã©ãªïŒãããã£ãŠã angular.json
ãã¡ã€ã«ã«è¿œå ãããªãã·ã§ã³ã¯ãããŸããïŒ
nextjsããŒã¹ã®ã»ããã¢ããã§ã¯ãïŒã¡ã€ã³ã¢ããªã®ããã«ïŒ import "../styles/main.css";
ãã.storybook/preview.js
åçŽãªè¡ã§ãã¹ã¿ã€ã«ãæ£ããè¿œå ãããŸãã
äžèšã®ãœãªã¥ãŒã·ã§ã³ã¯ããã¹ãŠã®ãã¹ãçžå¯Ÿçãª../../src/main.scss
å Žåã«æ©èœããŸãããçŸåšã®ãããžã§ã¯ãã§ã¯SCSSã°ããŒãã«/ãšã€ãªã¢ã¹ã䜿çšããŠããŸãã
Storybookã®main.js
webpackæ§æã§ããšã€ãªã¢ã¹ãã³ã³ãã€ã«ã§ããŸãã ããããã°ããŒãã«/ãšã€ãªã¢ã¹SCSSãpreview.js
ã€ã³ããŒãããããšãããšããã¹ã解決ã§ããŸããã
ã©ãã«è¡ãã°ããã®ãããããªãã
import '!style-loader!css-loader!sass-loader!./scss-loader.scss';
ãããè©ŠããŸãããããšã©ãŒãçºçããŸããã ã°ããŒãã«ãªCSSå€æ°ãšããã¯ã¹ã€ã³ã«ã€ããŠç¥ãã«ã¯Storybookãå¿ èŠã§ãã
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å€æ°ãå«ãŸããŠããŸããïŒ ãããã¯ã¹ããŒãªãŒããã¯ã«é©çšãããŸããïŒ ç§ã¯ãããè©ŠããŸããããããã§ã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ã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ããŒãã³ãã䜿çšããŠããéãæ©èœããŸãããã©ã€ãã©ãªã®å Žåãangular.jsonãã¡ã€ã«ã«
styles
ããããã£ãè¿œå ããããšã¯ã§ããŸãããããã¯çã®ããã«åããŠããŸããïŒ ç§ã®åŽã§åããŠããªã:(
ãããã ç§ãå©ãã«ã¯ãªããŸããã ç§ã¯ä»ãã®ãšã©ãŒãåãåããŸãïŒ
ERR! import '!style-loader!css-loader!sass-loader!./scss-loader.scss';
ERR! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ERR!
ERR! SyntaxError: Unexpected string
ãã°ã説æãã
ç§ã¯ãã¹ãŠã®StorybookIframeã«å¯ŸããŠã°ããŒãã«ã¹ã¿ã€ã«ïŒscssïŒãçµã¿èŸŒãè€æ°ã®æ¹æ³ãäžåºŠè©ŠããŸãããã倱æããŸããã ãããè¡ãããã®æ確ã§ç°¡æœãªæ¹æ³ã¯ãªãããã§ããåçŸããã«ã¯
è©Šã¿ïŒ
- åã³ã³ããŒãã³ãå ã®ã°ããŒãã«ã¹ã¿ã€ã«ãã€ã³ããŒãããŸãã
- çµæïŒã¹ã¿ã€ã«ãé©çšãããŸãããè€æ°ã®global.scssã¹ã¿ã€ã«ã{storyïŒ} xåç¹°ãè¿ãããŸãã
- ã«ã¹ã¿ã Webpackæ§æã«ã€ããŠã¯ããã¡ãã®æ瀺ã«åŸã£ãŠãã ããïŒ
- çµæïŒããã¯Storybookã«scssãèªã¿åãããã«æ瀺ããã ãã§ãããå®éã«ã¯ãã¹ãŠã®ã¹ããŒãªãŒã«é©çšãããã°ããŒãã«ãã¡ã€ã«ãèšå®ããŠããªãããã§ãã
- ããå Žæã§ã¯ãStorybookã®ãã³ã¬ãŒã¿ãäœæãããã®æ¹æ³ã§ãã°ããŒãã«ãCSSãé©çšããããšããå§ãããŸãã
- çµæïŒç§ãããããšããŠããããšïŒè€æ°ã®ã¹ã¿ã€ã«ãããã¯ã¹ã€ã³ãå€æ°ãªã©ïŒã§ã¯æ©èœããŸããããã¯å°ããªCSSã®å€æŽã«å¯ŸããŠã®ã¿æ©èœããŸã
- .storybook requireïŒ '../ libs / storybook / global-styles.scss'ïŒ;ã®äžã®èšå®ã§ loadStoriesé¢æ°å
- çµæïŒäœããããŸãã
- Storybookindex.tså ã®ã°ããŒãã«ã¹ã¿ã€ã«ãã€ã³ããŒãããããšããŸãã
- çµæïŒäœããããŸãã
angle.jsonãã¡ã€ã«ãä»ããŠã°ããŒãã«ã¹ã¿ã€ã«ãè¿œå ããããšããŸãã
- çµæïŒäœããããŸãã
äºæ³ãããè¡å
ãã¹ãŠã®ã¹ããŒãªãŒã®Iframeã«é©çšã§ããããã«ãã°ããŒãã«ïŒscssïŒãã¡ã€ã«ã1ãæã«ã€ã³ããŒãã§ãããšæåŸ ããŠããŸãã ç§ãç¥ããªãèšå®èšå®ãããã§ããããïŒã·ã¹ãã ïŒ
- OSïŒMacOS
- ããã€ã¹ïŒMacbook Pro 2015
- ãã©ãŠã¶ïŒChrome
- ãã¬ãŒã ã¯ãŒã¯ïŒAngular
- ã¢ããªã³ïŒ-[ã¢ããªã³äžå¿ãã¢ããªã³ãã¥ãŒããŒããã¢ããªã³æ å ±]
- ããŒãžã§ã³ïŒ[^ 5.0.1]
è¿œå ã®ã³ã³ããã¹ã
ãããç°¡åã«è§£æ±ºã§ããã¹ããŒãªãŒããã¯å ã®æ§æãæ¬ èœããŠããããšãé¡ã£ãŠããŸãã
ããã解決ããããšã¯ãããŸããïŒ ãããããªãã解決çã¯äœã§ãããïŒ ããããšãïŒ
@caseytrombley解決çã¯ãpreview.jsã«import '!style-loader!css-loader!sass-loader!./styles.scss';
ãè¿œå ããããšã§ãã
Create React App + Storybookã®å ŽåãCSSãªã»ãããStorybookã«é©çšããããã«ã以äžãconfig.js
ã«è¿œå ããŸããã
import '!style-loader!css-loader!../src/reset.css';
postcss-scssã§æ©èœãããœãªã¥ãŒã·ã§ã³ãæã£ãŠãã人ã¯ããŸããïŒ
ã«ã¹ã¿ã webpackconfigãä»ããŠã¹ããŒãªãŒããã¯ã«SCSSå®æ°ãããã°ãèªãããšãã§ããŸãã
çŸåšã®æ§æã®ãã°https://github.com/storybookjs/storybook/issues/11052ãšåé¿çãšããŠæžããããã°ã説æããããã«ãã°ã«èšé²ããæ¬ é¥ããããŸãã
ã圹ã«ç«ãŠãã°ïŒ
main.js
ã€ã³ã¹ããŒã«ã®å ŽåïŒã€ãŸããCreateReactAppãããžã§ã¯ãã§npx -p @storybook/cli sb init
ããå ŽåïŒãå
åŒãšããŠpreview.js
ãè¿œå ãã次ã®ããã«ããŸãã
// .storybook/preview.js
require('!style-loader!css-loader!../src/css/tailwind-utility-classes.css')
ãããã®ããŒããŒã®1ã€ãã€ã³ã¹ããŒã«ãããŠããªããšæå¥ãèšãå ŽåïŒCRAãããžã§ã¯ãã®å Žåã¯ã€ã³ã¹ããŒã«ãããŠããã¯ãã§ãïŒãæåã§ã€ã³ã¹ããŒã«ããŸãïŒã€ãŸãã yarn add style-loader css-loader
ïŒã
ã¹ã¬ãããããã¯ããŠãè³æ/éæšå¥šã®ãœãªã¥ãŒã·ã§ã³ã倱æãããšãã«ã人ã ããœãªã¥ãŒã·ã§ã³ã®ããã«äžçªäžã«ãžã£ã³ãã§ããããã«ããŸããïŒ
@garrettmaringããªããããããšããªãã£ã
.storybook/preview.js
ã§ã¯ãªã.storybook/config.js
ïŒ
ç§ãäœæããå Žåstyles.css
ãšåããã£ã¬ã¯ããªå
ã®ãã¡ã€ã«ããããããã€ã³ããŒãimport './styles.css';
ç§ã®å
åŽã®preview.js
ãã¡ã€ã«ãç§ã®ç©èªã¯çªç¶ã¡ããã©è² è·ç¶æ
ã§ç«ã¡åŸçããŠãã... :(
ããã解決ããæ¹æ³ã¯ãããŸããïŒ
ç§ã¯Webã³ã³ããŒãã³ãã®open-wcæ§æã§ã¹ããŒãªãŒããã¯ã䜿çšããŠ.storybook
ãã©ã«ããŒå
ã«preview.js
ãšmain.js
ãã¡ã€ã«ããããŸãã
@dctsã¯ã ./styles.css
ãTailwindãŠãŒãã£ãªãã£ãåç
§ããŠããããååŠçãå¿
èŠãªããã€ãã®æ©èœã䜿çšããŠãããããŸãã¯ä»ã®æ¹æ³ã§ã¹ã¿ã³ãã¢ãã³ãã¡ã€ã«ãšããŠãå£ããŠãããããšãåå ã§ããå¯èœæ§ããããŸãã
ç§ã¯3ã€ã®ããšãããå¿ èŠããããŸããïŒ
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`}
`
ããè¯ã解決çã¯ãpostcssã¹ããããåŠçããããã«ã¹ããŒãªãŒããã¯ã®webpackæ§æãç·šéããããšã ãšæããŸãã
ç§ã¯scssã§Vue.jsã䜿çšããŠããŸãã ç§ã®åé¡ã¯ãpreview.jsã«ã°ããŒãã«scssãã€ã³ããŒããããšããç§ã®chrome devtollsãéåžžã«é ãã䜿çšã§ããªãããšã§ãã åãåé¡ãæ±ããŠãã人ã¯ããŸããïŒ ä»£æ¿æ¡ã¯ãããŸããïŒ ç§ã¯èªåã®ã¹ããŒãªãŒã®ããããã«ã°ããŒãã«scssãã€ã³ããŒãããªãããã«ããŠããŸãã
äžèšã®è§£æ±ºçã¯ããæå³ã§æ©èœããŸãããããã®æ¹æ³ã¯__å ¬åŒããã¥ã¡ã³ããã__ãããžã§ã¯ãå šäœã®åé¡ãæé€ããŸãã
ã€ãŸããscssããŒããŒãèšå®ããããã«Webpackæ§æãæ¡åŒµããå¿ èŠããããŸãã
// .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>
preview.js
ããããªãã®SCSSãããžã§ã¯ããã€ã³ããŒããããšããããžã§ã¯ãå
ã®äœãã«å€æŽãå ãããš5ç§ä»¥äžã®åã³ã³ãã€ã«æéãçºçãããšããåé¡ãçºçããŸããã ãããã¹ããŒãªãŒã«ç§»ããšãã©ãããããããã¹ãŠã1ç§æªæºã®åã³ã³ãã€ã«æéã«æ»ããŸãã
ç§ã¯ã®ã£ãããŒãšæšæºã®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-modulesã䜿çšããå¿
èŠããããŸãã 以åã®æ¹æ³ã¯@importã䜿çšããããšã§ããããæ°ããæšå¥šãããæ¹æ³ã¯@useã§ãã button.scss
ãããªãã¹ãŠã®ã¢ãžã¥ãŒã«ã@use pathtomodule/global.scss
ãŸãã ç§ã®å Žåãããã«ããpreview.js
ã®ã€ã³ããŒããåé·ã«ãªããŸãã
å¥ã®ãã£ããããããŸããã @useã¯çŸåšã npm i node-sass --save-dev
ïŒã dart-sass
ïŒ npm i dart-sass --save-dev
ïŒãšããããã±ãŒãžããããŸãããããã¯åè¿°ã®ããªã»ããã®æ£ããããã±ãŒãžã§ã¯ãããŸããã ããŒããµã¹ã¯ã¬ã®ã¥ã©ãŒãµã¹ã«ãªããŸããã npm i sass --save-dev
ç°¡åã«ã€ã³ã¹ããŒã«ã§ããŸãã
ããã«ã¡ã¯@Piepongwong ã
ç§ã¯Gatsbyã䜿çšããŠããŸããããVueã§ããã¹ãŠã®ããã¯ã¹ã€ã³ãšå€æ°ã®ã€ã³ããŒãã_common.scss
ãšããååã®1ã€ã®ãã¡ã€ã«ã«å
¥ããŠã次ã®ãããªã³ã³ããŒãã³ãã«ã€ã³ããŒããããšããåé¡ã解決ããŸããã
<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ã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ããŒãã³ãã䜿çšããŠããéãæ©èœããŸãããã©ã€ãã©ãªã®å Žåãangular.jsonãã¡ã€ã«ã«
styles
ããããã£ãè¿œå ããããšã¯ã§ããŸãããããã¯çã®ããã«åããŠããŸããïŒ ç§ã®åŽã§åããŠããªã:(
ç§ã®ããã§ã¯ãããŸãã:(ç§ã¯next.jsãšreactstrapã§è©ŠããŸããããç§ã®ã¹ã¿ã€ã«ãã©ã«ããŒãã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ã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ããŒãã³ãã䜿çšããŠããéãæ©èœããŸãããã©ã€ãã©ãªã®å Žåãangular.jsonãã¡ã€ã«ã«
styles
ããããã£ãè¿œå ããããšã¯ã§ããŸãããããã¯çã®ããã«åããŠããŸããïŒ ç§ã®åŽã§åããŠããªã:(
ç§ã®ããã§ã¯ãããŸãã:(ç§ã¯next.jsãšreactstrapã§è©ŠããŸããããç§ã®ã¹ã¿ã€ã«ãã©ã«ããŒãã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ã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ããŒãã³ãã䜿çšããŠããéãæ©èœããŸãããã©ã€ãã©ãªã®å Žåãangular.jsonãã¡ã€ã«ã«
styles
ããããã£ãè¿œå ããããšã¯ã§ããŸããã