λ΄ μ ν리μΌμ΄μ μ΄ Semantic UI, Bootstrap λ±κ³Ό κ°μ μΌλΆ CSS νλ μ μν¬λ₯Ό κΈ°λ°μΌλ‘νλ€κ³ κ°μ ν΄ λ³΄κ² μ΅λλ€. κ΅¬μ± μμκ° μ¬λ°λ₯΄κ² νμλλλ‘ μ€ν 리 λΆμ ν΄λΉ μ€νμΌμ μ½κ² ν΅ν© ν μμλ λ°©λ²μ 무μμ λκΉ?
λ€, κ·Έλ μ΅λλ€. μ¬κΈ°μμ μ½μΌμΈμ-https: //github.com/kadirahq/react-storybook/blob/master/docs/setting-up-for-css.md
λλ λΉμ μ΄ νμν κ²μ΄ μλλλ€.
UPD 2017-08-17 (@hypnos)
https://storybook.js.org/configurations/add-custom-head-tags/
λ§ν¬κ° λμ΄μ Έ νμ¬ λ§μ€ν°μ νμΌμμ μ°Ύμ μ μμ΅λλ€.
μ΄κ²μ νμΈνμμμ€ : https://getstorybook.io/docs/configurations/custom-webpack-config
UPD 2017-08-17 (@hypnos)
https://storybook.js.org/configurations/custom-webpack-config/
κ°μ¬. λ μ¬μ΄ λ°©λ²μ ".storybook"λλ ν 리μ head.html νμΌμ μΆκ°νλ κ²μ λλ€. λΆνΈ μ€νΈλ© λλ μλ§¨ν± UI μ© μμ
UPD 2017-08-17 (@hypnos)
μ΄μ preview_head.html
κ°μ¬ν©λλ€. head.html λ©μλκ° μλ²½νκ² μλν©λλ€!
μΆκ°νλ €λ νμΌμ΄ URLμ ν΅ν΄ μ 곡λμ§ μκ³ λμ λ‘μ»¬λ‘ νΈμ€ν λλ κ²½μ° head.htmlμ΄ κ°μ₯ μ’μ λ°©λ²μΌκΉμ? μ΄λ»κ² μλν κΉμ?
λ λ§ν¬κ° λͺ¨λ λμ΄μ‘μ΅λλ€.
λ§ν¬κ° κΉ¨μ Έμ μ£μ‘ν©λλ€. μ΄κ²μ λΆννλ ꡬ쑰 μ‘°μ μ κ²°κ³Όμ λλ€. μ°Ύμ μμλ μ μΌν λ°©λ²μ κ²μμ λλ€.
@kirkstrobeckμ λν΄ λ¬΄μμ μ°Ύκ³ νμλκΉ ? μ΄ λ¬Έμ λ λ§€μ° μ€λλμμΌλ©° μ’
κ²°λμμ΅λλ€.
νΉμ λ¬Έμ κ°μλ κ²½μ° λμμ λ릴 μ μμ΅λλ€. π.
λͺ¨λ μ€νμΌμ΄ app/assets/stylesheets
scss νμΌμμλ μ€μ μ ν리μΌμ΄μ
μ React Storybookμ ν΅ν©νλ λ°©λ²μ μμ보기 μν΄ μ¬κΈ°μ μμ΅λλ€.
μΉν© ꡬμ±μ νμ₯νκ³ μ¬μ©μ μ§μ μΉν© ꡬμ±μ μ 곡ν΄μΌν©λλ€.
κ·Έ μμ .scss
νμΌλ‘ 무μμν΄μΌνλμ§ webpackμ μλ €μ€μΌν©λλ€. μΌλͺ
sass-loader
λ₯Ό μΆκ°ν΄μΌν©λλ€.
μ΄λ―Έ μ±μ λν μ€μ μ΄ μ΄λ―Έ μκ³ λλΆλΆμ μΉν© ꡬμ±μμ 볡μ¬νμ¬ λΆμ¬ λ£μ μ μμ΅λκΉ?
λ¬Έμμμ μ°Ύμ μ μμ΅λλ€ : https://storybook.js.org/configurations/default-config/#css -support
@arunoda μμμ νμ ν μΌκ΅΄μ νΌλμ€λ½κ²νλ λ λ§ν¬ μλ₯Ό μ κ±° ν μ μμ΅λκΉ? λμ€μμ΄ νμ΄μ§λ₯Ό μ λ ₯νλ λ€λ₯Έ μ¬μ©μλ₯Ό μν΄ μκ°μ μ μ½ ν μ μμ΅λλ€. κ°μ¬!
νΌλμ€λ¬μ΄ λ°μμΌλ‘ μΆ©λΆν κ²μ λλ€. λλ κ·Έλ€μ μ°¬μ±νλ€.
μ€λλ λ§ν¬λ‘ λκΈμ μ λ°μ΄νΈνμ΅λλ€.
μ΄μΌκΈ° μ±
μ ν€λ νμΌμ preview-head.html
μ°Έμ‘° :
https://storybook.js.org/configurations/add-custom-head-tags/
λ΄ "κΈ°λ³Έ"μ± λ΄μμ λ΄ μ μ μ€νμΌμ λͺ¨λ μ μ CSS κ·μΉμ ν¬ν¨νλ ν
νλ¦Ώ λ¬Έμμ΄μ λ΄λ³΄λ΄λ JS νμΌ λ΄μ μ μλ©λλ€.
μ€ν λ¦¬κ° λ λλ§λλ iframeμ CSS μ μκ°μλ ν
νλ¦Ώ λ¬Έμμ΄μ μΆκ°νλ λ°©λ²μ΄ μμ΅λκΉ?
νΈμ§νλ€:
react-styled-componentsλ₯Ό μ¬μ©νκ³ μκΈ° λλ¬Έμ μ΄μ injectGlobal
λμ°λ―Έλ₯Ό μ¬μ©νκ³ μμ΅λλ€.
@flavordaaave config.jsμ μ€νμΌ νκ·Έμ μ€νμΌμ μ½μ νκΈ° λ§νλ©΄λ©λλ€.
@ndelangen μ§κΈκΉμ§ μ μ μ€νμΌ ( import './styles.css';
λλ preview-head.html
λ₯Ό ν΅ν΄) μ½μ
μ λͺ¨λ κ°λ₯μ±μ λμ λ§€κ° λ³μλ‘ μ€νμΌμ μ½μ
νλ κ²μ νμ©νμ§ μμ΅λλ€.
λ΄ μ€νμΌμ λ€μκ³Ό κ°μ΅λλ€.
/* .storybook/config.js */
import theme from './theme'
export default `
html {
font-family: Helvetica;
background: ${theme.canvas_ground};
...
}
`
κ·Έλμ μ§κΈμ μμ νΈμ§ μμ μΈκΈνλ―μ΄ react-styled-components
μ injectGlobal
λμ°λ―Έλ₯Ό μ¬μ©νκ³ μμ΅λλ€.
/* .storybook/config.js */
...
import { injectGlobal } from 'styled-components'
import styles from '../src/styles'
injectGlobal`${styles}`
...
λ€μκ³Ό κ°μ΄ λΉμ·ν κ²°κ³Όλ₯Ό μ»μ μ μμ΅λλ€.
// create a <style></style> DOM element
const styleElement = document.createElement('style')
// put the text from styles variable between opening and closing <style> tags
styleElement.appendChild(document.createTextNode(styles))
// place the style element inside <head>
document.head.appendChild(styleElement)
μλ
!
λ΄ μ€νμΌ μνΈλ₯Ό Storybookμ μ°κ²°νλ €κ³ νλλ° λμ λλλ€.
μ΄ μ§μΉ¨ μ λ°λΌ import '../static/style.css';
μ€μ μ¬μ© νμ¬ λ΄ CSS νμΌ (νλ‘μ νΈ λ£¨νΈμ static/style.css
μ μμ)μ κ°μ Έ μμ΅λλ€. κ·Έ κ²°κ³Ό rμ μ€λ₯κ° λ°μνμ΅λλ€.
Error: Can't resolve '../i/link.svg' in [path]
μ€νμΌ μνΈμ λͺ¨λ μΈλΆ μ°Έμ‘° 리μμ€λ₯Ό μ‘°μ νκΈ° μν΄μ΄ λͺ¨λ
μ΄ λ¬Έμ λΉ preview-head.html
μΆκ°νμ¬ μ€νμΌ μνΈλ₯Ό λ€μκ³Ό κ°μ΄ μ°κ²°νμ΅λλ€.
<link rel="stylesheet" href="./static/style.css" />
κ·Έλ¬λ μ΄λ‘ μΈν΄ 리μμ€μ 404 μ€λ₯κ° λ°μν©λλ€. λλ _ μκ° _ κ·Έκ²μ λ¨μ§ κ²½λ‘ λ¬Έμ μΌ μ μμ§λ§ Storybookμ΄ μ€νλλ μμΉμ κ΄λ ¨νμ¬ μ΄λ€ κ²½λ‘λ₯Ό μ¬μ© ν΄μΌνλμ§ μ°Ύμ μ μμ΅λλ€. μ΄λ€ μμ΄λμ΄?
CSSκ° CDNμ μκΈ° λλ¬Έμ 404κ° λ°μνλ κ²½μ° μΆκ° λ§€κ° λ³μλ₯Ό μ λ¬νμ¬ μ μ ν΄λλ‘ Storybookμ μ€ννκ³ νμΌμ ./some.css
λ‘ μ°Έμ‘° ν μ μμ΅λλ€. storybook -p 9001 -s ./a-static-folder
μ€ννκ³ ν΄λΉ ν΄λμ CSSλ₯Ό λ£μΌμμμ€.
μ μ ν΄ μ£Όμ
μ κ°μ¬ν©λλ€, @nickytonline. λΆννλ κ·Έκ²μ μλνμ§ μλ κ² κ°μ΅λλ€. λλ λ΄ νμΌμ΄ static/style.css
λλ λͺ
λ Ήμ μ€ν storybook -p 9001 -s ./static
. κ·Έ κ²°κ³Ό storybook: command not found
. npm run storybook -p 9001 -s ./static
μ€ννμ§λ§ μ¬μ ν λ΄ μ€νμΌ μνΈμ 404 μ€λ₯κ° λ°μνμ΅λλ€.
@bradfrost , μ€λͺ
μ μν΄ npm run storybook -p 9001 -s ./static
λ₯Ό μ€νν λ ./static
λ μ€ν 리 λΆμμ /
μ²λΌ μλνλ―λ‘ νμΌμ΄ νλ‘μ νΈμ static/styles.css
μλ κ²½μ° κ·νμ λ§ν¬λ <link rel="stylesheet" href="./styles.css" />
μλ <link rel="stylesheet" href="./static/styles.css" />
@nickytonline λ€, <link rel="stylesheet" href="./styles.css" />
λ‘ μ°κ²°λμμ΅λλ€.
@bradfrost μ΄κ²μ κ·Έκ²μ΄ λΉμ μ μν΄ μλνμ§ μλλ€λ κ²μ <link />
νκ·Έλ₯Ό ν΅ν΄ μ°Έμ‘°λλ μ€ν 리 λΆμμ μ¬μ©λλ μ μ μμ°μ μλ₯Ό 보μ¬μ€λλ€. https://github.com/nickytonline/for-brad μμ μ¬μ©ν μ μμ΅λλ€.
https://github.com/nickytonline/for-brad/blob/master/.storybook/preview-head.html#L1 μμ μ°Έμ‘°λλ μ€νμΌ μνΈλ₯Ό λ³Ό μ μμ΅λλ€.
@nickytonline λ°λͺ¨ νλ‘μ νΈμ κ°μ¬λ립λλ€! μ λ§ κ°μ¬.
λ΄κ° μ¬μ ν κ²ͺκ³ μλ λ¬Έμ λ νλ‘μ νΈμ μ€νμΌμ κ°μ Έ μ€κΈ° μν΄ import
λ₯Ό μ¬μ©νλ μλ κ²μλ¬Όμ λ°μλμ΄ μμ΅λλ€. μ΄ λ°©λ²μ λΆννλ κΈκΌ΄, μμ΄μ½ λλ λ°°κ²½ μ΄λ―Έμ§μ κ°μ μμ°μ΄ ν΄κ²°λμ§ μμΌλ©΄ μ€λ₯κ° λ°μν©λλ€. λλ κ·Έκ²μ κ³ μΉ μμλ λ°©λ²μ΄ μλ€λ κ²μ μκ³ μμ§λ§, λλ λ¨μ§ λ΄ λ¬Έμμ 머리μμλ μ€νμΌ μνΈλ₯Ό μμ λ°©μμΌλ‘ μ°κ²°νλ €κ³ νλ κ² κ°λ€.
μ£μ‘ν©λλ€. μλ κ²μλ¬Ό μ μ 체 μ½ν μΈ λ₯Ό ν‘μνμ§ λͺ»ν΄μ μ£μ‘ν©λλ€. λ¦¬κ° λ§λ‘€ μ νΌνκ³ μΆλ€λ©΄ κ·Έκ²μ κ½€ νΌν΄μ λλ€. κ·Έκ²μ λν΄ μ‘°κΈ μκ°ν΄μΌ ν κ²μ λλ€.
ν μμλ μΌμ λ£¨νΈ ν΄λμ '곡μ©'ν΄λλ₯Ό λ§λλ κ²μ
λλ€.
'public / semantic'ν΄λμμ 'node_modules / semantic-ui-css'μ λ΄μ©μ νμ€νΈν©λλ€.
package.json => μ€ν¬λ¦½νΈ => μ€ν 리 λΆ => ''-s ./public "μΆκ°
λ§μ§λ§ κ²!!! κ΅¬μ± μμ .less νμΌμμ @import '/semantic/semantic.min.css';
μ΄μ μμ΄μ½μ΄ μννκ² μλν©λλ€.
Storybook v5 λ° normalize.css
"framework"μ κ²½μ° .storybook/config.js
νμΌμ import "normalize.css";
λ§ μΆκ°νλ©΄λ©λλ€.
@jmarceli κ·Έκ²μ λλ₯Ό μν΄ μλν©λλ€, λ§μ΄ κ°μ¬ν©λλ€!
v6μμλ μ¬μ ν μ€ν κ°λ₯ν μ΅μ μ λκΉ?
Storybook v5 λ°
normalize.css
"framework"μ κ²½μ°.storybook/config.js
νμΌμimport "normalize.css";
λ§ μΆκ°νλ©΄λ©λλ€.
@snyderhaus μ,νμ§λ§ 5.3 config.js
λΆν°λ μννΈ μ¬μ© μ€λ¨λμμΌλ©° λμ preview.js
λ₯Ό μ¬μ©νλ κ²μ΄ μ’μ΅λλ€. λ λ§μ μ 보:
https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#to -mainjs-configuration
λλ μλ§μ νλ‘μ νΈλ₯Ό μν΄μ΄ μ€λ λμ μ¬λ¬ λ² μμ΅λλ€! κ·Έλμ μ΄κ²μ λ΄ μμ κ³Ό λ€λ₯Έ μ¬λμμν κ²μ λλ€.
μ΄κ²μ λλ₯Ό μν΄ μΌνμ΅λλ€.
// storybook/config.js
import 'semantic-ui-css/semantic.min.css';
import 'bootstrap/dist/css/bootstrap.css';
import '!style-loader!css-loader!sass-loader!../client/scss/style.scss';
λ΄ style.scss
μ sass λ³μλ₯Ό μ¬μ©νμ¬ κΈ°λ³Έ λΆνΈ μ€νΈλ© ν
λ§λ₯Ό μ¬μ μν©λλ€.
λλ μ΄μΌκΈ° μ±
κΈ°λ³Έ μΉν© μ€μ μ μ¬μ©νκ³ λ¨μ§ μΆκ° λ΄ μ© μΈλΌμΈ λ‘λ ꡬ문μ μ¬μ©νμ¬, κ·Έλμ κ°μ μ€νμΌ μνΈλ₯Ό μ°Έμ‘° ν μ μμλ€ sass
μ κ°μ΄ νμΌμ μλ νλ‘μΈμμ .
"babel-core": "6.26.0",
"babel-loader": "7.1.4",
"@storybook/react": "^5.3.14",
"sass-loader": "^8.0.2",
"css-loader": "^3.4.2",
"style-loader": "0.20.3",
"react": "^16.3.2",
v6 μ΄μμ μ¬μ©νλ μ¬λμκ²λ config.js
μ¬μ©νλ μ루μ
μ΄ μλνμ§ μμ΅λλ€.
λλ κ·Έκ²μ κ·Έλ κ² μλνκ² λ§λ€μμ΅λλ€.
.storybook
ν΄λμ preview.js
νμΌμ λ§λλλ€.// .storybook/preview.js
import '!style-loader!css-loader!sass-loader!@company/framework/src/styles.sass'
import '!style-loader!css-loader!sass-loader!./cssoverrides.sass'
λ λ²μ§Έ κ°μ Έ μ€κΈ°λ μΌλΆ κΈ°λ³Έ μ μ μ€νμΌμ μ¬μ μνκΈ° μν΄ μΆκ°λμμ΅λλ€.
λ΄ ν΄λ ꡬ쑰 :
.storybook
β cssoverrides.sass
β main.js
β preview.js
μ¬μ© λ ν¨ν€μ§ :
"@storybook/react": "^6.0.0",
"react": "^16.13.1",
"@babel/core": "^7.11.1",
"@babel/preset-env": "^7.11.0",
"@babel/preset-react": "^7.10.4",
"sass-loader": "^9.0.3",
"css-loader": "^4.2.1",
"style-loader": "^1.2.1"
λλ₯Ό μν΄ μΌν κ²μ ./storybook/preview.jsμμ λΆνΈ μ€νΈλ©μ κ°μ Έ μ€λ κ²μ΄ μμ΅λλ€.
//I added this:
import 'bootstrap-4-grid/css/grid.min.css';
//this was already there
export const parameters = {
actions: { argTypesRegex: '^on[A-Z].*' },
};
https://storybook.js.org/docs/react/configure/styling-and-css#importing -css-files
κ°μ₯ μ μ©ν λκΈ
λ¬Έμμμ μ°Ύμ μ μμ΅λλ€ : https://storybook.js.org/configurations/default-config/#css -support