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-베타.22 |
| λ°˜μ‘ | 16.0.0 |
| λΈŒλΌμš°μ € | Chrome 버전 62.0.3202.94(곡식 λΉŒλ“œ)(64λΉ„νŠΈ) |

enhancement

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

:+1: κ·Έ 두 개λ₯Ό λ‹€μ‹œ μΆ”κ°€ν•  λ•Œ(ν™•μž₯ 및 μž‘μ„±). 그듀은 단지 2KB IMO에 λŒ€ν•΄ ν™•μ‹€νžˆ κ°€μΉ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€.

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

@tdkn jss-extend ν”ŒλŸ¬κ·ΈμΈμ„ λ‘œλ“œν•˜κ³  μžˆμŠ΅λ‹ˆκΉŒ? https://github.com/cssinjs/react-jss#custom -setup

@mbrooks
κ°μ‚¬ν•©λ‹ˆλ‹€πŸ‘
μ•„λž˜μ™€ 같이 μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€.
κ·ΈλŸ¬λ‚˜ 이것은 μžμ„Ένžˆ λ¬Έμ„œν™”λ˜μ–΄ μžˆμŠ΅λ‹ˆκΉŒ? :μ‹€λ§ν•œ:

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 쒋은 μ§€μ μž…λ‹ˆλ‹€. @μ½”ν”„?

@tdkn ν”Όλ“œλ°± μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. λ³€κ²½ 둜그의 μ£Όμš” λ³€κ²½ 뢀뢄에 λ³€κ²½ 사항을 μΆ”κ°€ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

μ‚¬μš©μžκ°€ μ—¬λŸ¬ μœ„μΉ˜μ—μ„œ 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
ν•˜μ§€λ§Œ μ„œλ²„ μΈ‘ λ Œλ”λ§μ„ μ‚¬μš©ν•˜κ³  있으며 μž‘λ™ν•˜κ²Œ λ§Œλ“€ 수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€.

μΆ”μ‹ : 이 ν”ŒλŸ¬κ·ΈμΈμ„ 2kb용으둜 μ œκ±°ν•˜λŠ” 것이 κ°€μΉ˜κ°€ μžˆλŠ”μ§€ ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λͺ¨λ‘κ°€ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” 정말 멋진 κΈ°λŠ₯이기 λ•Œλ¬Έμž…λ‹ˆλ‹€ 😁

두 번째둜, ν™•μž₯ 및 μž‘μ„±μ€ JSS의 IMHO ν•„μˆ˜ 도ꡬ이며 2kb의 κ°€μΉ˜κ°€ μ—†μŠ΅λ‹ˆλ‹€.

λ Œλ”λ§ λŸ°νƒ€μž„ μ˜€λ²„ν—€λ“œλ₯Ό μ •λŸ‰ν™”ν•΄μ•Ό ν•©λ‹ˆλ‹€. λ²ˆλ“€ 크기에 κ΄€ν•œ κ²ƒλ§Œμ΄ μ•„λ‹™λ‹ˆλ‹€.

mui의 경우 μ—¬μ „νžˆ 선택 μ‚¬ν•­μ΄λ―€λ‘œ μ˜€λ²„ν—€λ“œκ°€ μ¦κ°€ν•˜λŠ” κ²ƒμœΌλ‘œ ν™•μΈλ˜λ©΄ className 라이브러리 및 μŠ€ν”„λ ˆλ“œ μ—°μ‚°μžλ₯Ό 계속 μ‚¬μš©ν•  수 μžˆμ§€λ§Œ 큰 μ°¨μ΄λŠ” 없을 것이라고 μƒκ°ν•©λ‹ˆλ‹€.

λ¬Έμ„œμ— 따라 jss-rtl ν”ŒλŸ¬κ·ΈμΈμ„ ν™œμ„±ν™”ν•΄μ•Ό ν•˜λŠ” μ •ν™•ν•œ λ°©μ‹μœΌλ‘œ jss-extend ν”ŒλŸ¬κ·ΈμΈμ„ ν™œμ„±ν™”ν•˜λ €κ³  ν–ˆμŠ΅λ‹ˆλ‹€. λ™μΌν•œ μ½”λ“œμ΄μ§€λ§Œ jss-extend에 λŒ€ν•œ λͺ¨λ“  ν”ŒλŸ¬κ·ΈμΈ κ΄€λ ¨ ν˜ΈμΆœμ„ κ΅μ²΄ν–ˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ„±κ³΅ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€. ν™•μž₯ν•΄μ•Ό ν•˜λŠ” κ·œμΉ™μ€ μ‹€μ œλ‘œ 영ν–₯을 받지 μ•ŠμŠ΅λ‹ˆλ‹€. λˆ„κ΅°κ°€κ°€ κ²°κ΅­ 그것을 λ§Œλ“€ 수 μžˆμ—ˆμŠ΅λ‹ˆκΉŒ?

