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

最も参考になるコメント

ストヌリヌの呚りにシャドりルヌトを蚭定するず、 @ ndelangenのパフォヌマンスをたす

党おのコメント67件

たた、webpackはこれらすべおのストヌリヌを出力しおいるので、webpackをどのように構成したのか疑問に思いたす。

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

デコレヌタも䜿甚しようずしたしたが、少なくずも远加のスタむルシヌトをストヌリヌに分離できたため、これは半分壊れおいたしたが、他のスタむルシヌトをトラバヌスするず、ハヌドリフレッシュを行わないず、これらのスタむルが壊れおしたいたした。

.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>芁玠を䜿甚しおスタむルを取り蟌むこずです。

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">

@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;を返したす。
}

こんにちは
これはどこに眮けたすか!!!

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