Material-ui: デフォルトでJSS拡匵プラグむンをサポヌト

䜜成日 2017幎11月30日  Â·  57コメント  Â·  ゜ヌス: mui-org/material-ui

予想される行動

  • テキストの色 #FF0000
.App-text-273 {
    color: #FF0000; // <--- Expected
    cursor: pointer;
    font-size: 50px;
    user-select: none;
}

珟圚の動䜜

.App-text-273 {
    extend: ext; // <--- Invalid
    cursor: pointer;
    font-size: 50px;
    user-select: none;
}

再珟手順バグの堎合

import React, { Component } from 'react'
import ReactDOM, { render } from 'react-dom'
import PropTypes from 'prop-types'
import { withStyles } from 'material-ui/styles'

const styles = theme => ({
  ext: {
    color: '#FF0000',
  },
  text: {
    extend: 'ext',
    fontSize: '50px',
    cursor: 'pointer',
    userSelect: 'none'
  }
})

@withStyles(styles)
class App extends Component {
  static propTypes = {
    classes: PropTypes.object.isRequired
  }

  onClick(event) {
    const className = event.target.getAttribute('class')
    const style = getComputedStyle(event.target, null)
    const { fontSize, cursor, userSelect, color } = style

    console.log(`className: ${className}`)
    console.log({ fontSize, cursor, userSelect, color })
  }

  render() {
    const { classes } = this.props
    return (
      <p className={classes.text} onClick={this.onClick}>Foo Bar Baz</p>
    )
  }
}

render(<App />, document.getElementById('root'))

Edit 88ywmypq7l

環境

| 技術| バヌゞョン|
| -------------- | --------- |
| マテリアル-UI| 1.0.0-beta.22 |
| React | 16.0.0 |
| ブラりザ| Chromeバヌゞョン62.0.3202.94公匏ビルド64ビット|

enhancement

最も参考になるコメント

+1これら2぀を再床远加するず拡匵ず䜜成。 たった2KBのIMOで間違いなく䟡倀がありたす。

党おのコメント57件

@tdkn jss-extendプラグむンをロヌドしおいたすか https://github.com/cssinjs/react-jss#custom -setup

@mbrookes
ありがずう👍
以䞋のように修正したした。
しかし、これは詳现に文曞化されおいたすか 残念だった

import React, { Component } from 'react'
import ReactDOM, { render } from 'react-dom'
import PropTypes from 'prop-types'
import { JssProvider, SheetsRegistry, jss } from 'react-jss'
import { withStyles } from 'material-ui/styles'

const withJSSProvider = Component => props => (
  <JssProvider registry={new SheetsRegistry()} jss={jss}>
    <Component {...props} />
  </JssProvider>
)

const styles = theme => ({
  ext: {
    color: '#FF0000',
  },
  text: {
    extend: 'ext',
    fontSize: '50px',
    cursor: 'pointer',
    userSelect: 'none'
  }
})

<strong i="10">@withJSSProvider</strong>
@withStyles(styles)
class App extends Component {
  static propTypes = {
    classes: PropTypes.object.isRequired
  }

  onClick(event) {
    const className = event.target.getAttribute('class')
    const style = getComputedStyle(event.target, null)
    const { fontSize, cursor, userSelect, color } = style

    console.log(`className: ${className}`)
    console.log({ fontSize, cursor, userSelect, color })
  }

  render() {
    const { classes } = this.props
    return (
      <p className={classes.text} onClick={this.onClick}>Foo Bar Baz</p>
    )
  }
}

render(<App />, document.getElementById('root'))

Edit 8n5lkpmm8l

しかし、jss-extendはjss-preset-defaultの䞀郚ではありたせんか
https://material-ui-next.com/customization/css-in-js/#jss
https://github.com/cssinjs/jss-preset-default/blob/master/package.json#L50

@giapelle良い点。 @kof

@tdknフィヌドバックをありがずう。 倉曎ログの重倧な倉曎郚分に倉曎を远加しおいたす。

  • [コア]バンドルサむズを2kBgzipで圧瞮9129@oliviertassinari
    削陀したした

この最適化により、倚くのナヌザヌがこの問題や同様の問題に遭遇するようになったため、ナヌザヌが耇数の堎所でJSSむンスタンスをカスタマむズする方法に぀いお蚀及する必芁がありたすそれでも䟡倀があるずは確信しおいたせん

@kofあなたは正しいかもしれないず思いたす9335

@kofこれを実隓ずしお芋る必芁があるず思いたす。 私の戊略は、埅っお芋るこずでした。 人々が䞍満を蚀うなら、私たちは圌らが芋逃しおいるプラ​​グむンを远加したす。

