ããã«ã¡ã¯ã
ç§ã¯ãªããã®ç¹å®ã®åé¡ãæ±ããŠããã®ããç解ããããšããŠããŸãã ç§ã¯ãã®ãããªã¹ããŒãªãŒãåçã«ããŒãããŠããŸãïŒ
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ã®ãœãŒã¹ã§ã...ãã¹ãŠã®ã¹ã¿ã€ã«ã·ãŒããããŒãããŠããŸãïŒ
ããã¯æ£åžžãªåäœã§ãã...ïŒ
-
ãã¢
https://github.com/moimikey/729-single-stories-pulling-all-stylesheets
ãŸããwebpackã¯ããããã¹ãŠã®ã¹ããŒãªãŒãåºåããŠããã®ã§ãwebpackãã©ã®ããã«æ§æããã®ãçåã«æããŸãã
ãã³ã¬ãŒã¿ã䜿çšããããšããŸããããå°ãªããšãè¿œå ã®ã¹ã¿ã€ã«ã·ãŒããã¹ããŒãªãŒã«åé¢ã§ãããããããã¯ååå£ããŠããŸããããä»ã®ã¹ã¿ã€ã«ã·ãŒãããã©ããŒã¹ãããšãããŒããªãã¬ãã·ã¥ãè¡ããªããšããããã®ã¹ã¿ã€ã«ãå£ããŠããŸããŸããã
.addDecorator((getStory) => {
require('./story.sass');
return getStory();
})
@arunoda @mnmtanish
èå³æ·±ãã§ãïŒãããã瀺ãã¬ãã¯ãããŸããïŒ
@ndelangenã¯ãŸããªãäœæããŸã
ãŸã ããããã§ãã¯ããæéãèŠã€ããããšããŠããŸãã
ããããšã; Dããã¯å¥åŠãªãã®ã§ãã èŠãŠã¿ãŸããããã©ãããå§ãããããã®ãããããŸããã
ã€ãŸããèµ·ãã£ãŠãããšæãã®ã¯ããã¹ãŠã®CSSãã¡ã€ã«ãwebpackã¹ã¿ã€ã«ããŒããŒã«ãã£ãŠååŸããããããã«æ¿å ¥ãããŠãããšããããšã§ãã ãããã䜿çšãããŠãããã©ããã
ããããã©ã®ããã«ä¿®æ£ããã®ã§ããïŒ
ç§ãCSSã«å¯ŸããŠè¡ã£ãããšã¯ãCSSã¢ãžã¥ãŒã«ã䜿çšããããšã§ãã çæãããã¯ã©ã¹åãJSã«ã€ã³ããŒãããŸãã ãã¹ãŠã®CSSãäžç·ã«ãããã«æ¿å ¥ããããšããŠããäžæã®ã¯ã©ã¹/ã»ã¬ã¯ã¿ãŒã§ããããšãä¿èšŒãããŠãããããåé¡ã§ã¯ãããŸããã
ããã¯ããªããæ±ããŠããæ£ç¢ºãªåé¡ãå®éã«ã¯è§£æ±ºããŸããã ããããããã¯ã¹ã¿ã€ã«ããŒããŒã®æå³ãããåäœã ãšæããŸãã
ããã¯æ¬åœã§ãã ç§ïŒããã³ç§ã®äŒç€ŸïŒã¯cssã§ã¹ã³ãŒããèšå®ããŠããŸãããã³ãŒãã®åéçºãè¡ã£ãŠãããããã¹ã¿ã€ã«ãå
±æããŠããããã styleName
ãšclassName
çµã¿åããã«ãªã£ãŠããŸãã ãããã£ãŠãã¹ããŒãªãŒããã¯ã«åœ±é¿ãäžããã®ã¯ããããã®ãå€éšãã®cssãã¡ã€ã«ã§ãã
ããŒã«ã飲ãã åŸãä»å€ããäžåºŠã¹ããŒãªãŒããã¯ã®ã³ãŒãã調ã¹ãŠãå®è£ ã®èŠ³ç¹ããããã解決ããæ¹æ³ãèŠã€ããŸãã
@moimikeyåé¡ã®å Žåã¹ã¿ã€ã«ããŒããŒãã¹ãããããŠããã³ã¬ãŒã¿ã䜿çšããŠcssãã¡ã€ã«ãæåã§ããŒãããå¿ èŠããããšæããŸãã ãããããã®ãããªãã®ïŒ
.addDecorator(getStory => (
<div>
<link ... />
{getStory()}
</div>
))
ãããŒ....ããã¯ç§ã®å¿ã決ããŠè¶ããŸããã§ãã...ç§ã¯ãããè©ŠããŠã¿ãŸãã
ç æ°ã§ãããããäžåºŠãsassã䜿çšããŠããŸã... x_xã ç§ãã€ã³ã©ã€ã³requireãè©ŠããŸããã ã§ãéãæªãã£ãã§ãã ããã¯ãŸã£ãããªcssã®ããã®åªãã解決çã§ãã:)
ã ãã@mnmtanishã ãæå°ããããšãããããŸãã ç§ã¯ããªãã®ã€ã³ã¹ãã¬ãŒã·ã§ã³ã§ç§ã®åé¡ã解決ããŸããïŒ
.addDecorator((getStory) => {
require('./story.sass');
return getStory();
})
ããŒããããã§ä»ã®å¯äžã®åé¡ã¯ãã¹ããŒãªãŒããã¹ããŒãªãŒãžãšããã²ãŒããããšãã«ãã¹ã¿ã€ã«ãã¹ã¿ãã¯ããŠãããšããããšã§ã:(
ãã¶ããã¹ã¿ã€ã«ããŒããŒã¯ã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ã¯ãjavascriptã解æããCSSã解æããpostmessage-channelã«æ¥ç¶ããwebsocketã«åæ¥ç¶ããå¿ èŠããããŸãã
ã¹ããŒãªãŒã¹ã€ããã®<style>
èŠçŽ ãåé€ããã ãã§ããã®åé¡ã解決ã§ããã®ã§ã¯ãªãã§ããããã
ãã¡ãããã°ããŒãã«ã¹ã¿ã€ã«ã¯ãªãããã¹ãŠãé©åã«åå空éåãããŠããŸããããã¯å®å šã«åé¡ã«ãªãããšã¯ãããŸããã åžæç芳枬ã ãšæããŸãã ð
誰ããäžèšã®ã¹ããŒãã¡ã³ããééã£ãŠããããšã蚌æã§ããããåŠå®çãªçµæããªãããšã瀺ãããšãã§ããã°ãç§ã¯ãã¹ãŠã®è³ã§ãïŒ
ä»æ¥ã¯ããã€ãã®ãã¹ããããŸããã ãã³ã¬ãŒã¿ãã¿ãŒã³ã¯ããŸãæ©èœãããããã¹ããŒãªãŒã«åãæ¿ãããšãã«ã®ã¿ã¹ã¿ã€ã«ãæ¿å ¥ãããŸãã ãã ããã¹ããŒãªãŒãåãæ¿ãããšãã«ã¹ã¿ã€ã«ãåé€ãããªããšããåãåé¡ããããŸããã
ãã³ã¬ãŒã¿ã§ã¹ã¿ã€ã«ãåé€ããŠã¿ãŸããããå¿ èŠãªã¹ã¿ã€ã«ã¯1åããé©çšãããªãããã§ãã requireïŒïŒãåããªã¬ãŒããããšã¯å¯èœã§ããïŒ singletonïŒfalseã䜿çšããŠã¿ãŸããããåé¡ã¯è§£æ±ºããŸããã§ããã
ç§ã¯ãããææ¡ããããšããã»ãšãã©èºèºããŠããŸãããwebpackãã£ãã·ã¥ãç Žå£ããŠã¿ãããšãã§ããŸãïŒ
https://webpack.github.io/docs/api-in-modules.html#advanced
ããã¯webpack1ã®ããã¥ã¡ã³ãã§ãããããã§ãæ©èœããå¯èœæ§ããããŸãã
ã¢ã€ãã¢ïŒã¹ããŒãªãŒãåãæ¿ãããšãã«ãã¹ãŠã®<style>...</style>
ãåé€ãããã³ã¬ãŒã¿ãäœæã§ããŸãã çŸåšã®ã¹ããŒãªãŒã«é¢ä¿ã®ãªãã¹ã¿ã€ã«ãã¯ãªãŒã³ã¢ããããããã
ããããã§ãã ç§ã䜿çšããwebpackèšå®ã§'style-loader/useable' instead of 'style-loader',
ããã«ãããæäœããAPIãè¿œå ãããŸãã .useïŒïŒã䜿çšããŠã¹ã¿ã€ã«ãè¿œå ããunuseïŒïŒã䜿çšããŠã¹ã¿ã€ã«ãåé€ããŸãã ç§ã®ã¹ããŒãªãŒãã¡ã€ã«ã§ã¯ã次ã®ãããªãã³ã¬ãŒã¿ã䜿çšããŠããŸãã
.addDecorator((c) => <ReactStylesheet stylesheets={[require('./stories.scss')]}>{ c() }</ReactStylesheet> )
次ã®Reactã³ã³ããŒãã³ãã䜿çšããŠãã¹ã¿ã€ã«ãè¿œå ããã³åé€ããŸãã
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
ã®ã¢ã€ãã¢ã¯ç§ã«ã¯ç°è³ª
ããã¯ããµã³ãããã¯ã¹ã¹ããŒãªãŒããã¯ã®ãã1ã€ã®èå³æ·±ãç¹ã§ãhttps://github.com/Wildhoney/ReactShadow
çããããã«ã¡ã¯ïŒ æè¿ããã®åé¡ã¯ããŸãé²ãã§ããªãããã§ãã ããã§ã質åãã³ã¡ã³ãããã°ãããå Žåã¯ãé æ ®ãªãè°è«ãç¶ããŠãã ããã æ®å¿µãªããããã¹ãŠã®åé¡ã«åãçµãæéã¯ãããŸããã ç§ãã¡ã¯ãã€ã§ãå¯ä»ãåãä»ããŠããŸãã®ã§ããæäŒããããå Žåã¯ãã«ãªã¯ãšã¹ããéã£ãŠãã ããã éã¢ã¯ãã£ããªåé¡ã¯60æ¥åŸã«ã¯ããŒãºãããŸãã ããããšãïŒ
@ConneXNLã§ãã®åé¡ã解決ããŸãããã®ç¹ã§ãããã¥ã¡ã³ãã®æ¹åã«ãååããã ããŸããïŒ
é©ããå ŽæãèŠã€ãããªãå Žåã¯ãããŒã¯ããŠã³åœ¢åŒã§ãã³ã¯ããŠãã ããã å ¥ããŠãäžè©±ã«ãªããŸãã
ð
çããããã«ã¡ã¯ïŒ æè¿ããã®åé¡ã¯ããŸãé²ãã§ããªãããã§ãã ããã§ã質åãã³ã¡ã³ãããã°ãããå Žåã¯ãé æ ®ãªãè°è«ãç¶ããŠãã ããã æ®å¿µãªããããã¹ãŠã®åé¡ã«åãçµãæéã¯ãããŸããã ç§ãã¡ã¯ãã€ã§ãå¯ä»ãåãä»ããŠããŸãã®ã§ããæäŒããããå Žåã¯ãã«ãªã¯ãšã¹ããéã£ãŠãã ããã éã¢ã¯ãã£ããªåé¡ã¯60æ¥åŸã«ã¯ããŒãºãããŸãã ããããšãïŒ
ããããŸãç§ã ïŒ ä»£ããã«ãã¡ã³ãããçŸåšã®éçºããŒããããã«éäžã§ããããã«ããã®åé¡ã解決ããŸãã äžèšã®åé¡ãåŒãç¶ãæžå¿µãããå Žåã¯ãæ°ãããã±ãããéããŠããã®å€ããã±ããã«ã€ããŠèšåããŠãã ããã Storybookããå©çšããã ãããããšãããããŸãã
ããã§ãåãåé¡ã§ãããã¹ããŒãªãŒããã¯ã¯åã¹ããŒãªãŒãåé¢ããŠããªããããèŠèŠçãªãã¹ã/åãå ¥ããã¹ãã«ã¯äœ¿çšã§ããŸããã
ã¹ããŒãªãŒã®åšãã«ã·ã£ããŠã«ãŒããèšå®ãããšã @ ndelangenã®ããã©ãŒãã³ã¹ããŸã
@bennypowersãããããïŒ ãããå®çŸããæ¹æ³ã®ã³ãŒããµã³ãã«ã¯ãããŸããïŒ ð
@shilmanã«ãšã£ãŠãé¢çœããããã
ããã«ã¡ã¯ã ç§ããã®åé¡ãçµéšããŠããŸã
ããã¯ä¿®æ£ãããŸãããããããšãåé¿çã¯ãããŸããïŒ
@ndelangen
ããã§æºè¶³ããããã®æçã®éã¯ããããã@moimikeyãReactShadowã䜿çšããããšãææ¡ããããšã§ãããã
åãã¹ãæŠç¥ã¯ãã«ãŒããReactShadowã³ã³ããŒãã³ãã§ã©ããããŠããã adoptedStyleSheets
ïŒãŸãã¯ãµããŒããããŠããªããã©ãŠã¶ãŒã®å Žåã¯<style>
èŠçŽ ïŒã䜿çšããŠã¹ã¿ã€ã«ãåã蟌ãããšã§ãã
ãããå床éããŠãã ããããã®åé¡ã«ãããã¹ããŒãªãŒããšã«ã«ã¹ã¿ã ã¹ã¿ã€ã«ãè¿œå ããããšãéåžžã«å°é£ã«ãªããŸãã ç§ã¯ãäŸãšããŠã«ã¹ã¿ã ã¹ã¿ã€ã«ãå®è£ ããå®å šã«å¥åã®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">
@aendrew
ãããææããŠãããŠããããšããç§ã¯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/cssresourcesWDYTã§ããŸããããšæããŸããïŒ
@ndelangen
ãããããã§ãïŒ
foo.story = {
parameters: {
cssresources: [
{
id: 'foo',
code: `<style>${require('!to-string-loader!css-loader!./foo.css')}</style>`,
picked: true
}
]
}
}
1ã€ã®æžå¿µäºé ïŒãŠãŒã¶ãŒãéåžžã«å€§ããªã¹ã¿ã€ã«ã·ãŒããã€ã³ããŒããããšã[CSSãªãœãŒã¹]ã¿ããä¹±éã«ãªããŸãã
@pockaããã§ãããcssresourcesã¢ããªã³ã¯ãã®éšéã§å€§å¹ ã«æ¹åã§ãããšæããŸãã ããªãã¯ãããåŒãåããããšæããŸããïŒ
@ndelangen
ã¯ãïŒã¹ãã€ãªãŒïŒ
ã¡ãªã¿ã«ããŠãŒã¶ãŒã«raw-webpack-queryãæžãããããšã«ã€ããŠã©ãæããŸããïŒ ïŒ !to-string-loader!...
ïŒãããåãé€ãããã®ã§ããã°ãã¢ããªã³ã³ãŒãã«ããããã®é»éè¡ãå¿
èŠã ãšæããŸã...
ããã©ã«ãã§babel-macrosããµããŒãããŠãããšæãã®ã§ããŠãŒã¶ãŒã¯macro-prevalã䜿çšããŠãã¡ã€ã«ã³ã³ãã³ãããã³ãã«ã«æ¿å ¥ããããšãã§ããŸããïŒ
ç¥ããªãã£ãã®ã§ãããããèŠãŠãããŸãïŒ
ããã«ã¡ã¯ãç§ã¯åãåé¡ãçµéšããŠããŸãã
ãã®åé¡ã«çŽé¢ããŠãã人ã¯ããã®åé¿çãè©Šã
@ndelangenãã¯ãã調ã¹ãŸãããããã¯ãã§æå¹ã«ãªãã®ã¯ããã¡ã€ã«ã·ã¹ãã ããCSSãã¡ã€ã«ãããŒããããããšã§ãã å€ãã®ãŠãŒã¶ãŒãSASSãLessãStylusãPostCSSã䜿çšããCSSãã¡ã€ã«ãªã©ãã€ã³ããŒãããããšæã£ãŠããã®ã§ããã®ã¢ãããŒãã§ã¯ããŒãºãæºãããªããšæããŸãã ç§ã®çŸåšã®ã¢ã€ãã¢ã¯ãCSSResourceã¢ããªã³ãto-string-loader
ïŒãŸãã¯file-loader
ïŒã§CSSãã¡ã€ã«ãã€ã³ããŒãããã«ãŒã«ãè¿œå ããŠããŠãŒã¶ãŒãCSSãã¡ã€ã«ãã€ã³ããŒãããŠã¢ããªã³ã«äœ¿çšã§ããããã«ããããšã§ãã
// adding a rule like this
{
test: /\.css$/,
resourceQuery: /cssresources/,
use: ['to-string-loader', 'css-loader', 'postcss-loader']
}
ããªããã»ããµã®å Žåã test
ãšuse
ãã«ã¹ã¿ãã€ãºãããªãã·ã§ã³ãå¿
èŠã§ãã ã¹ã¿ã€ã«ãã¡ã€ã«ã®ã«ãŒã«ãéžæããŠoneOf
å€æŽããããšã¯å¯èœã§ãããéåžžã«è€éã«ãªããŸã...
ã©ãæããŸããïŒ
@pockaãããããã¯é¢çœãã³ã³ã»ããã®ããã«èãããŸãïŒ
ããã«ã¡ã¯ãããããŸã åãçµãã§ãããã©ããçåã«æããŸããïŒ ç§ããã®åé¡ãçµéšããŠããŸããåé¿çã¯ç¥ã£ãŠããŸãããä¿®æ£ãããã«å©çšå¯èœã«ãªããã©ããç¥ãããã§ãã
ããã«ã¡ã¯ãVueStoryã®åé¿çã®äŸãæããŠãã ããã
ç§ã®ç¥ãéããå°ãªããšãDocsã¢ããªã³ã䜿çšããŠããå Žåã¯ãåé¿çã«ãã£ãŠåæãã¥ãŒã®åŸã«ã¹ã¿ã€ã«ã·ãŒããã¹ã¿ãã¯ãããŸãã ð
@pockaã®ã¢ããªã³ã¢ãããŒãã¯ãã¹ããŒãªãŒãã¡ã€ã«ã§ã¯ãªããã³ã³ããŒãã³ããã¡ã€ã«ã«ã€ã³ããŒããããã¹ã¿ã€ã«ãåé¢ããªãããã軜èŠããã€ããã¯ãããŸãããããã¯ãããäžè¬çãªãã¿ãŒã³ã ãšæããŸãã ç§ã®å人çãªæ¬²æ±ïŒããã¯ãã®ã¹ã¬ããã®ä»ã®äººãšå
±æããããããããªããšæãïŒã¯ã Button.jsx
ã¹ããŒãªãŒãã¡ã€ã«ã§ã®ã¿äœ¿çšãããButton.jsx
å
ã«import './Button.css'
å«ããããšãã§ããããã«ããããšã§ãã Button.jsx
ãã€ã³ããŒããããŸãã @pockaãæäŸããæ¹æ³ã§ã®ã¹ããŒãªãŒããšã®ã¹ã¿ã€ã«èšå®ã¯ãããèªäœãButton
ïŒçŽæ¥çãŸãã¯éæ¥çã«ïŒã€ã³ããŒãããªãã³ã³ããŒãã³ãã圱é¿ãåããªãããã«ããããšã»ã©éèŠã§ã¯ãããŸããã Button.css
ããã®CSSã«ãŒã«ã ïŒããã§ã®æžå¿µã¯ãããšãã°ã OtherWidget.css
ã誀ã£ãŠButton.css
ã«ãªã£ãŠããŸã£ãã«ãŒã«ãæ¬ ããŠããªãããšã確èªãããããšã§ããããããããªãã¡ã¯ã¿ãªã³ã°ãªã©ã§èŠèœãšãããŠãæ¬ èœããŠããŸããããã¯ãOtherWidgetã®ã¹ããŒãªãŒãã¢ããªå
šäœã®éçã«ã€ã³ããŒããããCSSããã¹ãŠååŸãããããStorybookã§ã¯OtherWidgetãåŒãç¶ãæ£åžžã«è¡šç€ºãããããã§ããïŒ
代ããã«ããã¹ãŠã®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
ã¯ãã¹ããŒãªãŒã®HTMLãšãé¢é£ãããã¹ãŠã®ã¹ã¿ã€ã«ãã€ã³ã©ã€ã³<style>
ã¿ã°ãšããŠé£çµãããã®ã§ãã Storyã¯ãéåžžã©ããã :host
ã»ã¬ã¯ã¿ãŒã䜿çšããŠãã¹ãèŠçŽ ã®ã¹ã¿ã€ã«ãèšå®ã§ããŸãã
ããã¯æäœéã®åºçºç¹ã§ãããåŸã§ã©ã€ãã©ãªã³ãŒãã䜿çšããŠæ§ç¯ã§ããŸãããå°ãªããšãããããã®æ°ããææ¡ãããAPIããã¹ãŠå¿ èŠãšããã«ã匷åãªã¹ã¿ã€ã«ã®ã«ãã»ã«åãšããç®æšãéæã§ããŸãã
ããããããã¯webpackã§ã©ã®ããã«æ©èœããŸããïŒ Webpackã¯ããã¹ãŠãDOMæååã§ã¯ãªãJavaScriptãã³ãã«ã«ããã±ãŒãžåããŸãã ãŸããwebpackã®çŸåšã®æ§ææ¹æ³ã§ã¯ããã¹ãŠã®ã¹ããŒãªãŒã1ã€ã®ãã³ãã«ã«ããã±ãŒãžåãããŠããŸãã ïŒããããªïŒããŒããããŠããJavaScriptãã¹ã¿ã€ã«ãããã¥ã¡ã³ãã®ãããã«çŽæ¥æ¿å ¥ããå Žåãã·ã£ããŠã«ãŒãã圹ç«ã€ãšã¯æããŸããã ãããå€æŽããã«ã¯ããªãããã®æ¹æ³ã§ãã¢ãªãŒWebpackæ§æãè¡ãå¿ èŠããããŸãã
Shadow DOMã䜿çšããŠåã¹ããŒãªãŒãå®å
šã«åé¢ããããšã¯ãå€ãã®ã¹ããŒãªãŒã§å
±æãããŠããã¹ã¿ã€ã«ã¿ã°ãããããã«è€è£œããããšãæå³ããŸãã webpackã«ãã³ãã«ãããŠããå
±æã¹ã¿ã€ã«ã䜿çšãããšãããå¹ççã«ãªããŸãã 倧ããªéããçãã«ã¯ååã§ã¯ãªããããããŸãããã lazyStyleTag
ã䜿çšãã代ããã«ã·ã£ããŠDOMã䜿çšããããšã®å©ç¹ãããå Žåã¯ãããçžæ®ºããã®ã«ååãããããŸããïŒããã¯ã·ã£ããŠã«ãŒããè¡ãå¯äžã®è€éãã ãšæããŸãïŒããªããå©ããïŒã
ãŸããé ããæ©ãããããä¿®æ£ãããã®ãèŠãããšæã£ãŠããŸãã
ããã¯å®å šã§ãããããã©ãŒãã³ã¹ã«ãæªåœ±é¿ãåãŒããŸãã
æ°ããiframeã¯ãjavascriptã解æããCSSã解æããpostmessage-channelã«æ¥ç¶ããwebsocketã«åæ¥ç¶ããå¿ èŠããããŸãã
@ndelangen 2017幎ããåŒçšããŠç³ãèš³ãããŸããããããã¯ãŸã ããªãã®èŠè§£ã§ãããiframeã®ãªããŒãã¯é«ãããã§ããïŒ ãã©ãŠã¶ã¯ãã®çš®ã®ããšãåžžã«è¡ããŸãã 圌ãã¯ããããããã®ããã«éåžžã«æé©åãããŠããŸãã ãã®å Žåããããã¯ãŒã¯ãªã¯ãšã¹ããå«ãŸããªããããéåžžã®ããŒãžã®èªã¿èŸŒã¿ãããããã«é«éã«ãªããŸãã
ç§ã«ãšã£ãŠã¯ãã¹ããŒãªãŒããšã«æ°é®®ãªiframeãéåžžã«å¥œããããã¡ãªããã¯ã³ã¹ããäžåããŸãã ç§ã¯ãã®ãããªèŽ æ²¢ã®ããã«600msãã®é 延ã蚱容ããŸãã
ïŒç§ã®ãŠãŒã¹ã±ãŒã¹ã¯ãã¹ããŒãªãŒããã¯ã§ããã€ãã®ã¬ã¬ã·ãŒangularjsã³ã³ããŒãã³ããã¬ã³ããªã³ã°ããããšããŠããããšã§ããã³ã³ããŒãã³ãã¯ããŸãçŽç²ã§ã¯ãããŸãããéåžžã«ã¹ããŒããã«ã§ããå¯äœçšããããangularjsãµãŒãã¹ãå©çšããŸãããŸããéåžžã«ã¹ããŒããã«ã§ããäºæããªãæ¹æ³ã§ç©äºãå£ããŸããïŒ
APIãµãŒãã§ã¹ã®ã¢ã€ãã¢ã®1ã€ã¯ãã¹ããŒãªãŒããã¯ã.storybook/manager.js
ã§ãã
addons.setConfig({
refreshBetweenStories: true,
})
é ãæ£ããæ¹åã«åŸãããšãããã¯UIèšå®ãšèŠãªãããšãã§ããŸãã
ãã®ãã©ã°ãæå¹ã«ããªã人ã«ã¯å®è¡æã®ã³ã¹ãã¯ããããŸããããŸãããã®ãã©ã°ãæå¹ã«ãã人ã«ã¯ãããã_æ¬åœã«_å¿ èŠãªã®ã§ããã®ãããªé 延ã¯èš±å®¹ãããŸãã
ãããä¿®æ£ãããå Žåã¯ãåé¡ã®èª¬æã«ðãè¿œå ããŠè³æããŠãã ããã ããã䜿çšããŠåªå é äœãä»ããŸãã
.addDecoratorïŒïŒgetStoryïŒ=> {
requireïŒ './ story.sass'ïŒ;
getStoryïŒïŒ;ãè¿ããŸãã
}ïŒ
ããã«ã¡ã¯ïŒïŒïŒïŒ
ããã¯ã©ãã«çœ®ããŸããïŒ!!!
æãåèã«ãªãã³ã¡ã³ã
ã¹ããŒãªãŒã®åšãã«ã·ã£ããŠã«ãŒããèšå®ãããšã @ ndelangenã®ããã©ãŒãã³ã¹ããŸã