Material-ui: ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ์ง€์›

์— ๋งŒ๋“  2015๋…„ 04์›” 28์ผ  ยท  119์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: mui-org/material-ui

์ ˆ๋Œ€์ ์œผ๋กœ ์•„๋ฆ„๋‹ค์šด ๋„์„œ๊ด€.

ํ–ฅํ›„ React-Native๋กœ ์ด์‹ํ•  ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ?

enhancement

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@rogerstorm ์€ 200๋‹ฌ๋Ÿฌ๋กœ ์ด ๋ฌธ์ œ์— ์ž๊ธˆ์„ ์ง€์›ํ–ˆ์Šต๋‹ˆ๋‹ค. IssueHunt์—์„œ ํ™•์ธํ•˜์„ธ์š”.

๋ชจ๋“  119 ๋Œ“๊ธ€

์ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋ฐฉ๊ธˆ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค: https://github.com/lightningtgc/react-native-material-ui
๊ทธ๋ž˜๋„ ์ข‹์€์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @chadobado - ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ํ™•์‹คํžˆ ์ด์•ผ๊ธฐํ–ˆ์œผ๋ฉฐ ์‹œ์ž‘ํ•˜๋Š” ์žฌ๋ฏธ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ํ˜„์žฌ ์ด ํ”„๋กœ์ ํŠธ๋กœ ๊ฐ€๋“ ์ฐจ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ๊ณ„์† ์—ด์–ด๋‘๊ณ  ๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค๋ฉด ์—…๋ฐ์ดํŠธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ์ข‹์€ ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค. material-ui ๋ฅผ React-Native๋กœ ์ด์‹ํ•˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์Šคํƒ€์ผ์‹œํŠธ๋ฅผ ์•ฝ๊ฐ„๋งŒ ๋ณ€๊ฒฝํ•˜๊ณ  ๋ชจ๋“  div ์„ View , ๋ชจ๋“  h1 , h2 ๋“ฑ์„ Text ํ•˜๊ณ  ๊ทธ๊ฒƒ์€ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ฐพ์€ ์œ ์ผํ•œ ๋ฌธ์ œ๋Š” React Native๊ฐ€ boxShadow ์™„์ „ํžˆ ์ง€์›ํ•˜์ง€ ์•Š์•„ ํ˜„์žฌ Paper ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์ฝ”๋“œ๊ฐ€ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— React-Native๋กœ ์ฝ”๋“œ๋ฅผ ์ž๋™ ์ด์‹ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ›Œ๋ฅญํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  div๋ฅผ View๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ๋ชจ๋“  h1, h2 ๋“ฑ์„ Text๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

babel-plugin-transformer๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ์ข‹์€ ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค

๋ฐ๋ชจ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@oliviertassinari

babel-plugin-transformer๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?

React Native์˜ ์Šคํƒ€์ผ์‹œํŠธ๊ฐ€ CSS์™€ ์ƒ๋‹นํžˆ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ํŠธ๋žœ์Šคํฌ๋จธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ƒ๋‹นํžˆ ๋ณต์žกํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐ๋ชจ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์•„์ง๊นŒ์ง€๋Š” '๋ฐ”์˜์ง€๋งŒ ๊ณง ์ž‘์€ ๋ฐ๋ชจ๋ฅผ ๋ณด์—ฌ๋“œ๋ฆฌ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ ์šฐ๋ฆฌ๊ฐ€ ํ•ด์•ผ ํ•  ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค

์Šคํƒ€์ผ์‹œํŠธ

let styles = {
      root: {
        zIndex: 5,
        width: '100%',
        display: '-webkit-box; display: -webkit-flex; display: flex',
        minHeight: themeVariables.height,
        backgroundColor: themeVariables.color,
        paddingLeft: spacing.desktopGutter,
        paddingRight: spacing.desktopGutter,
      }
}

์—๊ฒŒ

let styles = StyleSheet.create({
      root: {
        // zIndex: 5, (not supported)
        //width: '100%', (number only)
        //display: '-webkit-box; display: -webkit-flex; display: flex', (React Native always use Flex)
        minHeight: themeVariables.height,
        backgroundColor: themeVariables.color,
        paddingLeft: spacing.desktopGutter,
        paddingRight: spacing.desktopGutter,
      }
})

์ง€์ธ๋ฑ์Šค ์†”๋ฃจ์…˜

JSX

<div {...other} style={this.prepareStyles(styles, style)}>
  <h1 style={styles.text}>Hello world</h1>
</div>

์—๊ฒŒ

<View {...other} style={this.prepareStyles(styles, style)}>
  <Text style={styles.text}>Hello world</Text>
</View>

์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ์ˆ˜์ •ํ•ด์•ผ styles/transition.jsx (๋ฐ˜์ž‘์šฉ ๊ธฐ๋ณธ ์‚ฌ์šฉ object ๋Œ€์‹  string ) mixins/style-propable.jsx ์šฐ๋ฆฌ๋Š” ์—ฌ๋Ÿฌ ๋ธŒ๋ผ์šฐ์ € ๋“ฑ์„ ์ฒ˜๋ฆฌ ํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์—

https://github.com/lenaten/material-ui-native ์—์„œ react-native๋กœ WIP ๋ถ„๊ธฐ๋ฅผ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค
ํ˜„์žฌ๋Š” ์นด๋“œ์™€ RaiseButton๋งŒ ์ž‘๋™ํ•˜์ง€๋งŒ ์Šคํƒ€์ผ์€ ์—†์Šต๋‹ˆ๋‹ค(WIP ๊ธฐ์–ตํ•˜์‹œ๋‚˜์š”?)

@lenaten ์žฌ๋ฏธ์žˆ๋‹ค!
๋˜ํ•œ ์ด ํ”„๋กœ์ ํŠธ์™€ mrn(https://github.com/oliviertassinari/react-material) ์‚ฌ์ด์˜ ๋ž˜ํผ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.
ํฌํฌ๊ฐ€ ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ์—์„œ๋งŒ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ์ž‘๋™ํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
๋‘ ๊ฐ€์ง€ ์ž‘์—… ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ๋‹ค๊ณ  ๋ง์”€ํ•˜์…จ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ์–ด๋ ค์šด ์ ์ด๋ฉฐ ์ง€๊ธˆ ํ•ด๊ฒฐํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์›ํ•œ๋‹ค๋ฉด ๋‚ด๊ฐ€ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด์ „์— ๋งํ–ˆ๋“ฏ์ด ์ €๋Š” ๋˜ํ•œ ๊ธฐ๋ณธ ๊ตฌํ˜„์„ ์œ„ํ•ด https://github.com/binggg/mrn ์„ ์กฐ์‚ฌํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ต๋ณ€์ด ์˜ค๋ฉด ์—ฌ๊ธฐ์—์„œ ํฌํฌ๋ฅผ ๋‹ค์‹œ ๋ณ‘ํ•ฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Material-UI๋Š” ๋งŽ์€ ๋จธํ‹ฐ๋ฆฌ์–ผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋†“์น˜๋Š” mrn ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์„ฑ์ˆ™ํ•œ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. ๋‚ด POC๊ฐ€ ์˜ˆ์™ธ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋ฉด ํ”Œ๋žซํผ ๊ฐ„ ํŒŒ์ผ ๊ตฌ์กฐ์— ๋ณ‘ํ•ฉํ•˜๊ธฐ๊ฐ€ ์‰ฌ์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”ํ€ด๋ฅผ ์žฌ๋ฐœ๋ช…ํ•˜๊ณ  ์ฒ˜์Œ๋ถ€ํ„ฐ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•  ์‹œ๊ฐ„์ด ์—†์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“ , ์ƒ๊ฐ๊ณผ ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋‹น์‹ ์˜ ๋„์›€์€ ๋งค์šฐ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

@oliviertassinari ์ €๋„์š”.

material-ui ๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์™€ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋‘์—์„œ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ์ œ ์•„์ด๋””์–ด๋Š” react-active ๊ฐ€ iOS์™€ Android๋ฅผ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ•œ ํŒŒ์ผ ์ด๋ฆ„ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

app-bar.native.jsx
app-bar.browser.jsx
common.jsx

๋˜๋Š” ๋ธŒ๋ผ์šฐ์ €์™€ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋‘์— โ€‹โ€‹๋™์ผํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•œ ๋‹ค์Œ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ž˜ํผ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด react-native ๋Š” View ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ €๋Š” div ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

div.browser.jsx

export class ... {
  render() {
    return </div>
  }
}

div.native.jsx

export class ... {
  render() {
    return </View>
  }
}

์•ฑ ๋ฐ”.jsx

import {div} from "div"

์‹ค์ œ๋กœ ์ด ๋ž˜ํผ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@quanglam2807 ๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ ๊ตฌ์„ฑ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋‚˜๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ๊ฐ–๋Š” ์•„์ด๋””์–ด๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.
๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ํ•  ๋ฐฉ๋ฒ•์œผ๋กœ https://github.com/benoitvallon/react-native-nw-react-calculator/tree/master/src/common/components ์˜ˆ์ œ๋ฅผ ์ทจํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ƒ๊ฐ์ด ๋ฐ”๋€Œ์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Google์˜ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋”ฐ๋ผ ํฐ ๋‹จ์ผ ์ €์žฅ์†Œ์—์„œ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ material-ui ๋˜๋Š” ์—ฌ๊ธฐ์—์„œ ํฌํฌ ๋™๊ธฐํ™” ์ž‘์—…์„ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

.native ํŒŒ์ผ๋กœ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ๋‹ค์Œ ํ•ญ๋ชฉ์— ์˜์กดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ์š”์†Œ.

@oliviertassinari ์ €๋„ "ํŒŒ์ผ ํ™•์žฅ์ž" ๋ชจ๋ธ์ด๋ผ๋Š” ์•„์ด๋””์–ด๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋‚˜์—๊ฒŒ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๊ธฐ๋ณธ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ ์ถ”์ƒํ™”๋ฅผ ๋•๊ณ  ์‹ถ๋‹ค๋ฉด ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” repo ์ด๋ฆ„์—์„œ "๋„ค์ดํ‹ฐ๋ธŒ"์ ‘๋ฏธ์‚ฌ๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ๋กœ ์•ฝ์†ํ•ฉ๋‹ˆ๋‹ค. :)

@lenaten ์€ material-ui-native๊ฐ€ tcomb-form-native์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ์–ผ๋งˆ๋‚˜ ํฐ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ ๊นŒ์š”?

@mvayngrib ํ•œ๋™์•ˆ ์ด ํ”„๋กœ์ ํŠธ ์ž‘์—…์„ ์ค‘๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค..

@lenaten ์ฃ„์†ก ํ•ฉ๋‹ˆ๋‹ค ๋‹ต๋ณ€ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

์ข‹์•„, ๋‚˜๋Š” https://github.com/callemall/material-ui/pull/2611 ์—์„œ ์ž‘์—…์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค
์‹œ๊ฐ„์ด ์ข€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค!

@oliviertassinari ๊ต‰์žฅํ•ฉ๋‹ˆ๋‹ค! ๋งค์šฐ ๋งค์šฐ ํฅ๋ถ„

๊ทธ๋ž˜์„œ ํ•ญ๊ตฌ ๋…ธ๋ ฅ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์—ด๋ ค ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋Š” ์–ด๋–ป๊ฒŒ ๊ฒฐ์ •๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

@dorthwein ์•„์ง ์—ด๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ๊ด€์ ์—์„œ ํ”„๋กœ์„ธ์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@oliviertassinari - ์•ž์œผ๋กœ ๋ฐฉ๋ฒ•์ด ์„ค์ •๋˜๋ฉด ์ผ๋ถ€ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ด์‹ํ•˜๋Š” ๋ฐ ์•ฝ๊ฐ„์˜ ์‹œ๊ฐ„์„ ํ• ์• ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ๋ชฉ๋ก์„ ๋ณด๋ฉด ์ง€๊ธˆ ์œ ์ผํ•˜๊ฒŒ ์•Œ๋ ค์ง€์ง€ ์•Š์€ ๊ฒƒ์ด ๋ฐ˜์‘ ๋ชจ์–‘์˜ ๋ฌผ๊ฑด ๋งž์Šต๋‹ˆ๊นŒ?

@dorthwein ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๋“ฃ๊ฒŒ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.
์—ฌ๊ธฐ #3829์—์„œ react-look์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ฐ€์ง„ ์œ ์ผํ•œ ๋ฌธ์ œ๋Š” ์‚ฌ์†Œํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. React Native๋Š” StyleSheet API์˜ ์ž˜๋ชป๋œ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํžˆ ์‚ดํŽด๋ณด์ง„ ์•Š์•˜์ง€๋งŒ ํ•ด๊ฒฐ๋  ์ˆ˜ ์žˆ์„ ๊ฑฐ๋ผ ๋ฏฟ์Šต๋‹ˆ๋‹ค.