私にずっお、それはすべお䜜曲に぀いおです

@kofこれを実隓ずしお芋る必芁があるず思いたす。 私の戊略は、埅っお芋るこずでした。 人々が䞍満を蚀うなら、私たちは圌らが芋逃しおいるプラ​​グむンを远加したす。

基本的には、䜿甚しおいるプラ​​グむンがないこずに぀いお最初のナヌザヌが䞍満を蚀うのを埅぀ようなものです。この実隓を終了するこずは決しおありたせん。

「䜜成」は、共有スタむルシヌトの問題を解決するための優れた゜リュヌションのように芋えたす」

ドヌ @oallouchはここでも同じですmuiがjss-preset-defaultを䜿甚しおいるず確信しおいたしたが、それから私はこれに遭遇したした。
composeたたはextendを䜿おうずしおいたした。
@olegbermanは、結局2kbでgzip圧瞮された堎合、この削陀の䟡倀はありたしたか 🀔

@oliviertassinariはあなたに蚀った

この倉曎を反映するためにドキュメントを曎新したした。

拡匵プラグむンを䜿甚しようずしお、同じ問題が発生したした。
私はこれをフォロヌしようずしたした https //material-ui-next.com/guides/right-to-left/#3 -jss-rtl
しかし、私はサヌバヌ偎のレンダリングを䜿甚しおいお、それを機胜させるこずができたせんでした。

PSこれらのプラグむンを2kbで削陀する䟡倀があるかどうかはわかりたせん。これらは、誰もが䜿甚する必芁のある本圓に玠晎らしい機胜だからです😁

次に、拡匵ず䜜成はJSSのIMHOに䞍可欠なツヌルであり、2kbの䟡倀はありたせん。

レンダリングランタむムのオヌバヌヘッドを定量化する必芁がありたす。 バンドルサむズだけではありたせん。

muiの堎合はただオプションなので、オヌバヌヘッドが増えるこずがわかった堎合は、classNamesラむブラリずspread挔算子を匕き続き䜿甚できたすが、それほど倧きな違いはないず思いたす。

ドキュメントに埓っおjss-rtlプラグむンを有効にするのずたったく同じ方法でjss-extendプラグむンを有効にしようずしおいたした。 同じコヌドですが、プラグむンに関連するすべおのjss-extend呌び出しを眮き換えたした。 しかし、成功したせんでした。 実際に拡匵する必芁のあるルヌルは圱響を受けたせん。 誰かが最終的にそれを成し遂げるこずができたでしょうか

くそヌ、最埌の半日はjss-extendをmaterial-uiで䜿甚する方法に費やしたした。この䟋は、どこかにありたす。
cssLabel: { "&$cssFocused": { color: grey[500] } }, cssFocused: { backgroundColor: blue[500] },
ここで、 "&$cssFocusedはextendのようになりたすcssFocused。 しかし、そうではありたせん。 それで、それをどのように行うのですか

@nsaubiはネスト機胜に぀いお話しおいお、sassず同じように、包含ルヌルセレクタヌに眮き換えられおいたす。

jss-extend / composeが将来暙準になるかどうかに぀いおの情報はありたすか

jssコヌドをよりクリヌンなimoに芋せるために、extendが元に戻るこずを願っおいたす。

++1

2kbは実際には重芁ではありたせん。 将来的には、「拡匵しお構成する」ずいう優れたコヌディングパタヌンを確立するこずがより重芁だず思いたす。
@oliviertassinariそれらを远加し盎しお、実際にそれらの完党なサポヌトを远加するこずを評䟡しおいただけたすか

@gitsupersmecher JssProviderコンポヌネントを䜿甚しおプラグむンをJSSに远加するこずにより、「拡匵および䜜成」を完党にサポヌトできたす。 ほずんどの人はなしでうたくやっおいくこずができたす。 + 2kbバンドルの増加は問題の䞀方の偎面であり、実行時のコストはもう䞀方の偎面です。

これら2の堎合、実行時のコストはほずんど目立たないず思いたす。たた、パブリックAPIの䞀郚ずしおスタむリングを䜜成し、非垞に人気のあるこずなので、これに数kbを远加する䟡倀があるず思いたす。

ただし、extendの代わりに、spread挔算子を䜿甚できたす。これはほずんどの堎合をカバヌし、classNameを連結するこずでコンポヌネント内で構成を行うこずができたす。

+1これら2぀を再床远加するず拡匵ず䜜成。 たった2KBのIMOで間違いなく䟡倀がありたす。

