Storybook: 단일 μŠ€ν† λ¦¬κ°€ λ‹€λ₯Έ λͺ¨λ“  μŠ€ν† λ¦¬μ˜ μŠ€νƒ€μΌ μ‹œνŠΈλ₯Ό λŒμ–΄ 듀이고 μžˆμŠ΅λ‹ˆκΉŒ?

에 λ§Œλ“  2017λ…„ 03μ›” 21일  Β·  67μ½”λ©˜νŠΈ  Β·  좜처: storybookjs/storybook

μ•ˆλ…•ν•˜μ„Έμš”,

λ‚˜λŠ”μ΄ νŠΉλ³„ν•œ λ¬Έμ œκ°€ μ™œ λ°œμƒν•˜λŠ”μ§€ μ•Œμ•„ λ‚΄λ €κ³  λ…Έλ ₯ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. λ‹€μŒκ³Ό 같은 μŠ€ν† λ¦¬λ₯Ό λ™μ μœΌλ‘œλ‘œλ“œν•©λ‹ˆλ‹€.

function loadStories() {
    const req = require.context('../components', true, /story.js$/);
    req.keys().forEach(filename => req(filename));
}
configure(loadStories, module);

각 story.js νŒŒμΌμ—λŠ” κ°€μ Έ μ˜€λŠ” 각각의 sass λ˜λŠ” css 파일이 μžˆμŠ΅λ‹ˆλ‹€ ( story.js κ°€ κ°€μ Έμ˜¬ ꡬ성 μš”μ†Œ μ™ΈλΆ€μ—μžˆλŠ” μŠ€ν† λ¦¬ νŠΉμ • μŠ€νƒ€μΌμ˜ λͺ©μ μ„ μœ„ν•΄ λ‹€μŒμ„ ν‘œμ‹œν•˜κΈ° μœ„ν•΄).

import './story.sass';

ν˜„μž¬ μ•½ 4 개의 μŠ€ν† λ¦¬κ°€ 있으며 이것이 각 μŠ€ν† λ¦¬ iframe의 μ†ŒμŠ€μž…λ‹ˆλ‹€. λͺ¨λ“  μŠ€νƒ€μΌ μ‹œνŠΈλ₯Όλ‘œλ“œν•©λ‹ˆλ‹€.

screen shot 2017-03-21 at 9 56 22 am

이게 정상적인 ν–‰λ™μΈκ°€μš” ...?

-

데λͺ¨

https://github.com/moimikey/729-single-stories-pulling-all-stylesheets

bug todo

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

μŠ€ν† λ¦¬ μ£Όμœ„μ— 그림자 뿌리λ₯Ό 두면 @ndelangen 의 μ„±λŠ₯ 문제

λͺ¨λ“  67 λŒ“κΈ€

λ˜ν•œ webpack은 λͺ¨λ“  이야기λ₯Ό λ‚΄ λ³΄λƒ…λ‹ˆλ‹€. κ·Έλž˜μ„œ webpack을 μ–΄λ–»κ²Œ κ΅¬μ„±ν–ˆλŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€.

screen shot 2017-03-21 at 11 27 10 am

λ‚˜λŠ” λ°μ½”λ ˆμ΄ν„°λ„ μ‚¬μš©ν•˜λ €κ³ ν–ˆλŠ”λ°, 적어도 μΆ”κ°€ μŠ€νƒ€μΌ μ‹œνŠΈλ₯Ό μŠ€ν† λ¦¬μ— 뢄리 ν•  수 β€‹β€‹μžˆμ—ˆκΈ° λ•Œλ¬Έμ—μ΄ 뢀뢄이 절반으둜 κΉ¨μ‘ŒμŠ΅λ‹ˆλ‹€.

.addDecorator((getStory) => {
  require('./story.sass');
  return getStory();
})

νŠΈμœ— λ‹΄μ•„ κ°€κΈ°

ν₯λ―Έ λ‘­κ΅°μš”!, 이것을 λ³΄μ—¬μ£ΌλŠ” μ €μž₯μ†Œκ°€ μžˆμŠ΅λ‹ˆκΉŒ?

@ndelangen 이 곧 λ§Œλ“€ κ²ƒμž…λ‹ˆλ‹€.

아직도 이걸 확인할 μ‹œκ°„μ„ μ°ΎλŠ” 쀑 ..

κ³ λ§ˆμ›Œμš”; D 이상 ν•΄μš”. λ‚˜λŠ” 그것을 λ³΄μ•˜μ§€λ§Œ μ–΄λ””μ„œλΆ€ν„° μ‹œμž‘ν•΄μ•Όν• μ§€ λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

κ·Έλž˜μ„œ λ‚΄κ°€ μƒκ°ν•˜λŠ” 것은 λͺ¨λ“  CSS 파일이 webpack μŠ€νƒ€μΌ λ‘œλ”μ— μ˜ν•΄ μ„ νƒλ˜μ–΄ ν—€λ“œμ— μ£Όμž…λœλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. μ‚¬μš© 여뢀에 관계없이

κ·ΈλŸ¬λ‚˜ κ³ μΉ˜λŠ” 방법?

CSSλ₯Ό μœ„ν•΄ μ œκ°€ ν•œ 일은 CSS λͺ¨λ“ˆμ„ μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 생성 된 클래슀 이름을 λ‚΄ JS둜 κ°€μ Έμ˜΅λ‹ˆλ‹€. λͺ¨λ“  CSSκ°€ ν—€λ“œμ— ν•¨κ»˜ μ‚½μž… λ˜λ”λΌλ„ 고유 ν•œ 클래슀 / μ„ νƒμžκ°€ 보μž₯λ˜λ―€λ‘œ μ€‘μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

그것은 당신이 κ°€μ§€κ³ μžˆλŠ” μ •ν™•ν•œ 문제λ₯Ό μ‹€μ œλ‘œ ν•΄κ²°ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 이것이 μŠ€νƒ€μΌ λ‘œλ”μ˜ μ˜λ„ 된 λ™μž‘μ΄λΌκ³  μƒκ°ν•©λ‹ˆλ‹€.

이것은 μ‚¬μ‹€μž…λ‹ˆλ‹€. i (그리고 우리 νšŒμ‚¬)λŠ” CSS둜 λ²”μœ„λ₯Ό μ§€μ •ν•˜κ³  μžˆμ§€λ§Œ μ—„μ²­λ‚œ μ½”λ“œ μž¬κ°œλ°œμ„ μˆ˜ν–‰ν•˜κ³  μžˆμœΌλ―€λ‘œ μŠ€νƒ€μΌμ„ κ³΅μœ ν•˜λ―€λ‘œ styleName 및 className μžˆμŠ΅λ‹ˆλ‹€. κ²°κ΅­ μŠ€ν† λ¦¬ 뢁에 영ν–₯을 λ―ΈμΉ˜λŠ” 것은 "μ™ΈλΆ€"CSS νŒŒμΌμž…λ‹ˆλ‹€.

