Next.js: hot reload μ‹œ styled-component μž¬μ •μ˜

에 λ§Œλ“  2018λ…„ 03μ›” 28일  Β·  27μ½”λ©˜νŠΈ  Β·  좜처: vercel/next.js

  • [x ] 이 μ €μž₯μ†Œμ˜ 문제 λ₯Ό κ²€μƒ‰ν–ˆμœΌλ©° 이것이 μ€‘λ³΅λ˜μ§€ μ•ŠλŠ”λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

μ˜ˆμƒλ˜λŠ” λ™μž‘


λ‚΄ νŽ˜μ΄μ§€μ—λŠ” λ‹€μŒκ³Ό 같은 맀우 기본적인 μ½”λ“œκ°€ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

import React from 'react'
import styled from 'styled-components'

const Title = styled.h1`
  color: pink;
  font-size: 50px;
`

export default () => <Title>My page</Title>

νŽ˜μ΄μ§€λ₯Ό μƒˆλ‘œ κ³ μΉ  λ•Œ 제λͺ©μ΄ 뢄홍색일 κ²ƒμœΌλ‘œ μ˜ˆμƒν•©λ‹ˆλ‹€.

ν˜„μž¬ 행동


νŽ˜μ΄μ§€κ°€ 처음 λ§Œλ“€μ–΄μ§€λ©΄ 제λͺ©μ΄ λΆ„ν™μƒ‰μœΌλ‘œ ν‘œμ‹œλ©λ‹ˆλ‹€. νŽ˜μ΄μ§€λ₯Ό μƒˆλ‘œ κ³ μΉ¨ν•˜λ©΄ 뢄홍색이 더 이상 μ‘΄μ€‘λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
μ½”λ“œμ˜ 색상을 λ‹€λ₯Έ κ²ƒμœΌλ‘œ λ³€κ²½ν•˜κ³  νŒŒμΌμ„ μ €μž₯ν•˜λ©΄ νŽ˜μ΄μ§€κ°€ μ—…λ°μ΄νŠΈλ©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ‹€μ‹œ μƒˆλ‘œ 고치면 λ³€κ²½ 사항이 λ‹€μ‹œ μ†μ‹€λ©λ‹ˆλ‹€. 이 문제의 원인이 무엇인지 μ „ν˜€ λͺ¨λ¦…λ‹ˆλ‹€. 도움을 μ£Όμ‹œλ©΄ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€.

λ‹Ήμ‹ μ˜ ν™˜κ²½


| 기술 | 버전 |
|---------|---------|
| λ‹€μŒ | μ΅œμ‹  |
| λ…Έλ“œ | |
| OS | μ•„μΉ˜ |
| λΈŒλΌμš°μ € | λΉ„λ°œλ”” |

good first issue

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

λ˜ν•œμ΄ λ¬Έμ œκ°€

νŽΈμ§‘(μ†”λ£¨μ…˜):

이 λ¬Έμ œλŠ” babel ꡬ성이 μ˜¬λ°”λ₯΄κ²Œ μ„€μ •λ˜μ§€ μ•Šμ€ 것과 관련이 μžˆμŠ΅λ‹ˆλ‹€. μŠ€νƒ€μΌμ΄ μ§€μ •λœ ꡬ성 μš”μ†Œκ°€ μžˆλŠ” NextJS의 곡식 예제λ₯Ό 보면 λ‹€μŒκ³Ό 같은 .babelrc 파일이 μžˆμŒμ„ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

{
    "presets": ["next/babel"],
    "plugins": [["styled-components", { "ssr": true }]]
}

그런 λ‹€μŒ 이 ν”ŒλŸ¬κ·ΈμΈμ„ package.json 파일의 devDependencies에 μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€.

"devDependencies": {
    "babel-plugin-styled-components": "^1.8.0"
},

그런 λ‹€μŒ μ„€μΉ˜ λͺ…λ Ή, yarn install λ˜λŠ” npm install λ₯Ό μ‹€ν–‰ν•˜λ©΄ λ°”λ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€!