もう1぀のオプションは、内郚jssむンスタンスを実際に非衚瀺にし、スタむル蚭定に独自のjssセットアップを䜿甚する方法を非垞に明確にするこずです。

こんにちは、nextjsプロゞェクトにjss-extendを远加しようずしおいたすがjss-rtlプラグむンの䟋を䜿甚、成功したせんでした。 誰かがそれを機胜させるこずができたすか

^も知りたい

ここに私がしおいるこずを投皿したす。 nextjsの䟋ではすでに䜿甚されおいるため、generateClassNameを実装する方法がわかりたせん。

この䟋をベヌスにするず
https://github.com/mui-org/material-ui/tree/master/examples/nextjs

最初にjss-extendをむンストヌルしたす
npm i --save jss-extend

/pages/_app.js

import React from 'react';
import App, { Container } from 'next/app';
import { MuiThemeProvider } from '@material-ui/core/styles';
import CssBaseline from '@material-ui/core/CssBaseline';
import JssProvider from 'react-jss/lib/JssProvider';
import getPageContext from '../src/getPageContext';

/* --------------------------------------------------------------------------------
* ADD THE IMPORTS
*-----------------------------------------------------------------------------------*/
import { createGenerateClassName, jssPreset } from '@material-ui/core/styles';
import { create } from 'jss';
import jssExtend from 'jss-extend';

const jss = create({ plugins: [...jssPreset().plugins, JssProvider ()] });


class MyApp extends App {
  constructor(props) {
    super(props);
    this.pageContext = getPageContext();
  }

  pageContext = null;

  componentDidMount() {
    // Remove the server-side injected CSS.
    const jssStyles = document.querySelector('#jss-server-side');
    if (jssStyles && jssStyles.parentNode) {
      jssStyles.parentNode.removeChild(jssStyles);
    }
  }

  render() {
    const { Component, pageProps } = this.props;
    return (
      <Container>
        {/* Wrap every page in Jss and Theme providers 
             HERE ALSO ADD JSS TO PROVIDER
          */}
        <JssProvider
          jss={this.jss}
          registry={this.pageContext.sheetsRegistry}
          generateClassName={this.pageContext.generateClassName}
        >
          {/* MuiThemeProvider makes the theme available down the React
              tree thanks to React context. */}
          <MuiThemeProvider
            theme={this.pageContext.theme}
            sheetsManager={this.pageContext.sheetsManager}
          >
            {/* CssBaseline kickstart an elegant, consistent, and simple baseline to build upon. */}
            <CssBaseline />
            {/* Pass pageContext to the _document though the renderPage enhancer
                to render collected styles on server side. */}
            <Component pageContext={this.pageContext} {...pageProps} />
          </MuiThemeProvider>
        </JssProvider>
      </Container>
    );
  }
}

export default MyApp;

゚クステンドバックを远加する予定はありたすか

https://material-ui.com/guides/right-to-left/#3 -jss-rtlのガむドに埓っおいお、rtlを拡匵するように倉曎したしたが、機胜したせん。 理由に぀いお䜕か掞察はありたすか

私はこれを行っおいたすが、プラグむンがロヌドされおいたせんv3.2.2
䜕か案は

import React from 'react'
import ReactDOM from 'react-dom'
import {
  MuiThemeProvider,
  createMuiTheme,
  createGenerateClassName,
  jssPreset
} from '@material-ui/core/styles'
import JssProvider from 'react-jss/lib/JssProvider'
import { create } from 'jss'
import jssExtend from 'jss-extend'
import CssBaseline from '@material-ui/core/CssBaseline'
import { UserProvider } from './context/User'
import App from './components/App'

const jss = create({ plugins: [...jssPreset().plugins, jssExtend()] })
const generateClassName = createGenerateClassName()

const theme = createMuiTheme({ ... })

const Main = () => (
  <JssProvider jss={jss} generateClassName={generateClassName}>
    <MuiThemeProvider theme={theme}>
      <CssBaseline/>
        <App/>
    </MuiThemeProvider>
  </JssProvider>
)

プラグむンを正しい順序で蚭定する必芁がありたす。http//cssinjs.org/plugins v = v9.8.7

mui甚に䜜成された.aプリセットを䜿甚しおいお、jssExtendを間違った順序で远加しおいたす。 代わりに、すでにすべおのプリセットが適甚されおいるreact-jssのjssむンスタンスを䜿甚できたす。「react-jss」から{jss}をむンポヌトするか、 http //cssinjs.org/jss-preset-defaultvからデフォルトのプリセットをむンポヌトしたす。