@oliviertassinari @dorthwein ์ด ๋…ธ๋ ฅ( material-ui ์„ react-native ๊ฐ€์ ธ์˜ด)์ด ์ฃฝ์ง€ ์•Š์•˜๋‹ค๋Š” ์‚ฌ์‹ค์— ๊ธฐ์ฉ๋‹ˆ๋‹ค . ์ด ์Šค๋ ˆ๋“œ์—์„œ ์–ธ๊ธ‰๋˜์ง€ ์•Š์€ ๋˜ ๋‹ค๋ฅธ ์ƒˆ๋กœ์šด material-ui to react-native ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์Œ์„ ์ง€์ ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. https://github.com/react-native-material- design/react-native-material-design . ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋Š” https://github.com/binggg/mrn์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค

@oliviertassinari ์ด ํฌํŠธ์— ๋Œ€ํ•ด iOS ์ง€์›์ด ํƒ€๋‹นํ•œ์ง€ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ํŠนํžˆ Google ์ง€๋„ ๋ฐ ๊ธฐํƒ€ Google Material + iOS ์•ฑ์ด ์–ด๋–ป๊ฒŒ ์ œ๊ณต๋˜๋Š”์ง€ ๋ณผ ๋•Œ ํŠนํžˆ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์˜๋ฏธ๊ฐ€ ์žˆ๊ณ  ๊ฐ•๋ ฅํ•œ ๊ธฐ์กด iOS ๊ตฌ์„ฑ ์š”์†Œ(์˜ˆ: ์Šค์œ„์น˜)๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ iOS์˜ iOS ์Šค์œ„์น˜์— ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Android ๋ฐ iOS๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋„ ํฐ ๋ถ€๋‹ด์ด ์•„๋‹™๋‹ˆ๋‹ค.

@oliviertassinari ์—ญ์‹œ component.native.js, component.android.js, component.ios.js ํŒŒ์ผ ๊ตฌ์กฐ๊ฐ€ ๊ฐ€์žฅ ์ดํ•ด๊ฐ€ ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@oliviertassinari ๋ฌธ์„œ๋ฅผ ๊ฐ€์ ธ

  • package.json: react-native๊ฐ€ ํŒจํ‚ค์ง€ ์ด๋ฆ„ material-ui๋ฅผ ์ข‹์•„ํ•˜์ง€ ์•Š์Œ - materialUI๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋จ
  • ํ˜„์žฌ material-ui/react-native ๋ธŒ๋žœ์น˜๋Š” react-native packager์— ๋ฌธ์ œ๊ฐ€ ์žˆ๊ณ  mainjs.bundle ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ์กด material-ui ์ €์žฅ์†Œ ์œ„์— ์ž‘๋™ํ•˜๋Š” ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ์„ ์–ป์„ ์ˆ˜ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ๋ถ„์•ผ์—์„œ ์šด์ด ์ข‹์€ ์‚ฌ๋žŒ์ด ์žˆ์œผ๋ฉด ๊ธฐ๋ณธ ๊ตฌ์„ฑ ์š”์†Œ ์ง‘ํ•ฉ์„ ๊ธฐ์—ฌ/๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•ˆ์ •์ ์œผ๋กœ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@dorthwein ํ”ผ๋“œ๋ฐฑ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ ๋ธŒ๋žœ์น˜๋Š” ๊ณ ๋„๋กœ ์‹คํ—˜์ ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋ฐ˜๋ฉด์— ์ €๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค(https://github.com/callemall/material-ui/pull/3829).
์ƒˆ๋กœ์šด git clone ์—์„œ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋„ค, ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์˜ ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ๋จธํ‹ฐ๋ฆฌ์–ผ ๋””์ž์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋ฐ”์ผ ์•ฑ์—์„œ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๋ชจ๋“  ์›น ํ•ญ๋ชฉ๋„ ์—ฌ๊ธฐ์— ์žˆ์œผ๋ฏ€๋กœ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ž‘์—… ํ™˜๊ฒฝ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ”„๋กœ์ ํŠธ์™€ ํ•จ๊ป˜ ์ž‘์—… ํ™˜๊ฒฝ์„ ์ข…๋ฃŒํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ์ •๋ณด๋ฅผ ์ฝ๊ณ  FB React ๊ธฐ๋ณธ ํŽ˜์ด์ง€์—์„œ ์ด ๊ฐ„๋‹จํ•œ ์ •๋ณด๋ฅผ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

"UI ๊ตฌ์ถ•์„ ์œ„ํ•œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์„ฑ ์š”์†Œ์ธ View๋Š” flexbox, ์Šคํƒ€์ผ, ์ผ๋ถ€ ํ„ฐ์น˜ ์ฒ˜๋ฆฌ ๋ฐ ์ ‘๊ทผ์„ฑ ์ปจํŠธ๋กค์ด ์žˆ๋Š” ๋ ˆ์ด์•„์›ƒ์„ ์ง€์›ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ์ด๋ฉฐ ๋‹ค๋ฅธ ๋ทฐ ๋‚ด๋ถ€์— ์ค‘์ฒฉ๋˜๊ณ  ๋ชจ๋“  ์œ ํ˜•์˜ ์ž์‹์ด 0๊ฐœ ์ด์ƒ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. UIView์ด๋“  ์ƒ๊ด€์—†์ด React๊ฐ€ ์‹คํ–‰๋˜๋Š” ํ”Œ๋žซํผ์— ์ƒ๊ด€์—†์ด ๊ธฐ๋ณธ ๋ณด๊ธฐ์— ์ง์ ‘ ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค.

, android.view ๋“ฑ. ์ด ์˜ˆ์ œ๋Š” ํŒจ๋”ฉ์ด ์žˆ๋Š” ํ–‰์— ๋‘ ๊ฐœ์˜ ์ƒ‰์ƒ ์ƒ์ž์™€ ์‚ฌ์šฉ์ž ์ •์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” ๋ณด๊ธฐ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค."

์ถœ์ฒ˜: https://facebook.github.io/react-native/docs/view.html

์ด์— ๋น„์ถ”์–ด ๋ณผ ๋•Œ div๋ฅผ ๋ณด๊ธฐ๋กœ ์ „ํ™˜ํ•˜์—ฌ ์ผ๋ฐ˜ ์ž‘์—…์˜ ์ƒ๋‹น ๋ถ€๋ถ„์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ํ˜„์žฌ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์•ฝ๊ฐ„ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ—ค๋” ๋ฐ ๊ธฐํƒ€ ๊ด€๋ จ ํƒœ๊ทธ๋„ ๋ณด๋‹ค ๋ณดํŽธ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๋งคํ•‘๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ƒ๊ฐ?

์ด ๋ฆฌ์†Œ์Šค๋„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”. ๊ฝค ์ง์„ ์ ์ด๋ฉฐ ํ•œ ๋ฒˆ ์‚ดํŽด๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

https://github.com/necolas/react-native-web

@dorthwein ์ข‹์€ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค! ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ ์ด ๊ธธ์„ ๊ฐ„๋‹ค๋ฉด React Native ์ „์šฉ ๋ฒ„์ „์„ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋„ค์ดํ‹ฐ๋ธŒ ๋ฐ DOM์— ๋Œ€ํ•œ ๋ณ„๋„์˜ ์ฝ”๋“œ ๋Œ€์‹  React ๋„ค์ดํ‹ฐ๋ธŒ API์—์„œ ์ „์ฒด ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋†€๋ผ์šด! ๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด ๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค.

@quanglam2807 ๋„ค - ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๋“ฑ... ์„œ๋กœ์˜ ๋ผ์ธ์„ ์œ ์ง€ํ•˜์‹ญ์‹œ์˜ค. ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๊ฐ€์žฅ ํฐ ๋„์ „์€ ์Šคํƒ€์ผ๊ณผ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹ค๋ฅธ ํฐ ์žฅ์ ์€ ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ์ง€์›์„ ์ ์ง„์ ์œผ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹จ์ ์€ ๋ชจ๋“  ๊ฒƒ์ด ํ”Œ๋ ‰์Šค ๋ฐ•์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์ฝ”๋“œ ๊ธฐ๋ฐ˜์˜ ์ฃผ์š” ๋ฆฌํŒฉํ† ๋ง์ด๋ผ๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ - ์•ž์œผ๋กœ ์ง„ํ–‰ํ•˜๋ ค๋ฉด ๋ชจ๋‘ ๋ˆ„๊ฐ€ ์ด ์ž‘์—…์— ์„œ๋ช…ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋‚˜๋Š” ์—ฌ์ „ํžˆ ๋†€์•„๋ณด๊ณ  react-native-web ํ•ญ๋ชฉ์ด ์–ผ๋งˆ๋‚˜ ๊ฐ•๋ ฅํ•œ์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@quanglam2807 @oliviertassinari ์ด ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๋˜ ๋‹ค๋ฅธ ์ด์ ์€ material-ui๊ฐ€ https://github.com/ptmt/react-native-desktop ์œผ๋กœ๋„ ์‰ฝ๊ฒŒ ์ด์‹๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@oliviertassinari ๋Š” ์ด ํ”„๋กœ์ ํŠธ์˜ ๋ฉ”์ธํ…Œ์ด๋„ˆ๊ฐ€ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜๋ฉด ๋’ค์ฒ˜์งˆ ์ˆ˜ ์žˆ๋Š” react-native-web์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

@dorthwein ์ด ํ”„๋กœ์ ํŠธ์˜ ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์—
react-native-web ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋จผ์ € ๊ธฐ๋ณธ ๋ฒ„์ „์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

@oliviertassinari ์•„๋‹ˆ์š”, react-native-web์ด ํ•˜๋Š” ์ผ์€ ํ”Œ๋žซํผ์— ๋”ฐ๋ผ ๊ฐ€์žฅ "๋„ค์ดํ‹ฐ๋ธŒ" ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด View ํƒœ๊ทธ๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” div๋ฅผ, iOS์—์„œ๋Š” UIView๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  UIView์™€ ๋™๋“ฑํ•œ ๊ฒƒ์€ Android๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ํ”„๋กœ์„ธ์Šค๋Š” ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ธฐ๋ณธ ๋ฒ„์ „์„ ์ž‘์„ฑํ•˜๋Š” ๋Œ€์‹  h1 ๋ฐ ๋ ˆ์ด๋ธ”๊ณผ ๊ฐ™์€ ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  div ๋ฐ ์Šคํƒ€์ผ ํ…์ŠคํŠธ ๋Œ€์‹  ๋ณด๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ธฐ์กด ๋ฒ„์ „์„ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ™•์‹คํžˆ ์ž‘์€ ์ž‘์—…์€ ์•„๋‹ˆ์ง€๋งŒ ํ”„๋กœ์„ธ์Šค๋Š” ์—ฌ๋Ÿฌ ๋ฒ„์ „์„ ๋งŒ๋“ค๊ณ  ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๋Œ€์‹  ๊ธฐ์กด ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ํ”„๋กœ์„ธ์Šค๋Š” ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ธฐ๋ณธ ๋ฒ„์ „์„ ์ž‘์„ฑํ•˜๋Š” ๋Œ€์‹  h1 ๋ฐ ๋ ˆ์ด๋ธ”๊ณผ ๊ฐ™์€ ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  div ๋ฐ ์Šคํƒ€์ผ ํ…์ŠคํŠธ ๋Œ€์‹  ๋ณด๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ธฐ์กด ๋ฒ„์ „์„ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ์ž‘๋™ํ•˜๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋ฒ„์ „์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ์ •ํ™•ํžˆ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ react-native-web ๋Š” ์›น์— ๊ธฐ๋ณธ ๋ฐ˜์‘์„ ๊ฐ€์ ธ์˜ค๊ณ  ๊ทธ ๋ฐ˜๋Œ€๋Š” ์•„๋‹™๋‹ˆ๋‹ค.
๊ทธ๋ž˜๋„ ๋™์ผํ•œ ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ํŽธ๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค :+1:.
๋‚˜๋Š” ์ง€๊ธˆ๊นŒ์ง€ ์ด lib์— ๋Œ€ํ•œ ํ•˜๋‚˜์˜ ์ž‘์€ ๋ฌธ์ œ๋ฅผ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์˜ StyleSheet.create ๊ตฌํ˜„์€ ๋™์  ๊ฐ’์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(muiTheme์— ํ•„์š”ํ•จ). ์ด ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•ด ๋ฐ˜์‘ ๋ณด๊ธฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@oliviertassinari ๋‹น์‹ ์˜ ๊ถŒ๋ฆฌ - ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊ฑฐ๊พธ๋กœ ์ดํ•ดํ•˜๊ณ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. 1๋‹จ๊ณ„๋Š” ์—ฌ์ „ํžˆ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฒ„์ „์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. 2๋‹จ๊ณ„๋Š” ์ž ์žฌ์ ์œผ๋กœ ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ ์›น๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ์ผ ์ฝ”๋“œ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@wordyallen : ์ž˜์ƒ๊น€ ๐Ÿ‘

@pgangwani ์ด์ œ ๋ง‰ ํ–ˆ๋Š”๋ฐ ... ์•„์ง ์ค€๋น„๊ฐ€ ์•ˆ๋์–ด.

๋‚˜๋Š” ๊ฒฉ์ฐจ๋ฅผ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด https://github.com/react-native-material-design/react-native-material-design ์„ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ๊ฐ€์žฅ์ž๋ฆฌ ์ฃผ๋ณ€๋„ ๋งค์šฐ ๊ฑฐ์น ๊ณ  ์ ๊ทน์ ์ธ ๊ฐœ๋ฐœ์ด ์—†์Šต๋‹ˆ๋‹ค.

ํ•  ์ˆ˜๋งŒ ์žˆ๋‹ค๋ฉด ์ด ๋…ธ๋ ฅ์— ์žฌ์ •์ ์œผ๋กœ ๊ธฐ๋ถ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„,

์ €๋Š” ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์˜๊ฐ์„ ๋ฐ›์€ react-native-material-ui ์—์„œ ์ž‘์—…ํ•ฉ๋‹ˆ๋‹ค. ์ž์œ ๋กญ๊ฒŒ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค - ํ”ผ๋“œ๋ฐฑ์„ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค ;)