μ  μž₯, μ§€λ‚œ λ‚  λ°˜μ€ material-uiμ—μ„œ jss-extendλ₯Ό μ‚¬μš©ν•˜λŠ” 방법에 λŒ€ν•΄ μΌμŠ΅λ‹ˆλ‹€. 이 μ˜ˆμ œλŠ” μ–΄λ”˜κ°€μ— μžˆμŠ΅λ‹ˆλ‹€:
cssLabel: { "&$cssFocused": { color: grey[500] } }, cssFocused: { backgroundColor: blue[500] },
μ—¬κΈ°μ„œ "&$cssFocused λŠ” extend: cssFocused와 같을 κ²ƒμž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ 그렇지 μ•ŠμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ 그것을 ν•˜λŠ” 방법?

@nsaubi 쀑첩 κΈ°λŠ₯에 λŒ€ν•΄ μ΄μ•ΌκΈ°ν•˜κ³  있으며 &λŠ” sassμ—μ„œμ™€ 같이 ν¬ν•¨ν•˜λŠ” κ·œμΉ™ μ„ νƒκΈ°λ‘œ λŒ€μ²΄λ©λ‹ˆλ‹€.

jss-extend/composeκ°€ λ―Έλž˜μ— ν‘œμ€€μ΄ 될 것인지에 λŒ€ν•œ 정보가 μžˆμŠ΅λ‹ˆκΉŒ?

jss μ½”λ“œλ₯Ό 더 κΉ”λ”ν•˜κ²Œ 보이게 ν•˜λŠ” 데 도움이 λ˜λ―€λ‘œ ν™•μž₯이 λ‹€μ‹œ λ§Œλ“€μ–΄μ§€κΈ°λ₯Ό λ°”λžλ‹ˆλ‹€.

++ (1 )

2kbλŠ” λ³„λ‘œ μ€‘μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ•žμœΌλ‘œ 'ν™•μž₯ν•˜κ³  μž‘μ„±'으둜 쒋은 μ½”λ”© νŒ¨ν„΄μ„ κ΅¬μΆ•ν•˜λŠ” 것이 더 μ€‘μš”ν•˜λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.
@oliviertassinari λ‹€μ‹œ μΆ”κ°€ν•˜κ³  μ‹€μ œλ‘œ 전체 지원을 μΆ”κ°€ν•˜κΈ° μœ„ν•΄ 평가해 μ£Όμ‹œκ² μŠ΅λ‹ˆκΉŒ?

@gitsupersmecher JssProvider ꡬ성 μš”μ†Œλ₯Ό μ‚¬μš©ν•˜μ—¬ JSS에 ν”ŒλŸ¬κ·ΈμΈμ„ μΆ”κ°€ν•˜μ—¬ "ν™•μž₯ 및 μž‘μ„±"에 λŒ€ν•œ μ™„μ „ν•œ 지원을 이미 κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. λŒ€λΆ€λΆ„μ˜ μ‚¬λžŒλ“€μ€ 없이 지낼 수 μžˆμŠ΅λ‹ˆλ‹€. +2kb λ²ˆλ“€ μ¦κ°€λŠ” 문제의 ν•œ 츑면이고 λŸ°νƒ€μž„ λΉ„μš©μ€ λ‹€λ₯Έ μΈ‘λ©΄μž…λ‹ˆλ‹€.

λŸ°νƒ€μž„ λΉ„μš©μ€ 2의 경우 거의 λˆˆμ— 띄지 μ•ŠλŠ”λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. λ˜ν•œ λͺ‡ kbλ₯Ό μΆ”κ°€ν•  κ°€μΉ˜κ°€ μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. μš°λ¦¬λŠ” μŠ€νƒ€μΌ 지정을 곡개 API의 μΌλΆ€λ‘œ λ§Œλ“€μ—ˆκ³  맀우 인기 μžˆλŠ” μž‘μ—…μ΄κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ ν™•μž₯ λŒ€μ‹ μ— λŒ€λΆ€λΆ„μ˜ 경우λ₯Ό λ‹€λ£¨λŠ” μŠ€ν”„λ ˆλ“œ μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•  수 있으며 ꡬ성은 className을 μ—°κ²°ν•˜μ—¬ ꡬ성 μš”μ†Œ λ‚΄λΆ€μ—μ„œ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