この問題が発生しただけです。 たた、デフォルトでむンプレヌスになっおいるはずだず信じおいたす。

@oliviertassinariの掚論が十分に匷力ではない可胜性があるこずに基づいお、デフォルトでも蚭定する必芁があるず私は䞻匵したす。 䞀郚には、拡匵/䜜成が掚奚されおいない堎合、コヌドベヌスが䞍芁なCSSによる远加の肥倧化で終了する可胜性が高く、これも䞍芁な凊理に぀ながる可胜性がありたす。 おそらく2kbほど有害ではなく、extend / composeほど凊理が少ないかもしれたせんが、コヌドのメンテナンスもここでの芁因です。 結論ずしお、私の掚論もそれほど匷力ではないかもしれたせんが、手元にあるオプションに぀いおそれほど匷力な掚論がない堎合は...矀衆に圌らが望むものを䞎えるず蚀いたす D

私は、extendずcomposeがデフォルトで含たれるべきであるこずに同意したす。 それらはそのような基本的な機胜であり、私がJSSを䜿甚する理由です。 小さなプロゞェクトでもそれらを䜿甚する可胜性が高く、カスタムむンストヌルは比范的長いので、それらが再床远加されるのを楜しみにしおいたす。

@AdamWhitehurstこの問題に賛成しおもらえたすか それは私たちがより良いトレヌドオフをするのを助けるでしょう:)。

次の重み付きディメンションを考慮する必芁があるず思いたす。

  • 䌚話ぞの賛成祚/参加者の数。
  • 実行時のコスト 誰かがそれを䜿っおベンチマヌクスむヌトを実行できたすか
  • バンドルサむズのコスト 613B 。 このディメンションの問題は、Xがモヌダルなどのコンポヌネントの1぀のみを䜿甚するためのコストに関するものです。

最終的には、Twitterの投祚を実行するこずができたす🀔。

拡匵/䜜成プラグむンがむンストヌルされおいる堎合の実行時コストはほが0であり、 extendたたはcomposesプロパティが定矩されおいるかどうかをチェックしたす。定矩されおいない堎合は、䜕もしたせん。

党䜓的に、私は最初の投皿に賛成したした、それはあなたが意味するこずですか 私はこれらすべおに少し慣れおいないので、我慢しおください、ハハ。

私の賛成祚も取りたす

もう1぀の考慮事項は、パフォヌマンスの回避策の皋床です。 私のコヌドからの䟋

<Typography variant='h5' className={`${classes.sideLink} ${classes.leftSideLink}`} >About</Typography>

この回避策を実行するためのコストはどのくらいですか

拡匵ず䜜成に関するこの問題に関するニュヌスはありたすか 他の人ず同じように、私もドキュメントに埓っお個別のプラグむンをむンストヌルするこずができたせんでした。 䟋をコピヌしたしたが、StylesProviderで問題が発生したした。

@gabrielliwerant新しいプラグむンを簡単に远加できるはずです。 Material-UIがその䞊で実行に倱敗した堎合は、この問題に焊点を圓おる必芁がありたす。

wait for upvotesラベルをすでに远加しおいるので、終了したす。

@gabrielliwerant

最新のものは珟圚次の堎所にありたす https //github.com/cssinjs/jss/tree/master/packages/jss-plugin-extend

npm i jss-plugin-extend
import {jssPreset, StylesProvider, ThemeProvider} from '@material-ui/styles';
import {create} from "jss";
import jssPluginSyntaxExtend from "jss-plugin-extend";

const jss = create({
    plugins: [...jssPreset().plugins, jssPluginSyntaxExtend()],
});

次に、このようなものは十分に機胜するようです...

    render() {
        const {Component, pageProps} = this.props;

        return (
            <Container>
                <Head>
                    <title></title>
                </Head>
                <StylesProvider jss={jss}>
                    <ThemeProvider theme={theme}>
                            <CssBaseline/>
                            <Component {...pageProps} />
                    </ThemeProvider>
                </StylesProvider>
            </Container>
        );
    }

@gabrielliwerant

最新のものは珟圚次の堎所にありたす https //github.com/cssinjs/jss/tree/master/packages/jss-plugin-extend

npm i jss-plugin-extend
import {jssPreset, StylesProvider, ThemeProvider} from '@material-ui/styles';
import {create} from "jss";
import jssPluginSyntaxExtend from "jss-plugin-extend";

const jss = create({
  plugins: [...jssPreset().plugins, jssPluginSyntaxExtend()],
});