@xotahal et. al, IMHO๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ์ƒˆ๋กœ ๋งŒ๋“œ๋Š” ๋Œ€์‹  ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํฌํฌํ•˜๊ณ  ๊ธฐ์กด ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋‹ค์‹œ ๋งŒ๋“œ๋Š” ๋Œ€์‹  ์ด์‹ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ๋ฌป๋Š”๋‹ค๋ฉด ์žฌ๋ฃŒ ์Šคํƒ€์ผ ์ž…๋ ฅ์˜ ํ•„์š”์„ฑ์€ RN ๊ณต๊ฐ„์—์„œ ์ ˆ์‹คํžˆ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. OSS ๋…ธ๋ ฅ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ์ฝ”๋“œ๋Š” ๋งŽ์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ๋ถ€ํ„ฐ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. RN์˜ ์Šคํƒ€์ผ๋ง์€ ์ด๊ฒƒ๊ณผ 90% ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ๊ฐ™์€ ํ”Œ๋žซํผ๋ณ„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ๊ฝค ์žˆ์Šต๋‹ˆ๋‹ค...

๊ตฌ์„ฑ ์š”์†Œ ๊ตฌ์กฐ, ์†Œํ’ˆ(๋ฐ ๋ฌธ์„œ)์„ ์ฑ„ํƒํ•˜๊ณ  ๋งŽ์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ๋”๋ผ๋„ ๋ช…ํ™•ํ•œ ์—…์ŠคํŠธ๋ฆผ์„ ๊ฐ–๋Š” ๊ฒƒ์€ ์›น์—์„œ ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ์•ž๋’ค๋กœ ์ด๋™ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์žฅ๊ธฐ์ ์œผ๋กœ ์œ ์ตํ•  ๊ฒƒ์ด๋ฉฐ ๊ฐ€์žฅ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€๋Š” ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์ด ๋ฉ๋‹ˆ๋‹ค.

@jhabdas์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. API๊ฐ€ ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋” ์œ ์‚ฌํ•˜๊ฒŒ ์ฐพ์„์ˆ˜๋ก ๊ฐœ๋ฐœ์ž๊ฐ€ ์›น ํ”„๋กœ์ ํŠธ์™€ ๊ธฐ๋ณธ ํ”„๋กœ์ ํŠธ์—์„œ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๋œ ๊ฑฐ์Šฌ๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋œ ๊ฑฐ์Šฌ๋ฆฌ๋Š” ๊ฒฝํ—˜์ผ์ˆ˜๋ก ๋” ์ƒ์‚ฐ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”Œ๋žซํผ๋ณ„ ์„ธ๋ถ€ ์ •๋ณด๊ฐ€ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋ฐฐํ›„์—์„œ ์ถ”์ƒํ™”๋˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

@chadobado ๋˜๋Š” ์œ ์ง€ ๊ด€๋ฆฌ์ž, ์ด

FWIW, ์ด๊ฒƒ์ด ๋‚ด ๋ˆˆ์„ ์‚ฌ๋กœ ์žก์•˜์Šต๋‹ˆ๋‹ค.

react-native-material-kit ์— ๋Œ€ํ•œ ์›น ์ง€์›์˜ @necols :

React Native์˜ ์›น ๊ตฌํ˜„์—์„œ ํ˜ธํ™˜์„ฑ์œผ๋กœ Stylesheet๊ฐ€ ์ œ๊ณต๋œ๋‹ค๋ฉด ๋งŽ์€ ๊ฒƒ์„ ์ด์‹ํ•  ํ•„์š”๊ฐ€ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@jhabdas ๋„ค์ดํ‹ฐ๋ธŒ ๋ฐ˜์‘์œผ๋กœ ์กฐ๊ธˆ ํ”Œ๋ ˆ์ดํ•˜๋ฉด ๊ทธ๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. StyleSheet API๋Š” ํ›Œ๋ฅญํ•˜์ง€๋งŒ ๊ฝค ๋งŽ์€ ๊ฒƒ์„ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค ;)

ํŽ˜์–ด ํฌ์ธํŠธ @antoinerousseau. ์ €๋Š” RN์— ๋Œ€ํ•œ James Long์˜ ์ธ์šฉ๋ฌธ์„ ๊ณ„์† ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์›น์˜ ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์„ ์œ„ํ•œ ํ”„๋กœํ† ํƒ€์ž…์œผ๋กœ ์ƒ๊ฐํ•˜์‹ญ์‹œ์˜ค.

@necolas ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ชฉ์ ์„ ์ดํ•ดํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ๋ฌธ์ œ๋ฅผ ์—ญ์ „์‹œํ‚ค๋Š” ๊ฒƒ์ด ์ œ์ •์‹ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. CSS๋ฅผ RN์œผ๋กœ ์ด์‹ํ•˜๋Š” ๋Œ€์‹  RN์—์„œ ์ „์ฒด๋ฅผ ์žฌ๊ตฌ์ถ•ํ•˜๊ณ  shim์„ ์‚ฌ์šฉํ•˜์—ฌ ์›น์šฉ ๋ฐฑ ํฌํŠธ๋ฅผ ๋ฐฑํฌํŠธํ•ฉ๋‹ˆ๋‹ค. React Native Material Kit๋Š” ์ด๋ฏธ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ข‹์€ ์ ํ”„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

react-native-web ๊ฐ€ ๋ฉ‹์ง„ ๊ฒƒ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ์ €๋Š” ์ œ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์— material-ui.android.js , material-ios.ios.js , material-ui.web.js ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ์ข‹์€ ์ด๋ฆ„์œผ๋กœ ๋ถ€๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์„ ๋ž˜ํ•‘ํ•˜์—ฌ material-ui API๋ฅผ ๋”ฐ๋ฅด๋ฉด ๊ฒฐ๊ตญ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฝ์šฐ material-ui ๋‚˜๋ฅผ ๋†€๋ผ๊ฒŒ ๊ทธ๋ƒฅ ์ž‘๋™, ๋‚œ ๋‹จ์ง€ ์ œ๊ฑฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค .web ์œผ๋กœ๋ถ€ํ„ฐ .web.js ๋‹ค๋ฅธ ํŒŒ์ผ์„ ์‚ญ์ œ. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ตฌ์„ฑ ์š”์†Œ๋‹น material-ui ์„ ํƒ์ ์œผ๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@oliviertassinari ๊ทธ๋ž˜์„œ react-native ๋ถ„๊ธฐ๋ฅผ NPM ์ข…์†์„ฑ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ชจ๋“  Babel ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ ๋‹ค์Œ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

EventPluginRegistry: Cannot inject event plugin ordering more than once. You are likely trying to load more than one copy of React.

๋‚ด ๋ชฉํ‘œ๋Š” material-ui ๊ตฌ์„ฑ ์š”์†Œ๋ณ„๋กœ ์‹คํ˜„ ๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ €๋Š” git rebase master ํ–ˆ๊ณ  git rebase next ํ–ˆ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฐœ๋ณ„ react-native ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ง€๊ธˆ next ์ง€์  ์ž‘์—… ์ค€๋น„๋กœ ์ธํ•ด ์ฐจ๋‹จ๋˜์–ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๋ฆฌ๊ณ  material-ui ์•„์ด์ฝ˜์„ ์†Œ๋น„ํ•˜๋Š” ๊ฒƒ๊ณผ ๋˜‘๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ react-native-vector-icons ๋ฅผ ์†Œ๋น„ํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

// <strong i="19">@flow</strong>

import React from 'react'
import {
  Text,
  View
} from 'react-native'
import Mui from './app/material-ui'
import Icons from './app/material-ui/icons'

export default React.createClass({
  render: function() {
    return (<View>
      <Icons.AccountCircle />
      <Mui.IconAccountCircle />
    </View>)
  }
})

ํ˜„์žฌ react-native-vector-icons ๋ฐ material-ui ์—๋Š” ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ ๊ตฌ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. @oblador glyphMap ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋ฐ˜๋ณตํ•˜๊ณ  ์ „์ฒด ๋ชฉ๋ก์„ ํ•˜๋‚˜์˜ ํฐ ๊ฐœ์ฒด๋กœ ๋‚ด ๋ณด๋‚ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

import { glyphMap } from 'react-native-vector-icons/MaterialIcons'

react-native-vector-icons ๋จธํ‹ฐ๋ฆฌ์–ผ ์•„์ด์ฝ˜์ด material-ui ์™€ ๊ฐ™์€ ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„๋กœ ๊ทธ๋ฃนํ™”๋˜์–ด ์นดํ…Œ๊ณ ๋ฆฌ ๋‚ด์—์„œ ๊ฐœ๋ณ„ ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ํ—ˆ์šฉํ•˜๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

import ActionHome from 'material-ui/svg-icons/action/home'

react-native-vector-icons ๊ฐ€ material-ui ๊ฐ€์ ธ์˜ค๊ธฐ ๊ทœ์น™๊ณผ ํ˜ธํ™˜๋˜๋„๋ก pull ์š”์ฒญ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@mattferrin react-native ์ง€์ ์€ ์ด์ œ ๊ฝค ์˜ค๋ž˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์†Œ๋น„ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ๋‚˜์•„๊ฐˆ ๊ธธ์— ๋Œ€ํ•œ ๊ฐœ๋… ์ฆ๋ช… ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
์ด ๋ฌธ์ œ๋ฅผ ์‚ดํŽด๋ณธ ํ•œ ์œ ๋งํ•œ ์ ‘๊ทผ ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜๋Š” react-native ๋Œ€์ƒ์œผ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด react-native-web ์ด ์šฐ๋ฆฌ๋ฅผ ์œ„ํ•ด ์–ด๋ ค์šด ๋ถ€๋ถ„์„ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ”„๋กœ๋•์…˜์ด ์ค€๋น„๋œ _react-native-web_์€ ์–ผ๋งˆ๋‚˜ ๋ฉ๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด ์œก์•ˆ ํ…Œ์ŠคํŠธ๋ฅผ ๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค.
  • ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๊นŒ?
  • ๋ณต์žกํ•œ ํ…Œ๋งˆ ์†”๋ฃจ์…˜์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๊นŒ?

react-with-styles ๋„ ์‚ดํŽด๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ผ๋งˆ๋‚˜ ๋งŽ์€ react-native-web์ด ํ”„๋กœ๋•์…˜ ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์Šต๋‹ˆ๊นŒ?

@oliviertassinari ์ €๋Š” ํ˜„์žฌ ์›น์‚ฌ์ดํŠธ๋ฅผ react-native-web ์ด์‹ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ˆ˜์šฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์•ต์ปค ํƒœ๊ทธ href ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์—†๊ณ  ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์ด ๋ˆ„๋ฝ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ธฐ๋ณธ ReactDOM์€ ํ”„๋กœ๋•์…˜ ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์œผ๋ฉฐ ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๊นŒ?

material-ui ์‹ ๊ฒฝ์จ์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ๊ตฌ์„ฑ ์š”์†Œ ๋˜๋Š” ํ™”๋ฉด์˜ ์น˜์ˆ˜๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. material-ui ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์Šคํƒ€์ผ์„ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹props๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ, ์šฐ๋ฆฌ๋Š” ํ™ฉ๊ธˆ์ƒ‰์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

material-ui ๋Š” ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” ํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ณต์žกํ•œ ํ…Œ๋งˆ ์†”๋ฃจ์…˜์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๊นŒ?

React Native์—์„œ ์ง€์›๋˜์ง€ ์•Š๋Š” ์†Œํ’ˆ์„ ์ƒ๋žตํ•˜๊ฑฐ๋‚˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋„๋ก Platform ์„ ํ™•์ธํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. (๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ œ๋Œ€๋กœ ์ œ๊ณต๋˜๋Š” ๊ฒฝ์šฐ) ํŒจ๋”ฉ๊ณผ ์—ฌ๋ฐฑ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ React Native์—์„œ ๋ฐ˜๋Œ€์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ•ด์•ผ ํ•  ์ผ์€ createStyleSheet ์ƒ์‘ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๋ž˜ํ•‘ํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ "์›น" ํ”Œ๋žซํผ์ด ์•„๋‹Œ ํŠน์ • ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•œ ์Šคํƒ€์ผ๋กœ ๋ณ€ํ™˜/ํ•„ํ„ฐ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„์ง ์จ๋ณด์ง€๋Š” ์•Š์•˜์ง€๋งŒ