λ§₯μ£Όλ₯Ό λ§ˆμ‹œκ³ μ΄ 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 방법, κ΅¬ν˜„ ν˜„λͺ…ν•œ 방법을 μ•Œμ•„ λ‚Έ ν›„ 였늘 λ°€ λ‹€μ‹œ μŠ€ν† λ¦¬ 뢁 μ½”λ“œλ₯Ό μ‚΄νŽ΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

@moimikey λ¬Έμ œμ— λŒ€ν•΄ μŠ€νƒ€μΌ λ‘œλ”λ₯Ό κ±΄λ„ˆ λ›°κ³  λ°μ½”λ ˆμ΄ν„°λ₯Ό μ‚¬μš©ν•˜μ—¬ μˆ˜λ™μœΌλ‘œ CSS νŒŒμΌμ„λ‘œλ“œν•΄μ•Όν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. μ•„λ§ˆλ„ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

.addDecorator(getStory => (
  <div>
    <link ... />
    {getStory()}
  </div>
))

μ™€μš° .... λ‚΄ λ§ˆμŒμ„ λ„˜μ–΄μ„  적이 μ—†λŠ”λ° ... μ‹œλ„ν•΄ λ³Όκ²Œμš”.

ickν•˜μ§€λ§Œ λ‹€μ‹œ sass ... x_xλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. λ‚˜λŠ” 심지어 인라인 μš”κ΅¬λ₯Ό μ‹œλ„ν–ˆλ‹€. ν•˜μ§€λ§Œ μš΄μ΄λ³„λ‘œ μ—†μ—ˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜λ„ κ³§λ°”λ‘œ CSS에 λŒ€ν•œ ν›Œλ₯­ν•œ μ†”λ£¨μ…˜μ΄ 될 κ²ƒμž…λ‹ˆλ‹€ :)

κ·Έλž˜μ„œ @mnmtanish. λ‹Ήμ‹ μ˜μ§€λ„μ— κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€. λ‚˜λŠ” λ‹Ήμ‹ μ˜ 영감으둜 λ‚΄ 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.

.addDecorator((getStory) => {
  require('./story.sass');
  return getStory();
})

mmm 이제 μœ μΌν•œ λ¬Έμ œλŠ” μŠ€ν† λ¦¬μ—μ„œ μŠ€ν† λ¦¬λ‘œ 이동할 λ•Œ μŠ€νƒ€μΌμ΄ μŒ“μ΄λŠ” κ²ƒμž…λ‹ˆλ‹€.

μŠ€νƒ€μΌ λ‘œλ”λŠ” 제거 ν•  수 μžˆλ„λ‘ HEAD μ΄μ™Έμ˜ λ‹€λ₯Έ μœ„μΉ˜μ— μ‚½μž…ν•˜λ„λ‘ ꡬ성 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” μ΄κ²ƒμ„ν•˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— 그것이 κ°€λŠ₯ν•œμ§€ ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이것듀 을 ν™•μΈν•˜μ‹­μ‹œμ˜€.

μ»΄ν¬λ„ŒνŠΈλ₯Ό μ™„μ „νžˆ 격리 된 μƒνƒœλ‘œλ‘œλ“œν•˜μ—¬ ν˜„μž¬ μ„ νƒν•œ μŠ€ν† λ¦¬μ™€ κ΄€λ ¨λœ JavaScript / CSS 만 μ‹€ν–‰ν•˜λŠ” 것이 React μŠ€ν† λ¦¬ 뢁의 μ±…μž„μ΄ μ•„λ‹™λ‹ˆκΉŒ?

https://github.com/storybooks/react-storybook/issues/686 κ³Ό 관련이

@ConneXNL 예. 쒋은 지적. 이것은 μ‚¬μ‹€μž…λ‹ˆλ‹€ ...; X