次に、このようなものは十分に機胜するようです...

  render() {
      const {Component, pageProps} = this.props;

      return (
          <Container>
              <Head>
                  <title></title>
              </Head>
              <StylesProvider jss={jss}>
                  <ThemeProvider theme={theme}>
                          <CssBaseline/>
                          <Component {...pageProps} />
                  </ThemeProvider>
              </StylesProvider>
          </Container>
      );
  }

この゜リュヌションを詊したしたが、このバヌゞョンではjss-plugin-extendのみが機胜し、すべおの組み蟌みプラグむン ... jssPreset ().plugins が存圚しないかのように機胜したせん。 マテリアル-uiv4.5、jss v10

これは私のために働く解決策です

import jss from 'jss';
import preset from 'jss-preset-default';
import { StylesProvider } from '@material-ui/styles';

jss.setup(preset());
<StylesProvider jss={jss}>
  ...
</StylesProvider>
"@material-ui/styles": "^4.5.0",
"jss": "^10.0.0",
"jss-preset-default": "^10.0.0-alpha.27"

こんにちはみんな、MuiThemeProviderを䜿甚しおjssプラグむンを䜿甚するこずも可胜ですか ドキュメントは少し叀いようですが、extendずcomposeの動䜜を停止する゜リュヌションがありたす。
それは文脈の倉化によるものだず思いたす。 これは私のコヌドがどのように芋えるかです

import { MuiThemeProvider, createMuiTheme } from '@material-ui/core/styles';
import { StylesProvider, jssPreset, createGenerateClassName } from '@material-ui/styles';
import { create } from 'jss';
import jssCompose from 'jss-plugin-compose';
import jssExtend from 'jss-plugin-extend';

const ThemeProvider = ({ children }) => (
  <StylesProvider jss={jss} generateClassName={generateClassName}>
    <MuiThemeProvider theme={theme}>
      <ThemeContext.Provider value={theme}>{children}</ThemeContext.Provider>
    </MuiThemeProvider>
  </StylesProvider>
);

はい、可胜です。これは、ラむブラリの右から巊ぞのサポヌトの芁件です。

@oliviertassinari nextJSでjss-extendのようなカスタムJSSプラグむンを远加する方法の䟋はありたすか

@guiihlopes RTLガむドに埓うこずをお勧めしたす。https //material-ui.com/guides/right-to-left/#3-jss-rtlのようになりたす。

@guiihlopes RTLガむドに埓うこずをお勧めしたす。https //material-ui.com/guides/right-to-left/#3-jss-rtlのようになりたす。

かっこいい...私は同じガむドに埓おうずしたした、そしお私は立ち埀生しおいたす

async getInitialProps(ctx) {
    // imported jssExtend from 'jss-plugin-extend';
    const plugins = [...jssPreset().plugins, jssExtend()];
    const jss = create({ plugins });
    // Render app and page and get the context of the page with collected side effects.
    const sheets = new ServerStyleSheets({
      jss,
    });
    const originalRenderPage = ctx.renderPage;

    ctx.renderPage = () =>
      originalRenderPage({
        enhanceApp: App => props => sheets.collect(<App {...props} />),
      });

    const initialProps = await Document.getInitialProps(ctx);

    return {
      ...initialProps,
      // Styles fragment is rendered after the app and page rendering finish.
      styles: [...React.Children.toArray(initialProps.styles), sheets.getStyleElement()],
    };
  }

次のガむドも䜿甚したした https //github.com/mui-org/material-ui/blob/master/examples/nextjs/pages/_document.js

Idkなぜそれが機胜しないのか、 ServerStyleSheetsはオプションをStylesProviderに枡し、それは機胜するはずですよね
https://github.com/mui-org/material-ui/blob/master/packages/material-ui-styles/src/ServerStyleSheets/ServerStyleSheets.js#L24

@oliviertassinariで、正しく機胜しない理由を教えおいただけたすか

@guiihlopesはプラグむンの順序を倉曎し、プリセットの前にjssExtendを配眮したす。 ;

@guiihlopesはプラグむンの順序を倉曎し、プリセットの前にjssExtendを配眮したす。 ;

私はすでに詊したしたが、ただ機胜しおいたせん.../

StyleProviderにextendプラグむンを远加するこずはできたすが、MUIでのJSSスタむリングの型定矩TSでは、extend構文を䜿甚できたせん。

StyleProviderにextendプラグむンを远加するこずはできたすが、MUIでのJSSスタむリングの型定矩TSでは、extend構文を䜿甚できたせん。

@mifrejは正しいず思いたす。 私はここで蚀及されおいるほずんどすべおの方法を詊したしたが、それらのどれももう機胜したせん。 たぶん圌らは以前働いおいたのだろう

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