๋‚˜๋Š” ๋˜ํ•œ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์ง€๋งŒ react-tunnel ์™€ ๊ฐ™์€ ๊ฒƒ์ด ํ…Œ๋งˆ ์ปจํ…์ŠคํŠธ์— ์ข‹์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๋” ๋งŽ์ด ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋Š๋ผ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์‹œ ์‚ฌ์šฉํ•˜๊ณ  ๋…ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์ธ๊ธฐ ์žˆ๋Š” ๋™๋“ฑ๋ฌผ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ผ๋งˆ๋‚˜ ๋งŽ์€ react-native-web์ด ํ”„๋กœ๋•์…˜ ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด ์œก์•ˆ ํ…Œ์ŠคํŠธ๋ฅผ ๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๋Œ€ํ™”ํ˜• ์˜ˆ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค: https://necolas.github.io/react-native-web/storybook/

๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๊นŒ?

JavaScript์—์„œ matchMedia (๋˜๋Š” Dimension )ํ•˜์—ฌ ๋ Œ๋”๋งํ•  ์Šคํƒ€์ผ๊ณผ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

ํ”Œ๋žซํผ ๊ฐ„ ์•ต์ปค ํƒœ๊ทธ href ๊ตฌ์„ฑ์š”์†Œ๊ฐ€ ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, "์ ์ ˆํ•œ" ์†”๋ฃจ์…˜์ด ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์ง€๊ธˆ์€ View ๋ฐ Text ๊ฐ™์€ ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋ฌผ๋ก  ์›น ์ง€์›๋งŒ ๊ฐ€๋Šฅ).

<Text accessibilityRole='link' href={href}>{text}</Text>

๋ณต์žกํ•œ ํ…Œ๋งˆ ์†”๋ฃจ์…˜์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๊นŒ?

React Native๋Š” ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ context ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ ์šฉํ•  ์Šคํƒ€์ผ ๊ฐœ์ฒด๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” Fela์˜ ์ปดํฌ๋„ŒํŠธ ๋‚ด API๋ฅผ ์ƒ๋‹นํžˆ ์ข‹์•„ํ•˜์ง€๋งŒ react-native-web ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๊ตฌํ˜„ ๋ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ API๊ฐ€ ๊ณผ๋„ํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ํ•ด์•ผ ํ•  ์ผ์€ createStyleSheet ๋“ฑ๊ฐ€ ๋ฉ”์„œ๋“œ๋ฅผ ๋ž˜ํ•‘ํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ "์›น"์ด ์•„๋‹Œ ํ”Œ๋žซํผ๋ณ„ ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•œ ์Šคํƒ€์ผ๋กœ ๋ณ€ํ™˜/ํ•„ํ„ฐ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

RN๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ์Šคํƒ€์ผ API๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ๋ฌธ์ œ์ธ๊ฐ€์š”? ๊ทธ๋ ‡๋‹ค๋ฉด RN ํ˜ธํ™˜ ์Šคํƒ€์ผ API๋ฅผ ๋…ธ์ถœํ•˜๊ณ  react-native-web ์—์„œ DOM ์Šคํƒ€์ผ๋กœ ๋ณ€ํ™˜ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@necolas

RN๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ์Šคํƒ€์ผ API๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ๋ฌธ์ œ์ธ๊ฐ€์š”? ๊ทธ๋ ‡๋‹ค๋ฉด RN ํ˜ธํ™˜ ์Šคํƒ€์ผ API๋ฅผ ๋…ธ์ถœํ•˜๊ณ  react-native-web์ด ์ด๋ฅผ DOM ์Šคํƒ€์ผ๋กœ ๋ณ€ํ™˜ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ข‹์€ ์ง€์ . ์˜ˆ๋ฅผ ๋“ค์–ด react-native-web ์— :hover ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@necolas ๊ทธ๋ฆฌ๊ณ  ๋‚ด๊ฐ€ ํ•˜๊ณ  ์žˆ๋Š” ํŠน์ • ์ž‘์—…์€ react-native-web ํฌํŒ…ํ•˜๋ฉด ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ์— material-ui ๋น„์šฉ์ด ๋“ค ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ •๋ง๋กœ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์•„๋ฌด๊ฒƒ๋„ ๋ชจ๋ฅธ๋‹ค. react-native-web ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ˜ธ๋ฒ„ ์Šคํƒ€์ผ์— ๋Œ€ํ•ด ํŠน๋ณ„ํ•œ ๊ฒƒ์€ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(RN๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž„). Windows ๋ฐ Ubuntu์šฉ ๋ฐ์Šคํฌํƒ‘ ๊ตฌํ˜„์ด ๋งˆ์šฐ์Šค ์ธํ„ฐํŽ˜์ด์Šค์šฉ์œผ๋กœ ๋ฒˆ๋“ค๋งํ•˜๊ฑฐ๋‚˜ ์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณตํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ๋ธŒ๋ผ์šฐ์ € ์ง€์›์ด ํ•„์š”ํ•œ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

react-native-web ๋Œ€ react-dom ๊ตฌ์„ฑ ์š”์†Œ ์Šคํƒ€์ผ API ์ค‘์—์„œ ์„ ํƒํ•˜๋ ค๋ฉด MuiThemeProvider ๋ฅผ ํ†ตํ•ด ๊ตฌ์„ฑ ์š”์†Œ ๊ณ„์ธต ๊ตฌ์กฐ ์ปจํ…์ŠคํŠธ์— ๋ถ€์šธ ๊ฐ’์„ ์‚ฝ์ž…ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์ข‹์€ ๋Œ€๋‹ต์€ react-native-web ์Šคํƒ€์ผ API๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ œ๊ฐ€ ์˜นํ˜ธํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ ์•„๋งˆ๋„ ํ™”๊ฐ€ ๋‚  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@oliviertassinari material-ui ๋ฅผ react-native ์Šคํƒ€์ผ API๋กœ ์ „ํ™˜ํ•˜์—ฌ ๋ฒ—์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋งˆ์šฐ์Šค ํŠน์ • ์Šคํƒ€์ผ์ด ๋ˆ„์ถœ๋˜๋„๋ก ํ—ˆ์šฉํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@necolas @oliviertassinari ์ฐธ๊ณ ์šฉ์œผ๋กœ๋งŒ. ์ง€๊ธˆ์€ ์—‰์„ฑํ•˜์ง€๋งŒ ์ง€๋‚œ 2-3์ผ ๋™์•ˆ ๋ธŒ๋žœ์น˜(https://github.com/mattferrin/material-ui-build/tree/mine)๋ฅผ ํฌ๋กœ์Šค ํ”Œ๋žซํผ์œผ๋กœ ์ด์‹ํ•˜๋Š” ์ž‘์—…์„ ํ•ด์™”์Šต๋‹ˆ๋‹ค. (์žฅ๊ธฐ์ ์œผ๋กœ ์ด ์ž‘์—…์„ ์ค„์ด๊ธฐ ์œ„ํ•ด) ์ •๋ง ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ react-native-web ๊ตฌ๋ฌธ์œผ๋กœ ์ด์‹ํ•˜๊ณ  ์ด์‹๋˜์ง€ ์•Š๋Š” ์Šคํƒ€์ผ์„ ์ฃผ์„ ์ฒ˜๋ฆฌํ–ˆ์ง€๋งŒ ๊ฒฐ๊ตญ ๋‹ค์‹œ ์ฃผ์„์„ ๋‹ฌ๊ณ  Platform.OS == 'web' ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›๋ž˜ ์ฝ”๋“œ๋ฅผ ๋ณธ์งˆ์ ์œผ๋กœ ์œ ์ง€ํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ž‘์—…ํ•˜๊ณ  ์žˆ๋Š” ์›น์‚ฌ์ดํŠธ ์ด์‹์„ ๋งˆ์น˜๋ฉด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ ์‹œ์ ์—์„œ ๋‚ด๊ฐ€ ๊ฐœ์ธ์ ์œผ๋กœ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒƒ๋งŒ์ด ๋ถˆ์™„์ „ํ•˜๊ฒŒ ์ด์‹๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” Mac๊ณผ Windows ์ปดํ“จํ„ฐ ์‚ฌ์ด๋ฅผ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ€์–ด๋ถ™์ด๊ธฐ ๋•Œ๋ฌธ์— (๋‚˜์ค‘์— ๋‹ค๋ฃฐ ๋•Œ๊นŒ์ง€) ์™„์ „ํžˆ ์—‰๋ง์ž…๋‹ˆ๋‹ค.

MUI๊ฐ€ RN์— ์˜ฌ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์—†๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ๋Œ€์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ๊ธฐ์— ์ƒ๋ก์ˆ˜ ๋ชฉ๋ก์„ ์œ ์ง€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค: https://habd.as/awesome-react-components/#react -native

์ „์ฒด ์Šคํƒ€์ผ๋ง ์†”๋ฃจ์…˜์ด ๋ณ€๊ฒฝ๋˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์—ˆ์ง€๋งŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์ž‘์„ฑ๋˜๋Š” ๋ถ€๋ถ„์„ ๋†“์ณค์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฑด ๋‚ด ์ž˜๋ชป์ด์•ผ. ์ผ๋ถ€ ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ์ตœ์ข… ์Šคํƒ€์ผ์€ ๋ณธ์งˆ์ ์œผ๋กœ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋˜๊ณ  ๊ธฐ์ˆ ๋งŒ ๋ณ€๊ฒฝ๋  ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ํ‹€๋ ธ์–ด. ๋กœ๋“œ๋งต์„ ์™„์ „ํžˆ ๋ฌด์‹œํ•˜์ง€ ์•Š๊ณ  ๋งค์šฐ ์ž˜๋ชป๋œ ๊ฐ€์ •์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ๊ธฐ์„œ ๋‚˜์˜ ์‹œ๋„๋ฅผ ํฌ๊ธฐํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

@mattferrin ์Šคํƒ€์ผ ์†”๋ฃจ์…˜ ๋ณ€๊ฒฝ์—๋Š” ๋งŽ์€ API ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜์ง€๋งŒ ์ฒ˜์Œ๋ถ€ํ„ฐ ์™„์ „ํžˆ Table ). ํ•˜์ง€๋งŒ ์ถ”๊ฐ€๋กœ ๋งŽ์€ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ์˜์—ญ์—์„œ API๋ฅผ ํ•ฉ๋ฆฌํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. . ๊ท€ํ•˜์˜ ๋…ธ๋ ฅ์ด ๋‚ญ๋น„๋˜์—ˆ๋‹ค๋ฉด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. Material-UI๊ฐ€ ์ง€์—ฐ๋˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค!

@mbrookes ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋–จ์–ด์ ธ ๋ถ„๊ธฐ์˜ ์‹ค์ˆ˜ํ–ˆ๋‹ค master ๋Œ€์‹  next ์™€์˜ ์ฐจ์ด (๊ทธ๋ฆฌ๊ณ  ์ผ๋ฐ˜์ ์œผ๋กœ ์ „์ฒด ์ž‘์—…)์„ ๊ณผ์†Œ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์ž˜๋ชป์ด์—ˆ๊ณ  ์œ„ํ—˜์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— React Native material-ui ํŒŒ์‚ฌ๋“œ์—์„œ ๋นˆ Text ์š”์†Œ๋ฅผ ์ž๋ฆฌ ํ‘œ์‹œ์ž๋กœ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด ์›น ์‚ฌ์ดํŠธ๋ฅผ react-native-web ์™„์ „ํžˆ ์ด์‹ํ•˜๋ฉด ๋‹ค์‹œ ๋Œ์•„์™€ next ์ƒˆ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฆฌ๋ฒ ์ด์Šคํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋Š˜ ์ด ๋…€์„์„ ๊ณต๊ฐœํ•ฉ๋‹ˆ๋‹ค: https://carbon-ui.com

material-ui์—์„œ ์˜๊ฐ์„ ๋ฐ›์•„ ์›น ๋ฐ ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. :)

@tuckerconnelly u made my day

@tuckerconnelly ์™€์šฐ, ์ด ํ”„๋กœ์ ํŠธ์˜ ๋งŽ์€ ์ž ์žฌ๋ ฅ์ด... ์ˆ˜๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค! ๋” ํฐ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์ด ๋…ธ๋ ฅ์˜ ๋ฐฐํ›„์—์„œ ๊ฒฐ์ง‘ํ•˜๊ธฐ๋ฅผ ํฌ๋งํ•ฉ๋‹ˆ๋‹ค! ๐Ÿป