μΆ”μ‹ : 둜컬 호슀트 개발 μž‘μ—…μ„ μœ„ν•΄ ν•˜λ‚˜μ˜ νƒ­λ§Œ μ—΄μ–΄μ•Ό ν•©λ‹ˆλ‹€!

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

λ‹€λ₯Έ μ„€μ •μœΌλ‘œ λ™μΌν•œ 버그가 μžˆμŠ΅λ‹ˆλ‹€. 두 개의 폴더가 μžˆλŠ” monorepoκ°€ β€‹β€‹μžˆμŠ΅λ‹ˆλ‹€.

  • app , λ‚΄ next.js μ•± μ‚¬μš©
  • ui , μŠ€νƒ€μΌ ꡬ성 μš”μ†Œλ₯Ό μ‚¬μš©ν•˜λŠ” 'ui 라이브러리' μ‚¬μš©

예제 μ €μž₯μ†Œμ— μžˆμŠ΅λ‹ˆλ‹€ : https://github.com/lucleray/ssr-ui-library

예λ₯Ό λ“€μ–΄ ui ν΄λ”μ—μ„œ 배경색을 μ—…λ°μ΄νŠΈν•˜κ³  νŒŒμΌμ„ μ €μž₯ν•˜λ©΄ νŽ˜μ΄μ§€κ°€ μ—…λ°μ΄νŠΈλ©λ‹ˆλ‹€.
κ·ΈλŸ¬λ‚˜ νŽ˜μ΄μ§€λ₯Ό μƒˆλ‘œ 고치면 μ—…λ°μ΄νŠΈκ°€ μ†μ‹€λ©λ‹ˆλ‹€.

이것은 <head> 에 μžˆλŠ” μŠ€νƒ€μΌ μ‹œνŠΈμ˜ μ£Όμž… μˆœμ„œμ™€ 관련이 μžˆμŠ΅λ‹ˆκΉŒ?

@ianregister μ•„λ‹ˆμš”, <head> 의 μ£Όμž… μˆœμ„œλŠ” 관련이 μ—†μŠ΅λ‹ˆλ‹€.

λ¬Έμ œλŠ” μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈκ°€ μŠ€νƒ€μΌμ‹œνŠΈμ— λŒ€ν•΄ λ™μΌν•œ μ½”λ“œλ₯Ό λ Œλ”λ§ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

λ‚˜λŠ” 같은 버그가 있으며 μŠ€νƒ€μΌμ—λ§Œ κ΅­ν•œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν•« λ¦¬λ‘œλ“œλŠ” λ³€κ²½ 사항을 μ„ νƒν•˜μ§€λ§Œ λΈŒλΌμš°μ € μƒˆλ‘œ 고침은 그렇지 μ•ŠμŠ΅λ‹ˆλ‹€. μ΅œμ‹  μ—…λ°μ΄νŠΈλ₯Ό λ°›μœΌλ €λ©΄ μ„œλ²„(λ…Έλ“œ server.js)λ₯Ό λ‹€μ‹œ μ‹€ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€. λ‚˜λŠ” [email protected] 을 μ‚¬μš©ν•˜κ³  16.3에 λ°˜μ‘ν•˜κ³  μ„œλ²„μ— λŒ€ν•΄ ν‘œν˜„ν•©λ‹ˆλ‹€.

@lucleray , 이것을 μ‹œλ„ν•˜μ‹­μ‹œμ˜€:

babel-plugin-styled-components κ°€ 쒅속성인지 ν™•μΈν•˜κ³  package.jsonμ—μ„œ babelμ—κ²Œ μ„œλ²„ μΈ‘ λ Œλ”λ§μ„ μˆ˜ν–‰ν•˜κ³  μžˆμŒμ„ μ•Œλ¦½λ‹ˆλ‹€.

이것이 μ§λ©΄ν•˜κ³  μžˆλŠ” ꡬ성 문제일 뿐이라고 μƒκ°ν•˜μ‹­μ‹œμ˜€.