:+1: κ·Έ 두 개λ₯Ό λ‹€μ‹œ μΆ”κ°€ν•  λ•Œ(ν™•μž₯ 및 μž‘μ„±). 그듀은 단지 2KB IMO에 λŒ€ν•΄ ν™•μ‹€νžˆ κ°€μΉ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€.

또 λ‹€λ₯Έ μ˜΅μ…˜μ€ λ‚΄λΆ€ jss μΈμŠ€ν„΄μŠ€λ₯Ό μ‹€μ œλ‘œ 숨기고 μŠ€νƒ€μΌ 지정을 μœ„ν•΄ 자체 jss 섀정을 μ‚¬μš©ν•˜λŠ” 방법을 맀우 λͺ…ν™•ν•˜κ²Œ λ§Œλ“œλŠ” κ²ƒμž…λ‹ˆλ‹€.

μ•ˆλ…•ν•˜μ„Έμš”, μ„±κ³΅ν•˜μ§€ μ•Šκ³  (jss-rtl ν”ŒλŸ¬κ·ΈμΈ 예제 μ‚¬μš©) nextjs ν”„λ‘œμ νŠΈμ— jss-extendλ₯Ό μΆ”κ°€ν•˜λ €κ³  ν•©λ‹ˆλ‹€. λˆ„κ΅°κ°€κ°€ 그것을 μž‘λ™ν•˜κ²Œ ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

^^ 이것도 μ•Œκ³  μ‹ΆμŠ΅λ‹ˆλ‹€

여기에 λ‚΄κ°€ν•˜λŠ” 일을 κ²Œμ‹œν•©λ‹ˆλ‹€. nextjs μ˜ˆμ œμ—μ„œ 이미 μ‚¬μš©λ˜μ—ˆκΈ° λ•Œλ¬Έμ— generateClassName을 κ΅¬ν˜„ν•˜λŠ” 방법을 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

이 예λ₯Ό 기본으둜 μ‚¬μš©:
https://github.com/mui-org/material-ui/tree/master/examples/nextjs

λ¨Όμ € jss-extendλ₯Ό μ„€μΉ˜ν•˜μ‹­μ‹œμ˜€.
npm i --save jss-extend

/νŽ˜μ΄μ§€/_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만큼 해둭지 μ•Šκ³  ν™•μž₯/μž‘μ„±λ§ŒνΌ μ²˜λ¦¬λ˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆμ§€λ§Œ μ½”λ“œ μœ μ§€ 관리도 μ—¬κΈ°μ—μ„œ ν•œ μš”μΈμž…λ‹ˆλ‹€. 결둠적으둜, λ‚΄ 좔둠도 κ·Έλ ‡κ²Œ κ°•λ ₯ν•˜μ§€ μ•Šμ„ 수 μžˆμ§€λ§Œ 손에 μžˆλŠ” μ˜΅μ…˜μ— λŒ€ν•œ κ·Έλ ‡κ²Œ κ°•λ ₯ν•˜μ§€ μ•Šμ€ μΆ”λ‘  μ•žμ—μ„œ... λ‚˜λŠ” ꡰ쀑이 μ›ν•˜λŠ” 것을 μ œκ³΅ν•œλ‹€κ³  λ§ν•©λ‹ˆλ‹€! :λ””

ν™•μž₯ 및 μž‘μ„±μ΄ 기본적으둜 ν¬ν•¨λ˜μ–΄μ•Ό ν•œλ‹€λŠ” 데 λ™μ˜ν•©λ‹ˆλ‹€. 그런 기본적인 κΈ°λŠ₯듀이 μ œκ°€ JSSλ₯Ό μ‚¬μš©ν•˜λŠ” μ΄μœ μž…λ‹ˆλ‹€. μ†Œκ·œλͺ¨ ν”„λ‘œμ νŠΈμ—μ„œλ„ μ‚¬μš©ν•  수 있고 μ‚¬μš©μž 지정 μ„€μΉ˜κ°€ 비ꡐ적 였래 걸리기 λ•Œλ¬Έμ— λ‹€μ‹œ μΆ”κ°€λ˜λŠ” 것을 보고 μ‹ΆμŠ΅λ‹ˆλ‹€.

@AdamWhitehurst 이 λ¬Έμ œμ— μ°¬μ„±ν‘œλ₯Ό 던질 수 μžˆμŠ΅λ‹ˆκΉŒ? 더 λ‚˜μ€ μ ˆμΆ©μ•ˆμ„ λ§Œλ“œλŠ” 데 도움이 될 κ²ƒμž…λ‹ˆλ‹€. :).