@tuckerconnelly ์กฐ๊ธˆ ํ˜ผ๋ž€ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์•„์ฃผ ์‰ฝ๊ฒŒ ์‹ค์ œ๋กœ ๋ฐœ๊ฒฌ material-ui (์˜คํ”„ ๋ถ„๊ธฐ์˜ ๋‚ด ์‹ค์ˆ˜์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์กฐ๊ฑด๋ถ€ ํฌ๋กœ์Šค ํ”Œ๋žซํผ์„ master ๋Œ€์‹  next ๋‚ด ์‹œ๊ฐ„์„ ๋‚ญ๋น„). ๋…๋ฆฝ ํ”„๋กœ์ ํŠธ์— ์–ด๋–ค ์ด์ ์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

2์›”์— ๋‹ค์‹œ ์‹œ๋„ํ–ˆ๋Š”๋ฐ ํŠนํžˆ ๋ฆฌํ”Œ ๊ตฌ์„ฑ ์š”์†Œ์™€ ํ”Œ๋žซํผ ๊ฐ„ ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋กœ ์ธํ•ด ์–ด๋ ค์›€์„ ๊ฒช์—ˆ์Šต๋‹ˆ๋‹ค.

๋•Œ๋กœ๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค.

๋‚˜์—๊ฒŒ React Native์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” React ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค ... ๊ทธ๋ฆฌ๊ณ  material-ui์˜ ๊ฐœ๋ฐœ์ž๋Š” RN์„ ์šฐ์„  ์ˆœ์œ„๋กœ ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ... ์ƒˆ๋กœ์šด ๊ฒฝ๋กœ์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ๊ณต์ •ํ•˜๊ณ  ๋…ผ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.

@tuckerconnelly ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๊ตฌํ˜„๋˜๋Š” ๋ฐฉ์‹์ด ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‘ ํ”„๋กœ์ ํŠธ๊ฐ€ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด ๋™์ผํ•œ API๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ๋™์ผํ•œ ์ด๋ฆ„์— ๋™์˜ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ณต์œ ํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ v1.0.0 ์ดํ›„์˜ 2017/2018๋…„์—๋Š” RN์ด material-ui์˜ ๋‹ค์Œ ๋ชฉํ‘œ๊ฐ€ ๋ ๊นŒ์š”?

์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด:

  • v1์— ๋Œ€ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ ์ฐธ์—ฌ
  • RN ์ง€์›์„ ์›ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์˜ ์ˆ˜
  • ๋งŽ์€ ํ”„๋กœ์ ํŠธ๊ฐ€ Material-ui๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ฑฐ๋‚˜ ์˜๊ฐ์„ ๋ฐ›์•„ RN ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋Š” ์‚ฌ์‹ค
  • ์ด ๋ชจ๋“  ๊ฒƒ์„ ํ†ตํ•ด ์–ป์€ ๊ฒฝํ—˜๊ณผ ์ด ํ˜ธ๊ฐ€ ๊ณต๊ฐœ๋œ ํ›„ ๋งŽ์€ ์‹œ๊ฐ„์ด ํ˜๋ €๋‹ค๋Š” ์‚ฌ์‹ค

(์•„๋งˆ๋„ v1 ์ถœ์‹œ ์ดํ›„์—) RN ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค๋ฉด ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋‹น์‹ ์„ ๋„์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ช…ํ™•ํ•œ ๊ฒฝ๋กœ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ์ •์˜ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ํ›Œ๋ฅญํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ๊ณ ์˜ ์ œํ’ˆ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@NitroBAY 1.0์€ ์Šคํƒ€์ผ๋ง์„ ์œ„ํ•ด JS ๊ฐœ์ฒด ๋Œ€์‹  JSS๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ React Native๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด cssinjs/jss#368์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ https://github.com/xotahal/react-native-material-ui ์™€ ๊ฐ™์€ React Native์šฉ ๋ณ‘๋ ฌ ๋ฒ„์ „์„ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค https://github.com/necolas/react-native-web์„ ์‚ฌ์šฉํ•˜์—ฌ ์›น์—์„œ React Native ๋ฒ„์ „์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ด๊ฒƒ์€ ๊ณ ์น  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ํƒœ๊ทธ๋ฅผ ๊ทธ๋ ‡๊ฒŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@jhabdas ์žฌ์งˆ ์‚ฌ์–‘์„ React Native๋กœ ๊ฐ€์ ธ์˜ค๋Š” ์ข‹์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
์Šค๋ ˆ๋“œ์— ๊ฒŒ์‹œ๋œ ๋งํฌ์—์„œ ์ด๋ฏธ ์ข‹์€ ํ›„๋ณด์ž ๋ชฉ๋ก์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๊ทธ ๋ฌธ์ œ๋ฅผ ์—ด์–ด๋‘๊ณ  ์žˆ๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ์›น๊ณผ ๋„ค์ดํ‹ฐ๋ธŒ๋ฅผ ํ†ตํ•ฉํ•˜๋Š” ๊ฒƒ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‘ ํ”Œ๋žซํผ ๊ฐ„์— ์ผ๊ด€๋œ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ž‘์—…ํ•  ์‹œ๊ฐ„์ด ์žˆ์—ˆ์œผ๋ฉด ์ข‹๊ฒ ์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉฐ ๋ณ€๊ฒฝ๋ ์ง€ ์˜์‹ฌ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.
@callemall/material-ui ํŒ€์€ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ทธ ๋ฌธ์ œ๋ฅผ ์ฃผ๋„ํ•˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ carbon-ui๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. :) ํ•„์š”ํ•  ๋•Œ๋งŒ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€๋งŒ(์ „์ฒด ์‚ฌ์–‘์„ ๋ฏธ๋ฆฌ ์ฑ„์šฐ๋ ค๊ณ  ํ•˜์ง€ ์•Š์Œ), ์‚ฌ๋žŒ๋“ค์ด ๋ชจ์—ฌ๋“ค ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  • ๊ตฌ์„ฑ ์š”์†Œ ์ฃผ์„์—์„œ ๋ฌธ์„œ๋ฅผ ์ž๋™ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฌธ์„œ ์‚ฌ์ดํŠธ ์žˆ์Œ(carbon-ui.com)
  • ๋™์ผํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๊ธฐ๋ณธ ๋ฐ ์›น ์ง€์›

๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. :)

@tuckerconnelly https://github.com/xotahal/react-native-material-ui ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐ https://github.com/tuckerconnelly/carbon-ui/blob/master/src/style/Elevation.js ์ฝ”๋“œ๋ฅผ ์ ์šฉํ–ˆ๋‹ค๋ฉด ์ œ ์ƒ๊ฐ์—๋Š” ์ž‘๋™ ํ•  ๊ฒƒ์ด๋‹ค. @oliviertassinari ๋Š” ํ•จ๊ป˜ ์ž‘์—…ํ•  ์ฃผ์š” ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฒฐ์ •ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ์ž˜ ์ง€์ ํ•ฉ๋‹ˆ๋‹ค.

@quangbuule ์ž ๊น๋งŒ์š”. ์•ฑ์„ RN ์•ฑ์œผ๋กœ ๊ฐœ๋ฐœํ•œ ๋‹ค์Œ ํ•ด๋‹น ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ RN์„ WEB ๋ฒ„์ „์œผ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋ง์”€ํ•˜์‹ญ๋‹ˆ๊นŒ?
๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋“ค์–ด๋ณธ ์ ์ด ์—†์ง€๋งŒ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๋” ์ด์ƒ material-ui ํ•˜์ง€ ์•Š๊ณ  RN ํฌํฌ๋ฅผ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

@NitroBAY ์šฐ๋ฆฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ material-ui๋ฅผ RN ํฌํฌ๋กœ ์ด์‹ํ•˜๊ณ  ์ค€๋น„๊ฐ€ ๋˜๋ฉด ์›น๊ณผ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋‘์˜ ๊ณต์‹ ๋ฒ„์ „์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. material-ui๊ฐ€ ๋‹ค์Œ ๋ธŒ๋žœ์น˜์—์„œ ๋น„์Šทํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋ฉด ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ๋ฉ์ฒญํ•œ ์งˆ๋ฌธ์— ๋Œ€ํ•ด ์ฃ„์†กํ•˜์ง€๋งŒ ์•ฝ 1 ์ฃผ ์ดํ›„๋กœ ReactLand ์ฐฉ๋ฅ™ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ํŒจํ‚ค์ง€๊ฐ€ ์ด ํŒจํ‚ค์ง€๋ฅผ ๋Œ€์ฒดํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?
๋‹น์‹ ์˜ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋‹ค์ค‘ ํ”Œ๋žซํผ์œผ๋กœ ๋ณด์ด๋ฉฐ ๋งค์šฐ ์ข‹์Šต๋‹ˆ๋‹ค. Material-ui๋Š” ์‹œ๊ฐ„์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์›น๋งŒ ๊ณ ์ง‘ํ•˜์ง€๋งŒ ๋‹ค์Œ์—๋Š” ์‹œ๊ฐ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
next next ์— ๋™ํ˜• ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๋งํ•˜์ง€๋งŒ ์ข…์ด ์™€ ๊ฐ™์€ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด div ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์›น์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
we ์€(๋Š”) ๋ˆ„๊ตฌ์ž…๋‹ˆ๊นŒ? ์ด ํŒ€์˜ ์ผ์›์ž…๋‹ˆ๊นŒ?
๊ธฐ์ˆ ์ ์ธ ๊ณ ๋ ค ์‚ฌํ•ญ์— ๊ด€๊ณ„์—†์ด IOS์—์„œ MD๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์‚ฌ์šฉ์ž๋ฅผ ๊ท€์ฐฎ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

ํŽธ์ง‘: ์ฃผ์ œ์—์„œ ๋ฒ—์–ด๋‚ฌ์ง€๋งŒ ์•„๋ฌด๋„ ๋Œ€๋‹ตํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. jss-react ์™€ ๋น„๊ตํ•  ๋•Œ jss-theme-reactor ๋Š” ์–ด๋–ค ์ด์ ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๊นŒ?