νŒ¨ν‚€μ§€.json
```json
"바벨": {
"ν™˜κ²½": {
"개발": {
"사전 μ„€μ •": ["λ‹€μŒ/바벨"],
"ν”ŒλŸ¬κ·ΈμΈ": [
[
"μŠ€νƒ€μΌ ꡬ성 μš”μ†Œ",
{
"ssr": 사싀,
"λ””μŠ€ν”Œλ ˆμ΄ 이름": μ°Έ
}
]
]
},
"생산": {
"사전 μ„€μ •": ["λ‹€μŒ/바벨"],
"ν”ŒλŸ¬κ·ΈμΈ": [
[
"μŠ€νƒ€μΌ ꡬ성 μš”μ†Œ",
{
"ssr": 사싀,
"λ””μŠ€ν”Œλ ˆμ΄ 이름": 거짓
}
]
]
}
}
}

@tvthatsme UI λΌμ΄λΈŒλŸ¬λ¦¬μ™€ μ•± μžμ²΄μ— babel-plugin-styled-components λ₯Ό μΆ”κ°€ν–ˆμ§€λ§Œ μ—¬μ „νžˆ λ™μΌν•œ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

μ—¬κΈ°μ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.
https://github.com/lucleray/ssr-ui-library/blob/master/app/.babelrc
https://github.com/lucleray/ssr-ui-library/blob/master/ui/.babelrc

ꡬ성(webpack ꡬ성)인지, μ–΄λ”˜κ°€μ— 버그가 μžˆλŠ”μ§€ 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

ꡬ성 μš”μ†Œ(μŠ€νƒ€μΌκ³Ό κ΄€λ ¨λ˜μ§€ μ•ŠμŒ)λ₯Ό νŽΈμ§‘ν•˜λ©΄ 후속 ν•˜λ“œ νŽ˜μ΄μ§€ μƒˆλ‘œ κ³ μΉ¨μ—μ„œ "κ²½κ³ : Prop className 이 μΌμΉ˜ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. μ„œλ²„:" 였λ₯˜κ°€ λ°œμƒν•˜λŠ” μœ μ‚¬ν•œ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. 사라지렀면 μ„œλ²„λ₯Ό λ‹€μ‹œ μ‹œμž‘ν•΄μ•Ό ν•©λ‹ˆλ‹€.

@sea129 κ³ μΉ  수 μžˆμ—ˆλ‚˜μš”?

Lol, 여기에 같은 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. @valeeum ν•΄κ²°ν•˜μ…¨λ‚˜μš”?

이 λ¬Έμ œμ— λŒ€ν•΄ μ•½κ°„μ˜ 연ꡬλ₯Ό μˆ˜ν–‰ν–ˆμœΌλ©° μΌμ’…μ˜ "μ›ΉνŒ© 캐싱"κ³Ό 연결될 수 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

문제의 예둜 여기에 μ½”λ“œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. https://github.com/lucleray/ssr-ui-library

app λŠ” Next.jsλ₯Ό μ‚¬μš©ν•˜κ³  있으며 ui 에 μ’…μ†λ©λ‹ˆλ‹€. μ—°κ²°ν•˜κΈ° μœ„ν•΄ μ›μ‚¬μ˜ μž‘μ—… 곡간을 μ‚¬μš©ν•˜κ³  μžˆμ§€λ§Œ 더 κ°„λ‹¨ν•œ yarn link μžˆμŠ΅λ‹ˆλ‹€.

μ„œλ²„ μΈ‘μ—μ„œ λ²ˆλ“€μ€ ui λͺ¨λ“ˆμ„ ν¬ν•¨ν•˜μ§€ μ•Šκ³  external 둜 μ·¨κΈ‰ν•©λ‹ˆλ‹€(node_modules에 있기 λ•Œλ¬Έμ—).
ν΄λΌμ΄μ–ΈνŠΈ μΈ‘μ—μ„œ λ²ˆλ“€μ€ ui λͺ¨λ“ˆμ„ ν¬ν•¨ν•©λ‹ˆλ‹€.

.next/static (ν΄λΌμ΄μ–ΈνŠΈ μΈ‘) λ²ˆλ“€μ—μ„œ λ‹€μŒκ³Ό 같이 λ‚˜νƒ€λ‚©λ‹ˆλ‹€.

/***/ "../ui/bundle.js":
/*!***********************!*\
  !*** ../ui/bundle.js ***!
  \***********************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, '__esModule', { value: true });

function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }

var styled = _interopDefault(__webpack_require__(/*! styled-components */ "../node_modules/styled-components/dist/styled-components.browser.esm.js"));

const UiButton = styled.button`
  background: black;