@mnmtanish λ¬Όλ‘  λ‚΄ λ‹€μŒ 응닡은 λ‹€λ₯Έ 문제둜 μ΄μ–΄μ§‘λ‹ˆλ‹€. insertAt λŠ” 유용 ν•  수 μžˆμ§€λ§Œ μ΅œμ‹  λ²„μ „μ˜ style-loader μ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. [email protected] μŠ€ν† λ¦¬ 뢁은 μ—¬μ „νžˆ 0.x μžˆμŠ΅λ‹ˆλ‹€. μš°λ¦¬κ°€ μ‚¬μš©ν•  μˆ˜μžˆλŠ” μ΅œμ‹  버전은 [email protected] . : (...

μ•ˆλ…•ν•˜μ„Έμš” @moimikey μ•„λ§ˆλ„ μ•ŒνŒŒ λ¦΄λ¦¬μŠ€μ—μ„œ λ§ˆμ§€λ§‰μœΌλ‘œ μ–ΈκΈ‰ ν•œ μ ‘κ·Ό 방식을 μ‹œλ„ν•΄ λ³Ό 수 μžˆμŠ΅λ‹ˆκΉŒ?

μŠ€ν† λ¦¬λ₯Ό μ „ν™˜ ν•  λ•Œ μƒˆ iframe μš”μ†Œλ₯Ό λ§Œλ“œλŠ” 것이 더 λ‚«κ±°λ‚˜ μ•ˆμ „ν•˜μ§€ μ•ŠμŠ΅λ‹ˆκΉŒ?

μ•ˆμ „ν•˜κ³  μ„±λŠ₯에도 쒋지 μ•ŠμŠ΅λ‹ˆλ‹€.

μƒˆλ‘œμš΄ iframe은 μžλ°” 슀크립트λ₯Ό νŒŒμ‹±ν•˜κ³ , CSSλ₯Ό νŒŒμ‹±ν•˜κ³ , postmessage-channel에 μ—°κ²°ν•˜κ³ , μ›Ή μ†ŒμΌ“μ— λ‹€μ‹œ μ—°κ²°ν•˜λŠ” λ“± 더 λ§Žμ€ κ²ƒλ“€μ„ν•΄μ•Όν•©λ‹ˆλ‹€.

μŠ€ν† λ¦¬ μŠ€μœ„μΉ˜μ—μ„œ <style> μš”μ†Œλ₯Ό μ œκ±°ν•˜λ©΄μ΄ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

λ¬Όλ‘  κΈ€λ‘œλ²Œ μŠ€νƒ€μΌμ΄μ—†κ³  λͺ¨λ“  것이 μ μ ˆν•˜κ²Œ λ„€μž„ μŠ€νŽ˜μ΄μŠ€κ°€ μ§€μ •λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 이것은 λͺ…λ°±ν•œ λ¬Έμ œκ°€ μ•„λ‹™λ‹ˆλ‹€. λ‚΄κ°€ μƒκ°ν•˜κΈ°μ— 희망찬 생각. πŸ˜ƒ

λˆ„κ΅°κ°€κ°€ μœ„μ˜ μ§„μˆ μ΄ κ±°μ§“μž„μ„ 증λͺ…ν•  수 μžˆκ±°λ‚˜ 뢀정적인 κ²°κ³Όκ°€ μ—†μŒμ„ μž…μ¦ ν•  수 μžˆλ‹€λ©΄, λͺ¨λ‘ κ·€μž…λ‹ˆλ‹€!

였늘 λͺ‡ 가지 ν…ŒμŠ€νŠΈλ₯Όν–ˆμŠ΅λ‹ˆλ‹€. λ°μ½”λ ˆμ΄ν„° νŒ¨ν„΄μ΄ 잘 μž‘λ™ν•˜μ—¬ μŠ€ν† λ¦¬λ‘œ μ „ν™˜ ν•œ 후에 만 β€‹β€‹μŠ€νƒ€μΌμ΄ μ‚½μž…λ©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μŠ€ν† λ¦¬λ₯Ό μ „ν™˜ ν•  λ•Œ μŠ€νƒ€μΌμ΄ μ œκ±°λ˜μ§€ μ•ŠλŠ” λ™μΌν•œ λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” λ°μ½”λ ˆμ΄ν„°μ—μ„œ μŠ€νƒ€μΌμ„ μ œκ±°ν•˜λ©΄μ„œ λ†€μ•˜μ§€λ§Œ ν•„μš”ν•œ μŠ€νƒ€μΌμ΄ ν•œ 번만 적용된 것 κ°™μŠ΅λ‹ˆλ‹€. require ()λ₯Ό λ‹€μ‹œ 트리거 ν•  수 μžˆμŠ΅λ‹ˆκΉŒ? singleton : falseλ₯Ό μ‚¬μš©ν•΄ λ³΄μ•˜μ§€λ§Œ λ¬Έμ œκ°€ ν•΄κ²°λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 이것을 μ œμ•ˆν•˜λŠ” 것을 거의 μ£Όμ €ν•˜μ§€λ§Œ μ›ΉνŒ© μΊμ‹œλ₯Ό νŒŒμ—΄ ν•΄ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
https://webpack.github.io/docs/api-in-modules.html#advanced

이것은 μ›ΉνŒ© 1 λ¬Έμ„œμ΄μ§€λ§Œ μ—¬μ „νžˆ μž‘λ™ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

아이디어 : μŠ€ν† λ¦¬λ₯Ό μ „ν™˜ ν•  λ•Œ λͺ¨λ“  <style>...</style> λ₯Ό μ œκ±°ν•˜λŠ” λ°μ½”λ ˆμ΄ν„°λ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν˜„μž¬ μŠ€ν† λ¦¬μ™€ κ΄€λ ¨μ΄μ—†λŠ” μŠ€νƒ€μΌμ„ μ •λ¦¬ν•©λ‹ˆλ‹€.

거의 λ‹€ μ™”μ–΄μš”. webpack κ΅¬μ„±μ—μ„œ λ‚˜λŠ”
'style-loader/useable' instead of 'style-loader',

μž‘μ—… ν•  APIκ°€ μΆ”κ°€λ©λ‹ˆλ‹€. .use ()λŠ” μŠ€νƒ€μΌμ„ μΆ”κ°€ν•˜κ³  unuse ()λŠ” μŠ€νƒ€μΌμ„ μ œκ±°ν•©λ‹ˆλ‹€. λ‚΄ 이야기 β€‹β€‹νŒŒμΌμ—μ„œ λ‹€μŒκ³Ό 같은 λ°μ½”λ ˆμ΄ν„°λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

.addDecorator((c) => <ReactStylesheet stylesheets={[require('./stories.scss')]}>{ c() }</ReactStylesheet> )

λ‹€μŒ React Componentλ₯Ό μ‚¬μš©ν•˜μ—¬ μŠ€νƒ€μΌμ„ μΆ”κ°€ν•˜κ³  μ œκ±°ν•˜μ‹­μ‹œμ˜€.

import * as React from 'react';

export class ReactStylesheet extends React.Component{

    componentWillUnmount(){
        let stylesheets = Array.isArray(this.props.stylesheets) ? this.props.stylesheets : [this.props.stylesheets];
        stylesheets.forEach((stylesheet) => {
            console.log("Unmounting....");
            stylesheet.unuse();
        });

    }

    componentDidMount(){
         let stylesheets = Array.isArray(this.props.stylesheets) ? this.props.stylesheets : [this.props.stylesheets];
        stylesheets.forEach((stylesheet) => {
            console.log("Mounting....");
            stylesheet.use();
        });
    }

    render(){
        return this.props.children;
    }
}

μŠ€νƒ€μΌ μ‹œνŠΈλ₯Ό μ˜¬λ°”λ₯΄κ²Œ λ³€κ²½ν•˜λ©΄ μŠ€νƒ€μΌμ΄ λ‹€μ‹œλ‘œλ“œλ©λ‹ˆλ‹€. λ‹€λ₯Έ μŠ€ν† λ¦¬λ‘œ μ „ν™˜ν•˜λ©΄ unuse ()κ°€ 호좜되고 μŠ€νƒ€μΌ μ‹œνŠΈκ°€ μ •λ¦¬λ©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μŠ€νƒ€μΌ μ‹œνŠΈμ˜ λΉ„ hrm μ—…λ°μ΄νŠΈ 버전을 κ΄‘κ³ ν•˜κΈ° λ•Œλ¬Έμ— μŠ€νƒ€μΌμ„ λ‹€μ‹œ μΆ”κ°€ν•˜λ©΄ λ©”μ„œλ“œκ°€ μ€‘λ‹¨λ©λ‹ˆλ‹€. κ·Έ 후에 λ³€κ²½ν•˜λ©΄ λ‹€μŒ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

Uncaught (in promise) TypeError: Cannot read property 'refs' of undefined
    at update (webpack:///./~/style-loader/addStyles.js?:63:4)
    at eval (webpack:///./src/Component/stories.scss?:32:4)
    at Object.hotApply [as apply] (http://dev.test:6006/static/preview.bundle.js:499:14)
    at cb (webpack:///(webpack)-hot-middleware/process-update.js?:52:36)
    at eval (webpack:///(webpack)-hot-middleware/process-update.js?:68:13)
    at <anonymous>

μ΅œμ‹  HRM 버전을 가리 킀도둝 require 문을 μ—…λ°μ΄νŠΈν•˜λŠ” 방법을 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

ν™˜μƒμ μΈ μˆ˜μ‚¬ μž‘μ—…! λ‚˜λŠ” 전에 이와 같은 것을 λ‘˜λŸ¬ λ³΄μ•˜μ§€λ§Œ 찾을 수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€.

@ConneXNL 을 돕기 μœ„ν•΄

μ†”λ£¨μ…˜μ΄ κ°€κΉŒμ›Œμ§€κ³  μžˆμŠ΅λ‹ˆλ‹€. stylesheet.use() 및 unuse 에 λŒ€ν•œ μ•„μ΄λ””μ–΄λŠ” λ‚˜μ—κ²Œ λ‚―μ„  κ²ƒμ΄μ—ˆμ§€λ§Œ μ˜¬λ°”λ₯Έ λ°©ν–₯으둜 κ°€κ³ μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

이것은 μƒŒλ“œ λ°•μ‹± μŠ€ν† λ¦¬ 뢁 https://github.com/Wildhoney/ReactShadow의 또 λ‹€λ₯Έ ν₯미둜운 μ μž…λ‹ˆλ‹€.

μ•ˆλ…•ν•˜μ„Έμš” μ—¬λŸ¬λΆ„! 졜근이 λ¬Έμ œμ—μ„œ λ§Žμ€ 일이 μΌμ–΄λ‚˜μ§€ μ•Šμ€ 것 κ°™μŠ΅λ‹ˆλ‹€. μ—¬μ „νžˆ 질문, 의견 λ˜λŠ” 버그가 있으면 토둠을 κ³„μ†ν•˜μ‹­μ‹œμ˜€. μ•ˆνƒ€κΉκ²Œλ„ λͺ¨λ“  문제λ₯Ό λ‹€λ£° μ‹œκ°„μ΄ μ—†μŠ΅λ‹ˆλ‹€. μš°λ¦¬λŠ” 항상 기여에 μ—΄λ € μžˆμœΌλ―€λ‘œ 도움이 ν•„μš”ν•˜λ©΄ ν’€ μš”μ²­μ„ λ³΄λ‚΄μ£Όμ‹­μ‹œμ˜€. λΉ„ν™œμ„± λ¬Έμ œλŠ” 60 일 후에 λ§ˆκ°λ©λ‹ˆλ‹€. 감사!

@ConneXNL 이이 문제λ₯Ό λ§ˆλ¬΄λ¦¬ν•˜κΈ° μœ„ν•΄μ΄ μ μ—μ„œ λ¬Έμ„œλ₯Ό κ°œμ„ ν•˜λŠ” 데 도움을 쀄 수 μžˆλ‹€κ³  μƒκ°ν•˜μ‹­λ‹ˆκΉŒ?

쒋은 μž₯μ†Œλ₯Ό 찾을 수 μ—†λ‹€λ©΄ 마크 λ‹€μš΄ ν˜•μ‹μœΌλ‘œ μ–΄λ”˜κ°€μ— 꽂아 λ‘μ„Έμš”. λ‚΄κ°€ λ„£μ–΄ μ€„κ²Œ.

πŸ™‡

μ•ˆλ…•ν•˜μ„Έμš” μ—¬λŸ¬λΆ„! 졜근이 λ¬Έμ œμ—μ„œ λ§Žμ€ 일이 μΌμ–΄λ‚˜μ§€ μ•Šμ€ 것 κ°™μŠ΅λ‹ˆλ‹€. μ—¬μ „νžˆ 질문, 의견 λ˜λŠ” 버그가 있으면 토둠을 κ³„μ†ν•˜μ‹­μ‹œμ˜€. μ•ˆνƒ€κΉκ²Œλ„ λͺ¨λ“  문제λ₯Ό λ‹€λ£° μ‹œκ°„μ΄ μ—†μŠ΅λ‹ˆλ‹€. μš°λ¦¬λŠ” 항상 기여에 μ—΄λ € μžˆμœΌλ―€λ‘œ 도움이 ν•„μš”ν•˜λ©΄ ν’€ μš”μ²­μ„ λ³΄λ‚΄μ£Όμ‹­μ‹œμ˜€. λΉ„ν™œμ„± λ¬Έμ œλŠ” 60 일 후에 λ§ˆκ°λ©λ‹ˆλ‹€. 감사!

μ•ˆλ…•, 또 λ‚˜μ•Ό! 이 문제λ₯Ό λ§ˆλ¬΄λ¦¬ν•˜μ—¬ κ΄€λ¦¬μžκ°€ λŒ€μ‹  ν˜„μž¬ 개발 λ‘œλ“œλ§΅μ— 집쀑할 수 μžˆλ„λ‘ν•˜κ² μŠ΅λ‹ˆλ‹€. μ–ΈκΈ‰ 된 λ¬Έμ œκ°€ μ—¬μ „νžˆ μš°λ €λ˜λŠ” 경우 μƒˆ 티켓을 열고이 이전 티켓을 μ–ΈκΈ‰ν•˜μ‹­μ‹œμ˜€. μŠ€ν† λ¦¬ 뢁을 μ‚¬μš©ν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€!

μ—¬κΈ°μ„œλ„ 같은 문제인 μŠ€ν† λ¦¬ 뢁은 각 μŠ€ν† λ¦¬λ₯Ό λΆ„λ¦¬ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ μ‹œκ°μ  ν…ŒμŠ€νŠΈ / 승인 ν…ŒμŠ€νŠΈμ— μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

μŠ€ν† λ¦¬ μ£Όμœ„μ— 그림자 뿌리λ₯Ό 두면 @ndelangen 의 μ„±λŠ₯ 문제

@bennypowers ν₯λ―Έ λ‘­μŠ΅λ‹ˆλ‹€! 그것을 λ‹¬μ„±ν•˜λŠ” 방법에 λŒ€ν•œ μ½”λ“œ μƒ˜ν”Œμ΄ μžˆμŠ΅λ‹ˆκΉŒ? πŸ™‡

@shilman μ—κ²Œλ„

μ•ˆλ…•ν•˜μ„Έμš”. 이 λ¬Έμ œλ„ λ°œμƒν•©λ‹ˆλ‹€.
이 λ¬Έμ œκ°€ ν•΄κ²°λ˜μ—ˆκ±°λ‚˜ ν•΄κ²° 방법이 μžˆμŠ΅λ‹ˆκΉŒ?

λΏ‘λΏ‘

μ—¬κΈ°μ„œ κ°€μž₯ λΉ λ₯Έ λ§Œμ‘±λ„λŠ” ReactShadow λ₯Ό μ‚¬μš© ν•˜λΌλŠ” @moimikey 의 μ œμ•ˆ 일 κ²ƒμž…λ‹ˆλ‹€.

μ·¨ν•  μ „λž΅μ€ ReactShadow ꡬ성 μš”μ†Œμ— 루트λ₯Ό λž˜ν•‘ ν•œ λ‹€μŒ adoptedStyleSheets (λ˜λŠ” μ§€μ›λ˜μ§€ μ•ŠλŠ” λΈŒλΌμš°μ €μ˜ 경우 <style> μš”μ†Œ)둜 μŠ€νƒ€μΌμ„ κ°€μ Έ μ˜€λŠ” κ²ƒμž…λ‹ˆλ‹€.

https://github.com/storybookjs/storybook/blob/ba74d889fcfd87849a6ae9369f5e4176e8149d33/lib/core/src/client/preview/start.js#L253

이 문제λ₯Ό λ‹€μ‹œμ—¬μ‹­μ‹œμ˜€.이 문제둜 인해 μŠ€ν† λ¦¬λ³„λ‘œ μ‚¬μš©μž 지정 μŠ€νƒ€μΌμ„ μΆ”κ°€ν•˜λŠ” 것이 맀우 μ–΄λ ΅μŠ΅λ‹ˆλ‹€. μ˜ˆμ œμ— λŒ€ν•œ μ‚¬μš©μž 지정 μŠ€νƒ€μΌμ„ κ΅¬ν˜„ν•˜λŠ” μ™„μ „νžˆ 뢄리 된 MDX μŠ€ν† λ¦¬κ°€ 있으며 λͺ¨λ“  μŠ€ν† λ¦¬μ˜ λͺ¨λ“  μŠ€νƒ€μΌμ„ μ „μ—­ 적으둜 ν¬ν•¨ν•˜λ©΄μ΄ μ‚¬μš© 사둀λ₯Ό μœ μ§€ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

νŽΈμ§‘ : κ°μ‚¬ν•©λ‹ˆλ‹€ !!!

2020 λ…„ 3 μ›” 21 μΌκΉŒμ§€μ΄ λ¬Έμ œκ°€ ν•΄κ²°λ˜κΈ°λ₯Ό λ°”λžλ‹ˆλ‹€.

@moimikey 이 일에 관심이

IMOμ—μ„œλŠ” μŠ€νƒ€μΌ μ‹œνŠΈ μ „μš© κΈ°λŠ₯을 μΆ”κ°€ν•˜λŠ” λŒ€μ‹  맀개 λ³€μˆ˜ λ˜λŠ” μ• λ“œμ˜¨μ„ μΆ”κ°€ν•˜μ—¬μ΄ κΈ°λŠ₯을 μ²˜λ¦¬ν•΄μ•Όν•©λ‹ˆλ‹€. μŠ€νƒ€μΌ μ‹œνŠΈμ™€ μŠ€ν¬λ¦½νŠΈκ°„μ— μΌκ΄€μ„±μ—†λŠ” λ™μž‘μ΄ λ°œμƒν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ "격리"κ°€ μ–΄λ–»κ²Œλ˜μ–΄μ•Όν•˜λŠ”μ§€ κ³ λ €ν•  μ’‹μ€μ‹œκΈ°μΌκΉŒμš”?

λ‚˜λŠ” 그것이 κ°€λŠ₯ν•œμ§€ κΆκΈˆν•΄ν•˜λŠ” μ• λ“œμ˜¨ μ ‘κ·Ό 방식에 λŒ€ν•œ λΉ λ₯Έ PoCλ₯Ό μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€.
https://github.com/pocka/storybook-addon-css

@pocka 당신은 ꡉμž₯ν•©λ‹ˆλ‹€! πŸ’―

yazzzzz. 건배 @pocka

mdx-js / mdx # 894 λ•Œλ¬Έμ— MDX μŠ€ν† λ¦¬λ₯Ό μ‚¬μš©ν•˜λŠ” 경우 @pocka 의 μ†”λ£¨μ…˜μ΄ μž‘λ™ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 점에 μ£Όλͺ©ν•  κ°€μΉ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€.

νŽΈμ§‘ : λ‚΄ λ‚˜μœ, ν™•μ‹€νžˆ κ·Έλ ‡μŠ΅λ‹ˆλ‹€! μŠ€νƒ€μΌ λ‘œλ” 1.x +κ°€ μžˆμ–΄μ•Όν•˜λ©° λ‹€μŒκ³Ό κ°™μ΄ν•΄μ•Όν•©λ‹ˆλ‹€.

--- a/components/grid/GridChild.stories.mdx
+++ b/components/grid/GridChild.stories.mdx
@@ -1,7 +1,9 @@
 import { Meta, Story, Preview } from '@storybook/addon-docs/blocks';
 import { GridContainer, GridRow, GridChild } from './';
 import '../../shared/critical-path.scss';
-import 'o-grid/demos/src/scss/_demos.scss';
+import demoStylesModule from '!!style-loader?injectType=lazyStyleTag!css-loader!sass-loader!o-grid/demos/src/scss/_demos.scss?story';
+
+export const demoStyles = Promise.resolve(demoStylesModule);

 <Meta title="Core|Grid/GridChild" component={GridChild} />

@@ -37,7 +39,12 @@ You supply it a `colspan` prop in one of the following formats:
     ```

 <Preview>
-  <Story name="Default unresponsive columns">
+  <Story
+    name="Default unresponsive columns"
+    parameters={{
+      styles: [demoStyles],
+    }}
+  >
     <GridContainer>
       <GridRow>
         <GridChild colspan="1">

λΏ‘λΏ‘
지적 ν•΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. μ €λŠ” MDXλ₯Ό μ™„μ „νžˆ μžŠμ—ˆμŠ΅λ‹ˆλ‹€. : no_mouth :
PoCλ₯Ό μ—…λ°μ΄νŠΈν•˜κ³  MDX 예제λ₯Ό μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€ .

μ• λ“œμ˜¨ 방식 (μŠ€ν† λ¦¬ μŠ€νƒ€μΌ 별)을 μ‚¬μš©ν•˜λ©΄ 파일 λ²”μœ„ 지정 방식 (파일 μŠ€νƒ€μΌ 별)κ³Ό 달리 λ¬Έμ„œ 탭은 λͺ¨λ“  μŠ€ν† λ¦¬μ˜ λͺ¨λ“  μŠ€νƒ€μΌ μ‹œνŠΈλ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€. λ‚΄ 예 μ—μ„œ "foo"및 "baz"μŠ€ν† λ¦¬ κ°€μ Έ 였기 foo.css 및 "bar"μŠ€ν† λ¦¬ κ°€μ Έ 였기 bar.css , 그러면 λ¬Έμ„œ νƒ­μ—μ„œ foo.css 및 bar.css κ°€μ Έ 였기 . λ‚˜λŠ” 이것이 ν”Όν•  수 μ—†λ‹€κ³  μƒκ°ν•˜λ©° 이것이 수용 κ°€λŠ₯ν•œμ§€ μ•„λ‹Œμ§€ λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

@pocka https://github.com/storybookjs/storybook/tree/next/addons/cssresources WDYTμ—μ„œ κ·Έ μ ‘κ·Ό 방식이 잘 μž‘λ™ ν•  것이라고 μƒκ°ν•©λ‹ˆλ‹€.

λΏ‘λΏ‘
μ•„, λ§žμ•„!

foo.story = {
  parameters: {
    cssresources: [
      {
        id: 'foo',
        code: `<style>${require('!to-string-loader!css-loader!./foo.css')}</style>`,
        picked: true
      }
    ]
  }
}

ν•œ 가지 λ¬Έμ œλŠ” μ‚¬μš©μžκ°€ 맀우 큰 μŠ€νƒ€μΌ μ‹œνŠΈλ₯Ό κ°€μ Έ 였면 "CSS λ¦¬μ†ŒμŠ€"탭이 μ§€μ €λΆ„ν•΄μ§ˆ κ²ƒμž…λ‹ˆλ‹€.

@pocka λ§žμŠ΅λ‹ˆλ‹€. cssresources μ• λ“œμ˜¨μ΄ ν•΄λ‹Ή λΆ€μ„œμ—μ„œ 크게 ν–₯상 될 수 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. κ·Έκ±Έ 받아듀이고 μ‹Άλ‹ˆ?

λΏ‘λΏ‘
예 : 슀마일 :

그런데 μ‚¬μš©μžκ°€ raw-webpack-queryλ₯Ό μž‘μ„±ν•˜λ„λ‘ ν—ˆμš©ν•˜λŠ” 것에 λŒ€ν•΄ μ–΄λ–»κ²Œ μƒκ°ν•˜μ‹­λ‹ˆκΉŒ? ( !to-string-loader!... 처럼) μš°λ¦¬κ°€ 이것을 μ—†μ• κ³  μ‹Άλ‹€λ©΄ μ• λ“œμ˜¨ μ½”λ“œμ— λ§Žμ€ 흑 λ§ˆλ²•μ΄ ν•„μš”ν•˜λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€ ...

기본적으둜 babel-macrosλ₯Ό μ§€μ›ν•˜λ―€λ‘œ μ‚¬μš©μžκ°€ macro-preval 을 μ‚¬μš©ν•˜μ—¬ λ²ˆλ“€μ— 파일 μ½˜ν…μΈ λ₯Ό μ‚½μž… ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

λͺ°λžμŠ΅λ‹ˆλ‹€. 곧 μ‚΄νŽ΄ λ³Όκ²Œμš”!

μ•ˆλ…•ν•˜μ„Έμš”, λ™μΌν•œ λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

λ¬Έμ œκ°€μžˆλŠ” μ‚¬λžŒμ€ 이 ν•΄κ²° 방법을 μ‹œλ„ν•΄λ³΄μ‹­μ‹œμ˜€. (ν•˜μ§€λ§Œ μ•½κ°„μ˜ κΉŠμ€ μ›ΉνŒ© 지식이 ν•„μš”ν•©λ‹ˆλ‹€).


@ndelangen 맀크둜λ₯Ό μ‚΄νŽ΄ to-string-loader (λ˜λŠ” file-loader )둜 CSS νŒŒμΌμ„ κ°€μ Έ μ˜€λŠ” κ·œμΉ™μ„ μΆ”κ°€ν•˜λŠ” CSSResource μ• λ“œμ˜¨μž…λ‹ˆλ‹€.

// adding a rule like this
{
  test: /\.css$/,
  resourceQuery: /cssresources/,
  use: ['to-string-loader', 'css-loader', 'postcss-loader']
}

μ „ 처리기의 경우 test 및 use λ₯Ό μ‚¬μš©μž μ§€μ •ν•˜λŠ” μ˜΅μ…˜λ„ ν•„μš”ν•©λ‹ˆλ‹€. μŠ€νƒ€μΌ νŒŒμΌμ— λŒ€ν•œ κ·œμΉ™μ„ μ„ νƒν•œ λ‹€μŒ oneOf 둜 μˆ˜μ •ν•  수 μžˆμ§€λ§Œ λ„ˆλ¬΄ λ³΅μž‘ν•©λ‹ˆλ‹€ ...

μ–΄λ–»κ²Œ 생각해?

@pocka 예, ν₯미둜운 κ°œλ…μ²˜λŸΌ λ“€λ¦½λ‹ˆλ‹€!

μ•ˆλ…•ν•˜μ„Έμš”, 아직 μž‘μ—… 쀑인지 κΆκΈˆν•˜μ‹­λ‹ˆκΉŒ? λ˜ν•œ λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. ν•΄κ²° 방법을 μ•Œκ³  μžˆμ§€λ§Œ μ‘°λ§Œκ°„ μˆ˜μ • 사항을 μ‚¬μš©ν•  수 μžˆλŠ”μ§€ μ•Œκ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

μ•ˆλ…•ν•˜μ„Έμš”, Vue Storyλ₯Ό μ‚¬μš©ν•˜μ—¬ ν•΄κ²° λ°©λ²•μ˜ 예λ₯Ό 제곡 ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

λ‚΄κ°€ 말할 μˆ˜μžˆλŠ” ν•œ, ν•΄κ²° 방법 은 적어도 λ¬Έμ„œ λΆ€κ°€ κΈ°λŠ₯을 μ‚¬μš©ν•˜λŠ” 경우 초기보기 후에 μŠ€νƒ€μΌ μ‹œνŠΈκ°€ μŒ“μ΄λŠ” κ²°κ³Όλ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€. πŸ˜•

λ¬΄λ‘€ν•œ μ˜λ„κ°€ μ—†μ—ˆκΈ° λ•Œλ¬Έμ— @pocka 의 μ• λ“œμ˜¨ μ ‘κ·Ό 방식은 더 일반적인 νŒ¨ν„΄μ΄λΌκ³  μƒκ°ν•˜λŠ” μŠ€ν† λ¦¬ 파일과 달리 ꡬ성 μš”μ†Œ νŒŒμΌμ—μ„œ κ°€μ Έμ˜¨ μŠ€νƒ€μΌμ„ λΆ„λ¦¬ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— λ‹€μ†Œ λΆ€μ‘±ν•˜λ‹€λŠ” 것을 μ•Œμ•˜μŠ΅λ‹ˆλ‹€. λ‚΄ 개인적인 μ†Œλ§ (이 μŠ€λ ˆλ“œμ˜ λ‹€λ₯Έ μ‚¬λžŒλ“€μ΄ 이것을 곡유 ν•  수 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.)은 Button.jsx μŠ€ν† λ¦¬ νŒŒμΌμ—μ„œλ§Œ μ‚¬μš©λ˜λŠ” Button.jsx 내뢀에 import './Button.css' λ₯Ό κ°€μ§ˆ μˆ˜μžˆλŠ” κ²ƒμž…λ‹ˆλ‹€ Button.jsx λ₯Ό κ°€μ Έ μ™”μŠ΅λ‹ˆλ‹€. @pocka κ°€ 제곡 ν•œ λ°©μ‹μ˜ μŠ€ν† λ¦¬ 별 μŠ€νƒ€μΌλ§μ€ Button (직간접 적으둜)λ₯Ό κ°€μ Έ μ˜€μ§€ μ•ŠλŠ” ꡬ성 μš”μ†Œκ°€ 영ν–₯을받지 μ•Šλ„λ‘ν•˜λŠ” κ²ƒλ§Œ 큼 μ€‘μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. Button.css λͺ¨λ“  CSS κ·œμΉ™. (μ—¬κΈ°μ—μ„œ μš°λ €λ˜λŠ” 점은 OtherWidget.css 에 μ‹€μˆ˜λ‘œ Button.css 둜 λλ‚˜λŠ” 일뢀 κ·œμΉ™μ΄ μ—†λŠ”μ§€ ν™•μΈν•˜λ €λŠ” κ²ƒμž…λ‹ˆλ‹€. OtherWidget의 μŠ€ν† λ¦¬λŠ” 전체 μ•±μ˜ μ •μ μœΌλ‘œ κ°€μ Έμ˜¨ CSSλ₯Ό λͺ¨λ‘ κ°€μ Έ μ˜€λ―€λ‘œ OtherWidget은 Storybookμ—μ„œ μ—¬μ „νžˆ 잘 λ³΄μž…λ‹ˆλ‹€.)

λŒ€μ‹  μ œκ°€ μƒκ°ν•˜λŠ” 것은 λͺ¨λ“  CSS λ‘œλ”λ₯Ό λ³€κ²½ν•˜μ—¬ lazyStyleTag μ£Όμž… ν•œ λ‹€μŒ, webpack APIλ₯Ό μ‚¬μš©ν•˜μ—¬ CSS λͺ¨λ“ˆμ„ ꢁ극적으둜 ν•„μš”λ‘œν•˜κ³  μŠ€ν† λ¦¬ 변경을 μˆ˜μ‹ ν•˜λŠ” μŠ€ν† λ¦¬ νŒŒμΌλ³„λ‘œ κ·Έλ£Ήν™”ν•˜λŠ” μƒˆ λͺ¨λ“ˆμ„ μƒμ„±ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 이벀트λ₯Ό 톡해 ν•΄λ‹Ή λͺ¨λ“ˆμ„ 켜고 λ•λ‹ˆλ‹€.
이 μ ‘κ·Ό 방식을 이미 κ³ λ €ν•˜κ³  폐기 ν–ˆμŠ΅λ‹ˆκΉŒ? μ•„λ‹ˆλ©΄ μ§€κΈˆλ³΄κ³ μžˆλŠ” λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆκΉŒ? Storybook μ• λ“œμ˜¨μ—μ„œ λͺ¨λ“  것을 ν•  수 μžˆλ‹€κ³  μƒκ°ν•˜μ§€λ§Œ Storybook에 핡심 κΈ°λŠ₯으둜 ν†΅ν•©ν•˜λ©΄ 더 깨끗할 수 μžˆμŠ΅λ‹ˆλ‹€.

κ°•λ ₯ν•œ μŠ€νƒ€μΌ μΊ‘μŠν™”λ₯Ό μ›ν•˜λ©΄ λΈŒλΌμš°μ €κ°€ ν•¨κ»˜ μ œκ³΅λ©λ‹ˆλ‹€. 여기에 λ‚΄ 무지가 λ“œλŸ¬λ‚  μœ„ν—˜μ— μ²˜ν•΄ μžˆμ§€λ§Œ,이 λͺ¨λ“  μ‚¬μš©μž μ˜μ—­ JavaScript (κ΄€λ ¨ λ³΅μž‘μ„± λΉ„μš© 포함)κ°€ κΈ°λ³Έ 제곡되고 λ°”λ‘œ μ‚¬μš©ν•  μˆ˜μžˆλŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 데 ν•„μš”ν•œ μ΄μœ λŠ” 아직 ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ‹€μŒκ³Ό 같이 각 μŠ€ν† λ¦¬μ˜ DOM을 그림자 루트둜 λ Œλ”λ§ν•˜μ§€ μ•ŠλŠ” 이유

customElements.define('encapsulated-story', class EncapsulatedStory extends HTMLElement {
  constructor() {
    super();
    this.attachShadow({ mode: 'open' });
  }

  /* not sure why we'd need this getter, but let's say */
  get storyHTML() {
    return this.shadowRoot.innerHTML;
  }

  set storyHTML(string) {
    this.shadowRoot.innerHTML = storyHTML;
  }
});

그리고 이야기가 λ°”λ€” λ•Œλ§ˆλ‹€

encapsulatedStory.storyHTML = theStoryDOMStringWithAllStyleTags;

μ™„λ£Œ? μ—¬κΈ°μ„œ theStoryDOMStringWithAllStyleTags λŠ” λͺ¨λ“  κ΄€λ ¨ μŠ€νƒ€μΌμ΄ 인라인 <style> νƒœκ·Έλ‘œ μ—°κ²°λœ μŠ€ν† λ¦¬μ˜ HTML을 μ—°κ²° ν•œ κ²ƒμž…λ‹ˆλ‹€. StoryλŠ” ν‰μ†Œμ²˜λŸΌ :host μ„ νƒκΈ°λ‘œ 호슀트 μš”μ†Œμ˜ μŠ€νƒ€μΌμ„ 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ΄λŠ” μ•„λ§ˆλ„ 일뢀 라이브러리 μ½”λ“œλ‘œ λ‚˜μ€‘μ— λΉŒλ“œ ν•  μˆ˜μžˆλŠ” μ΅œμ†Œν•œμ˜ μ‹œμž‘μ μ΄μ§€λ§Œ, 적어도 μƒˆλ‘œ μ œμ•ˆ 된 λͺ¨λ“  APIκ°€ ν•„μš”μ—†μ΄ κ°•λ ₯ν•œ μŠ€νƒ€μΌ μΊ‘μŠν™”μ˜ λͺ©ν‘œλ₯Ό 달성 ν•  κ²ƒμž…λ‹ˆλ‹€.

κ·Έλž˜λ„ webpackκ³Ό μ–΄λ–»κ²Œ μž‘λ™ν•©λ‹ˆκΉŒ? Webpack은 λͺ¨λ“  것을 DOM λ¬Έμžμ—΄μ΄ μ•„λ‹Œ JavaScript λ²ˆλ“€λ‘œ νŒ¨ν‚€μ§•ν•©λ‹ˆλ‹€. μ›ΉνŒ©μ΄ ν˜„μž¬ κ΅¬μ„±λ˜λŠ” 방식은 λͺ¨λ“  μŠ€ν† λ¦¬λ₯Ό 단일 λ²ˆλ“€λ‘œ νŒ¨ν‚€μ§•ν•©λ‹ˆλ‹€. JavaScriptκ°€ (ν•« 리)λ‘œλ“œλ˜λŠ” 경우 λ¬Έμ„œμ˜ 머리에 μŠ€νƒ€μΌμ„ 직접 μ‚½μž… ν•  λ•Œ μ„€λ„μš° λ£¨νŠΈκ°€ λ„μ›€μ΄λ˜μ§€ μ•ŠλŠ”λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. 이λ₯Ό λ³€κ²½ν•˜λ €λ©΄ 털이 λ§Žμ€ μ›ΉνŒ© ꡬ성을 μˆ˜ν–‰ν•΄μ•Όν•©λ‹ˆλ‹€.

Shadow DOM을 μ‚¬μš©ν•˜μ—¬ 각 μŠ€ν† λ¦¬λ₯Ό μ™„μ „νžˆ λΆ„λ¦¬ν•˜λŠ” 것은 λ§Žμ€ μŠ€ν† λ¦¬μ—μ„œ κ³΅μœ ν•˜λŠ” μŠ€νƒ€μΌ νƒœκ·Έλ₯Ό 각 μŠ€ν† λ¦¬λ‘œ λ³΅μ œν•˜λŠ” 것을 μ˜λ―Έν•˜κΈ°λ„ν•©λ‹ˆλ‹€. μ›ΉνŒ©μ— λ²ˆλ“€λ‘œ μ œκ³΅λ˜λŠ” 곡유 μŠ€νƒ€μΌμ„ μ‚¬μš©ν•˜λŠ” 것이 더 νš¨μœ¨μ μž…λ‹ˆλ‹€. 큰 차이λ₯Ό λ§Œλ“€κΈ°μ—λŠ” μΆ©λΆ„ν•˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆμ§€λ§Œ, lazyStyleTag λŒ€μ‹  Shadow DOM을 μ‚¬μš©ν•˜λŠ” 이점이 μžˆλ‹€λ©΄μ΄λ₯Ό μƒμ‡„ν•˜κΈ°μ— μΆ©λΆ„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 당신을 κ΅¬ν•˜μ‹­μ‹œμ˜€).

μ‘°λ§Œκ°„μ΄ λ¬Έμ œκ°€ ν•΄κ²°λ˜λŠ” 것을보고 μ‹ΆμŠ΅λ‹ˆλ‹€.

μ•ˆμ „ν•˜κ³  μ„±λŠ₯에도 쒋지 μ•ŠμŠ΅λ‹ˆλ‹€.

μƒˆλ‘œμš΄ iframe은 μžλ°” 슀크립트λ₯Ό νŒŒμ‹±ν•˜κ³ , CSSλ₯Ό νŒŒμ‹±ν•˜κ³ , postmessage-channel에 μ—°κ²°ν•˜κ³ , μ›Ή μ†ŒμΌ“μ— λ‹€μ‹œ μ—°κ²°ν•˜λŠ” λ“± 더 λ§Žμ€ κ²ƒλ“€μ„ν•΄μ•Όν•©λ‹ˆλ‹€.

@ndelangen 2017μ—μ„œ 인용 ν•΄ μ£„μ†‘ν•˜μ§€λ§Œ iframe을 λ‹€μ‹œλ‘œλ“œν•˜λŠ” 것이 λ„ˆλ¬΄ λΉ„μ‹Έλ‹€λŠ” 것이 μ—¬μ „νžˆ κ·€ν•˜μ˜ κ΄€μ μž…λ‹ˆκΉŒ? λΈŒλΌμš°μ €λŠ” μ΄λŸ¬ν•œ μœ ν˜•μ˜ μž‘μ—…μ„ μ§€μ†μ μœΌλ‘œ μˆ˜ν–‰ν•©λ‹ˆλ‹€. μ•„λ§ˆ 맀우 μ΅œμ ν™”λ˜μ–΄μžˆμ„ κ²ƒμž…λ‹ˆλ‹€. 이 경우 κ΄€λ ¨λœ λ„€νŠΈμ›Œν¬ μš”μ²­μ΄ μ—†κΈ° λ•Œλ¬Έμ— 일반 νŽ˜μ΄μ§€λ‘œλ“œλ³΄λ‹€ 훨씬 λΉ λ¦…λ‹ˆλ‹€.

λ‚˜μ—κ²Œ 이읡은 λΉ„μš©λ³΄λ‹€ ν½λ‹ˆλ‹€. 각 μŠ€ν† λ¦¬μ— λŒ€ν•΄ μƒˆλ‘œμš΄ iframe을 맀우 μ„ ν˜Έν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. λ‚˜λŠ” κ·ΈλŸ¬ν•œ μ‚¬μΉ˜ν’ˆμ„ μœ„ν•΄ 600ms의 지연을 ν—ˆμš© ν•  κ²ƒμž…λ‹ˆλ‹€.

(λ‚΄ μ‚¬μš© μ‚¬λ‘€λŠ” μŠ€ν† λ¦¬ λΆμ—μ„œ 일뢀 λ ˆκ±°μ‹œ angularjs ꡬ성 μš”μ†Œλ₯Ό λ Œλ”λ§ν•˜λ €κ³ ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. ꡬ성 μš”μ†Œκ°€ 맀우 μˆœμˆ˜ν•˜μ§€ μ•Šλ‹€κ³  κ°€μ • ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€. 맀우 μƒνƒœ μ €μž₯μž…λ‹ˆλ‹€. λΆ€μž‘μš©μ΄ 있으며 λ‹€μŒκ³Ό 같은 angularjs μ„œλΉ„μŠ€λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. 상황이 μ˜ˆμƒμΉ˜ λͺ»ν•œ λ°©μ‹μœΌλ‘œ μ€‘λ‹¨λ©λ‹ˆλ‹€.)

API ν‘œλ©΄μ— λŒ€ν•œ ν•œ 가지 μ•„μ΄λ””μ–΄λŠ” .storybook/manager.js μ—μ„œ μŠ€ν† λ¦¬ 뢁을 κ΅¬μ„±ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

addons.setConfig({
  refreshBetweenStories: true,
})

머리λ₯Ό μ˜¬λ°”λ₯Έ λ°©ν–₯으둜 기울이면 UI μ„€μ •μœΌλ‘œ κ°„μ£Ό 될 수 μžˆμŠ΅λ‹ˆλ‹€.

이 ν”Œλž˜κ·Έλ₯Ό ν™œμ„±ν™”ν•˜μ§€ μ•ŠλŠ” μ‚¬λžŒμ—κ²ŒλŠ” λŸ°νƒ€μž„ λΉ„μš©μ΄ 듀지 μ•ŠμœΌλ©° ν™œμ„±ν™”ν•˜λŠ” μ‚¬λžŒμ—κ²ŒλŠ” _ μ •λ§λ‘œ _ ν•„μš”ν•˜λ―€λ‘œ μ΄λŸ¬ν•œ 지연은 ν—ˆμš©λ©λ‹ˆλ‹€.

이 문제λ₯Ό ν•΄κ²°ν•˜λ €λ©΄ 문제 μ„€λͺ…에 πŸ‘μ„ μΆ”κ°€ν•˜μ—¬ μ°¬μ„±ν•˜μ„Έμš”. μš°μ„  μˆœμœ„λ₯Ό μ •ν•˜λŠ” 데이 정보λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€!

.addDecorator ((getStory) => {
require ( './ story.sass');
return getStory ();
})

μ•ˆλ…•ν•˜μ„Έμš”!!!!
이거 어디에 λ‘˜ 수 μžˆλ‚˜μš”? !!!

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