@๋‹ˆํŠธ๋กœ๋ฒ ์ด :

  1. ์ €๋Š” ์ด ํ”„๋กœ์ ํŠธ๋‚˜ React Native ํ”„๋กœ์ ํŠธ์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ €๋Š” ์ด ๋ฌธ์ œ๋ฅผ ๋ช‡ ๋‹ฌ ๋™์•ˆ ์ง€์ผœ๋ณด์•˜๊ณ  ํ˜„์žฌ๋กœ์„œ๋Š” react-native-material-ui ๊ธฐ์—ฌํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๊ธฐ๋ฅผ ๊ณ ๋Œ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  2. paper ๋˜๋Š” ๊ทธ๋ฆผ์ž๊ฐ€ ์ด์ œ ์›น, iOS, Android์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๊ฒƒ์€ ํฐ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  3. material-ui master ๋ถ„๊ธฐ๋Š” ๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํƒ€์ผ์‹œํŠธ๋ฅผ ์ •์˜ํ•˜์ง€๋งŒ ์„ฑ๋Šฅ ํ–ฅ์ƒ(30% ํ–ฅ์ƒ)์„ ์œ„ํ•ด ๊ธฐ์—ฌ์ž๋Š” next ๋ถ„๊ธฐ์—์„œ JSS(JS์˜ CSS)๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ JSS๋Š” React Native์™€ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  4. Google์€ iOS์—์„œ Material Design์„ ์‚ฌ์šฉํ•˜๋ฉฐ ์‚ฌ์šฉ์ž๊ฐ€ ํฌ๊ฒŒ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ƒํƒœ ํ‘œ์‹œ์ค„ ์ƒ‰์ƒ ๋ณ€๊ฒฝ, iOS ๊ณต์œ  ์•„์ด์ฝ˜ ์‚ฌ์šฉ ๋“ฑ ํ”Œ๋žซํผ์— ๋งž๊ฒŒ ์ผ๋ถ€ ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Windows 10 ๋ฐ macOS ์•ฑ์— material-ui ๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ๋งŽ์ด ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋“ค์€ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋ถˆํ‰ํ–ˆ์Šต๋‹ˆ๋‹ค(http://moderntranslator.com/). ์ผ๋ถ€์—์„œ๋Š” MD๊ฐ€ ์‚ฌ์šฉํ•˜๊ธฐ ๋” ์‰ฝ๋‹ค๊ณ  ๋งํ•˜๊ธฐ๊นŒ์ง€ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ span ๋˜๋Š” div ์™€ ๊ฐ™์€ HTML ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ next ๋ถ„๊ธฐ๊ฐ€ RN์—์„œ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ์—ฌ์ „ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋†“์นœ ๊ฒƒ์ด ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ RN์—์„œ ๊ฐœ๋ฐœํ•˜๋ ค๋ฉด RN ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?
๋‚˜๋Š” ๋‹น์‹ ์„ ์ธ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค :

์›น๊ณผ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋‘์˜ ๊ณต์‹ ๋ฒ„์ „์ด ๋ฉ๋‹ˆ๋‹ค. material-ui๊ฐ€ ๋‹ค์Œ ๋ธŒ๋žœ์น˜์—์„œ ๋น„์Šทํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋ฉด ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ œ๊ฐ€ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ ๊ฒƒ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. next ๋ถ„๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด RN์—์„œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ง์ž…๋‹ˆ๊นŒ?

@NitroBAY : next ๋ธŒ๋žœ์น˜๋Š” material-ui ๋ฅผ React Native์™€ ๋œ ํ˜ธํ™˜๋˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋˜ํ•œ RN ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ span ๋˜๋Š” div๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋”๋ผ๋„ ์กฐ๊ฑด๋ถ€ ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

if (platform === 'web') return <span/>;
else return <View />;

https://github.com/necolas/react-native-web์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค ์ข‹์•„, ๋‚˜๋Š” ๊ทธ๋“ค์ด RN๊ณผ ํ˜ธํ™˜๋˜๋„๋ก ๋งŒ๋“ค์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ํ”„๋กœ์ ํŠธ๊ฐ€ React Native API๋ฅผ ํ†ตํ•œ ๋‹ค์ค‘ ํ”Œ๋žซํผ ์ง€์›์— ๊ด€์‹ฌ์ด ์—†๊ณ  ๊ทธ ๋…ธ๋ ฅ์„ https://github.com/xotahal/react-native-material-ui ๋กœ ์˜ฎ๊ฒจ์•ผ ํ•œ๋‹ค๋Š” TL;DR

carbon-ui์šฉ ๋ฌธ์„œ๊ฐ€ ๋” ์ข‹์œผ๋ฉฐ ์ด๋ฏธ ์›น์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. react-native-material-ui์˜ ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ทธ๋ž˜์„œ ๋ชจ๋‘๊ฐ€ material-ui ์‚ฌ์šฉ์„ ์ค‘์ง€ํ•˜๊ณ  ๋ช‡ ์‹œ๊ฐ„ ํ›„์— ๊ถŒ์žฅํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์ด ํŒจํ‚ค์ง€์˜ ์†Œ์œ ์ž๊ฐ€ RN์„ ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์œ ๊ฐ์ž…๋‹ˆ๊นŒ?

carbon-ui StyleSheet ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋งŽ์€ ์›น ๊ธ€๊ผด์„ ์‚ฝ์ž…ํ•˜๋ฉด ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

screen shot 2017-03-15 at 1 10 26 pm

์ง„์ •ํ•ด, ์–˜๋“ค์•„! ์•„์ง ์˜ค๊ณ  ์žˆ๋‹ค.

TL;DR: React Native์šฉ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋นŒ๋“œํ•˜๋ฉด RN ๋ฐ ์›น์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์›น์šฉ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋นŒ๋“œํ•˜๋ฉด RN์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  material-ui ๋Š” ์›น์šฉ์œผ๋กœ ์ œ์ž‘๋˜์—ˆ์œผ๋ฉฐ ์›น์šฉ์œผ๋กœ ์ตœ์ ํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. => RN์—์„œ ์ž‘๋™ํ•˜๋ ค๋ฉด ์„ฑ๋Šฅ์ด ํฌ์ƒ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ ์–ด๋„ ํ˜„์žฌ๋กœ์„œ๋Š”). ๋”ฐ๋ผ์„œ RN์ด ๋” ์„ฑ์ˆ™ํ•ด์งˆ ๋•Œ๊นŒ์ง€ ๋‘ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์›น์— ์ตœ์ ํ™”๋จ => RN์—์„œ ์ž‘๋™ํ•˜๋ ค๋ฉด ์„ฑ๋Šฅ์ด ํฌ์ƒ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ ์–ด๋„ ํ˜„์žฌ๋กœ์„œ๋Š”)

๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๊ณต์œ ํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ง€๊ธˆ๊นŒ์ง€ RNW์— ๋Œ€ํ•œ ๋‚ด ๋ฐœ๊ฒฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@necolas #4066

ํ , StyleSheet๋ฅผ Uranium๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CSS ๊ด€๋ จ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ–ˆ์ง€๋งŒ StyleSheet ํ•ญ๋ชฉ๊ณผ ๋” ์ž˜ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ํฐ ์„ฑ๋Šฅ ํžˆํŠธ๋Š” Animated: https://github.com/animatedjs/animated/issues/48 ํ•˜์ง€๋งŒ ์ด๋Š” ๋ชจ๋“  RNW ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

์›น ๊ธ€๊ผด์„ ์‚ฝ์ž…ํ•˜๋ฉด ์„ฑ๋Šฅ์ด ์˜๋ฏธ ์žˆ๊ฒŒ ๊ฐ์†Œํ•ฉ๋‹ˆ๊นŒ? Google ๊ธ€๊ผด์—์„œ ์ง์ ‘ ๋กœ๋“œํ•˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž ์‹œ์Šคํ…œ์— ์ด๋ฏธ ์บ์‹œ๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์ด ๋‹จ์ผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ง€์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  material-ui๊ฐ€ React Native๋ฅผ ์ง€์›ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@necolas TL;DR์€ ์•ž์œผ๋กœ ๋‚˜์•„๊ฐˆ ๊ธธ์ด ๋ถˆ๋ถ„๋ช… ํ•˜๋‹ค๋Š”

union

A = ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ
B=์›น

1. ๊ฐ€์žฅ ์ œ์•ฝ์ด ๋งŽ์€ ํ”Œ๋žซํผ

๊ฐ€๋Šฅํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๊ฐ€์žฅ ์ œํ•œ๋œ ํ”Œ๋žซํผ์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜์—ฌ react-native ์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ธฐ๋Šฅ์„ ์›น์œผ๋กœ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ์„ ์›น์œผ๋กœ ํ™•์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์ ˆ์ถฉ์ ๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋ฉฐ, ์šฐ๋ฆฌ๋Š” ์ฝ”๋“œ ๊ณต์œ ์—์„œ ์Šน๋ฆฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์–ด๋–ค ์ฐจ์›์—์„œ ์žƒ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋„ค์ดํ‹ฐ๋ธŒ API๋ฅผ ์›น์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ

API๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž‘๋™ํ•˜๋„๋ก ๋‹ค์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฒ„ ํ—ค๋“œ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋„ค์ดํ‹ฐ๋ธŒ์—์„œ ๋ˆ„๋ฝ๋œ ์›น API ์ฒ˜๋ฆฌ

๊ฐ€์žฅ ์ œํ•œ๋œ ํ”Œ๋žซํผ์—์„œ ์‹œ์ž‘ํ•  ๋•Œ ์›น์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ผ๋ถ€ ๊ธฐ๋Šฅ์„ ๋‹ค์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? CSS ์ƒ์†, CSS ์• ๋‹ˆ๋ฉ”์ด์…˜?
๋„ค์ดํ‹ฐ๋ธŒ ๋ฒ„์ „์„ ๋ถ€ํ’€๋ฆฌ์ง€ ์•Š๊ณ  ๋ˆ„๊ฐ€ ์ ‘๊ทผ์„ฑ ๋ฐ ํ‚ค๋ณด๋“œ ์ด๋ฒคํŠธ๋ฅผ ๊ตฌํ˜„ํ• ๊นŒ์š”?

2. ์ œ์•ฝ์ด ๋œํ•œ ํ”Œ๋žซํผ

๋˜ ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์€ ๋œ ์ œํ•œ๋œ ํ”Œ๋žซํผ, ์ฆ‰ ์›น์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ˆ„๋ฝ๋œ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์„ ๋‹ค์‹œ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์ ˆ์ถฉ์ ๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋ฉฐ, ์šฐ๋ฆฌ๋Š” ์ฝ”๋“œ ๊ณต์œ ์—์„œ ์Šน๋ฆฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์–ด๋–ค ์ฐจ์›์—์„œ ์žƒ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์›น API๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ

์šฐ๋ฆฌ๋Š” ํฌ์ƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด CSS ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ, CSS ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ์›น ๊ธฐ๋Šฅ์€ ๋„ค์ดํ‹ฐ๋ธŒ์—์„œ ๊ตฌํ˜„ํ•˜๊ธฐ ์ •๋ง ์–ด๋ ค์šธ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค. (๊ณ ๊ธ‰ CSS ๊ทœ์น™)

์›น์—์„œ ๋ˆ„๋ฝ๋œ ๋„ค์ดํ‹ฐ๋ธŒ API ์ฒ˜๋ฆฌ

๋ˆ„๋ฝ๋œ ์›น API ๊ธฐ๋Šฅ ์ค‘ ์ผ๋ถ€๋Š” ํ„ฐ์น˜ ์ฒ˜๋ฆฌ, ์Šคํฌ๋กค ๋ฐ ๋ฌดํ•œ ๋ชฉ๋ก ๋ณด๊ธฐ, DatePicker ๋˜๋Š” Drawer์™€ ๊ฐ™์€ ๊ธฐ๋ณธ ๊ตฌ์„ฑ ์š”์†Œ์™€ ๊ด€๋ จ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

3. ๊ณ„์•ฝ ๊ณต์œ 

์„ธ ๋ฒˆ์งธ ์†”๋ฃจ์…˜์€ API ๋ฐ ํ…Œ์ŠคํŠธ๋ฅผ ๊ณต์œ ํ•˜๋Š” ์ธํ”„๋ผ๋ฅผ ์„ค์ •ํ•œ ๋‹ค์Œ ๋‘ ๊ฐœ์˜ ๊ธฐ๋ณธ ํ”Œ๋žซํผ์—์„œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋‹ค์‹œ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด ์ธ์‹์— ๋”ฐ๋ฅด๋ฉด ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ ๊ฐ€ iOS ๋ฐ Android์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด์ „ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ํ˜ผํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ„์•ฝ์„ ์™„์ „ํžˆ ์ฑ„์›๋‹ˆ๋‹ค. ์˜๋ฏธ๊ฐ€ ์žˆ์„ ๋•Œ ์ฝ”๋“œ ๋ถ„๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ฐ€๋Šฅํ•œ ํ•œ ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด:

  • CSS ์ „ํ™˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์™œ ๋ธŒ๋ผ์šฐ์ €์—์„œ animation.js ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ?
  • ๋„ค์ดํ‹ฐ๋ธŒ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์™œ react-native ์— Drawer ๋กœ์ง์„ ๊ตฌํ˜„ํ•ด์•ผ ํ• ๊นŒ์š”?

๋‚˜๋Š” ๊ทธ ์˜ต์…˜ 3์ด ๊ฐ€์žฅ ์œ ๋งํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ react-swipeable-views ์—์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ์‹œ๋„ํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

https://github.com/tuckerconnelly/uranium์€ ํ”Œ๋žซํผ ๊ฐ„ ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. :)

RN์˜ ์žฅ์ ์€ ์ถ”์ƒ API ๋ฐ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ์˜ ๊ฐ„๋‹จํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๊ณ  ์ €์ˆ˜์ค€ ๊ตฌํ˜„์ด ์ฒ˜๋ฆฌ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Animated๋Š” ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ์ €์ˆ˜์ค€ ๊ตฌํ˜„(iOS/Android์˜ ๊ธฐ๋ณธ ์• ๋‹ˆ๋ฉ”์ด์…˜, ์›น์˜ CSS ์ „ํ™˜)์ด ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” animation.js๊ฐ€ CSS ์ „ํ™˜์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€๊ทธ์žฌ๊ทธ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

@quanglam2807 ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋„ˆ๋ฌด

๊ธฐ๋Šฅ์„ ์›น์œผ๋กœ ํ™•์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/necolas/react-native-web , https://github.com/taobaofed/react-web

react-web ๋Š” ์„ฑ๋Šฅ์ด๋‚˜ ๊ธฐ๋Šฅ์ ์œผ๋กœ ์˜ฌ๋ฐ”๋ฅธ IMO์™€๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฉ‰๋‹ˆ๋‹ค.

API๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž‘๋™ํ•˜๋„๋ก ๋‹ค์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฒ„ ํ—ค๋“œ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์–ด๋–ค ์ฐจ์›์˜ ์˜ค๋ฒ„ํ—ค๋“œ? ๋ฒˆ๋“ค ํฌ๊ธฐ ์ธก๋ฉด์—์„œ ๊ฒฐ์ •ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ์ฝ”๋“œ ์ค‘ ์ผ๋ถ€๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ RNW ํ•ต์‹ฌ ์ˆ˜์ถœ ์ด์™ธ์˜ ๊ฒƒ์— ์˜์กดํ•œ๋‹ค๋ฉด ๋น ๋ฅด๊ฒŒ ์ถ”๊ฐ€๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. mobile.twitter.com์˜ ์Šคํƒ€์ผ์ด ๋งŽ์€ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ CSS ๋ชจ๋“ˆ์—์„œ RNW StyleSheet๋กœ ์Šคํƒ€์ผ์„ ๋ณ€ํ™˜ํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ ํฌ๊ธฐ๊ฐ€ 20-40% ๊ฐ์†Œํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ ํ˜„์žฌ css-modules ์™€ ๋ฉ€์ง€ ์•Š์Šต๋‹ˆ๋‹ค .

๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

matchMedia ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํƒ€์ผ๊ณผ ๊ตฌ์„ฑ ์š”์†Œ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ด์ ์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

CSS ์ƒ์†, CSS ์• ๋‹ˆ๋ฉ”์ด์…˜?

RNW๋Š” CSS ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค(ํ‚คํ”„๋ ˆ์ž„์„ ์ •์˜ํ•˜๋ ค๋ฉด API๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•จ). CSS ์ƒ์†๊ณผ ๊ด€๋ จ๋œ ์งˆ๋ฌธ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋„ค์ดํ‹ฐ๋ธŒ ๋ฒ„์ „์„ ๋ถ€ํ’€๋ฆฌ์ง€ ์•Š๊ณ  ์ ‘๊ทผ์„ฑ ๋ฐ ํ‚ค๋ณด๋“œ ์ด๋ฒคํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์ด๊ฒƒ์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์•ฑ์˜ "ํŒฝ์ฐฝ" ์ž„๊ณ„๊ฐ’์ด ์›น ์•ฑ๋ณด๋‹ค ํ›จ์”ฌ ๋†’๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ react-native-web์ด ์Šคํƒ€์ผ์„ ์ฒ˜๋ฆฌํ•˜์—ฌ CSS ์„ฑ๋Šฅ์„ CSS ๋ชจ๋“ˆ ์„ฑ๋Šฅ์œผ๋กœ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์€ ์ด์ œ ๋œ ์ ์ ˆํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์™œ ๊ทธ๋Ÿด๊นŒ์š”?

aphrodite ๋˜๋Š” jss์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ์ผ์ข…์˜ react-native-web์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ชจ๋‘ ๋Š๋ฆฌ๊ณ  ํฌ๊ธฐ๊ฐ€ ํฌ๋ฉฐ ๊ฒฐ์ •์  ์Šคํƒ€์ผ์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@necolas material-ui ๋Š” css-in-js ๋ฐฉ์‹์—์„œ ์Šคํƒ€์ผ์‹œํŠธ ๋ฐฉ์‹(css in <style> )์œผ๋กœ ์ „ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ „ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๋‹ฌ ๋™์•ˆ ์ ๊ทน์ ์ธ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์˜€์Šต๋‹ˆ๋‹ค. ์ด์œ ๊ฐ€ ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค . ๋‚ด๊ฐ€ ์ฝ์€ ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด jss๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํฐ ์ด์ ์ด๋ฉฐ ์ง€๊ธˆ๊นŒ์ง€ ์Šคํƒ€์ผ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฐ€์žฅ ์™„๋ฒฝํ•œ ์†”๋ฃจ์…˜์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ  Roadmap.md๋ฅผ ๋‹ค์‹œ ์ฝ์œผ๋ฉด RN ์ง€์›์ด ๋กœ๋“œ๋งต์— ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ์™€ ํ•จ๊ป˜ Material-UI๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋งค์šฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ง„ํ–‰ ์ƒํ™ฉ์— ๋Œ€ํ•ด ๋ง์”€ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@wswoodruff ์ง€๊ธˆ์€ ์ด๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค - https://github.com/xotahal/react-native-material-ui

ํ˜„์žฌ ์ด๋ฅผ ์œ„ํ•œ ์„ธ ๊ฐ€์ง€ ๋ฉ‹์ง„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • react-native-material-design โ˜…2447 - React Native Material ๋””์ž์ธ ์ปดํฌ๋„ŒํŠธ

  • react-native-material-ui โ˜…1040 - React Native๋ฅผ ์œ„ํ•œ ๊ณ ๋„๋กœ ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ€๋Šฅํ•œ ๋จธํ‹ฐ๋ฆฌ์–ผ ๋””์ž์ธ ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค.

์ฆ๊ธฐ๋‹ค!

๋ณดํŽธ์ ์œผ๋กœ ๊ฐ€๊ณ  ์‹ถ๋‹ค๋ฉด ๋œ ์•Œ๋ ค์ง„ Carbon UI ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด ์‹œ๊ฐ„ ๋™์•ˆ ๋‚˜๋Š” ์•„๋งˆ ์ด๊ฒƒ๋“ค ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ณ ์ˆ˜ํ• 

์ด ์Šค๋ ˆ๋“œ์—์„œ ๋ช‡ ๋ฒˆ ์–ธ๊ธ‰ํ–ˆ์ง€๋งŒ ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ๋‚ด ๊ด€์‹ฌ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์‹œ ์–ธ๊ธ‰ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ณด๊ณ  ์žˆ๋Š” ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ ์ง€์›์˜ ์ฃผ์š” ์ด์ ์€ ์‹ค์ œ๋กœ ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. , ๊ทธ๋Ÿฌ๋‚˜ ๋Œ€์‹  ๋™์ผํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฐ ์›น _๋ชจ๋‘_์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ธฐ๋ณธ ์š”์†Œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•ด๋‹น ์œ ํ˜•์˜ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๊ฐ€ ์‚ฌ์šฉ๋œ ๊ฒฝ์šฐ react-sketchup ๋ฐ react-pdf ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ๋„๊ตฌ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ, ๊ทธ๊ฒƒ๋“ค์€ ๋„ค์ดํ‹ฐ๋ธŒ๋ณด๋‹ค ๋‚˜์—๊ฒŒ ๋” ํฅ๋ฏธ๋กญ์ง€๋งŒ ๋™์ผํ•œ ๋ณ€๊ฒฝ์— ์˜ํ•ด ํ™œ์„ฑํ™”๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@jhabdas Carbon UI๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝํ—˜์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? Bcz ๋‚˜์—๊ฒŒ ๊ทธ๊ฒƒ์€ ๊ฝค ์ข‹์•„ ๋ณด์ด์ง€๋งŒ ์•„์ง ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

@deadcoder0904 ๋Š” ์•„์ง ๊ฐœ์ธ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ธํ”ผ๋‹ˆํŠธ ๋ ˆ๋“œ์— ์žˆ๋Š” ์‚ฌ๋žŒ ์ค‘ ํ•œ ๋ช…์—๊ฒŒ ์†์„ ๋‚ด๋ฐ€์–ด ๋ณด์„ธ์š”. ๊ทธ๋“ค์€ RN ๋‰ด์Šค๋ ˆํ„ฐ๋ฅผ ์šด์˜ํ•˜๋ฉฐ ํ•ด๋‹น ์ฃผ์ œ์˜ ์ „๋ฌธ๊ฐ€์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋‹ค๋ฅธ RN ์•ฑ์„ ๋นŒ๋“œํ•  ๋•Œ(์ข‹์•„, ์–ธ์ œ...) ์ด๋ฒˆ์—๋Š” ํ•จ๊ป˜ ๋ฐฉํ•ดํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ƒ์šฉ๊ตฌ๋ฅผ ๊ตฌ์ถ•ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. IMHO ๊ณต๊ฐ„์€ ๊ธฐ์กด ์ƒ์šฉ๊ตฌ ์™€ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ React Native์—์„œ MUI๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ๊ทน๋ณตํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์žฅ์• ๋ฌผ์ž…๋‹ˆ๋‹ค. v1 MUI๋ฅผ ๊ฐ€์ •ํ•˜๊ณ  JSS, classes ํŒจํ„ด ๋ฐ ์ด ์‹œ์ ์—์„œ MUI API ๋””์ž์ธ์˜ ํ•ต์‹ฌ ๋ถ€๋ถ„์ธ ๊ธฐํƒ€ ์‚ฌํ•ญ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

  • JSS๋Š” RN์„ ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, withStyles๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์Šคํƒ€์ผ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ https://github.com/cssinjs/jss/issues/368#issuecomment -376708219๋ฅผ
  • hacky wrapper ๋˜๋Š” babel ๋ณ€ํ™˜์ด ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด classes ํŒจํ„ด์„ ๋ณด๊ฐ•ํ•ด์•ผ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•˜์ง€๋งŒ RN์—์„œ ๋Œ€์‹  style ๋ฐฐ์—ด์„ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. , ๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ styles ๋กœ ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด๊ฒƒ์€ classnames ๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋ฌด๋Œ€ ๋’ค์—์„œ ํด๋ž˜์Šค/className ์ฒ˜๋ฆฌ์™€ ์Šคํƒ€์ผ/์Šคํƒ€์ผ ์‚ฌ์ด๋ฅผ ์ „ํ™˜ํ•˜๋Š” ํ™•์‚ฐ ๊ฐ€๋Šฅํ•œ ๋„์šฐ๋ฏธ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ์•„๋งˆ๋„:
    js const styleProps = props.composeStyles( 'root', (raised || fab) && 'raised', fab && 'fab', fab && mini && 'mini', color === 'inherit' && 'colorInherit', flat && color === 'primary' && 'flatPrimary', flat && color === 'secondary' && 'flatSecondary', !flat && color === 'primary' && 'raisedPrimary', !flat && color === 'secondary' && 'raisedSecondary', size !== 'medium' && `size${capitalize(size)}`, disabled && 'disabled', fullWidth && 'fullWidth', ); return <ButtonBase {...styleProps} ... />
    composeStyles๋Š” ์Šคํƒ€์ผ ์ด๋ฆ„ ๋ชฉ๋ก์„ ํ—ˆ์šฉํ•˜๊ณ  ๊ฑฐ์ง“ ๊ฐ’์€ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค. ์›น์—์„œ๋Š” props.classes ๋ณด๊ณ  {classNames} ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์— ๊ทธ๊ฒƒ์€์— ๋ณด์ผ ๊ฒƒ์ด๋‹ค props.styles ์™€ ์ถœ๋ ฅ {style} .
    ์›๋ž˜๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” this.composeStyles ๋ฅผ ์ƒ๊ฐํ–ˆ์ง€๋งŒ ๊ทธ ๋Œ€์‹  withStyles ์Šคํƒ€์ผ ๊ตฌ์„ฑ ๋„์šฐ๋ฏธ๋ฅผ ์†Œํ’ˆ์˜ ์ผ๋ถ€๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด ๋ชจ๋“  ํ›„์— ๊ธฐ๋ณธ ์Šคํƒ€์ผ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ž‘๋™ํ•˜๋„๋ก ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์• ๋‹ˆ๋ฉ”์ด์…˜, ํ„ฐ์น˜ ๊ฐ€๋Šฅ ๋“ฑ์„ ์ž‘๋™์‹œํ‚ค๋ ค๋ฉด ์ถ”๊ฐ€ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฌ๋‚˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ๊ฒฝ์šฐ ์ด๊ฒƒ์ด ๋‚˜์˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. opacity , backgroundColor ๋“ฑ์„ ์ž๋™์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์ „ํ™˜์—๋Š” ์•ฝ๊ฐ„์˜ ์†์‹ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๋„์šฐ๋ฏธ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ๋ณธ ๋ฐ”๋กœ๋Š”, ๊ทธ ์ด์™ธ์˜ ์‹ค์ œ ๋ฌผ์งˆ ์ „ํ™˜ ๊ตฌํ˜„์€ ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•˜๊ณ /๋น„๋ฐ€์Šค๋Ÿฌ์›Œ ๋ณด์ด๋ฉฐ ์ž˜ ํ™•์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. react-transition-group ๋Š” ๋‚ฎ์€ ์ˆ˜์ค€์˜ ๋ถ€๋ถ„(์ž…๊ตฌ/์ถœ๊ตฌ ์ฒ˜๋ฆฌ ๋“ฑ)์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์ข‹์€ ์ด์ƒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ CSS ์ „ํ™˜ ๊ธฐ๋ฐ˜ ๋””์ž์ธ ๋Œ€์‹  ์ƒˆ๋กœ์šด Web Animations API๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ด์— ๋Œ€ํ•œ ํด๋ฆฌํ•„์ด ํ•„์š”ํ•œ ๋ฏธ๋ž˜ ์ง€ํ–ฅ์ ์ธ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
    ์ฆ‰, ๋ธŒ๋ผ์šฐ์ €์—์„œ Web Animations๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  React Native์—์„œ Animated API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” React์—์„œ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ƒˆ๋กœ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค ์—ฌ์ง€๊ฐ€ ์žˆ์œผ๋ฉฐ MUI๊ฐ€ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ๊ฐœ์„ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
  • MUI๋Š” ๊ณ„๋‹จ์‹ ๋™์ž‘์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ธฐ๋Œ€๋ฅผ ๋ฒ„๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•˜์œ„ ํŠธ๋ฆฌ ๋‚ด์—์„œ ํ…Œ๋งˆ ์ˆ˜์ • ์‚ฌํ•ญ์„ ์‰ฝ๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ…Œ๋งˆ ์„ค์ •์„ ๊ฐœ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    ํ˜„์žฌ AppBar + ์•„์ด์ฝ˜๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์€ ํ…์ŠคํŠธ ์ƒ‰์ƒ์„ ์„ค์ •ํ•˜๊ณ  ๋ช…์‹œ์  color='inherit'๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ƒ‰์ƒ์ด ๊ณ„๋‹จ์‹์œผ๋กœ ๋‚ด๋ ค๊ฐˆ ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜์—ฌ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ MUI์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์—์„œ๋„ ๋™์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    React Native์—๋Š” ์ด์™€ ๊ฐ™์€ ์บ์Šค์ผ€์ด๋”ฉ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๊ฐ ๋ณด๊ธฐ์— ๋Œ€ํ•ด ์Šคํƒ€์ผ์„ ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ๊ฒฝ์šฐ AppBar ๋ฐ ๊ธฐํƒ€ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ํ•ด๋‹น ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ ํ…Œ๋งˆ๋ฅผ dark ํ•˜์—ฌ ์•„์ด์ฝ˜์ด ์˜ฌ๋ฐ”๋ฅธ ๋Œ€์กฐ ์•„์ด์ฝ˜์„ ๊ฐ–๋„๋ก ์ˆ˜์ •๋œ ํ…Œ๋งˆ์˜ ์ˆ˜์ •๋œ ๋ฒ„์ „์„ ์‰ฝ๊ฒŒ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ƒ‰์ƒ(ํ…์ŠคํŠธ ์ƒ‰์ƒ ๋Œ€์‹  ์‹ค์ œ ์•„์ด์ฝ˜ ์ƒ‰์ƒ ์‚ฌ์–‘์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•  ์ˆ˜ ์žˆ์Œ). ์ด๋Š” ์•ฑ ๋ฐ”์— ์ค‘์ฒฉ๋œ ๋ฉ”๋‰ด์™€ ๊ฐ™์€ ์‚ฌํ•ญ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด ๊ณ„๋‹จ์‹ ๋ฌธ์ œ์˜ ํ™•์žฅ์œผ๋กœ. MUI๋Š” ๋˜ํ•œ <Button>Text</Button> ์™€ ๊ฐ™์€ ๊ฒƒ๋“ค์„ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ MUI๋Š” ๋ฒ„ํŠผ ๋ฃจํŠธ์˜ fontFace/color ๋“ฑ์˜ ์Šคํƒ€์ผ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์š”์†Œ์™€ ํ…์ŠคํŠธ ๋…ธ๋“œ์˜ ํ˜ผํ•ฉ๊ณผ ํ…์ŠคํŠธ ๋…ธ๋“œ๋Š” ์˜ฌ๋ฐ”๋ฅธ ์Šคํƒ€์ผ์„ ์–ป์Šต๋‹ˆ๋‹ค.
    ์ด๊ฒƒ์€ React Native์—์„œ ๋ฌด๋„ˆ์ง‘๋‹ˆ๋‹ค. ๋ชจ๋“  ํ…์ŠคํŠธ๋Š” <Text> ์˜ ์ผ๋ถ€์—ฌ์•ผ ํ•˜๊ณ  ๋ชจ๋“  ํ…์ŠคํŠธ ์Šคํƒ€์ผ์€ ํ•ด๋‹น ๊ตฌ์„ฑ์š”์†Œ์˜ ์Šคํƒ€์ผ์— ์žˆ์–ด์•ผ ํ•˜๋ฉฐ ํ…์ŠคํŠธ ์š”์†Œ๋Š” ํ…์ŠคํŠธ๊ฐ€ ์•„๋‹Œ ์ž์‹์„ ํฌํ•จํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(์˜ˆ:).
    ๋ช‡ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

    • <Button text='Text' /> ํŒจํ„ด์€ React Native์—์„œ ํ›จ์”ฌ ๋” ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ๊ทธ๊ฒƒ์€ MUI์˜ ์ •์‹ ๊ณผ ๊ทผ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์„ ํƒ ์‚ฌํ•ญ์ด ์•„๋‹™๋‹ˆ๋‹ค.

    • ์ž์‹์„ ๋งคํ•‘ํ•˜๊ณ  ๋ฌธ์ž์—ด์„ ์Šคํƒ€์ผ์ด ์ง€์ •๋œ Text ์š”์†Œ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋ถ€์„œ์ง€๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด์„ ๋ฌด์—‡์ด๋“  ๊ฐ์‹ธ๋Š” ์ˆœ๊ฐ„ ๋Š์–ด์ง‘๋‹ˆ๋‹ค(์‹ฌ์ง€์–ด react-intl๋„ ๋ฌธ์ž์—ด์„ ๋ฌด๋„ˆ๋œจ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค). ์–ด.

    • ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์•„๋‹ˆ๋ฉฐ ๊ธฐ๋‹ค๋ ค์•ผ ํ•  ๊ฒƒ์ด๋ฉฐ ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ 100% ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” React 16.3์˜ ์ƒˆ๋กœ์šด ์ปจํ…์ŠคํŠธ API๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  <MuiText>Text</MuiText> ๋…ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Button ์™€ ๊ฐ™์€ MUI ๊ตฌ์„ฑ ์š”์†Œ์—๋Š” ํ˜„์žฌ ์ปจํ…์ŠคํŠธ์˜ ์Šคํƒ€์ผ(๊ธ€๊ผด, ํ…์ŠคํŠธ ์ƒ‰์ƒ ๋“ฑ...)์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ณต๊ธ‰์ž๊ฐ€ ์žˆ๊ณ  MuiText๋Š” ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Text ์š”์†Œ์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋Š˜ v1์ด ์ถœ์‹œ๋˜์—ˆ๋Š”๋ฐ React Nativeโ“์˜ ๊ณ„ํš์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