`;

exports.UiButton = UiButton;


/***/ }),

반면 .next/server (μ„œλ²„ μΈ‘) λ²ˆλ“€μ—μ„œλŠ” λ‹€μŒκ³Ό 같이 λ‚˜νƒ€λ‚©λ‹ˆλ‹€.

/***/ "@monorepo/ui":
/*!*******************************!*\
  !*** external "@monorepo/ui" ***!
  \*******************************/
/*! no static exports found */
/***/ (function(module, exports) {

module.exports = require("@monorepo/ui");

/***/ }),

μ΄μƒν•œ 점은 module.exports = require("@monorepo/ui") κ°€ ui νŒ¨ν‚€μ§€λ‘œ ν™•μΈλ˜κ³  μ œλŒ€λ‘œ μž‘λ™ν•΄μ•Ό ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ μΊμ‹œλœ κ²ƒμ²˜λŸΌ 보이며 μ‹€μ œ ui νŒ¨ν‚€μ§€λ‘œ ν™•μΈλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ ui 에 μžˆλŠ” λ²„νŠΌμ˜ 배경색을 νŒŒλž€μƒ‰μœΌλ‘œ λ³€κ²½ν•˜λ©΄. ν•« λ¦¬λ‘œλ”λŠ” νŽ˜μ΄μ§€λ₯Ό μ˜¬λ°”λ₯΄κ²Œ μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μƒˆλ‘œ κ³ μΉ¨ν•˜λ©΄ νŽ˜μ΄μ§€κ°€ 이전 색상(λ‚΄ μ˜ˆμ—μ„œλŠ” 녹색)으둜 μ„œλ²„ 츑으둜 λ Œλ”λ§λ©λ‹ˆλ‹€. μ„œλ²„ μΈ‘ λ²ˆλ“€μ΄ μ‹€μ œ νŒ¨ν‚€μ§€λ‘œ μ΄λ™ν•˜κΈ° μœ„ν•΄ @monorepo/ui 쒅속성을 ν•΄κ²°ν•˜μ§€ μ•Šκ³  μΊμ‹œλœ 버전을 μ‚¬μš©ν•˜λŠ” 것과 κ°™μŠ΅λ‹ˆλ‹€.


@monorepo/ui μ™ΈλΆ€ 쒅속성이 μ•„λ‹ˆλΌ λ‹€μŒκ³Ό 같이 μ„œλ²„ μΈ‘ λ²ˆλ“€λ‘œ 묢도둝 webpack을 κ΅¬μ„±ν•˜μ—¬ ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€. https://github.com/lucleray/ssr-ui-library/blob/ webpack-config/app/next.config.js

λ‚˜λŠ” μ—¬μ „νžˆ 무슨 일이 μΌμ–΄λ‚˜κ³  μžˆλŠ”μ§€ μ΄ν•΄ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€ πŸ€”

require μ—λŠ” μΊμ‹œ( require.cache )κ°€ λ‚΄μž₯λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” (컴파일 속도λ₯Ό μœ„ν•΄) μ„œλ²„μ˜ node_modules 내뢀에 아무 것도 λ²ˆλ“€λ‘œ 묢지 μ•ŠκΈ° λ•Œλ¬Έμ— node_modules의 쒅속성에 λŒ€ν•΄ μ˜ˆμƒλ˜λŠ” λ™μž‘μž…λ‹ˆλ‹€.

μ•Œκ² μŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ λ¬Έμ œλŠ” ν•« λ¦¬λ‘œλ”κ°€ μ„œλ²„ μΈ‘μ—μ„œ μ™ΈλΆ€ μ’…μ†μ„±μ˜ μ½”λ“œ λ³€κ²½ 사항을 λ‹€μ‹œ λ‘œλ“œν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. λ§žμŠ΅λ‹ˆκΉŒ?

λ‚΄κ°€ κ³΅μœ ν•œ μ˜ˆμ œμ—μ„œ λ‚΄ μ½”λ“œ λ³€κ²½ 사항이 개발 λͺ¨λ“œμ—μ„œ ν΄λΌμ΄μ–ΈνŠΈ(이 경우)와 μ„œλ²„(κ²½μš°κ°€ μ•„λ‹˜) λͺ¨λ‘μ— λ‘œλ“œλ  κ²ƒμœΌλ‘œ μ˜ˆμƒν•©λ‹ˆλ‹€.

λ”°λΌμ„œ λ¬Έμ œλŠ” ν•« λ¦¬λ‘œλ”κ°€ μ„œλ²„ μΈ‘μ—μ„œ μ™ΈλΆ€ μ’…μ†μ„±μ˜ μ½”λ“œ λ³€κ²½ 사항을 λ‹€μ‹œ λ‘œλ“œν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

μ •ν™•νžˆλŠ” require.cacheμ—μ„œ 전체 경둜만 μ‚­μ œν•©λ‹ˆλ‹€.

이 @timneutkensλ₯Ό μ–΄λ–»κ²Œ ν•΄κ²°ν•  수 μžˆλ‹€κ³  생각

μ„œλ²„ μΈ‘ λ²ˆλ“€μ— λ²ˆλ“€λ‘œ ν¬ν•¨λ˜λ„λ‘ μ™ΈλΆ€ μ’…μ†μ„±μ—μ„œ @monorepo/ui λ₯Ό μ œκ±°ν•΄μ•Ό ν•©λ‹ˆκΉŒ? 그것은 μž‘λ™ν•˜μ§€λ§Œ 이미 그것을 λ³€ν™˜ν•˜κ³  있기 λ•Œλ¬Έμ— 그것을 μš”κ΅¬ν•˜λŠ” 것이 더 낫지 μ•Šμ„κΉŒμš”?

https://github.com/martpie/next-plugin-transpile-modules λ₯Ό μ‚¬μš©ν•˜μ—¬ λͺ¨λ“ˆ μ»΄νŒŒμΌμ„ ν™œμ„±ν™”ν•˜λŠ” κ²ƒλ§ŒνΌ μ‰¬μšΈ 수 μžˆμŠ΅λ‹ˆλ‹€.

@timneutkens μ™œ νμ‡„λ˜μ—ˆλ‚˜μš”? 이 λ¬Έμ œλŠ” μ΅œμ‹  버전에 μ—¬μ „νžˆ μ‘΄μž¬ν•©λ‹ˆλ‹€

μ—¬μ „νžˆμ΄ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 아직도이 λ¬Έμ œκ°€μžˆλ‹€

여기도 λ§ˆμ°¬κ°€μ§€

λ˜ν•œμ΄ λ¬Έμ œκ°€

νŽΈμ§‘(μ†”λ£¨μ…˜):

이 λ¬Έμ œλŠ” babel ꡬ성이 μ˜¬λ°”λ₯΄κ²Œ μ„€μ •λ˜μ§€ μ•Šμ€ 것과 관련이 μžˆμŠ΅λ‹ˆλ‹€. μŠ€νƒ€μΌμ΄ μ§€μ •λœ ꡬ성 μš”μ†Œκ°€ μžˆλŠ” NextJS의 곡식 예제λ₯Ό 보면 λ‹€μŒκ³Ό 같은 .babelrc 파일이 μžˆμŒμ„ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

{
    "presets": ["next/babel"],
    "plugins": [["styled-components", { "ssr": true }]]
}

그런 λ‹€μŒ 이 ν”ŒλŸ¬κ·ΈμΈμ„ package.json 파일의 devDependencies에 μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€.

"devDependencies": {
    "babel-plugin-styled-components": "^1.8.0"
},

그런 λ‹€μŒ μ„€μΉ˜ λͺ…λ Ή, yarn install λ˜λŠ” npm install λ₯Ό μ‹€ν–‰ν•˜λ©΄ λ°”λ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€!

μΆ”μ‹ : 둜컬 호슀트 개발 μž‘μ—…μ„ μœ„ν•΄ ν•˜λ‚˜μ˜ νƒ­λ§Œ μ—΄μ–΄μ•Ό ν•©λ‹ˆλ‹€!

μ’‹μ•„ μ‚¬λžŒλ“€. 여기에 해결책이 μžˆμŠ΅λ‹ˆλ‹€. λ””λ ‰ν† λ¦¬μ˜ λ£¨νŠΈμ— _document.jsλ₯Ό λ§Œλ“€κ³  이것을 μΆ”κ°€ν•˜μ‹­μ‹œμ˜€.

import Document, { Head, Main, NextScript } from 'next/document'
import { ServerStyleSheet } from 'styled-components'

class MyDocument extends Document {
  static getInitialProps ({ renderPage }) {
    const sheet = new ServerStyleSheet()
    const page = renderPage(App => props => sheet.collectStyles(<App {...props} />))
    const styleTags = sheet.getStyleElement()
    return { ...page, styleTags }
  }

  render () {
    return (
      <html>
        <Head>
          <title>Your site title</title>
          {this.props.styleTags}
        </Head>
        <body>
          <Main />
          <NextScript />
        </body>
      </html>
    )
  }
}

export default MyDocument

그럼 npm install --save -D babel-plugin-styled-components

λ˜ν•œ νŽ˜μ΄μ§€ 디렉토리 _App.js에 μ‚¬μš©μž 지정 앱을 λ§Œλ“€κ³  λ‹€μŒμ„ μΆ”κ°€ν•©λ‹ˆλ‹€.

import React from "react";
import App from "next/app";

class MyApp extends App {
  render() {
    const { Component, pageProps } = this.props;
    return <Component {...pageProps} />;
  }
}

export default MyApp;

당신은 λͺ¨λ“  μ„€μ •

λ˜ν•œμ΄ λ¬Έμ œκ°€

νŽΈμ§‘(μ†”λ£¨μ…˜):

이 λ¬Έμ œλŠ” babel ꡬ성이 μ˜¬λ°”λ₯΄κ²Œ μ„€μ •λ˜μ§€ μ•Šμ€ 것과 관련이 μžˆμŠ΅λ‹ˆλ‹€. μŠ€νƒ€μΌμ΄ μ§€μ •λœ ꡬ성 μš”μ†Œκ°€ μžˆλŠ” NextJS의 곡식 예제λ₯Ό 보면 λ‹€μŒκ³Ό 같은 .babelrc 파일이 μžˆμŒμ„ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

{
    "presets": ["next/babel"],
    "plugins": [["styled-components", { "ssr": true }]]
}

그런 λ‹€μŒ 이 ν”ŒλŸ¬κ·ΈμΈμ„ package.json 파일의 devDependencies에 μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€.

"devDependencies": {
    "babel-plugin-styled-components": "^1.8.0"
},

그런 λ‹€μŒ μ„€μΉ˜ λͺ…λ Ή, yarn install λ˜λŠ” npm install λ₯Ό μ‹€ν–‰ν•˜λ©΄ λ°”λ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€!

μΆ”μ‹ : 둜컬 호슀트 개발 μž‘μ—…μ„ μœ„ν•΄ ν•˜λ‚˜μ˜ νƒ­λ§Œ μ—΄μ–΄μ•Ό ν•©λ‹ˆλ‹€!

이것은 μž‘λ™ν•©λ‹ˆλ‹€, κ°μ‚¬ν•©λ‹ˆλ‹€

λΆˆν–‰νžˆλ„ μ—¬μ „νžˆ λ¬Έμ œμž…λ‹ˆλ‹€.

λ‚˜λŠ” μ΄μƒν•œ 것을 λͺ©κ²©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

당신이 가지고 μžˆλ‹€λ©΄

styled.h1`
color: red;
`

초기 λ‘œλ“œ μ‹œ 빨간색, λ‹€μŒμœΌλ‘œ λ³€κ²½ν•˜λ©΄

styled.h1`
color: purple;
`

λ¬΄μ‹œλ˜κ³  ν…μŠ€νŠΈκ°€ 검은색이 되고 μŠ€νƒ€μΌμ΄ μ—†μŠ΅λ‹ˆλ‹€.
νŽ˜μ΄μ§€λ₯Ό μƒˆλ‘œκ³ μΉ¨ν•˜λ©΄ μ˜ˆμƒλŒ€λ‘œ 보라색이 λ©λ‹ˆλ‹€.
κ·ΈλŸ¬λ‚˜ 색상을 red ν•˜λ©΄ HMR이 μ œλŒ€λ‘œ μž‘λ™ν•˜κ³  ν…μŠ€νŠΈκ°€ 빨간색이 λ©λ‹ˆλ‹€.
μ–΄λ–€ μ’…λ₯˜μ˜ 캐싱이 진행 쀑인 κ²½μš°μ™€ 같이 μ›ν•˜λŠ” 경우 λ§Žμ€ μƒ‰μƒμœΌλ‘œ 이λ₯Ό μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ HMR을 톡해 μƒˆ μŠ€νƒ€μΌμ„ μΆ”κ°€ν•˜λ©΄ λ¬΄μ‹œλ˜μ§€λ§Œ 초기 λ Œλ”λ§μ—μ„œλŠ” μΊμ‹œμ— 배치되고 λ‚˜μ€‘μ— HMR을 톡해 이 μŠ€νƒ€μΌμ„ μ‚¬μš©ν•˜λ©΄ μž‘λ™ν•©λ‹ˆλ‹€. κ·Έλž˜μ„œ HMRμ—μ„œ λΈŒλΌμš°μ €μ— μ œλŒ€λ‘œ μ „λ‹¬λ˜μ§€ μ•ŠμŠ΅λ‹ˆκΉŒ?

μ €λŠ” SC 및 Next.js 내뢀에 λŒ€ν•œ 지식이 μ—†μœΌλ―€λ‘œ 좔츑일 λΏμž…λ‹ˆλ‹€.

νŽΈμ§‘ν•˜λ‹€:
μŠ€νƒ€μΌμ΄ μ§€μ •λœ ꡬ성 μš”μ†Œ 5.0.0-rc.2 μ—μ„œ μ œλŒ€λ‘œ μž‘λ™ν–ˆμŠ΅λ‹ˆλ‹€.

이 정보가 μ–Όλ§ˆλ‚˜ 관련이 μžˆμ„μ§€λŠ” ν™•μ‹€ν•˜μ§€ μ•Šμ§€λ§Œ λ‚΄κ°€ 직접 μˆ˜μ •ν•œ 방법은 λ‹€μŒ λ¦¬ν¬μ§€ν† λ¦¬μ˜ 예제λ₯Ό 따라 λˆ„λ½λœ λΉ„νŠΈ 쑰각을 ν†΅ν•©ν•œ κ²ƒμž…λ‹ˆλ‹€.
https://github.com/zeit/next.js/tree/canary/examples/with-typescript-styled-components

λ‚˜λŠ” next.jsλ₯Ό μ‚¬μš©ν•˜κ³  μžˆμ—ˆκ³  @MaxMcKinney μ†”λ£¨μ…˜μ΄ μ €μ—κ²Œ .babelrc κΈ°λ³Έ 섀정을 μ˜¬λ°”λ₯΄κ²Œ κ΅¬μ„±ν–ˆλŠ”μ§€ ν™•μΈν•˜μ‹­μ‹œμ˜€. 따라야 ν•  λ°°μ—΄ 및 κ°œμ²΄κ°€ 맀우 ν˜Όλž€μŠ€λŸ¬μš΄ ν˜•μ‹μ΄κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

이것은 예λ₯Ό λ“€μ–΄ λ‚΄ .babelrc νŒŒμΌμ΄μ—ˆμŠ΅λ‹ˆλ‹€.

{
    "presets": [
        [
            "next/babel",
            {
                "styled-jsx": {
                    "plugins": [
                        "styled-jsx-plugin-postcss"
                    ]
                }
            }
        ]
    ],
    "plugins": [
        [
            "styled-components",
            {
                "ssr": true
            }
        ]
    ]
}

이 λ¬Έμ œλŠ” λ™μΌν•œ package.json 쒅속성과 .babelrc 섀정이 μ—†λŠ” Next.js 예제 쀑 ν•˜λ‚˜λ₯Ό λ³΅μ œν•˜κ³  λΉŒλ“œν•˜λŠ” κ²½μš°μ— λ°œμƒν•©λ‹ˆλ‹€. MaxMckinney μ†”λ£¨μ…˜ 외에도 package.json μ˜¬λ°”λ₯Έ 쒅속성이 μžˆλŠ”μ§€ ν™•μΈν•˜μ‹­μ‹œμ˜€. "styled-components": "^5.0.0" μ™„μ „νžˆ λ†“μ³€μŠ΅λ‹ˆλ‹€.

제 κ²½μš°μ—λŠ” νŽ˜μ΄μ§€ floder μ•„λž˜μ— _app.js 및 _document.js νŒŒμΌμ„ μΆ”κ°€ν•˜κΈ°λ§Œ ν•˜λ©΄ 잘 μž‘λ™ν•©λ‹ˆλ‹€.

// _app.js
import App from 'next/app'
import { ThemeProvider } from 'styled-components'

const theme = {}

export default class MyApp extends App {
    render() {
        const { Component, pageProps } = this.props
        return (
            <ThemeProvider theme={theme}>
                <Component {...pageProps} />
            </ThemeProvider>
        )
    }
}
// _document.js
import Document from 'next/document'
import { ServerStyleSheet } from 'styled-components'

export default class MyDocument extends Document {
  static async getInitialProps(ctx) {
    const sheet = new ServerStyleSheet()
    const originalRenderPage = ctx.renderPage

    try {
      ctx.renderPage = () =>
        originalRenderPage({
          enhanceApp: (App) => (props) =>
            sheet.collectStyles(<App {...props} />),
        })

      const initialProps = await Document.getInitialProps(ctx)
      return {
        ...initialProps,
        styles: (
          <>
            {initialProps.styles}
            {sheet.getStyleElement()}
          </>
        ),
      }
    } finally {
      sheet.seal()
    }
  }
}

제 κ²½μš°μ—λŠ” νŽ˜μ΄μ§€ floder μ•„λž˜μ— _app.js 및 _document.js νŒŒμΌμ„ μΆ”κ°€ν•˜κΈ°λ§Œ ν•˜λ©΄ 잘 μž‘λ™ν•©λ‹ˆλ‹€.

// _app.js
import App from 'next/app'
import { ThemeProvider } from 'styled-components'

const theme = {}

export default class MyApp extends App {
    render() {
        const { Component, pageProps } = this.props
        return (
            <ThemeProvider theme={theme}>
                <Component {...pageProps} />
            </ThemeProvider>
        )
    }
}
// _document.js
import Document from 'next/document'
import { ServerStyleSheet } from 'styled-components'

export default class MyDocument extends Document {
  static async getInitialProps(ctx) {
    const sheet = new ServerStyleSheet()
    const originalRenderPage = ctx.renderPage

    try {
      ctx.renderPage = () =>
        originalRenderPage({
          enhanceApp: (App) => (props) =>
            sheet.collectStyles(<App {...props} />),
        })

      const initialProps = await Document.getInitialProps(ctx)
      return {
        ...initialProps,
        styles: (
          <>
            {initialProps.styles}
            {sheet.getStyleElement()}
          </>
        ),
      }
    } finally {
      sheet.seal()
    }
  }
}

Material-UIμ—μ„œ μ–΄λ–»κ²Œ μ‚¬μš©ν•΄μ•Ό ν•˜λ‚˜μš”?

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