λ‹€μŒ κ°€μ€‘μΉ˜ 차원을 κ³ λ €ν•΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

  • λŒ€ν™”μ— λŒ€ν•œ μ°¬μ„±/μ°Έκ°€μž 수.
  • λŸ°νƒ€μž„ λΉ„μš©: ? (λˆ„κ΅°κ°€ 벀치마크 μ œν’ˆκ΅°μ„ μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?)
  • λ²ˆλ“€ 크기 λΉ„μš©: 613 B . 이 μ°¨μ›μ˜ λ¬Έμ œλŠ” Xκ°€ Modalκ³Ό 같은 ꡬ성 μš”μ†Œ 쀑 ν•˜λ‚˜λ§Œ μ‚¬μš©ν•˜λŠ” 데 λ“œλŠ” λΉ„μš©μž…λ‹ˆλ‹€.

κ²°κ΅­ νŠΈμœ„ν„° 섀문쑰사λ₯Ό μ‹€μ‹œν•  수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€ πŸ€”.

ν™•μž₯/μž‘μ„± ν”ŒλŸ¬κ·ΈμΈμ΄ μ„€μΉ˜λœ 경우 λŸ°νƒ€μž„ λΉ„μš©μ€ 거의 0이고 extend λ˜λŠ” composes 속성이 μ •μ˜λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ 아무 μž‘μ—…λ„ μˆ˜ν–‰ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ™„μ „νžˆ, λ‚˜λŠ” 첫 번째 κ²Œμ‹œλ¬Όμ— μ°¬μ„±ν‘œλ₯Ό λ˜μ‘ŒμŠ΅λ‹ˆλ‹€. 그게 무슨 λ§μΈκ°€μš”? λ‚˜λŠ” 이 λͺ¨λ“  것에 μ΅μˆ™ν•˜μ§€ μ•ŠμœΌλ‹ˆ, μ°Έμ•„μ£Όμ„Έμš”. ν•˜ν•˜.

λ‚΄ 찬성도 λ°›μ•„

또 λ‹€λ₯Έ κ³ λ € 사항은 ν•΄κ²° λ°©λ²•μ˜ μ„±λŠ₯μž…λ‹ˆλ‹€. λ‚΄ μ½”λ“œμ˜ 예:

<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 )은 마치 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” κ²ƒμ²˜λŸΌ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 재료 UI v4.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 ν”ŒλŸ¬κ·ΈμΈλ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆκΉŒ? λ¬Έμ„œκ°€ 쑰금 였래된 것 κ°™κ³  ν™•μž₯ 및 μž‘μ„± μž‘μ—…μ„ μ€‘μ§€ν•˜λŠ” μ†”λ£¨μ…˜μ΄ μžˆμŠ΅λ‹ˆλ‹€.
λ§₯락의 λ³€ν™” λ•Œλ¬ΈμΈ 것 κ°™μ•„μš”. λ‚΄ μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

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 jss-extend 와 같은 μ‚¬μš©μž μ •μ˜ JSS ν”ŒλŸ¬κ·ΈμΈμ„ nextJS둜 μΆ”κ°€ν•˜λŠ” 방법에 λŒ€ν•œ μ˜ˆκ°€ μžˆμŠ΅λ‹ˆκΉŒ?

@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

μž‘λ™ν•˜μ§€ μ•ŠλŠ” 이유λ₯Ό μ•Œκ³  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 에 ν™•μž₯ ν”ŒλŸ¬κ·ΈμΈμ„ μΆ”κ°€ν•  수 μžˆμ§€λ§Œ MUI의 JSS μŠ€νƒ€μΌμ— λŒ€ν•œ μœ ν˜• μ •μ˜ TSλŠ” ν™•μž₯ ꡬ문을 ν—ˆμš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

StyleProvider 에 ν™•μž₯ ν”ŒλŸ¬κ·ΈμΈμ„ μΆ”κ°€ν•  수 μžˆμ§€λ§Œ MUI의 JSS μŠ€νƒ€μΌμ— λŒ€ν•œ μœ ν˜• μ •μ˜ TSλŠ” ν™•μž₯ ꡬ문을 ν—ˆμš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

@mifrej κ°€ λ§žλŠ” 것 κ°™μ•„μš”. 여기에 μ–ΈκΈ‰λœ 거의 λͺ¨λ“  방법을 μ‹œλ„ν–ˆμ§€λ§Œ 더 이상 μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ–΄μ©Œλ©΄ 그듀은 전에 일을 μ‚¬μš©ν•©λ‹ˆλ‹€!

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