React Native Material Support์˜ ๊ฒฝ์šฐ CallStack ํŒ€์—์„œ ์œ ์ง€ ๊ด€๋ฆฌ ๋ฐ ์ง€์›ํ•˜๋Š” React Native Paper ๋ผ๋Š” ์•„๋ฆ„๋‹ค์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ Paper๊ฐ€ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ React Native๋กœ ์ด์‹ํ•  ๊ณ„ํš์ด ์—†์Šต๋‹ˆ๋‹คโ“

๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ด ๋ฌธ์ œ๋ฅผ ๋‹ซ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :)

@deadcoder0904๋ฅผ ๊ณต์œ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. Awesome React Components ์— Paper๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. CallStack์— ๋Œ€ํ•ด ๋“ค์–ด๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” Call-Em-All๋กœ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ™์€ ์นœ๊ตฌ๋“ค์ด ์•„๋‹Œ ๊ฒƒ ๊ฐ™์ฃ ?

@jhabdas ์•„๋‹ˆ ๊ทธ๋“ค์€ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

@dantman ๋‹ค์Œ์€ ๊ธฐ๋ณธ ์ง€์›์„ ๋‹ฌ์„ฑํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ œ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค.

  • jss๋ฅผ ๊ณ ์ˆ˜ํ•˜๋Š” ๊ฒƒ์ด ์ ˆ๋Œ€์ ์ธ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์•„๋‹Œ ๊ฒฝ์šฐ fela ๊ฐ€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋Œ€์•ˆ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
  • react-native-animable ์€ ํ‚คํ”„๋ ˆ์ž„์„ ์ง€์›ํ•˜๋ฉฐ ์•„๋งˆ๋„ transition-group ๋Œ€์‹  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .
  • ๋‚˜๋Š” ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ์— ๋Œ€ํ•œ ๊ณ„๋‹จ์‹ ์—†๋Š” ๊ด€์ ์„ ๋’ค์ง‘๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. cascade ๋ฐ inherit ์†Œํ’ˆ์œผ๋กœ ๊ณต๊ธ‰์ž์™€ ์†Œ๋น„์ž์—๊ฒŒ ์˜ตํŠธ์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ๋‚ด๊ฐ€ ์ž‘์—…ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•œ ๋ชจ๋“  ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์žฌ์ •์˜๋ฅผ ํ—ˆ์šฉํ•˜๊ธฐ ์œ„ํ•ด @shoutem/theme ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ  ์ง€๋‚˜์น˜๊ฒŒ ์—„๊ฒฉํ•œ API์™€ ์žฌ์ •์˜ํ•  ์ˆ˜ ์—†๋Š” ์Šคํƒ€์ผ ๋•Œ๋ฌธ์— ๊ณ ํ†ต์Šค๋Ÿฝ๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ๊ธฐ๋ณธ ๊ธฐ๋ฐ˜) .

์•„์ง ์ด ์ง€์›์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์›น์—์„œ๋„ ๋ฉ‹์ง€๊ฒŒ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋ชจ๋ฐ”์ผ์—์„œ๋„ ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค!

๋„ค์ดํ‹ฐ๋ธŒ ๋ฐ˜์‘ ์ง€์›์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@oliviertassinari ์œ„์—์„œ ์„ค๋ช…ํ•œ ๊ตฌํ˜„ ๊ฒฝ๋กœ๋ฅผ ๋ถ„๊ธฐํ•˜๊ณ  ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์šฐ์„  ์ˆœ์œ„๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์— ํ•„์š”ํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ž‘๋™์‹œํ‚ค๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๊ณง ๊ฐ•๋ ฅํ•œ React Native ์ง€์›์„ PRํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด์ง€๋งŒ ๊ฐ€๋Šฅํ•œ ํ•œ ๋งˆ์Šคํ„ฐ์™€ "๋™๊ธฐํ™”"๋˜๋„๋ก ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ธ์  ๊ฐ€๋Š” ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋˜๋Š” ๋ณ‘ํ•ฉ๋  ์ˆ˜ ์žˆ์Œ).

@micimize ์•Œ๋ ค ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ์—์„œ ํ–‰์šด์„ ๋น•๋‹ˆ๋‹ค! :) ์šฐ๋ฆฌ๊ฐ€ ์•„์ง ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ์— ๋Œ€ํ•ด ์ž‘์—…ํ•˜์ง€ ์•Š์€ ์ด์œ ์— ๋Œ€ํ•ด. ๋‹ค์–‘ํ•œ ๋ง›์œผ๋กœ ๋‚˜์˜ค๋Š” ๊ฒƒ ๊ฐ™์•„์š”. ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ๋Š” ํ•ต์‹ฌ ๊ด€๋ฆฌ์ž๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. react-dom ์‚ฌ์šฉ์€ react-native๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ์„ฑ์žฅํ•˜๊ณ  ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ: ๋ชฉ๋ก, ๋ฒ„ํŠผ, ์นด๋“œ, ์•„์ด์ฝ˜, ์„ ํƒ ์ปจํŠธ๋กค, ํ…์ŠคํŠธ ํ•„๋“œ ๋ฐ ๋ฐฐ๊ฒฝ์„ ํฌํ•จํ•˜์—ฌ ์ƒ๋‹นํ•œ ๊ธฐ๋Šฅ ๋ฉ์–ด๋ฆฌ๋ฅผ ๋‹ค์†Œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„, ์šฐ๋ฆฌ๊ฐ€ ๋งˆ์นจ๋‚ด ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ์—์„œ ์•ฑ ์ž์ฒด๋ฅผ ๊ฐœ๋ฐœํ•˜๊ฒŒ ๋˜์ž ์ˆ˜๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๊ณ  ์šฐ๋ฆฌ๋Š” Flutter๋กœ ์˜ฎ๊ฒจ์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์–ธ์  ๊ฐ€๋Š” ๋Œ์•„๊ฐ€์„œ ์šฐ๋ฆฌ๊ฐ€ ํ•œ ์ž‘์—… ์ค‘ ์ผ๋ถ€๋ฅผ ๋ณต๊ตฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ฃผ๋กœ css-shorthand-properties ๋ฐ ๊ธฐํƒ€ ๊น”๋”ํ•œ ๊ฒƒ๋“ค์„ ํ™œ์šฉํ•œ withStyles / classes ์Šคํƒ€์ผ๋ง ์†”๋ฃจ์…˜์˜ ํฌํŠธ์ง€๋งŒ ๋” ์ด์ƒ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‚˜๋ฅผ์œ„ํ•œ.

@rogerstorm ์€ 200๋‹ฌ๋Ÿฌ๋กœ ์ด ๋ฌธ์ œ์— ์ž๊ธˆ์„ ์ง€์›ํ–ˆ์Šต๋‹ˆ๋‹ค. IssueHunt์—์„œ ํ™•์ธํ•˜์„ธ์š”.

๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์€ ์šฐ๋ฆฌ์—๊ฒŒ ๊ธฐํšŒ ๋น„์šฉ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ซ๊ณ  ์žˆ์–ด์š”. ๋ธŒ๋ผ์šฐ์ € ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋” ์ž˜ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@oliviertassinari , ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ ์ง€์›์ด ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฌ๊ณ  ๊ฐ€๊นŒ์šด ๋ฏธ๋ž˜(์˜ˆ: 1๋…„)์— ๋ ˆ์ด๋”์—

๋„ค

https://github.com/lightningtgc/react-native-material-ui ๋˜ ๋‹ค๋ฅธ ์‚ฌ๊ธฐ npm ํŒจํ‚ค์ง€์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