ํ์ฌ ๋ชจ๋ ํจํค์ง์ CommonJS ๋ฒ์ ๋ง ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ ํฅํ ESM์ผ๋ก ๋ฐฐ์กํ ์ ์์ต๋๋ค(https://github.com/facebook/react/issues/10021).
๊ฐ ํจํค์ง์์ ์ต์์ ES ๋ด๋ณด๋ด๊ธฐ๊ฐ ์ด๋ป๊ฒ ๋ณด์ผ์ง ์ค์ ๋ก ๊ฒฐ์ ํ์ง ์์๊ธฐ ๋๋ฌธ์ ์ด ์์
์ ์ฝ๊ฒ ์ํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด react
์๋ ๋ช
๋ช
๋ ๋ด๋ณด๋ด๊ธฐ๊ฐ ๋ง์ด ์์ง๋ง React
๋ผ๋ ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ๋ ์์ต๋๊น? ๋ ๋์ ๋๋ฌด ํ๋ค๊ธฐ๋ฅผ ์ํด ์ฌ๋๋ค์๊ฒ import *
๋ฅผ ๊ถ์ฅํด์ผ ํฉ๋๊น? ํ์ฌ ํด๋์ค๋ฅผ ๋ด๋ณด๋ด๋ react-test-renderer/shallow
๋ ์ด๋ป์ต๋๊น(๋ฐ๋ผ์ ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ๋ก ๋ณํ๋ ๊ฒฝ์ฐ Node์์ ์คํจํ๊ธฐ ์์ํจ)?
Imho import *
๋ ๊ฐ ๊ธธ์
๋๋ค. ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ๋ ๋ฐ๋ํ์ง ์์ง๋ง ์ด ์์ ๊ฐ์ด ๋ค๋ฅธ ํญ๋ชฉ์ ๋ค์ ๋ด๋ณด๋ด๋ ๋ฐ ์ฌ์ฉํด์๋ ์ ๋ฉ๋๋ค.
export const Component = ...
export default React
React.Component = Component
๊ทธ๋ฌ๋ ๋ค์ ์์ ๊ฐ์ด ๋ค๋ฅธ ํญ๋ชฉ์ ๋ค์ ๋ด๋ณด๋ด๋ ๋ฐ ์ฌ์ฉํด์๋ ์ ๋ฉ๋๋ค.
๊ธฐ์ ์ ์ธ ์ด์ ๊ฐ ์์ต๋๊น? (๊ฐ์ ์ผ์ ํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ์ธํ๊ณ .)
๋ด ์ธ์์ *
๊ฐ์ ธ์ค๊ณ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ์ง ์๋ ์ฌ๋๋ค์ ๊ธฐ๋ณธ๊ฐ์ด ์ฌ์ฉ๋์ง ์์ ์ํ๋ก ์ ์ง๋๊ธฐ ๋๋ฌธ์ ํธ๋ฆฌ ํ๋ค๋ฆผ์ ๋ฌธ์ ๊ฐ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํ์ง๋ง ๋กค์
๋ฑ์ ๊ณผ๋ํ๊ฐํ ๊ฒ์ผ ์๋ ์์ต๋๋ค.
๊ทธ ์ง๋ฌธ์ @lukastaegert๊ฐ ๊ฐ์ฅ ์ ๋ตํ ์ ์์ต๋๋ค. https://github.com/facebook/react/issues/10021#issuecomment -335128611 ์ดํ๋ก ๋ฌด์ธ๊ฐ๊ฐ ๋ณ๊ฒฝ๋์๋์ง ํ์คํ์ง ์์ต๋๋ค.
๋ํ Rollup์ด ์ ์ผํ ํธ๋ฆฌ ์ ฐ์ด์ปค๋ ์๋๋ฉฐ webpack์ ํธ๋ฆฌ ์ ฐ์ดํน ์๊ณ ๋ฆฌ์ฆ์ด ๋กค์ ์ ์๊ณ ๋ฆฌ์ฆ๋ณด๋ค ๋์์ง๋ง ์ฌ์ฉ๋ฅ ์ ์๋ง๋ ๋กค์ ๋ณด๋ค ํจ์ฌ ๋์ ๊ฒ์ ๋๋ค(๋ ๋๊ตฌ ๋ชจ๋ ์ฐ์ํ ์์ ์ ์ํํ๋ฏ๋ก ๋๊ตฐ๊ฐ์ ๊ธฐ๋ถ์ ์ํ๊ฒ ํ๊ณ ์ถ์ง ์์ต๋๋ค) , ์ฌ์ค๋ง ์ธ๊ธ) ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ค๋ฉด (์ปค๋ฎค๋ํฐ๋ก์) ๋ ๋๊ตฌ๋ฅผ ๋์์ ๋์ธ ์ ์๋ค๋ฉด ์ธ์ ๋ ์ง ๊ทธ๋ ๊ฒ ํด์ผ ํฉ๋๋ค.
๋ชจ๋ ๊ฒ์ด ๋จ์ผ ํ๋ซ ๋ฒ๋ค๋ก ์ฌ์ ์ฒ๋ฆฌ๋๋ค๋ ์ ์ ๊ฐ์ํ ๋ ํธ๋ฆฌ ํ๋ค๊ธฐ๊ฐ React์ ๊ฒฝ์ฐ ๋ฌด์์ด๋ _do_ ํฉ๋๊น? React์ ๊ธฐ๋ณธ ๊ฐ์ ธ์ค๊ธฐ ์คํ์ผ์ด ๋ฌด์์ธ์ง ๊ถ๊ธํฉ๋๋ค. ๊ฐ์ธ์ ์ผ๋ก React.Component
, React.Children
์ ๊ฐ์ด ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ์ฒ๋ผ ์ฒ๋ฆฌํ๋ ๊ฒฝํฅ์ด ์์ง๋ง ๊ฐ๋ cloneElement
๋ช
๋ช
๋ ์์
์ ์ํํฉ๋๋ค.
@gaearon์ ์ด๋ฏธ ๋ค๋ฅธ ๊ณณ์์ ์ธ๊ธํ๋ฏ์ด ๋ฐ์ ์ ํฌ๊ธฐ ๊ฐ์ ์ ์ต์ํ๋ ๊ฒ์ผ๋ก ์์๋ฉ๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ์ด ์์ต๋๋ค.
React.Component
๋ฅผ ์ฐธ์กฐํ๋ ๋ ๋ค๋ฅธ ๋ณ์๊ฐ ํ์ํ์ง ์๊ณ ๋ชจ๋ ๊ณณ์์ ๊ณต์ ๋๋ ๋ณ์๋ง ์๋ค๋ ์ฌ์ค์ ์์ต๋๋ค(์ด๊ฒ์ด ์ผ๋ฐ์ ์ผ๋ก ๋กค์
์ด ์ํํ๋ ๋ฐฉ์์
๋๋ค). ๋ํ ์ด๊ฒ์ ๋ด๊ฐ ์ถ์ธกํ ๊ฒ์ผ ๋ฟ ์นํฉ์ ModuleConcatenationPlugin์ด ๋น ์ ธ๋๊ฐ ๊ฐ๋ฅ์ฑ์ ์ค์ผ ์ ์์ต๋๋ค.๋ด๋ณด๋ด๊ธฐ์ ์ข ๋ฅ์ ๊ดํด์๋ ๋ฌผ๋ก ๋ช ๋ช ๋ ๋ด๋ณด๋ด๊ธฐ๋ง ์ค์ ๋ก ์์ฌ์ด ํธ๋ฆฌ ํ๋ค๊ธฐ์ ์ด์ ์ ์ ๊ณตํฉ๋๋ค(GCC๋ฅผ ์ฌ์ฉํ์ง ์๋ ํ ๊ณต๊ฒฉ์ ์ธ ์์ง์๊ณผ ์ด์ด ์ข์ผ๋ฉด ์ต์ ๋กค์ ์์ ๋ ๋ง์ ์์ ์ ์ํํ ์ ์์) . ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ๋ ์ ๊ณตํ๋์ง์ ๋ํ ์ง๋ฌธ์ ๊ฒฐ์ ํ๊ธฐ ๋ ์ด๋ ต์ต๋๋ค.
๋ ๊ฐ์ง ๋ฒ์ ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ต์ผ๋ก ํธํ์ฑ์ ์ํด ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๊ฒ์ผ๋ก ์ ์ธ๋(๊ฒํฐ ๋ฑ์ ํตํด ๊ฒฝ๊ณ ๋ฅผ ํ์ํ ์๋ ์์) ๋ค์ ๋ฒ์ ์ ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ์ถ๊ฐํ ๋ค์ ์ดํ ๋ฒ์ ์์ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ํฅ๋ฏธ๋ก์ด ์ฌ๋ก์ด๊ธฐ๋ ํฉ๋๋ค: https://github.com/facebook/react/issues/11526. ํ ์คํธ๋ฅผ ์ํ ๋ชฝํคํจ์นญ์ ๋ค์ ์ ๋งคํ์ง๋ง, ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ๊นจ๋ ๊ฒ์ ๋ํด ์์ํ๊ณ ์ถ์ ๊ฒ์ ๋๋ค(๋๋ ์ด์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์).
์ด Twitter ๋ํ ๋ฅผ ํตํด ์ฌ๊ธฐ์ ์์ต๋๋ค. ์ ์๊ฒ๋ ์ด ์ง๋ฌธ์ ๋ํ ๋ช
ํํ ์ ๋ต์ด ์์ต๋๋ค. React์ ReactDOM์ ๋ช
๋ช
๋ ๋ด๋ณด๋ด๊ธฐ ๋ง ๋ด๋ณด๋ด์ผ ํฉ๋๋ค. ์ํ๋ฅผ ํฌํจํ๊ฑฐ๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ฑ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ถ๊ฐํ ์ ์๋ ๊ฐ์ฒด๊ฐ ์๋๋๋ค(#11526์๋ ๋ถ๊ตฌํ๊ณ ) โ ์กด์ฌํ๋ ์ ์ผํ ์ด์ ๋ Component
, createElement
'๋ฃ๋' ์ฅ์์
๋๋ค
(๊ทธ๊ฒ์ ๋ํ ๋ฒ๋ค๋ฌ์ ์ถ์ ๋ ์ฝ๊ฒ ๋ง๋ค์ด ์ฃผ์ง๋ง ๊ทธ๊ฒ์ ์ฌ๊ธฐ๋ ์ ๊ธฐ๋ ์๋๋๋ค.)
๋ฌผ๋ก ์ด๋ ํ์ฌ ๊ธฐ๋ณธ ๊ฐ์ ธ์ค๊ธฐ ๋ฐ ํธ๋์คํ์ผ์ ์ฌ์ฉํ๋ ์ฌ๋๋ค์๊ฒ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํ๋ ๋๋ค. @lukastaegert ๋ ์ ๊ทผ์๋ฅผ ์ฌ์ฉํ์ฌ ์ง์ ์ค๋จ ๊ฒฝ๊ณ ๋ฅผ ์ธ์ํ๋ ์ฌ๋ฐ๋ฅธ ์๊ฐ์ ๊ฐ์ง๊ณ ์์ ๊ฒ์ ๋๋ค. ๋ฒ์ 17์์ ์ ๊ฑฐ๋ ์ ์์ต๋๊น?
ํ์ง๋ง #11526์ ๋ํ ๊ธฐ์ฑํ ์ ์์ด ์์ต๋๋ค. ์๋ง๋ ESM์ ๋ฐฐ์กํ๋ ๊ฒ์ ์ด์จ๋ ๊ทธ๋ฐ ์ด์ ๋ก v17์ ๊ธฐ๋ค๋ ธ์ ๊ฒ์ ๋๋ค. ์ด ๊ฒฝ์ฐ ์ฌ์ฉ ์ค๋จ ๊ฒฝ๊ณ ์ ๋ํด ๊ฑฑ์ ํ ํ์๊ฐ ์์ต๋๋ค.
์ฌ๋๋ค์ด ์ ๋ง ์ข์ํ๊ฒ ๋์์ต๋๋ค.
import React, { Component } from 'react'
๊ทธ๋์ ํฌ๊ธฐํ๋๋ก ์ค๋ํ๋ ๊ฒ์ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
์ฝ๊ฐ ์ด์ํ๋๋ผ๋ ์ด๊ฒ์ด ๋๋ฌด ๋์์ง๋ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
import * as React from 'react';
import { Component } from 'react';
๋ช
ํํ ํ์๋ฉด JSX๊ฐ React.createElement()
๋ณํ๋๊ธฐ ๋๋ฌธ์ React
๊ฐ ๋ฒ์ ๋ด์ ์์ด์ผ ํฉ๋๋ค(์ด ๊ฒฝ์ฐ์๋ ๋ค์์คํ์ด์ค๋ก). JSX๋ฅผ ๊นจ๊ณ ๋์ ์ ์ญ jsx()
ํจ์์ ์์กดํ๋ค๊ณ ๋งํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ฐ์ ธ์ค๊ธฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
import {jsx, Component} from 'react';
๊ด์ฐฎ์ ์๋ ์์ง๋ง ํฐ ๋ณํ์
๋๋ค. ์ด๊ฒ์ ๋ํ React UMD ๋น๋๊ฐ ์ด์ window.jsx
๋ ์ค์ ํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค.
์ ๋ด๊ฐ ์ ์ํ๊ณ jsx
๋์ createElement
? ๊ธ์, createElement
๋ ์ด๋ฏธ ์ค๋ฒ๋ก๋( document.createElement
)๋์์ผ๋ฉฐ React.
ํ์ ์๋ก๋ ๊ด์ฐฎ์ง๋ง ์ ์ญ์์ ์ฃผ์ฅํ์ง ์๋ ๊ฒ์ ๋๋ฌด ๋ง์ต๋๋ค. Tbh ์ ๋ ์ด๋ฌํ ์ต์
์ค ํ๋์ ๋ํด ๊ทธ๋ค์ง ํฅ๋ถํ์ง ์์ผ๋ฉฐ ์ด๊ฒ์ด ์๋ง๋ ๊ฐ์ฅ ์ข์ ์ค๊ฐ ์ง์ ์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
import * as React from 'react';
import { Component } from 'react';
๊ธฐ๋ณธ์ ์ผ๋ก JSX๋ฅผ React.createElement
๋ก ๊ณ์ ๋ณํํฉ๋๋ค.
๊ณ ๋ฐฑ: ์ ๋ JSX๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๋ช
์์ ์ผ๋ก React
๋ฅผ ๊ฐ์ ธ์์ผ ํ๋ค๋ ์ฌ์ค์ด ํญ์ ์ฝ๊ฐ ์ด์ํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ๋น๋ก ์ค์ ๋ก ๊ทธ ์๋ณ์๋ฅผ ์ด๋์๋ ์ฌ์ฉํ๊ณ ์์ง๋ ์์ง๋ง์. ์๋ง๋ ๋ฏธ๋์๋ ํธ๋์คํ์ผ๋ฌ๊ฐ JSX๋ฅผ ๋ง๋ ๋ import * as React from 'react'
(Preact ๋ฑ์ ์ํด ๊ตฌ์ฑ ๊ฐ๋ฅ)๋ฅผ ์ฝ์
ํ ์ ์์ต๋๋ค(์์ง ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ)? ์ด๋ ๊ฒ ํ๋ฉด ๋ฉ๋๋ค๋ง...
import { Component } from 'react';
... ๋ค์์คํ์ด์ค ๊ฐ์ ธ์ค๊ธฐ๊ฐ ์๋์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
๋จผ ๋ฏธ๋์, ์๋ง๋. ์ง๊ธ์ ํธ๋์คํ์ผ๋ฌ๊ฐ ๋ค๋ฅธ ๋ชจ๋ ์์คํ (CommonJS ๋๋ ์ ์ญ)๊ณผ ์๋ํ๋์ง ํ์ธํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ ๊ตฌ์ฑ ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ๊ฒ๋ ์ฅ์ ๋ฌผ์ด๋ฉฐ ์ปค๋ฎค๋ํฐ๋ฅผ ๋์ฑ ๋ถ์ด์ํต๋๋ค.
@Rich-Harris๊ฐ ์ ์ํ ๊ฒ(jsx๋ฅผ ์ฌ์ฉํ ๋ ํน์ ๊ฐ์ ธ์ค๊ธฐ ์ฝ์
)์ ํธ๋์คํ์ผ๋ฌ ํ๋ฌ๊ทธ์ธ์ผ๋ก ์ฝ๊ฒ ์ํ๋ฉ๋๋ค. ์ปค๋ฎค๋ํฐ๋ babel-plugin-transform-react-jsx
๋ฅผ ์
๊ทธ๋ ์ด๋ํด์ผ ํฉ๋๋ค. ๋ฌผ๋ก ๊ธฐ์กด ์ค์ ๋ ํ์ผ์ import * as React from 'react';
๋ง ์ถ๊ฐํ๋ฉด ๊ณ์ ์๋ํฉ๋๋ค.
๋ฌผ๋ก ๋ค๋ฅธ ๋ชจ๋ ์์คํ ๋ ์๊ฐํด๋ณผ ํ์๋ ์์ง๋ง ํ๊ธฐ ์ด๋ ค์ด ๋ฌธ์ ๋ ์๋ ๊ฒ ๊ฐ๋ค. ์ผ๋์ ๋๊ณ ์๋ ํน์ ๋ฌธ์ ๊ฐ ์์ต๋๊น?
๋ฌผ๋ก ๋ค๋ฅธ ๋ชจ๋ ์์คํ ๋ ์๊ฐํด๋ณผ ํ์๋ ์์ง๋ง ํ๊ธฐ ์ด๋ ค์ด ๋ฌธ์ ๋ ์๋ ๊ฒ ๊ฐ๋ค. ์ผ๋์ ๋๊ณ ์๋ ํน์ ๋ฌธ์ ๊ฐ ์์ต๋๊น?
์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ๋ํ ๊ตฌ์ฒด์ ์ธ ์ ์์ ๋ฌด์์ ๋๊น? Babel JSX ํ๋ฌ๊ทธ์ธ์ ๊ธฐ๋ณธ๊ฐ์ ๋ฌด์์ ๋๊น?
์ฌ๋๋ค์ด ์ ๋ง ์ข์ํ๊ฒ ๋์์ต๋๋ค.
import React, { Component } from 'react'
์ด๋ค ์ฌ๋๋ค? ๋ด๊ฐ ์กฐ๋กฑํ ์ ์๋๋ก ๋์ค์ญ์์ค.
๋ง์ด ํ์ด์ ๐ ํ์คํ ๋ค๋ฅธ ๊ณณ์์๋ ๋ณธ ์ ์ด ์์ด์.
๊ธฐ๋ณธ๊ฐ์ ํ์ฌ React.createElement
์ด๋ฉฐ ๊ฑฐ์ ๋์ผํ๊ฒ ์ ์ง๋ฉ๋๋ค. ์ ์ผํ ๋ฌธ์ ๋ ํ์ฌ(๋๋ ์ด๋ฏธ ๋ฒ์์์ ์ฌ์ฉ ๊ฐ๋ฅ) ์ ์ญ์ผ๋ก ๊ฐ์ ํ๋ค๋ ๊ฒ์
๋๋ค.
es ๋ชจ๋์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋์ ์ํํ๋ ํ์ค ๋ฐฉ์(์์ง ๋ชจ๋ ์ฑํ๋์ง๋ ์์์ง๋ง)์ด๋ฏ๋ก ๋๋ค์๊ฐ ์ฌ์ฉํ๊ฑฐ๋ ์ฌ์ฉํด์ผ ํ๋ค๊ณ ๊ฐ์ ํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์
๋๋ค. ๋๋ค์๋ ์ด๋ฏธ ๋ค์ํ ๋น๋ ๋จ๊ณ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒ๋ค์ ์์ฑ ํฉ๋๋ค . React.createElement
๋ฅผ ๋ฒ์์ ์๋ ์ฝ์
ํ๋๋ก jsx ํ๋ฌ๊ทธ์ธ์ ๊ธฐ๋ณธ ๋์์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ํฉ๋ฆฌ์ ์ธ ์ผ์
๋๋ค. ์ฐ๋ฆฌ๋ babel@7 ์ด ๊ณง ์ ๊ณต๋ (-ish) ์ด๋ฌํ ๋ณ๊ฒฝ์ ์ํ ์๋ฒฝํ ์๊ฐ์ ์์ต๋๋ค. ์ต๊ทผ babel-helper-module-imports
์ถ๊ฐ๋ก ์ฌ๋ฐ๋ฅธ ์ ํ์ ๊ฐ์ ธ์ค๊ธฐ(es/cjs)๋ฅผ ํ์ผ์ ์ฝ์
ํ๋ ๊ฒ์ด ๊ทธ ์ด๋ ๋๋ณด๋ค ์ฌ์์ก์ต๋๋ค.
์ค๋๋ ์ ๋์(๋ฒ์์ ์๋ค๊ณ ๊ฐ์ )์ ๊ตฌ์ ํ๊ธฐ ์ํด ์ด ๊ตฌ์ฑ์ ๊ฐ๋ ๊ฒ์ ์์์ ์ฌ์ฉ์์๊ฒ ํ์ํ ๊ตฌ์ฑ์ ์ฌ์ํ ๋ณ๊ฒฝ๊ณผ ๋๋ค์์ ์ฌ์ฉ์์๊ฒ๋ ๊ฐ์ (ํ์คํ ํฐ ๊ฒ์ ์๋์ง๋ง ์ฌ์ ํ)์ฒ๋ผ ๋ณด์ ๋๋ค.
๋ ๋์ ๋๋ฌด ํ๋ค๊ธฐ๋ฅผ ์ํด ์ฌ๋๋ค์ด *๋ฅผ ๊ฐ์ ธ์ค๋๋ก ๊ถ์ฅํด์ผ ํฉ๋๊น?
@alexlamsl ๋๋ถ์ uglify-es
๋ ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค์์ export default
ํจ๋ํฐ๋ฅผ ์ ๊ฑฐํ์ต๋๋ค.
$ cat mod.js
export default {
foo: 1,
bar: 2,
square: (x) => x * x,
cube: (x) => x * x * x,
};
$ cat main.js
import mod from './mod.js'
console.log(mod.foo, mod.cube(mod.bar));
md5-d6d4ede42fc8d7f66e23b62d7795acb9
$ uglifyjs -V
uglify-es 3.2.1
```js
$ cat bundle.js | uglifyjs --toplevel -bc
var mod_foo = 1, mod_bar = 2, mod_cube = x => x * x * x;
console.log(mod_foo, mod_cube(mod_bar));
$ cat bundle.js | uglifyjs --toplevel -mc passes=3
console.log(1,8);
์์ฐ, ์๋กญ๋ค์ ๐ ์ง๊ธ uglify-es
๊ฐ ์์ ์ ์ธ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๋์? ๋๋ ๊ทธ๊ฒ์ด ์์ง ๊ฑฐ๊ธฐ์ ์์ง ์๋ค๊ณ ๋ช ๋ฌ ์ ์ ์ธ๊ธํ๋ ๊ฒ์ ๊ธฐ์ตํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๊ทธ๊ฒ์ ์๋ชป ๊ธฐ์ตํ ์ ์์ผ๋ฏ๋ก ํ์คํ์ง ์์ต๋๋ค.
์ด์จ๋ - ๋กค์
์ธ๊ณ์์๋ ๊ทธ๊ฒ ์ ๋ถ์ด๊ณ ํ๋ฅญํ์ง๋ง React
๊ฐ ๋๋ถ๋ถ ์ฑ์ ๋ฒ๋ค๋์ด ์๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฒ์ ํธ์ด์คํ
์ ์ํํ์ง ์๋ ๋๋ถ๋ถ webpack
๋ฅผ ์ฌ์ฉํ๋ค๋ ์ ์ ๊ณ ๋ คํ๋ฉด ์ฌ์ ํ ๊ทธ๋ ๊ฒ ๋งํ๊ณ ์ถ์ต๋๋ค. uglisy-es
+ rollup
์ด์ธ์ ๋ค๋ฅธ ๋๊ตฌ๊ฐ ๋ ์์ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์์ฑํ๋ ๋ฐ ๋์์ด ๋๋๋ก ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ๋ด๋ณด๋ด๋ ๊ฒ์ ํผํด์ผ ํฉ๋๋ค. ๋ํ ๋์๊ฒ๋ ์ด๊ฒ์ ํผํ๋ ๊ฒ์ด ์๋ฏธ์ ์ผ๋ก ๋ ์ข์ต๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ค์ ๋ก ํ๋ ์ผ์ ๋ค์์คํ์ด์ค๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด๋ฉฐ import * as Namespace from 'namespace'
์ฌ์ฉํ ๋ ๋ ์ ํํ๋ฉ๋๋ค.
uglify-es๋ ์ด์ ์์ ์ ์ธ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๊น?
JS ์ํ๊ณ์ ๋ค๋ฅธ ๋ฌด์๋ณด๋ค ์์ ์ ์ ๋๋ค. ๋งค์ฃผ 500K ์ด์์ ๋ค์ด๋ก๋.
๋กค์ ์ธ๊ณ์์๋ ๊ทธ๊ฒ ์ ๋ถ์ด๊ณ ํ๋ฅญํ์ง๋ง React๊ฐ ์ฃผ๋ก ์ฑ์ ๋ฒ๋ค๋์ด ์๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฒ์ ํธ์ด์คํ ์ ์ํํ์ง ์๋ ๋๋ถ๋ถ์ webpack์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ๋ฉด
์ด์จ๋ ์ต์
์
๋๋ค. ์ด์จ๋ Webpack ๊ธฐ๋ณธ๊ฐ์ ์ด์์ ์ด์ง ์์ต๋๋ค. ์์๋ค์ํผ ModuleConcatenationPlugin
๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ฌ๊ธฐ์ ๋ช ์ผํธ ์ถ๊ฐ:
import React from 'react'
๋๋ import * as React from 'react'
์ ๋ง ์ข์ํ์ง ์์ต๋๋ค. ๋ด ๋์ ์ด ๋์์ธ์ createElement
๋ถ๋ถ์ โโ์ฌ์ฉํ ์ ์๋๋ก ์ฌ์ฉ์๊ฐ ๋ชจ๋ React๋ฅผ ๊ฐ์ ธ์ค๋๋ก ๊ฐ์ ํ๋ค๋ ์ ์์ ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น์ ๋ถ๋ช
ํ ์๋ฐํ๊ณ ์์ต๋๋ค. ๋ถํ์ํ ์์ถ์ ๋ค์ ์ ๊ฑฐํ์ญ์์ค)๋ฐ๋ผ์ ํ๊ธฐ์ ์ธ ๊ฒฐ์ ์ ๋ด๋ฆด ์ ์๋ ์์ ์ ์๋ ๊ฒฝ์ฐ JSX๊ฐ ๋จ์ผ(์ ์ญ ๋๋ ๊ฐ์ ธ์จ) ๊ธฐ๋ฅ์ ์ข
์๋๋๋ก ์ด๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ createJSXElement()
๋ผ๊ณ ๋ถ๋ ์ ๊ฒ์
๋๋ค. ์ ์๊ฐ์๋ createElement()
๋ณด๋ค ๋ ์ ์ค๋ช
ํ๊ณ ๋ ์ด์ ์๋ฏธ๊ฐ ์๋ React ์ปจํ
์คํธ๊ฐ ํ์ํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋ ๋ฐ์ดํธ๊ฐ ์ค์ํ ์ธ์์์๋ jsx()
๋ ๊ด์ฐฎ์ ๊ฒ์
๋๋ค.
์ด๊ฒ์ ๋ํ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋์ผํ ๋ณํ์ ์ฌ์ฉํ๊ณ ๋ค๋ฅธ jsx
ํจ์๋ฅผ ์ ๊ณตํ์ฌ JSX๋ฅผ ์ง์ํ๋๋ก ์ ํํ ์ ์๋ ๋ฐฉ์์ผ๋ก React์์ JSX๋ฅผ ๋ง์ง๋ง์ผ๋ก ๋ถ๋ฆฌํฉ๋๋ค. ๋ฌผ๋ก ์ฌ๊ธฐ์์ ์ด๋ฌํ ๋ณํ์ ํตํด ์๋ง์ ๊ธฐ์กด ์์ฉ ํ๋ก๊ทธ๋จ์ ์๋ดํ๋ ๋ง์ ์ฑ
์์ด ์์ง๋ง ์ํคํ
์ฒ ๊ด์ ์์ ๋ณด๋ฉด React์ JSX๊ฐ ์งํฅํด์ผ ํ๋ ๋ถ๋ถ์ด ๋ฐ๋ก ์ฌ๊ธฐ์
๋๋ค. Babel์ ์ฌ์ฉํ์ฌ ๊ทธ๋ฌํ ๋ณํ์ ๋ฌด๊ฑฐ์ด ์์
์ ์ํํ๋ ๊ฒ์ ๋์๊ฒ ์ข์ ์์ด๋์ด์ฒ๋ผ ๋ค๋ฆฝ๋๋ค!
๊ฐ์ธ์ ์ผ๋ก babel ํ๋ฌ๊ทธ์ธ์ ๊ธฐ๋ณธ IMHO๊ฐ react
ํจํค์ง์์ ๊ฐ์ ธ์์ผ ํ๋ฏ๋ก jsx
๋์ฐ๋ฏธ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๋ ๋ฐ ๋ง์ ์ด์ ์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ์ค์ ๋์ฐ๋ฏธ์ ์ด๋ฆ์ ์ค์ ๋ก ๋ฌธ์ - ๋๋จธ์ง๋ ๊ตฌ์ฑํ ์ ์๋ ๋ฌธ์ ์
๋๋ค.
์ด๊ฒ์ ์๋ง๋ ์ฃผ์ ๋
ผ์์ ์ฝ๊ฐ ์ ํ ์ ์์ง๋ง ES ๋ชจ๋์ด dev/prod ๋ฒ๋ค์ ์กฐ๊ฑด๋ถ๋ก ๋ด๋ณด๋ด๊ธฐ ์ํด process.env.NODE_ENV
๋ฅผ ๊ฒ์ฌํ๋ ๋ฐ ์ผ๋ง๋ ์ ์๋ํ๋์ง ๊ถ๊ธํฉ๋๋ค. ์๋ฅผ ๋ค์ด,
์ฌ๊ธฐ์ ๋ถ๋ช ํ ๊ฒ์ ๋์ณค์ ์๋ ์์ง๋ง ์ด ํจํด์ ES ๋ชจ๋๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ์ ๋ณด๊ธฐ ์ํด ๊ณ ๊ตฐ๋ถํฌํ๊ณ ์์ต๋๊น?
@NMinhNguyen ES ๋ชจ๋์์๋ ์กฐ๊ฑด๋ถ ๋ด๋ณด๋ด๊ธฐ๊ฐ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
process.env.NODE_ENV
๊ฒ์ฌ๋ ๋ ์ธ๋ถํ๋(์ฝ๋) ์์ค์ผ ์ ์์ผ๋ฉฐ ์ ์ ํ ๊ฐ์ ๊ฐ์ง ๋ฒ๋ค๋ฌ๋ก ๊ต์ฒดํ ์ค๋น๊ฐ ๋์ด ์์ต๋๋ค.
@Andarist @milesj ์ ์์ฌ์ ํ์ธํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค :)
process.env.NODE_ENV
๊ฒ์ฌ๋ ๋ ์ธ๋ถํ๋(์ฝ๋) ์์ค์ผ ์ ์์ผ๋ฉฐ ์ ์ ํ ๊ฐ์ ๊ฐ์ง ๋ฒ๋ค๋ฌ๋ก ๊ต์ฒดํ ์ค๋น๊ฐ ๋์ด ์์ต๋๋ค.
React 16 ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ ์์ process.env.NODE_ENV
์ํ๊ฐ ์๋์ ์ผ๋ก ๋งจ ์๋ก ๋ฝํ๋ค๊ณ ์๊ฐํ์ต๋๋ค. ), Node.js์ ์ฑ๋ฅ์ ๋๊ธฐ ์ํด?
๋ ๋์ ์๋ฒ ์ธก ๋ ๋๋ง
React 16์๋ ์์ ํ ์ฌ์์ฑ๋ ์๋ฒ ๋ ๋๋ฌ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ์ ๋ง ๋น ๋ฅด๋ค์. ์คํธ๋ฆฌ๋ฐ์ ์ง์ํ๋ฏ๋ก ํด๋ผ์ด์ธํธ์ ๋ฐ์ดํธ ์ ์ก์ ๋ ๋น ๋ฅด๊ฒ ์์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ
process.env
๊ฒ์ฌ๋ฅผ ์ปดํ์ผํ๋ ์๋ก์ด ํจํค์ง ์ ๋ต ๋๋ถ์(๋ฏฟ๊ฑฐ๋ ๋ง๊ฑฐ๋, Node์์process.env
๋ฅผ ์ฝ๋ ๊ฒ์ ์ ๋ง ๋๋ฆฝ๋๋ค!), ๋ ์ด์ ์ข์ ์๋ฒ๋ฅผ ์ป๊ธฐ ์ํด React๋ฅผ ๋ฒ๋ค๋ก ๋ฌถ์ ํ์๊ฐ ์์ต๋๋ค. ๋ ๋๋ง ์ฑ๋ฅ.
๋ง์ฐฌ๊ฐ์ง๋ก, ๋ด๊ฐ ํ๋๊ฐ ์ฌ์ฉํ ์์๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ฒ ์ด์ module
ํ๋ package.json
ES๋ฅผ ์ ์งํ๋ ํ๋ฉด ๋ฒ๋ค ๋ฐ ์ํฅ์์ฃผ์ง ์์ผ๋ฉด ์ ESM์ ๋ํ dev์ / ์๊ทน ์ฌ์ด์ ์ฐจ๋ณํ๋ฅผ Node.js๋ฅผ ๋ฐํ ํ
์๋ฅผ ๋ค์ด package.json์ ๋ชจ๋ ํ๋๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ๊ณ ES ๋ฒ๋ค์ ํ๋ซํ๊ฒ ์ ์งํ๊ณ Node.js ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น์ง ์์ผ๋ฉด์ ESM์ฉ dev/prod๋ฅผ ๊ตฌ๋ณํ ์ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
ํ์ฌ๋ก์๋ ์ด๋ฅผ ์ํํ๋ ํ์ค ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ํ์คํ ๋จ์ ์ ๋๋ค. OTOH ๊ทธ๊ฒ์ ๋จ์ง ๋๊ตฌ์ ๋ฌธ์ ์ผ ๋ฟ์ด๋ฉฐ, ์ค๋๋ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ ๋จ๊ณ์์ ์ด๊ฒ์ ์ปดํ์ผํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค(๊ทธ๋ฆฌ๊ณ ์คํ๋ ค ์ฝ์ต๋๋ค). ํจํค์ง๊ฐ dev/prod ๋น๋๋ฅผ ๋ ธ์ถํ ์ ์๊ณ ๋ฆฌ์กธ๋ฒ๊ฐ ์ด๋ ๊ฒ์ ๊ณ ๋ฅผ์ง ์๋ฉด ๋ ์ฌ์ธ ๊ฒ์ ๋๋ค.
ํ๊ธ์ ์ํด:
import Component from 'react/Component'
class MyButton extends Component{
constructor(){
this.state = {}
}
render() {
return <button> Button <Button>
}
}
์ฌ๊ธฐ์ ๋ณํ์ super.createElement()๋ฅผ ์ฌ์ฉํ์ฌ jsx๋ก ๋ณํํ๊ฑฐ๋ ์ ์ Component.createElement()๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ํ ๋น์ ์ฅ ๊ตฌ์ฑ ์์์ ๊ฒฝ์ฐ:
import jsx from 'react/jsx'
const MyButton = () => jsx`<button> Button <Button>`;
ํ๊ทธ๊ฐ ์ง์ ๋ ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด์ ์ฌ์ฉํ ์ ์์ต๋๊น?
๋ ธ๋๊ฐ ์ด PR์ ์๋ฝํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. https://github.com/nodejs/node/pull/18392
@Rich-Harris์ ์๊ฒฌ์ ๋์ํฉ๋๋ค.
์ค์ ๋ก ๊ตฌ์ฒด์ ์ผ๋ก ์ธ๊ธ๋์ง ์์ ์ด ์ค๋ ๋์ ๋ํ ์๊ฒฌ์ ๋จ๊ธฐ๋ ๊ฒ์ ๋๋ค.
๋๋ ๋ฒ๋ค๋ฌ๋ฅผ ์ ํ ์ฌ์ฉํ์ง ์๊ณ ๋ธ๋ผ์ฐ์ ( <script type="module" src="...">
)๋ฅผ ํตํด ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด ๋ฐ์ ๋ฐ ๋ค์ํ ๊ตฌ์ฑ ์์๋ฅผ ๊ฐ์ ธ์ค๋ ค๋ ์ํฉ์ ์์ต๋๋ค. ์ฆ,
import React from โhttps://unpkg.com/[email protected]/umd/react.development.jsโ;
import ReactDOM from โhttps://unpkg.com/[email protected]/umd/react-dom.development.jsโ;
ReactDOM.render(
React.createElement(...),
document.getElementById('root')
);
๋ด๊ฐ ๋งํ ์ ์๋ ๋ฐ์ ๋ฐ๋ฅด๋ฉด ์ด๊ฒ์ ์ค๋๋ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๋์ CDN์ <script>
ํ๊ทธ๋ฅผ ํตํด react์ UMD ๋ฒ์ ์ ํฌํจํด์ผ ํ๋ฉฐ ๋ค์๊ณผ ๊ฐ์ด ๋ด๊ฐ ์์ฑํ๋ <script type="module">
๋ชจ๋์ ์ฐฝ์ ์๋ค๊ณ ๊ฐ์ ํด์ผ ํฉ๋๋ค.
// myPage.html
<div id="myComponentRoot"></div>
<script src="https://unpkg.com/[email protected]/umd/react.development.js"></script>
<script type="module" src="/assets/scripts/components/MyComponent.js"></script>
// MyComponent.js
import AnotherComponent from "/assets/scripts/components/AnotherComponent.js";
window.ReactDOM.render(
window.React.createElement(AnotherComponent),
document.getElementById('root')
);
// AnotherComponent.js
export default class AnotherComponent extends window.React.Component {...}
CDN์์ ๋ฐ์ ๊ฐ์ ธ์ค๊ธฐ๊ฐ ์์ผ๋ฉด ํ์์ ์ผ ๊ฒ์ ๋๋ค. ํ์ผ ๋ถ๋ฆฌ๋ฅผ ์ ์งํ๋ฉด์ ๋ธ๋ผ์ฐ์ ์์ ํ๋กํ ํ์ดํ์ ๋งค์ฐ ๋น ๋ฅด๊ณ ์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ๋ฒ๋ค๋ฌ ์์ด React๋ฅผ ์ฌ์ฉํ ๋ ๋ด๊ฐ ํญ์ ํฌ์ํ๋ค๊ณ ๋๊ผ๋ ํ ๊ฐ์ง๋ ๊ตฌ์ฑ ์์(๋ฐ ๊ธฐํ ์ ํธ๋ฆฌํฐ ๊ธฐ๋ฅ ๋ฑ)๋ฅผ ํ์ผ๋ก ๋ถ๋ฆฌํ๋ ๊ธฐ๋ฅ์ด์์ต๋๋ค. ํ์ง๋ง ์ด์ ๊ธฐ๋ณธ ES ๋ชจ๋์ ๋ํ ๋ธ๋ผ์ฐ์ ์ง์์ ํตํด React ๊ตฌ์ฑ ์์๋ฅผ ๋ณ๋์ ํ์ผ์ ์์ฑํ๊ณ ์์ฑ๋ ๋๋ก ๋ธ๋ผ์ฐ์ ์์ ์ฌ์ฉํ๋๋ก ํ ์ ์์ต๋๋ค. JSX๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ์ง๋ง JSX๋ฅผ ์ฌ์ฉํ๋๋ผ๋ ๋น๋ ๋จ๊ณ๋ฅผ ํตํด ๋ชจ๋ ํ์ผ์ ์ ์๋ฆฌ์ ๋ ์ ์๊ณ ๋ชจ๋ ๊ฐ์ ธ์ค๊ธฐ๊ฐ ๋ธ๋ผ์ฐ์ ์์ ๊ณ์ ์๋ํฉ๋๋ค.
// /assets/scripts/entry.js
import React from โhttps://unpkg.com/[email protected]/umd/react.development.jsโ;
import React from โhttps://unpkg.com/[email protected]/umd/react-dom.development.jsโ;
import RelatedPosts from "/assets/scripts/components/RelatedPosts.js";
ReactDOM.render(
React.createElement(RelatedPosts),
document.getElementById('root')
);
// /assets/scripts/components/RelatedPosts.js
import React from โhttps://unpkg.com/[email protected]/umd/react.development.jsโ;
import ListItem from "/assets/scripts/components/ListItem.js"
export default class MyComponent extends React.Component {
componentDidMount() { /* fetch some data */ }
render() {
return React.createElement(
'ul',
{},
this.state.items.map(item => React.createElement(ListItem, { item: item })
)
}
}
// /assets/scripts/components/ListItem.js
import React from โhttps://unpkg.com/[email protected]/umd/react.development.jsโ;
export default function ListItem(props) {
return React.createElement('li', null, ...)
}
์ด๋ค ์ฌ๋๋ค์ CDN URL์ ํญ์ ์ ๋ ฅํ๋ ๊ฒ์ด ๋ฌธ์ (์ผ๋ถ ์ฌ๋๋ค์ ํด๊ฒฐํ๋ ค๊ณ ํ๋ ๋ฌธ์ )๋ผ๊ณ ์ฃผ์ฅํ์ง๋ง ์ ์๊ฒ๋ ๊ทธ๋งํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ํด๋น URL์ ๋ณ๊ฒฝ/์ ๋ฐ์ดํธ๋ ๊ฐ๋จํ ์ฐพ๊ธฐ/๋ฐ๊พธ๊ธฐ์ ๋๋ค. ๋ด ์ฌ์ฉ ์ฌ๋ก์ ๊ฒฝ์ฐ ๋ฒ๋ค๋ฌ๋ฅผ ์ค์ ํ๋ ์๊ณ ๋ฅผ ๋ฅ๊ฐํฉ๋๋ค.
React๊ฐ ์ด์ ๊ฐ์ ๊ฒ์ ์ง์ํ๋ค๋ฉด ๋๊ตฌ๊ฐ ํ์ํ์ง ์์์ ๊ฒ์ ๋๋ค. ์ ๋ ๊ทธ๋ฅ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋๋ ์ต์ ๋ธ๋ผ์ฐ์ ๋ฅผ ๊ฐ์ ํ๊ณ ํ์ด์ง์์ ์ ์ง์ ์ธ ํฅ์์ผ๋ก ๋ฐ์ํ๋ ๋ช ๊ฐ์ง ๊ฐ์ธ ํ๋ก์ ํธ์์ ์ด์ ๊ฐ์ ์ฝ๋๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ํ์์ ์ผ๋ก ๋ง๋๋ ๊ฒ์ 12๊ฐ์ ๋ง์ ์ฝ๋ ๋ฒ ์ด์ค๋ก ๋์์์ ๋ ๋ง์ ๋๊ตฌ API๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ NPM์ ํจํค์ง ๊ด๋ฆฌ์๋ก ์ฌ์ฉํ ํ์๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ ๋ ๋ธ๋ผ์ฐ์ ์์ API๋ฅผ ์ฌ์ฉํ๊ณ ์์ ๋ฟ์ ๋๋ค. ๋ค๋ฅธ ๊ฒ์ ์์ต๋๋ค.
FWIW๋ : / ๋ฐ์์ฉ ํ ๋์ด ๊ฐ์ ์ง์์ผ๋ก ๋ฐฐ๋ฅผ ์๋ ๊ฒฝ์ฐ, ๋น์ ๋ฐ์ ํ์ฉ์ ํตํด ๊ฐ ๊ตฌ์ฑ ์์ ๋ก์ง์ ๋ถ๋ฆฌํ์ฌ ๊ทธ ๊ตฌ์ฑ ๋ชจ๋ธ ์ ์๋ค๋ ๊ฐ๋ฅด์นจ, ๋น์ ์ด ๋ฌธ์์์ ๋ค์๊ณผ ๊ฐ์ด ๋ฐ์์ฉ ์ฌ์ฉํ ์์๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ ๋งค์ฐ ๋์์ด ๋ ์ ์๋ค๊ณ ์๊ฐ์ ์์ ์ ํ์ผ์ ๋ง๋ค๊ณ ์ด๋ฅผ ์ํํ๊ธฐ ์ํด ๋ฒ๋ค๋ฌ๊ฐ ํ์ํ์ง ์์ต๋๋ค. ๋ค์ดํฐ๋ธ <script type="module">
๋ฅผ ์ฌ์ฉํ๊ณ CDN(๋๋ ์์ฒด ๋ก์ปฌ ๋ณต์ฌ๋ณธ)์์ React๋ฅผ ๊ฐ์ ธ์ค๋ฉด ํด์ ๋ฉ๋๋ค!โ
์ด์ ๋ชจ๋ฐ์ผ ๋ฒ์ ์ ํฌํจํ ๋ชจ๋ ์ต์ ๋ธ๋ผ์ฐ์ ๊ฐ ESM์ ์ง์ํฉ๋๋ค. ESM์ ๋ ์ด์ ๋ฏธ๋์ ๋ชจ๋ ์์คํ ์ด ์๋๋ผ ํ์ฌ์ ์ฌ์ค์์ ํ์ค์ ๋๋ค.
ํ์คํ๋ ๋ชจ๋์ ์ ๊ณตํ์ง ์๋ ๊ฒ์ ํนํ ์ฌ์ค์์ ํ์ค ์น ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฒฝ์ฐ ์ค์ํ ๋ฌธ์ ์ ๋๋ค.
import * as React from 'react';
import * as ReactDOM from 'react-dom';
์ด๊ฒ์ React ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ์ฉํ๋ ์ผ๋ฐ์ ์ธ ์ฝ๋์ด๋ฉฐ ์ค์ ๋ก ๊ฐ์ ธ์ฌ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ ๋์ ํ์ฌ ํธ๋์คํ์ผ๋ฌ์ ๋ฒ๋ค๋ฌ๊ฐ ๊ฐ์ ธ์ค๊ธฐ ํ๋ก์ธ์ค๋ฅผ ์๋ฎฌ๋ ์ดํธํฉ๋๋ค.
์ด์จ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๊ธฐ๋ณธ ESM์ ์ง์ํ์ง ์์๊ธฐ ๋๋ฌธ์ ์ค์ ESM์ ์ ๊ณตํ์ง ์๋ ๊ฒ์ด ์ฝ๊ฐ ์ ๋นํ๋์์ง๋ง ๋ถ๋ช
ํ ์๊ฐ์ด ์ง๋ฌ๊ณ ์ด์ import
์ผ๋ฐ์ ์ธ ์ํ ์ฝ๋์ ์ง์ ๋ ๋๋ก ESM์ ์ ๊ณตํ ๋์
๋๋ค.
@TrySound ๊ธฐ์ฌํด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค.
ESM ๋น๋๋ฅผ ๊ฐ์ ธ์ ํ
์คํธํ ์ ์๋ ๊ณณ์ด ์์ต๋๊น?
react-is ํจํค์ง์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
@TrySound
์ข์, https://github.com/TrySound/react/tree/react-is-esm ์ง์ ์ ์ฐพ์๊ณ ๊ตฌ์ถํ์ผ๋ฉฐ ์ด์ ๋น์ ์ด ์๋ฏธํ๋ ๋ฐ๋ฅผ ์๋๋ค. react-dom
๋ ๊ธฐ๋๋ฉ๋๋ค.
๋๋ React ์ปค๋ฎค๋ํฐ์์ ์ด ๋ฌธ์ ์ ๋ํด ํ๋์ ์ถฉ๋ถํ ๋
ผ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
https://discuss.reactjs.org/t/es6-import-as-react-vs-import-react/360/
๊ณต์ ES6 ๋ชจ๋ ์ฌ์์ ๊ฒฐ์ ํ๊ณ ๊ณง ๊ฒ์ํ์ญ์์ค.
@kenokabe ๊ฐ๋ ์ค์ ๋๋ค. ์ฐ๋ฆฌ๋ฅผ ๊ฐ์ํ์ง ๋ง์ญ์์ค. ๊ทธ๋ ๊ฒ ์ฌ์ด ์ผ์ด ์๋๋๋ค.
ํ์ฌ ๊ณํ์ ๋ช ๋ช ๋ ๋ด๋ณด๋ด๊ธฐ๋ง ์๋ ๋ชจ๋ ํจํค์ง๋ฅผ ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๊ฒ์ ๋๋ค. ์ด ๋ณ๊ฒฝ ์ฌํญ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ๋์ ์ํฅ์ ๋ฏธ์น์ง ์์ผ๋ฉฐ ๋ฌธ์์์ ๋ช ๋ช ๋ ๋ด๋ณด๋ด๊ธฐ๋ ์ฌ์ฉํ๋ฏ๋ก ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ๋์ ๋์ด์๋ ์ ๋ฉ๋๋ค.
๋ค๋ฅธ ํจํค์ง์ ๊ฒฝ์ฐ ๋ค์ํ ๋๊ตฌ์ ๋ค๋ฅด๊ฒ ์๋ํ๋ ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ์ ๋ช ๋ช ๋ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ๋ชจ๋ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
@TrySound ์ฃ์กํฉ๋๋ค.
์ด ์ฃผ์ ์ ํค๋ ๋ฉ์
์ด
๊ฐ ํจํค์ง์์ ์ต์์ ES ๋ด๋ณด๋ด๊ธฐ๊ฐ ์ด๋ป๊ฒ ๋ณด์ผ์ง ์ค์ ๋ก ๊ฒฐ์ ํ์ง ์์๊ธฐ ๋๋ฌธ์ ์ด ์์ ์ ์ฝ๊ฒ ์ํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, react์๋ ์ด๋ฆ์ด ์ง์ ๋ ๋ด๋ณด๋ด๊ธฐ๊ฐ ๋ง์ด ์์ง๋ง React๋ผ๋ ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ๋ ์์ต๋๊น? ๋ ๋์ ๋๋ฌด ํ๋ค๊ธฐ๋ฅผ ์ํด ์ฌ๋๋ค์ด *๋ฅผ ๊ฐ์ ธ์ค๋๋ก ๊ถ์ฅํด์ผ ํฉ๋๊น?
๊ทธ๋ฆฌ๊ณ , ์ธ๊ธ๋ ๋ ์ ์ผ๋ง ์ ์ด๊ณ , React ์ปค๋ฎค๋ํฐ์์ ๋ ผ์๋ ๊ฒ์ผ๋ก ์๊ฐํ๊ธฐ ๋๋ฌธ์ ๊ฒฐ์ ์ด ๋ช ํํด์ผ ํ๋ค๊ณ ์ ์ํ๊ณ ์ถ์์ต๋๋ค. ๊ฐ์ฌ ํด์!
์ด๊ฒ์ ๋ํ ์ ๋ฐ์ดํธ๋ฅผ ์ํ์ญ๋๊น...
์ ๋ ์ฐ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฒ๋ค๋งํ๊ธฐ ์ํด webpack v4๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋ฐ๋ฉด ์ IDE ์ธํ
๋ฆฌ์ผ์ค(WebStorm)์์๋ import * as React from 'react';
๋ฅผ ์ฌ์ฉํ๋ผ๊ณ ์ ์ํ๊ณ ๋๋ฃ๋ ์ฝ๋ ๊ฒํ ์์ import React from 'react';
๋ฅผ ๋ณ๊ฒฝํ๋๋ก ์์ฒญํฉ๋๋ค. ๋ ๋ค ์ ์๋ํ๋ฏ๋ก ๊ทธ๊ฐ ๋ง๋ ์ ๋๋ ๋ง์ ํ๊ณ ์๋ค๊ณ ์๊ฐํ์ง๋ง ๊ทธ๋ฅผ ๊ธฐ์๊ฒ ํ๊ธฐ ์ํด ์ด์จ๋ ๋ณ๊ฒฝํ๊ณ ์์ต๋๋ค. ์ด ์ค๋ ๋๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ์ด๊ธฐ๋ ํฉ๋๋ค.
๊ถ๊ธํด์ ์ต์ข ๋น๋ ํฌ๊ธฐ์ ์ฐจ์ด์ ์ ๋น๊ตํฉ๋๋ค(React 16.8.1 ์ฌ์ฉ).
import * as React from 'react';
: 6,618,723๋ฐ์ดํธ
import React from 'react';
: 6,619,077๋ฐ์ดํธ
๊ทธ๋์ ๋ถ๋ช
ํ ์ฝ๊ฐ์ ์ฐจ์ด๊ฐ ์์์ง๋ง ๋ฏธ๋ฏธํ์ต๋๋ค. (์ฐธ๊ณ . ๋๋ propTypes
์ ๋์ผํ๊ฒ ํ์ต๋๋ค)
์ด ์ค๋ ๋์ ๋ํ ๋ด ์ดํด๊ฐ ์ ํํ๋ค๋ฉด import * as React from 'react';
๋ฅผ ๊ฐ๋ ๊ฒ์ด ์ ๋ฆฌํ ๊ฒ์
๋๋ค. ๋ง์ต๋๊น? (1) ์, ์ฝ๊ฐ์ ํฌ๊ธฐ๋ฅผ ์ ์ฝํ๊ธฐ ๋๋ฌธ์
๋๋ค. (2) ESM์ ํ์คํ๋ ๋ฐฉ์์ด๋ฏ๋ก ๋ ์ด์ CJS๊ฐ ๋จ์ง ์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ค๋ ์ด๊ฒ์ ๋ณ๊ฒฝํ๊ณ ๋ด IDE์ ๋ง์ถ๊ณ ์ถ์ต๋๋ค.
@leoyli ์ฅ๊ธฐ์ ์ผ๋ก ๊ทธ๋ ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋จผ์ ๊ธฐ์กด ์ฝ๋๋ฅผ ์์์ํค์ง ์๋๋ก ๋ช ๋ช ๋ ๋ด๋ณด๋ด๊ธฐ์ ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ๊ฐ ๋ ๋ค ์์ ๊ฒ์ ๋๋ค.
๋๋ ๋ด ํ๋ก์ ํธ์์ ๋ ์ด์ ๋ฒ๋ค๋ฌ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ฌ์ ํ ๋ฐ์์ ์ฌ์ฉํ๊ธฐ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์์ ์ง์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค(Vue, Hyperapp ๋ฑ๊ณผ ๊ฐ์ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํ ์ ์๋ ๊ฒ์ฒ๋ผ unpkg.com์์ ์ง์ ). . ์ด๊ฒ์ ๋ด๊ฐ ์๊ฐํด ๋ธ ๊ฒ์ ๋๋ค. ๋ฉ์ง ๊ฒ์ ์๋๋ฉฐ ์์ผ๋ก ํธ์ง ํ umd์ ๋๋ค.
https://github.com/lukejacksonn/es-react
React
๋ฐReactDOM
์ ์ต์ ๋ฒ์ ์ ๋ ธ์ถํ๋ ES6 ๋ชจ๋
README์ ์ค๋ช
๋ ๋๋ก ์ด๊ฒ์ ๋๋ถ๋ถ POC์ด์ง๋ง ์ด ๋น๋๊ฐ ์ฐฉ๋ฅํ ๋๊น์ง ๊ธฐ๋ค๋ฆด ์ ์๋ ์ฌ๋๋ค์ ์ํด ํํฌ, ์์คํ์ค, ๊ฒ์ผ๋ฆ ๋ฑ์ ํฌํจํ๊ณ ๋ค์์ ์ํํ์ฌ ์์๋๋ก ์๋ํ๋ 16.8.3
๋น๋์
๋๋ค.
import { React, ReactDOM } from 'https://unpkg.com/es-react'
์ด ์ค๋ ๋์ ์ผ๋ถ๋ ์ ์ฉํ ๊ฒ์ ๋๋ค. ๊ฐ์ธ์ ์ผ๋ก ์ ๋ ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ๋น๋ ๋จ๊ณ๊ฐ ์๋ ๋ฐ์ ์คํํฐ ํ๋ก์ ํธ ๋ฅผ ๋ง๋ค์์ต๋๋ค. ๋ํ ์์ง ์งํ์ค์ธ ์์ ์ ๋๋ค.
@lukejacksonn ์ฐ๋ฆฌ๋ ํ๋ก๋์ ์์๋ ์ด๋ฌํ ์๋ฃจ์ ์ ์ฌ์ฉํ๊ณ ์์ง๋ง ํ์ฌ ํ๋ก์ ํธ์์ UMD ๋ฒ์ ์ React ๋ฐ ReactDOM์ ๋ํ ๋ณํ๊ธฐ ์คํฌ๋ฆฝํธ๋ผ๋ ์ ์์ ์ ๊ทผ ๋ฐฉ์์ด ๋ค๋ฆ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ํ์ผ์ ๊ฐ๋ณ์ ์ผ๋ก ์ถ๋ ฅํ๋ฏ๋ก ๋๋ถ๋ถ์ ์ฝ๋์ ๋ํด ๊ต์ฒด์ฉ ๋๋กญ์ธ์ด์ด์ผ ํฉ๋๋ค. https://github.com/wearespindle/react-ecmascript์ ๊ด์ฌ์ด ์๊ณ unpkg https://unpkg.com/react-ecmascript/ ์์ ๋ก๋ํ ์๋
@ PM5544 ์ค ์์ฐ.. ์ด๊ฒ์ ๋ด ๊ฒ๋ณด๋ค ํจ์ฌ ํฌ๊ด์ ์ธ ์๋ฃจ์ ์ ๋๋ค! ์ํ์ด ๐ฏ
๋ฉ์ง ๋ฌผ๊ฑด @ PM5544. ์ธ์ ๊ฐ ๊ทธ๊ฒ์ ๋ํด ๋ ๋ฃ๊ณ ์ถ์ต๋๋ค. Xebia์ ๋ค์ ๊ฒ์คํธ๋ก ์ถ์ฐํ ๊น์?
์ ๋ ์ต๊ทผ์ UNPKG๋ฅผ ์ง์ํ๋ ์คํ ์์ค ํจํค์ง๋ฅผ ๋ฌถ๊ธฐ ์ํด ํฉ ์ ์ฑํํ์ต๋๋ค.
๋ฒ๋ค๋ฌ๋ฅผ ์ฌ์ฉํ๋ ๋์ UNPKG์์ ์ง์ ์ข
์์ฑ์ ๋ก๋ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ข์ ๊ธฐ์ฌ๋ฅผ ์๋ ์ฌ๋์ด ์์ต๋๊น?
์ ๋ ํ์ฌ ํ๋๋ฅผ ์์ฑ ์ค์ด๋ฉฐ 6์์๋ React ๋ ธ๋ฅด์จ์ด์์ ๊ฐ์ฐ์ผ๋ก ์ ๊ณตํ ์์ ์ ๋๋ค!
@TrySound 2์ ์ดํ์ ์ด์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์์ต๋๊น? ์ด ๋ฌธ์ ๋ฅผ ์ฎ๊ธฐ๊ธฐ ์ํด ๋จ์ ๊ฒ์ ๋ฌด์์ด๋ฉฐ ์ผ๋ถ ์ฝ๋ฉ ์์ ์ผ๋ก ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ์ฐธ์ฌํ ์ ์์ต๋๊น? ์ ๋ ์ด๋ฏธ CA์ ์๋ช ํ์ผ๋ฉฐ ์ค๋ ์์ ํ ์๊ฐ์ด ์์ต๋๋ค.
์ด๊ฒ์ ๋จผ์ ๋ณํฉํด์ผ ํฉ๋๋ค https://github.com/facebook/react/pull/15037
@TrySound ์๊ฒ ์ต๋๋ค. ํด๋น ์ค๋ ๋์ ๋ํ ์ง์ ์ ์์ ์ ๋ฌํ์ต๋๋ค.
๊ธฐ๋ณธ React ๋ด๋ณด๋ด๊ธฐ๋ฅผ ์ฌ์ฉํ ๋ ๋ค์ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
// react/index.js
import * as React from "./react";
export { React as default }
export * from "./react";
// react/react.js
export function createElement() {}
...
์ด๊ฒ์ ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ๊ฐ ์นํฉ 5 ๋ฐ ๋กค์ ์์ ์ด๋ฌํ ๊ตฌ์ฑ์ ๋ํด ํธ๋ฆฌ ํ๋ค๋ฆผ์ ํ์ฉํ๋ ๋ค์์คํ์ด์ค ๊ฐ์ฒด๋ผ๋ ๊ฒ์ ์ ์ ์ผ๋ก ๋ถ์ํ ์ ์๊ฒ ํฉ๋๋ค.
import React from "react";
React.createElement(); // <- only `createElement` export is used
๋๋ 1.5 ๋ ๋์ ๋กค์ gitter chat์ ์์๊ณ ์ด๋ฌํ ์ข ๋ฅ์ ๋ฌธ์ ๋ 2 ์ฃผ ์ ๋๋ง๋ค ๋ํ๋ฉ๋๋ค ...
BTW, @lukejacksonn ์ es-react ํฌํฌ์์ ์์ฒญ๋ ์ผ์ ํ์ผ๋ฉฐ ๊ฐ๋ ฅํ ์ถ์ฒํ ์ ์์ต๋๋ค.
BTW, @lukejacksonn ์ es-react ํฌํฌ์์ ์์ฒญ๋ ์ผ์ ํ์ผ๋ฉฐ ๊ฐ๋ ฅํ ์ถ์ฒํ ์ ์์ต๋๋ค.
๊ณต์ FB ํ์ด ์ ์ด๊ฒ์ ๋ํด ์๋ฌด๊ฒ๋ํ์ง ์๋์ง ๊ถ๊ธํฉ๋๋ค.
๋๋ ๋ํ ์ด๊ฒ์ด ์์ผ๋ก ๋์๊ฐ๋ ๋ฐ ์ฝ๊ฐ์ ์๋ ฅ์ ๊ฐํ๊ธฐ๋ฅผ ๋ฐ ๋๊ณ @lukejacksonn ์์ ๋
์ด๊ฒ๋ ์ฐธ์ผ๋ก ๋ฐ๋๋ค. ์ฌ์ค ์ ๋ ํจํค์ง๋ฅผ ๋ง๋๋ ๊ณผ์ ์์ react ํ์ ์ง์์ ๊ฑฐ์ ๋ฐ์ง ๋ชปํ์ต๋๋ค(@threepointone์ ๊ฒฉ๋ ค์ ๋ง ์ธ์). ์ต๊ทผ์ ์ฌ๊ธฐ Formidable์ ๋๋ฃ๊ฐ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ํจํค์ง๋ฅผ ๋น๋ํ๋ ๋ฐ ๋์์ ์ฃผ์์ต๋๋ค. ์ด๋ ์๋ก์ด ๋ฒ์ ์ react๊ฐ ๋ฆด๋ฆฌ์ค๋ ๋๋ง๋ค ์๋์ผ๋ก ์ํํ๋ ๊ฒ๋ณด๋ค ๊ฐ์ ๋์์ง๋ง ๋คํธ์ํฌ ํญ์์ ํจ์ฌ ๋ ๊นจ๋ํ ์ถ๋ ฅ์ ๊ฐ์ ธ์ค๋ฏ๋ก ๊ทธ๋ ๊ฒ ๋ ์ง ํ์ ํ ์ ์์ต๋๋ค. ์์ง ์ด๋๋ก ์์ด. ์ฐ๋ฆฌ๋ ๋ณด๊ฒ ๋ ๊ฒ์ด๋ค!
์ด์ ๊ฑฐ์ 2020๋ ์ธ๋ฐ ๊ณต์ FB ํ์์ ์ ๋ฐ์ดํธ๊ฐ ์๋์ง ์๊ณ ์ถ์ต๋๋ค. React v17์์ ์ด์ ๊ด๋ จ๋ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ต๋๊น?
์
๋ฐ์ดํธ๋ ES ๋ชจ๋ React NOW๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ด๋ฏธ v16.13.x์ ์๋ @pica/react
๋ฅผ ์๋ํ์ญ์์ค.
https://www.npmjs.com/package/@pika/react
https://www.npmjs.com/package/@pika/react -dom
https://github.com/pikapkg/react
๋จผ ๋ฏธ๋์, ์๋ง๋.
์ข์, ์ด๋ฏธ ๋ฏธ๋์. ์ง๊ธ์ ๊ฐ๊น์ด ๋ฏธ๋์ธ๊ฐ์?
@gaearon ๋ด๋ณด๋ด๊ธฐ(๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ ๋ ๋ช ๋ช ๋ ๋ด๋ณด๋ด๊ธฐ)๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํ๊ธฐ ์ํ ์ฐจ๋จ๊ธฐ๋ ๋ฌด์์ ๋๊น? ์ด ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ๋ฐ ์ปค๋ฎค๋ํฐ์์ ๋์์ ์ค ์ ์๋ ๊ฒ์ด ์์ต๋๊น?
๋ถ๋ช ํ ๊ทธ ๊ฒฐ์ ์ ์ด๋ฏธ ์ผ๋ง ์ ์ ๋ด๋ ค์ง ๊ฒ ๊ฐ์ต๋๋ค: #18102. ์ด ๋ฌธ์ ๋ ์ง๊ธ ๋ซ์ ์ ์์ต๋๋ค.
์ด์ ๋ํด ์ฝ๊ฐ์ ์ ๋ฐ์ดํธ๋ฅผ ๋๋ฆฌ๊ฒ ์ต๋๋ค.
์ฐ๋ฆฌ์ ์ต์ข ๊ณํ์ ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ์์ ์์ ํ ๋ฒ์ด๋๋ ๊ฒ์ ๋๋ค.
import { useState } from 'react';
๊ทธ ์ธ๊ณ์์๋ ๋ค์๊ณผ ๊ฐ์ด ์๋ ํ์ง ์์ต๋๋ค .
import React from 'react'; // no
์ฝ๊ฐ ์๋๋ฝ์ง๋ง ์๋ํฉ๋๋ค.
import * as React from 'react';
ํ์ง๋ง ์ฌ๊ธฐ์ ํค์ปค๊ฐ ์์ต๋๋ค. ์ค์ ๋ก React
๋ฅผ ๊ฐ์ ธ์ฌ ์ด์ ๊ฐ ๋ง์ง ์์ต๋๋ค.
์ค๋๋ ์ฌ๋๋ค์ด React
์์
ํ๋ ์ด์ ๋ ๋๋ถ๋ถ JSX ๋๋ฌธ์
๋๋ค. ๊ทธ๋ฌ๋ @lunaruan ์ ์๋ก์ด JSX ๋ณํ ๋ฐ ๊ด๋ จ codemod์ ๋ํ ์์
์ ๋ง๋ฌด๋ฆฌ ์ค์ด๋ฏ๋ก ํ์ํ์ง ์์ต๋๋ค.
๊ทธ๋์ ๋น์ ์ ์ด๊ฒ์์ ๊ฐ ๊ฒ์ ๋๋ค :
import React from 'react';
import { useState } from 'react';
function Button() {
const [pressed, setPressed] = useState(false)
return <button />
}
์ด์:
import { useState } from 'react';
function Button() {
const [pressed, setPressed] = useState(false)
return <button />
}
JSX๋ ํ๋ ์๋์ ์ฌ๋ฐ๋ฅธ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์๋์ผ๋ก ์ฝ์
ํ๋ฏ๋ก ๋ฒ์์ React
๊ฐ ํ์ํ์ง ์์ต๋๋ค.
์ด๊ฒ์ด ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ์ ๊ฑฐํ๋ ค๋ ์์ง์์ ํ์ฉํ๋ ์ด์ ์
๋๋ค. ๋น์ ์ ๊ทธ๊ฒ๋ค์ด ๊ทธ๋ค์ง ํ์ํ์ง ์์ต๋๋ค.
์ ๋ฐ์ ์ผ๋ก ์์์ ์ ํธ๊ฐ๋ฅผ ๋์ด ESM์ ๋ฐฐํฌํ๋ ๊ฒ์ ์ด๋ ค์ด ์ผ์ ๋๋ค. ๊ด๋ฒ์ํ ์ํ๊ณ๋ ์ค์ ๋ก ์ค๋น๋์ง ์์์ผ๋ฉฐ ๋ค์ํ ๋๊ตฌ ์กฐํฉ์ผ๋ก ์ธํด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๋ฐฉ๋ฒ์ด ๋ง์ด ์์ต๋๋ค. CJS์ ESM์ด ์ํธ ์์ฉํ๋ ๋ฐฉ์์ ๋งค์ฐ ๋ณต์กํ๋ฉฐ ํด๋น ์ํธ ์ด์ฉ์ฑ(๋ฐ ์คํจ ๋ฐฉ์)์ด ์ด๋ฌํ ๋ฌธ์ ์ ๋๋ถ๋ถ์ ์์ธ์ ๋๋ค.
๊ทธ๋์ ์ฐ๋ฆฌ์ ํ์ฌ ์๊ฐ์ ์ฐ๋ฆฌ๊ฐ ESM์ ํ ๋ ESM์ ๋๊น์ง ์๋ํ๊ณ ์ถ์ ์๋ ์๋ค๋ ๊ฒ์ ๋๋ค. CJS๊ฐ ์ ํ ์๊ฑฐ๋ ํธํ๋๋ ๋ ๊ฑฐ์ ํจํค์ง๋ก ๋ถ๋ฆฌ๋ฉ๋๋ค. ์ด๊ฒ์ React 17์์๋ ๋ฐ์ํ์ง ์์ผ๋ฉฐ 18์์๋ ๊ฐ๋ฅ์ฑ์ด ๋ฎ์ง๋ง React 19์์ ์๋ํ๋ ๊ฒ์ ๊ทธ๋ด๋ฏํฉ๋๋ค.
@pika/react
์ ESM ๋น๋์ ๋ํ ๋์์ ์ฐพ๋ ์ฌ๋์ https://github.com/esm-bundle/react ๋ฐ https://github.com/esm-bundle/react-dom์ ํ์ธ import React from 'react';
๋ ์ ์ฒด CDN URL์์ React๋ฅผ ๊ฐ์ ธ์ค๋๋ก ๋ณ๊ฒฝ๋ฉ๋๋ค. ๋ ๋ค๋ฅธ ์ฐจ์ด์ ์ ์๋ ๋จ๊ณ ์์ด ์ ๋ฐ์ ๋ฒ์ ์ด ๊ฒ์๋ ๋๋ง๋ค ์ ๋ฒ์ ์ด ์๋ ๊ฒ์๋๋ค๋ ๊ฒ์
๋๋ค.
์ฝ๋ ์๋๋ฐ์ค ์์ฐ: https://codesandbox.io/s/gifted-roentgen-qcqoj?file=/index.html
๋ช๋ช ์ฌ๋๋ค์ ์ํ๊ณ๊ฐ ์ค๋น๋์ง ์์๋ค๋ ๊ฐ๋ ์ ์ด์๋ฅผ ์ ๊ธฐํ์ต๋๋ค. ์ด์ ๋ํ ์ ์ฒด ๋งฅ๋ฝ์ ์์ง๋ง ์ง๊ธ์ด ๋ณ๊ฒฝ์ ์์ํ๊ธฐ์ ์ข์ ์๊ธฐ๋ผ๊ณ ์๊ฐํ์๋ฉด https://github.com/reactjs/rfcs/pull/38์ ์ดํด๋ณด๊ณ ๊ทธ๊ฒ์ ๋ํ ์ฐ๋ ค. ๋๋ต์ ์ผ๋ก ์ผ๋์ ๋์์ต๋๊น, ์๋๋ฉด ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ์ ํธํฉ๋๊น?
ํ์ง๋ง ์ฌ๊ธฐ์ ํค์ปค๊ฐ ์์ต๋๋ค. ์ค์ ๋ก React๋ฅผ ๊ฐ์ ธ์ฌ ์ด์ ๋ ๋ง์ง ์์ต๋๋ค.
TypeScript๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด ์์ผ๋ก๋ ๊ทธ๋ด ๊ฒ์ ๋๋ค. TS๊ฐ babel์ ์ด ์๋ก์ด ๋ง์ ๋์์ ๋ํด ๋ฐฐ์ธ ๋๊น์ง ๊ฐ๋ฐ์๋ ๊ณ์ํด์ ๋ช ์์ ์ผ๋ก React๋ฅผ ๊ฐ์ ธ์์ผ ํ๊ณ ์ฌ๋ฐ๋ฅธ import ๋ฌธ์ด ๋ฌด์์ธ์ง ์์์ผ ํฉ๋๋ค.
JSX๋ ํ๋ ์๋์ ์ฌ๋ฐ๋ฅธ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์๋์ผ๋ก ์ฝ์ ํ๋ฏ๋ก ๋ฒ์์ React๊ฐ ํ์ํ์ง ์์ต๋๋ค.
s/JSX/์๋ก์ด babel react jsx ๋ณํ ํ๋ฌ๊ทธ์ธ/. JSX๋ JavaScript์ ๋ํ ๊ตฌ๋ฌธ ํ์ฅ์ด๋ฉฐ ์์ฒด์ ์ผ๋ก๋ ์๋ฌด ๊ฒ๋ ํ์ง ์์ต๋๋ค.
TypeScript๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด ์์ผ๋ก๋ ๊ทธ๋ด ๊ฒ์ ๋๋ค. TS๊ฐ babel์ ์ด ์๋ก์ด ๋ง์ ๋์์ ๋ํด ๋ฐฐ์ธ ๋๊น์ง ๊ฐ๋ฐ์๋ ๊ณ์ํด์ ๋ช ์์ ์ผ๋ก React๋ฅผ ๊ฐ์ ธ์์ผ ํ๊ณ ์ฌ๋ฐ๋ฅธ import ๋ฌธ์ด ๋ฌด์์ธ์ง ์์์ผ ํฉ๋๋ค.
TypeScript ํ์ ์ด ๋ณ๊ฒฝ ์ฌํญ์ ์๊ณ ์์ผ๋ฉฐ https://github.com/microsoft/TypeScript/issues/34547 ์์ ์ถ์ ์ค
s/JSX/์๋ก์ด babel react jsx ๋ณํ ํ๋ฌ๊ทธ์ธ/
์, ์ด๊ฒ์ด ๋ด๊ฐ ์๋ฏธํ๋ ๊ฒ์ ๋๋ค!
reactjs/rfcs#38์ ์ดํด๋ณด๊ณ ์ด์ ๋ํ ์ฐ๋ ค ์ฌํญ์ ํํํด ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค. ๋๋ต์ ์ผ๋ก ์ผ๋์ ๋์์ต๋๊น, ์๋๋ฉด ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ์ ํธํฉ๋๊น?
RFC์ ์๋ณธ ํ
์คํธ ์ค ์ผ๋ถ๊ฐ ์ค๋๋์์ต๋๋ค. NodeJS๋ฅผ ์ฌ์ฉํ๋ฉด package.json์ "type"
๋ฅผ ์ง์ ํ ๋ .mjs
๋์ .js
ํ์ผ์์ ESM์ ์คํํ ์ ์์ต๋๋ค. ( ๋ฌธ์ ).
ํนํ RFC ์๋ณธ ํ ์คํธ๋ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ค์ด ์๋๋ผ๊ณ ๋งํฉ๋๋ค.
ESM ์ฝ๋ ๋
.mjs
ํ์ผ ์์ ์์ด์ผ ํฉ๋๋ค.
@frehner ์ ๋ํํ ํ React๊ฐ ESM์ผ๋ก ์ ์ง์ ์ผ๋ก ๋ณํ๋ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ํ ์ ์์ด ์์ต๋๋ค. ESM ๋ฒ์ ์ React๋ฅผ ๊ฒ์ํ ๋ ๋ช ๋ช ๋/๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ ๋ฌธ์ ๋ฅผ ์ฐ๊ฒฐํ์ง ์์ต๋๋ค. @gaearon ์ ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ๊ฐ ๊ฒฐ๊ตญ ์ฌ๋ผ์ง ๊ฒ์ด๋ผ๊ณ ๋ฐํ์ง๋ง ์ด๋ 4๋จ๊ณ๊น์ง ์ ์์์ ๋์ด๋์ง ์์ต๋๋ค.
| | 1๋จ๊ณ | 2๋จ๊ณ | 3๋จ๊ณ | 4๋จ๊ณ |
| - | -------- | -------- | -------- | ------- |
| ESM ๊ฒ์? | โ๏ธ | โ๏ธ | โ๏ธ | โ๏ธ |
| ํจํค์ง.json "module"
| โ | โ๏ธ | โ๏ธ | โ๏ธ |
| ์นํฉ/๋กค์
์ฌ์ฉ esm 1 , 2 | โ | โ๏ธ | โ๏ธ | โ๏ธ |
| ํจํค์ง.json "exports"
| โ | โ | โ๏ธ | โ๏ธ |
| ํจํค์ง.json "type"
| โ | โ | โ๏ธ | โ๏ธ |
| NodeJS๋ esm์ ์ฌ์ฉํฉ๋๋ค | โ | โ | โ๏ธ | โ๏ธ |
| ํ๊ธฐ์ ์ธ ๋ณํ? | โ | โ | โ | โ๏ธ |
| ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ๊ฐ ์ฌ๋ผ์ก์ต๋๊น? | โ | โ | โ | โ๏ธ |
| ๊ฐ์ ธ์ค๊ธฐ์ ํ์ํ ํ์ผ ํ์ฅ์ | โ | โ | โ | โ |
| mjs ํ์ผ ํ์ฅ๋ช
| โ | โ | โ | โ |
1๋จ๊ณ๋ ์ค์ ๋ก ๋งค๋์๋ง์ ๋์์ผ๋ก ํ๊ธฐ ๋๋ฌธ์ 1๋จ๊ณ์ 2๋จ๊ณ๋ฅผ ํจ๊ป ๊ฒฐํฉํ๋ ๊ฒ์ ๋ํ ํ๋นํ ์ฃผ์ฅ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋จ๊ณ๋ฅผ ๋ถ๋ฆฌํ๋ฉด ๋จผ์ ์ผ๋ฆฌ ์ด๋ตํฐ์๊ฒ ๋ฌธ์ ๋ฅผ ๋ณด๊ณ ํ๊ณ ์์ ์ฌํญ์ ์ฐพ์ ์ ์๋ ๊ธฐํ๋ฅผ ์ฃผ์ง ์๊ณ CRA์ ์ ์ฒด ์ํ๊ณ๋ฅผ ์ฆ์ ์ค๋จํ์ง ์๋ ๋ฐฉ์์ผ๋ก ESM์ ๋งค์ฐ ์ฒ์ฒํ ๋กค์์ํ ์ ์๋ ๊ธฐํ๊ฐ ์๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ๋ถํ ํ์ต๋๋ค. .
@joeldenning ๋จ๊ณ์ ๋๋ต์ ์ธ ํ์ด๋ฐ์ ๋ฌด์์
๋๊น? ์๊ฐ ๊ธฐ๋ฐ์
๋๊น ์๋๋ฉด ์ํ๊ณ์ ์ผ๋ถ ์๊ฐ ์ฒดํฌํฌ์ธํธ์ ๊ด๋ จ๋ ๊ฒ์
๋๊น? require('react')
์ด 3๋จ๊ณ์์ ๊ณ์ ์๋ํฉ๋๊น?
๋จ๊ณ์ ๋๋ต์ ์ธ ํ์ด๋ฐ์ ๋ฌด์์ ๋๊น? ์๊ฐ ๊ธฐ๋ฐ์ ๋๊น ์๋๋ฉด ์ํ๊ณ์ ์ผ๋ถ ์๊ฐ ์ฒดํฌํฌ์ธํธ์ ๊ด๋ จ๋ ๊ฒ์ ๋๊น?
๋ชจ๋ ๋จ๊ณ์ ํ์ด๋ฐ์ ์ํํด์ผ ํ ์์ ๊ณผ React์ ๋ฆด๋ฆฌ์ค ์ผ์ ์ ์ํด์๋ง ์ ํ๋ฉ๋๋ค. ๋ด ์ดํด๋ ์ ์๋ ๋ชจ๋ ๊ฒ์ด ๋ฒ๋ค๋ฌ์ nodejs์์ ์ง์๋๋ฉฐ, ์ง์ํ์ง ์๋ ์ด์ ๋ฒ์ ์ ์ฌ์ฉํ ๋ ์ ์ ํ ํด๋ฐฑ๊ณผ ํจ๊ป ์ง์๋๋ค๋ ๊ฒ์ ๋๋ค.
require('react')๊ฐ 3๋จ๊ณ์์ ๊ณ์ ์๋ํ ๊น์?
๋๋ ๊ทธ๋ ๊ฒ ์๊ฐํ๋ค. https://nodejs.org/api/esm.html#esm_dual_commonjs_es_module_packages ๋ฐ https://nodejs.org/api/esm.html#esm_package_entry_points๋ฅผ ์ฐธ์กฐํ์ญ์์ค. ๋ฌผ๋ก ๋ด๊ฐ ๋ชจ๋ ๊ฒฝ์ฐ์ ๋ํด ๋ชจ๋ ์ํฉ์ ์ ์๋ ์์ง๋ง ๋ด๊ฐ ์ ์ํ ์ ํ ๊ฒฝ๋ก๋ "์ด๋์๋ ์๋ํ ๊ฒ"์ด๋ผ๊ณ ์ดํดํฉ๋๋ค. ์๋ง๋ ๊ทธ ์ ๋ช ํ ๋ง์ง๋ง ๋ง์ผ ๊ฒ์ ๋๋ค ๐
์ถ๊ฐ ์ค๋ช ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๊ฒ์๋ tarball์ด React์ ๋ํด ๋ค์๊ณผ ๊ฐ์ด ํ์๋ฉ๋๋ค.
node_modules/react/
cjs/
react.development.js
react.production.min.js
react.profiling.min.js
umd/
react.development.js
react.production.min.js
react.profiling.min.js
esm/
react.development.js
react.production.min.js
react.profiling.min.js
index.js
๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ package.json์ด ์ด๋ป๊ฒ ๋ ๊ฒ์ธ์ง์ ๋ํ ๊ทผ์ฌ์น๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
{
"type": "module",
"main": "index.js",
"module": "esm/react.development.js",
"exports": {
"import": "./esm/react.development.js",
"require": "./cjs/react.development.js"
}
}
^ ์ด๊ฒ์ ์์ ํ ์๊ฐํ๊ณ ์์ฑํ ๊ฒ์ ์๋์ง๋ง ์ ์์ ๋ํ ๊ตฌ์ฒด์ ์ธ ์ปจํ ์คํธ๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ๊ณต์ ํ๊ณ ์์ต๋๋ค.
๊ทธ๋์ - React๋ ์ํ ์ ์ฅ(ํ
)์ด๊ธฐ ๋๋ฌธ์ ์ด์ค ํจํค์ง ์ํ์ ๊ฒช์ต๋๋ค. ๋ฐ๋ผ์ ์ด ์ํ๋ ์ ์คํ๊ฒ ๊ฒฉ๋ฆฌ๋์ด์ผ ํฉ๋๋ค. CJS ๋ฐ ESM ํญ๋ชฉ ๋ชจ๋์์ ๊ฐ์ ธ์ฌ ์ ์๋ ์์ CJS ํ์ผ์ ์์ด์ผ ํ๊ฑฐ๋ .json
๋ก๋ํ๊ณ ๋ ํญ๋ชฉ์์ ํด๋น ์ํ๋ก ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ์ด ์์ ์ ์์ต๋๋ค. ๋ ๋ฒ์งธ ์ ๊ทผ).
๋ํ ์ด๋ฏธ 1๋จ๊ณ์์ ๋ฐ์ํ๋ ๋ช ๋ช ๋ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ์ถ๊ฐํ์ฌ ํ ์ด๋ธ์ ๋์ดํ๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ผ๋ถ ์ฝ๋ ์ผ์ด์ค๋ฅผ ๋์น ์ ์ด ์๋์ง 100% ํ์ ํ ์ ์์ต๋๋ค. ์ด ์ฃผ์ ๋ ๋งค์ฐ ๋ณต์กํฉ๋๋ค. ๋์์ ์ผ์ ์ ์ํ๊ณ ์ฒดํฌํฌ์ธํธ์ ์ฐ๊ฒฐ๋์ด์ผ ํฉ๋๋ค. 3๋จ๊ณ๋ exports
๋ฒ๋ค๋ฌ์์ ์ถฉ๋ถํ ์ง์์ด ์์ด์ผ๋ง ๋ฐฐ์ก๋ ์ ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ ์ฌ์ ์ธ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
React๋ ์ํ ์ ์ฅ(ํํฌ)์ด๋ฏ๋ก ์ด์ค ํจํค์ง ์ํ์ด ์์ผ๋ฏ๋ก ์ด ์ํ๋ฅผ ์ ์คํ๊ฒ ๊ฒฉ๋ฆฌํด์ผ ํฉ๋๋ค.
์ข์ ์ , ๋๋ ์ด๊ฒ์ ๊ณ ๋ คํ์ง ์์์ต๋๋ค( ์ถ๊ฐ ์ ๋ณด ). ์ด ๊ฒฝ์ฐ CJS/ESM ๋น๋ ๊ฐ์ ๊ณต์ ํ์ผ์ ์ ์ํ๋ ๊ฒ์ด ์ ์ฉํ ์ ์์ต๋๋ค. ๋๋ ESM ๋ฒ์ ์ด react์ ์ ์ฒด ๋ณต์ฌ๋ณธ์ด ์๋๋ผ CJS ๋น๋๋ฅผ ํธ์ถํ๋ ESM ๊ณต๊ฐ ์ธํฐํ์ด์ค์ผ ์๋ ์์ต๋๋ค.
๋ํ ์ด๋ฏธ 1๋จ๊ณ์์ ๋ฐ์ํ๋ ๋ช ๋ช ๋ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ์ถ๊ฐํ์ฌ ํ ์ด๋ธ์ ๋์ดํ๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ฒ์ ์์ค ์ฝ๋์์ ์ด๋ฏธ ํด๋น๋๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ด๊ฐ ์ ์ ์๋ ๋ฐ์ ๋ฐ๋ฅด๋ฉด ์์ค ์ฝ๋๋ ์ด๋ฏธ ๋ช ๋ช ๋ ๋ด๋ณด๋ด๊ธฐ๋ก ํญ๋ชฉ์ ๋ด๋ณด๋ ๋๋ค.
์ผ๋ถ ์ฝ๋ ์ผ์ด์ค๋ฅผ ๋์น ์ ์ด ์๋์ง 100% ํ์ ํ ์ ์์ต๋๋ค. ์ด ์ฃผ์ ๋ ๋งค์ฐ ๋ณต์กํฉ๋๋ค. ๋์์ ์ผ์ ์ ์ํ๊ณ ์ฒดํฌํฌ์ธํธ์ ์ฐ๊ฒฐ๋์ด์ผ ํฉ๋๋ค. 3๋จ๊ณ๋ ์์ถ์ด ๋ฒ๋ค๋ฌ์์ ์ถฉ๋ถํ ์ง์์ ๋ฐ์ ํ์๋ง ๋ฐฐ์ก๋ ์ ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ด๊ฒ์ด ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ก ์ด์ด์ง ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
3๋จ๊ณ์ ๋ํด ๋์ํ์ต๋๋ค. ์ด๊ฒ์ด ๋ธ๋ ์ดํน ์ฒด์ธ์ง ์ฌ๋ถ์ ๋ํด ๋ฌผ์ํ๋ฅผ ํ์ํ ์ด์ ์ ๋๋ค. package.json ๋ด๋ณด๋ด๊ธฐ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์ข ์ข ์ํ๊ณ์ ๋ค๋ฅธ ํจํค์ง์ ๋ํ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด๋ผ๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฃผ์ ๋ ํ์คํ ๋ณต์กํฉ๋๋ค. ํ ๊ฐ์ง ์ฃผ๋ชฉํด์ผ ํ ์ ์ ์ํ๋ ๊ฒฝ์ฐ 3๋จ๊ณ์ 4๋จ๊ณ์ ์์๋ฅผ ๋ฐ๊ฟ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๊ฐ ๋จ๊ณ๋ฅผ ๊ตฌํํ๋ ์ฌ๋๋ค์ webpack, ๋กค์ , nodejs ๋ฑ์ ์ฌ๋ฌ ๋ฒ์ ์ ๋ํด ๋งค์ฐ ์ฒ ์ ํ ํ ์คํธ๋ฅผ ์ํํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ํํด์ผ ํ ์์ ์ด ์ฌ์ํ๋ค๊ณ ๋งํ๋ ๊ฒ์ด ์๋๋๋ค. ์๋ง๋ ์ฌ๊ธฐ์์ ์ ํ ๊ฒฝ๋ก ์ผ ๊ฒ์ ๋๋ค :)
๊ทธ๋ฌ๋ ์ด๊ฒ์ ์์ค ์ฝ๋์์ ์ด๋ฏธ ํด๋น๋๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ด๊ฐ ์ ์ ์๋ ๋ฐ์ ๋ฐ๋ฅด๋ฉด ์์ค ์ฝ๋๋ ์ด๋ฏธ ๋ช ๋ช ๋ ๋ด๋ณด๋ด๊ธฐ๋ก ํญ๋ชฉ์ ๋ด๋ณด๋ ๋๋ค.
์ - ๋ง์์, ์ด ๊ฒฝ์ฐ export default
๐๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํ ํ
์ด๋ธ ํ์ด ์์ด์ผ ํฉ๋๋ค. ํ์ฌ ๋๋ถ๋ถ์ ๋ฒ๋ค๋ฌ์์ ์๋ํ๊ณ ๋๋ฆฌ ์ฌ์ฉ๋์ง๋ง default
๋ฅผ ์ ๊ณตํ์ง ์๊ณ ์ง์ ํ ESM ํญ๋ชฉ์ ์ถ๊ฐํ๋ฉด ๊ทธ ์ฌ์ฉ๋ฒ์ ๊นจ์ญ์์ค.
์ด ๊ฒฝ์ฐ ๋ด๋ณด๋ด๊ธฐ ๊ธฐ๋ณธ๊ฐ์ ์ถ๊ฐํ๊ธฐ ์ํ ํ ์ด๋ธ ํ์ด ์์ด์ผ ํฉ๋๋ค.
๋ค, ์ข์ ์ง์ ์ ๋๋ค. ์ถ๊ฐํ๊ฒ ์ต๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ PR์ "๋์๊ฒ ๋ณด์ผ ๊ฒ"์ด๋ผ๊ณ ์๊ฐํ์ง๋ง ํ์ฌ์ ๊ณต๊ฐ ์ธํฐํ์ด์ค๋ฅผ ์๋ ๊ทธ๋๋ก ๋ฐ์๋ค์ด๊ณ ์์ผ๋ก ๊ฐ์ ํ ๊ณํ์ด๋ผ๊ณ ๋ด ๋๋ค.
์ผ๋ถ ๋ฒ์ ์ด ๊ฒ์๋๋ฉด ๋๋๋ฆด ์ ์์ผ๋ฉฐ ์๋ฏธ๋ก ์ ๋ณ๊ฒฝ ์ฌํญ์ด ๊นจ์ง ์ ์๋ค๋ ์ ์ ์ ์ํด์ผ ํฉ๋๋ค. ๋ฉ์ด์ ๋ฅผ ์์ฃผ ๋ฆด๋ฆฌ์คํ์ง ์๋๋ค๋ ์ ์ ๊ฐ์ํ ๋ ๋ณ๋์ ์ต์ํํ๊ธฐ ์ํด ๋ณ๊ฒฝ ์ฌํญ์ ์ผ๊ด ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
๊ฐ๋ฐ/ํ๋ก๋์ ๋น๋ ๋ถํ ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ง๋ฌธ๋ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก React ๋น๋์ ์ํ ์ ์ฅ ํน์ฑ์ ๋ณด์กดํ๋ ๊ฒ์ด ๋งค์ฐ ์ค์ํฉ๋๋ค.
์ผ๋ถ ๋ฒ์ ์ด ๊ฒ์๋๋ฉด ๋๋๋ฆด ์ ์์ผ๋ฉฐ ์๋ฏธ๋ก ์ ๋ณ๊ฒฝ ์ฌํญ์ด ๊นจ์ง ์ ์๋ค๋ ์ ์ ์ ์ํด์ผ ํฉ๋๋ค. ๋ฉ์ด์ ๋ฅผ ์์ฃผ ๋ฆด๋ฆฌ์คํ์ง ์๋๋ค๋ ์ ์ ๊ฐ์ํ ๋ ๋ณ๋์ ์ต์ํํ๊ธฐ ์ํด ๋ณ๊ฒฝ ์ฌํญ์ ์ผ๊ด ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
์ข์ ์ . ๋ด ์์ด๋์ด๋ React 16์ ๊ฒ์๋ ESM ๋น๋์ ๋ช
์์ ์ธ export default React
๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์
๋๋ค. PR์ด ์ผ๋ถ ๋์น์ ์ผ์ผํค๊ณ ๋
ผ๋์ ์ฌ์ง๊ฐ ์์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ชฉ์ ์ง๊ฐ ๊ฒฐ์ ๋์ง ์์๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๋ฌ๋ ์ ์๊ฐ์๋ React 16์์ ESM ๋น๋๋ฅผ ๊ฐ๊ณ ๋ค์ ์ฃผ์ ๋ฒ์ ์์ export default
๋ฅผ ์ ๊ฑฐํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ๋์๊ฒ import React from 'react';
๋ฅผ ํตํด ๋ฐ์์ ์ฌ์ฉํ๋ ๊ฒ์ ๋งค์ฐ ์ผ๋ฐ์ ์ด์ด์ ESM ๋น๋์์ ๊ธฐ๋ณธ๊ฐ์ ๋ด๋ณด๋ด๋ ๊ฒ์ ๋จ์ํ "์ฐ๋ฆฌ๊ฐ ์๋ ๊ณณ์ ์๋ฝ"ํ๋ ๊ฒ์
๋๋ค. ํฅํ ์ฃผ์ ๋ฒ์ ์์๋ ์ด๋ฅผ ์ ๊ฑฐํ ๊ฒ์
๋๋ค.
๋ํ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ์ต์ํํ๋ ๊ฒ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค. 3๋จ๊ณ์ 4๋จ๊ณ๋ ๋์ผํ ์ฃผ์ ๋ฆด๋ฆฌ์ค์ ์ผ๋ถ์ผ ์ ์์ต๋๋ค. 3๋จ๊ณ๊ฐ ์์ ํ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋๋ ๋ฐฉ์์ผ๋ก ์ํ๋ ์ ์์ผ๋ฉฐ, ์ด ๊ฒฝ์ฐ 16 ๋ฆด๋ฆฌ์ค์ ๋ค์ด๊ฐ ์๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๋ ๊น๋ค๋กญ๊ณ ๊ทธ๊ฒ์ ๋ํด ํ์ ํ ๋งํผ ์ถฉ๋ถํ ์์ง ๋ชปํฉ๋๋ค.
๊ฐ๋ฐ/ํ๋ก๋์ ๋น๋ ๋ถํ ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ง๋ฌธ๋ ์์ต๋๋ค.
์ด๊ฒ์ ๋ด๊ฐ ๊ฐ๊ณผ ํ ๊ฒ์ ๋๋ค. ๋ฒ๋ค๋ฌ์ NodeJS ๋ชจ๋์์ ESM์ ์ฌ์ฉํ์ฌ ์ด ์์ ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด์ง๋ง ๊ฐ๋ฅํ ๊ฒ์ด ๋ฌด์์ธ์ง ์์๋ณด๊ธฐ ์ํด ๋ช ๊ฐ์ง ์กฐ์ฌ๋ฅผ ํ ๊ฒ์ ๋๋ค. ๋๋ ์ด ์ฃฝ์ ์ ์์ ์ฐพ์์ง๋ง ์ด์์๋
๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก React ๋น๋์ ์ํ ์ ์ฅ ํน์ฑ์ ๋ณด์กดํ๋ ๊ฒ์ด ๋งค์ฐ ์ค์ํฉ๋๋ค.
๋์. ํ ๊ฐ์ง ์ฃผ์ํ ์ ์ React ๋น๋์ stateful ํน์ฑ์ Phase 1๊ณผ 2๊ฐ ์๋๋ผ Phase 3์์๋ง ํด๊ฒฐํ๋ฉด ๋๋ค๋ ๊ฒ์ ๋๋ค. @Andarist ์ ์ ๊ฐ ์ ์ํ ์ต์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ํจ๊ณผ์ ์ ๋๋ค.
์ง๊ธ์ ๊ฐ์ฅ ์ฌ์ด, ๊ฐ์ฅ ํ์ ํธํ์ฑ ์ ๊ทผ๋ผ๋ ์ด๋ฆ์ ์์ ์ ํ์ฉํ๋ ๊ฐ๋จํ ESM ๋ํผ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ React์ ์ถ๊ฐํ๋ PR์ ํ๊ณ ์ถ์ต๋๋ค. "exports" ํ๋์ ์ถ๊ฐ๊ฐ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋์ ํ์ธํฉ๋๋ค(์ ๋ ์ด๊ฒ์ ์ฝ๊ฒ ๊ฒฐ์ ํ ์ ์๋๋ก npx ls-exports
๋๊ตฌ๋ฅผ ์์ฑํ์ต๋๋ค). ๋น๋ ํ๋ก์ธ์ค ์์ด ESM์ ์ฌ์ฉํ๋ ค๋ ์ฌ๋๋ค์๊ฒ๋ ๋์์ด ๋์ง ์์ง๋ง ๊ฐ๋ณ ํจํค์ง๊ฐ ์ด์จ๋ ํด๊ฒฐํ ์ ์๋ ๋ฌธ์ ์
๋๋ค.
@gaearon ์ ์ฉํ ๊น์? ๊ทธ๊ฒ์ semver-minor๋ก React 16์ ์ฐฉ๋ฅํ ์ ์์ต๋๋ค.
CJS ๋น๋๋ ์ง๊ธ๊ณผ ๊ฐ์ด ํ๊ฒฝ ๊ฐ์ง๋ฅผ ๊ณ์ ์ฌ์ฉํ๋ฏ๋ก ESM์ (์ด๋ ค์ด, ํด๊ฒฐ๋์ง ์์) ๋ฌธ์ ๋ฅผ ์์ง ํ์ ํ ํ์๊ฐ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ ์๊ฐ์๋ React 16์์ ESM ๋น๋๋ฅผ ๋ง๋ ๋ค์ ํฅํ ์ฃผ์ ๋ฒ์ ์์ ๋ด๋ณด๋ด๊ธฐ ๊ธฐ๋ณธ๊ฐ์ ์ ๊ฑฐํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
๋ ๋ค๋ฅธ ๋ฌธ์ ๋ ๊ตฌ์ฑ ์๋ฅผ ๋๋ฆฌ๋ฉด ์ํ๊ณ์ ๋ถ๋ด์ด ๋๋ค๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด ESM ๋น๋๋ฅผ ์ถ์ํ๋ฉด ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ์ ๊ฐ์ด ๋ฐ๋ก ๋ค์ ๋ฆด๋ฆฌ์ค์์ ํ์คํ ์ ๊ฑฐํ ํญ๋ชฉ์ด ํฌํจ๋์ด์๋ ์ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ค์ ๋งํด, ์ฌ๋ผ์ง๋ ๊ฒ(๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ)์ ์๋ก ์ถ๊ฐ๋๋ ๊ฒ(ESM ๋น๋)์ ๋์ ํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ ์๊ฐ์๋ React 16์์ ESM ๋น๋๋ฅผ ๋ง๋ ๋ค์ ํฅํ ์ฃผ์ ๋ฒ์ ์์ ๋ด๋ณด๋ด๊ธฐ ๊ธฐ๋ณธ๊ฐ์ ์ ๊ฑฐํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
๋ ๋ค๋ฅธ ๋ฌธ์ ๋ ๊ตฌ์ฑ ์๋ฅผ ๋๋ฆฌ๋ฉด ์ํ๊ณ์ ๋ถ๋ด์ด ๋๋ค๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด ESM ๋น๋๋ฅผ ์ถ์ํ๋ฉด ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ์ ๊ฐ์ด ๋ฐ๋ก ๋ค์ ๋ฆด๋ฆฌ์ค์์ ํ์คํ ์ ๊ฑฐํ ํญ๋ชฉ์ด ํฌํจ๋์ด์๋ ์ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ค์ ๋งํด, ์ฌ๋ผ์ง๋ ๊ฒ(๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ)์ ์๋ก ์ถ๊ฐ๋๋ ๊ฒ(ESM ๋น๋)์ ๋์ ํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ๋ค์ ๋ฆด๋ฆฌ์ค๊ฐ ์ผ๋ง๋ ์ค๋ ๋๋์ง์ ๋ฌ๋ ค ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ผ์ฃผ์ผ์ ์ฐจ์ด์ ๋ํด ์ด์ผ๊ธฐํ๋ค๋ฉด ๊ทธ๊ฒ์ ํฉ๋ฆฌ์ ์ผ๋ก ๋ณด์ ๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๊ฐ ๋ช ๊ฐ์ / ๋ช ๋ ์ ์ด์ผ๊ธฐํ๋ค๋ฉด ๊ทธ ์๊ฐ ๋์ ๊ทธ๊ฒ์ ๊บผ๋ด๋ ๊ฒ์ด ์ ๋์์ง ์ ์ ์์ต๋๋ค.
์ด ๊ฒฝ์ฐ์ ์ฐ๋ ค๋ ๊ทธ๊ฒ์ด ๋ ์ค๋ ์กด์ฌํ ์๋ก ๋ ๋ง์ ์ฌ๋๋ค์ด ํ์ฌ ํํ๋ก ๊ทธ๊ฒ์ ์์กดํ๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ฑฐ๊ธฐ์ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋์ ํ๋ฉด React๋ฅผ ์ ๊ทธ๋ ์ด๋ํ๊ธฐ๊ฐ ๋ ์ด๋ ค์์ง๋๋ค. ์ด์ ํ๋์ ESM ๋ง์ด๊ทธ๋ ์ด์ ์ด ์๋๋ผ ์ฌ๋ฌ ๊ฐ ์์ผ๋ฉฐ ์ผ๋ถ ์ฌ๋๋ค์ ๋๋ฌด ์ผ์ฐ ๋ฐ์ด๋ค์ด ๋์ค์ ๋ค๋ฅธ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ํ ๋ฆฌ์์ค๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ค์ฒ์ง๊ฒ ๋ ๊ฒ์ ๋๋ค. ESM์ ๊ฒฝ์ฐ ์ํ๊ณ ์ ๋ฐ์ ๊ฑธ์ณ ํ๊ธ๋ ฅ์ด ๋ฐ์ํฉ๋๋ค.
ESM ๋น๋๋ฅผ ์ถ์ํ๋ฉด ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ์ ๊ฐ์ด ๋ฐ๋ก ๋ค์ ๋ฆด๋ฆฌ์ค์์ ํ์คํ ์ ๊ฑฐํ ํญ๋ชฉ์ด ํฌํจ๋์ด์๋ ์ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ค์ ๋งํด, ์ฌ๋ผ์ง๋ ๊ฒ(๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ)์ ์๋ก ์ถ๊ฐ๋๋ ๊ฒ(ESM ๋น๋)์ ๋์ ํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ import React from 'react'
๋ฅผ ์๋ก ์ถ๊ฐ๋ ๊ฒ์ผ๋ก ๋ณด์ง ์๊ณ ์คํ๋ ค ํ์ฌ์ ํ์ค์ ์์ฉํ๋ค. ์ด๊ฒ์ ์๋ง๋ ์๋ํ์ง ์์๊ณ ์ง๊ธ์ ์ฌ์ฉ๋์ง ์๋ ESM/CJS ์ํธ ์ด์ฉ์ฑ์ ๋ถ์์ฉ์ผ ๋ฟ์ด์ง๋ง ์ฌ์ ํ ์ด๋ฅผ ์ํํ๋ ์์ฒ(๋ฐฑ๋ง?) ์ค์ ์ฝ๋๊ฐ ์์ต๋๋ค. ๋์(๋ช
๋ช
๋ ๋ด๋ณด๋ด๊ธฐ๋ง ๋ด๋ณด๋ด๊ธฐ)์ ์ฌ์ฉ์์๊ฒ "์ฐ๋ฆฌ๋ ๋ง์ด๋ ๋ฒ์ ์ผ๋ก ESM ๋น๋๋ฅผ ๊ฒ์ํ์ง๋ง ๋ชจ๋ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค"๋ผ๊ณ ๋งํฉ๋๋ค. ์ด๋ "์ ๊ฑฐ๋ ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ"๋ฅผ ๋ณด๋ ๊ฒ๋ณด๋ค ์ฌ์ฉ์์๊ฒ ๋ ํผ๋์ค๋ฝ์ต๋๋ค. ์ฃผ์ ๋ฒ์ ์ ๋ฆด๋ฆฌ์ค ์ ๋ณด์์.
๊ถ๊ธํฉ๋๋ค. ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ๊ฐ ์๋ ESM์ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋๋ ๋ฐฉ์์ผ๋ก ์ถ๊ฐํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น? ์ด๊ฒ์ ์ด์ ์ ๋ํ๋ฌ์ต๋๋ค(์: https://github.com/facebook/react/pull/18187 ๋ํ ๊ด๋ จ ๋ฌธ์ ๋ก ์ฐ๊ฒฐ๋จ). ๋ฌธ์ ๋์ ์นํฉ CJS <-> ๋น์ ์ดํ๊ณ CJS ์ฝ๋๊ฐ์๋ ๊ฒฝ์ฐ ESM์ ์ํธ ์ด์ฉ์ฑ require('react')
์นํฉ์ ESM์ ์กด์ฌ ๋ฐํ ๋ฌด์จ react
๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ์ ๊ฐ์ฒด์
๋๋ค default
CJS react
๊ด๊ณ์์ด default
์์ฑ(์ด์ require('react').default
๊ฐ ํ์ํจ์ ์๋ฏธ). ํ์ง๋ง ๋ช
๋ช
๋ ๋ด๋ณด๋ด๊ธฐ๋ ํ๋ฉด ๋ฌธ์ ๊ฐ ๋์ง ์์๊น์? @TrySound ๋ ์ด์ ์ ๋ค๋ฅธ ํจํค์ง์์ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ
ํ์ง๋ง ๋ช ๋ช ๋ ๋ด๋ณด๋ด๊ธฐ๋ ํ๋ฉด ๋ฌธ์ ๊ฐ ๋์ง ์์๊น์?
์, ์ด๊ฒ์ด ์ ๊ฐ ์๊ฐํ๋ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค. https://unpkg.com/browse/@esm-bundle/react @16.13.1/esm/react.development.js์ ๋ง์ง๋ง 40์ค์
ํ์ง๋ง ๋ช ๋ช ๋ ๋ด๋ณด๋ด๊ธฐ๋ ํ๋ฉด ๋ฌธ์ ๊ฐ ๋์ง ์์๊น์?
์, ์ด๊ฒ์ด ์ ๊ฐ ์๊ฐํ๋ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค. https://unpkg.com/browse/@esm-bundle/react @16.13.1/esm/react.development.js์ ๋ง์ง๋ง 40์ค์
๊ทธ๋ฌ๋ CJS ์ฝ๋ ๋๋ ESM์์ ์ฌ์ฉํ๊ณ ์์ต๋๊น? CJS <-> ESM interop ๋ฌธ์ ๊ฐ ๋งค์ฐ ๋๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
@gaearon ๋ง์; ๋ด๊ฐ ์ ์ํ๋ ESM ๋ํผ์ ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ๊ฐ ์๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์
๋๋ค. ๊ธฐ๋ณธ ESM์ ์ํํ๋ ๋ชจ๋ ์ฌ์ฉ์๋ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด import * as React from 'react'
๋ฅผ ์ํํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ง๊ธ ๊ทธ๋ ๊ฒ ํ๋ ์ฌ๋์ด ๊ฐ์๊ธฐ ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ๊ฐ ์๋ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก ๋ณผ ์ ์์ผ๋ฏ๋ก ์ง๊ธ ๊ธฐ๋ณธ๊ฐ์ ์ถ๊ฐํ์ง ์์ผ๋ ค๋ฉด v17๊น์ง ๊ธฐ๋ค๋ ค์ผ ํฉ๋๋ค.
๊ทธ๋ฌ๋ CJS ์ฝ๋ ๋๋ ESM์์ ์ฌ์ฉํ๊ณ ์์ต๋๊น? CJS <-> ESM interop ๋ฌธ์ ๊ฐ ๋งค์ฐ ๋๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
CJS ๋ฐ ESM ํ์ผ ๋ชจ๋์์ webpack์ผ๋ก ์ฑ๊ณต์ ์ผ๋ก ๊ฐ์ ธ์์ต๋๋ค.
๋ค์ดํฐ๋ธ ESM์ ์ํํ๋ ์ฌ๋์ *๋ฅผ 'react'์์ React๋ก ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ํํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ง๊ธ ๊ทธ๋ ๊ฒ ํ๋ ์ฌ๋์ด ๊ฐ์๊ธฐ ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ๊ฐ ์๋ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก ๋ณผ ์ ์์ผ๋ฏ๋ก ์ง๊ธ ๊ธฐ๋ณธ๊ฐ์ ์ถ๊ฐํ์ง ์์ผ๋ ค๋ฉด v17๊น์ง ๊ธฐ๋ค๋ ค์ผ ํฉ๋๋ค.
๋์. ์ฒ์๋ถํฐ ์์ํ๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ๊ฐ ํ์ํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ์ถ๊ฐํ์ง ์๊ณ ๋ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ ์์ด 2๋จ๊ณ ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค. ์ ๋ ๊ฐ์ธ์ ์ผ๋ก React 16์์ Phase 1์ ์ํํ๊ณ React 17+์์ Phase 2-4๋ฅผ ์ํํ๋ ๊ฒ์ด ์ข์ง๋ง Phase 1, 2, ์ฌ์ง์ด 3๊น์ง ์ํํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค(@ljharb ์ ๋ด๋ณด๋ด๊ธฐ ๊ฒ์ฌ๊ธฐ ๋๊ตฌ์ ๋์์ผ๋ก) ๋ณ๊ฒฝ ์ฌํญ์ ๊นจ๋จ๋ฆฌ์ง ์๊ณ React 16์์. ๊ทธ ์ด์ ๋ 2๋จ๊ณ๊ฐ ๋๋ถ๋ถ์ ์ฌ์ฉ์๊ฐ ESM ๋ฒ๋ค์ ์ฌ์ฉํ๊ธฐ ์์ํ๋ ํฐ ๋จ๊ณ์ธ ๋ฐ๋ฉด, 1๋จ๊ณ๋ ๋๋ถ๋ถ ์ผ๋ฆฌ ์ด๋ตํฐ/๋งค๋์๋ฅผ ์ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด ์ ์ ์์ ๊ณ์๋ฉ๋๋ค. ์ด๊ฒ์ ์ํ๋ฅผ ๋ค๋ฅธ ๊ณณ์ผ๋ก ๊ฒฉ๋ฆฌํ์ฌ ์ด์ค ํจํค์ง ์ํ์ ์ฒ๋ฆฌํ๋ ์์ ํ CJS ๋ฐ ESM ์์ค๊ฐ ์๋ ์ด์ค ํจํค์ง๋ก์ ์ ํ์ ๋ํ ์ ์์ธ ๊ฒ ๊ฐ์ต๋๋ค( ์ ๊ทผ๋ฒ 2 ). ์ด์ RFC( ์ ๊ทผ๋ฒ 1 )์ ๊ฐ์ ESM ๋ํผ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ๋ ๋์กฐ์ ์ ๋๋ค.
๊ฐ์ ํ๋ฉด ์์ง ์ธ๊ธ๋์ง ์์ ๋ช ๊ฐ์ง ๋ฉ๋ชจ๊ฐ ์์ต๋๋ค.
.js
์ฌ์ฉํ๋ Node.js ํจํค์ง๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. "type": "module"
๋ฅผ ์ค์ ํ๋ฉด ๋ชจ๋ CommonJS ํ์ผ์ ๋์ .cjs
ํ์ผ ํ์ฅ์๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.Component
ํด๋์ค์ ๊ตฌํ์ด ์ํ๋ฅผ ๊ณต์ ํ๋ CJS ์ฝ๋์ ์ผ๋ถ๊ฐ ์๋๊ณ ๋์ CJS/ESM ๋ฒ๋ค์ ์ผ๋ถ์ธ ๊ฒฝ์ฐ ๋ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ instanceof Component
๊ฒ์ฌ์ ์ํ์ด ์์ต๋๋ค. ํ๊ดด.ESM ๋ฐ CommonJS ํ์ผ์ด ๋ชจ๋ .js๋ฅผ ์ฌ์ฉํ๋ Node.js ํจํค์ง๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. "type": "module"์ ์ค์ ํ๋ฉด ๋ชจ๋ CommonJS ํ์ผ์ ๋์ .cjs ํ์ผ ํ์ฅ์๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์์๋ ํ์ผ NodeJS์ ๋ํ (ํ์ง๋ง bundlers ์ํด) ๋๋ฌธ์,์ด ์ฌ์ค์ด๋ค cjs
๋๋ ํ ๋ฆฌ๋ก ์ข
๋ฃํด์ผํฉ๋๋ค .cjs
.
์ ์ฌ์ ์ผ๋ก ๋์ผํ ํจํค์ง์ 2๊ฐ ๋ฒ์ ์ ๋ก๋ํ๋ฉด ์ด๋ฌํ ๊ฒฝ์ฐ React์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ๋ ์ฆ๊ฐํฉ๋๋ค.
์ด๊ฒ์ด ์ด๋ป๊ฒ npm์ ๊ฒ์๋ tarball ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐ์์ผ ๋์คํฌ์ ์ ์ฒด ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐ์ํค๋์ง ์ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ด ๋ฉ๋ชจ๋ฆฌ์ ์ด๋ค ์ํฅ์ ๋ฏธ์น๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ด๊ฐ ์๋ ํ, ๋ฒ๋ค๋ฌ์ NodeJS๋ import
/ require()
๋ฅผ ํตํด ๋ก๋๋์ง ์์ ์ฝ๋๋ฅผ ๋ฉ๋ชจ๋ฆฌ๋ก ๊ฐ์ ธ์ค์ง ์์ต๋๋ค. ๋ฉ๋ชจ๋ฆฌ ํํ๋ฆฐํธ๊ฐ ์ด๋ป๊ฒ ๋ณ๊ฒฝ๋๋์ง ๋ช
ํํ ํด์ฃผ์ค ์ ์์ต๋๊น?
์๋ฅผ ๋ค์ด Component ํด๋์ค์ ๊ตฌํ์ด ์ํ๋ฅผ ๊ณต์ ํ๋ CJS ์ฝ๋์ ์ผ๋ถ๊ฐ ์๋๊ณ ๋์ CJS/ESM ๋ฒ๋ค์ ์ผ๋ถ์ธ ๊ฒฝ์ฐ ๋ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ instanceof Component ๊ฒ์ฌ๊ฐ ์ค๋จ๋ ์ํ์ด ์์ต๋๋ค.
์ ์๋ ์๋ฃจ์
( 1 , 2 ) ์ค ํ๋๋ NodeJS esm ๊ตฌํ์ด CJS ์ฝ๋๋ฅผ ํธ์ถํ๋ ESM ์ธํฐํ์ด์ค๊ฐ ๋๋๋ก ํ๋ ๊ฒ์
๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด Node.js์์ ์ฌ์ฉ๋๋ Component
์ ์๊ฐ ํ๋๋ง ์์ต๋๋ค. 1๋จ๊ณ์ 2๋จ๊ณ๋ NodeJS์์ ์คํ๋๋ ํญ๋ชฉ์ ๋ณ๊ฒฝํ์ง ์์ผ๋ฏ๋ก ์ด๋ 3๋จ๊ณ์๋ง ์ ์ฉ๋ฉ๋๋ค.
์ต๊ทผ์ ์ฐ๋ฆฌ(webpack)๊ฐ webpack 5์ exports
ํ๋ ์ง์์ ์ถ๊ฐํ๊ธฐ ๋๋ฌธ์ ์ด ์ฃผ์ ์ 2์ผํธ๋ฅผ ์ฃผ๊ณ ์ถ์ต๋๋ค.
exports
ํ๋๋ฟ ์๋๋ผ Node.js ๋ฐ ์ผ๋ฐ์ ์ผ๋ก https://gist.github.com/sokra/e032a0f17c1721c71cfced6f14516c62์ ๋ํ ๋ง์ ์ ๋ณด๊ฐ development
๋ฐ production
์กฐ๊ฑด๋ ์ถ๊ฐ๋์ด ๋ฐ์์ ๋งค์ฐ ์ ์ฉํฉ๋๋ค. ( process.env.NODE_ENV
๋ ๊ณ์ ์ง์๋์ง๋ง ์ผ๋ฐ์ ์ผ๋ก Node.js์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ํ๋ฐํธ์๋ ์ฝ๋์์๋ ํผํด์ผ ํฉ๋๋ค.)require("esm")
์ง์ํ๋ฏ๋ก ํญ์ ESM์ ์ฌ์ฉํ์ฌ ์ด์ค ์ํ ๋ฌธ์ ๋ฅผ ํผํ ์ ์์ต๋๋ค( require()
). webpack์ ์ด์ ๋ํ ํน๋ณํ ์กฐ๊ฑด์ ๋์
ํ์ต๋๋ค: module
. ์ด CommonJs ๋ฐ ESM ๋ฒ์ ์ ๊ฒฝ์ฐ ๋์ผํ ์ธํฐํ์ด์ค๋ฅผ ๋ด๋ณด๋ด์ผ ํฉ๋๋ค. ํ์ฌ Node.js๋งํผ ์ด์ค ์ํ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ์ ์์ต๋๋ค. ๋๋ ์ด๊ฒ์ด ๋๋ถ๋ถ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ ๋ฌธ์ ์ด๊ธฐ ๋๋ฌธ์ ๋ฏธ๋์ ๋ฌด์ธ๊ฐ๋ฅผ ๋ณด๊ฒ ๋ ๊ฒ์ด๋ผ๊ณ ๊ธฐ๋ํ์ง ์์ต๋๋ค.{
"type": "commonjs",
"main": "index.js",
"module": "esm/wrapper.js",
"exports": {
".": {
"node": {
"development": {
"module": "./esm/index.development.js",
"import": "./esm/wrapper.development.js",
"require": "./cjs/index.development.js"
},
"production": {
"module": "./esm/index.production.min.js",
"import": "./esm/wrapper.production.min.js",
"require": "./cjs/index.production.min.js"
},
"import": "./esm/wrapper.js",
"default": "./cjs/index.js"
},
"development": "./esm/index.development.js",
"production": "./esm/index.production.min.js",
"default": "./esm/index.production.min.js"
},
"./index": "./index.js",
"./index.js": "./index.js",
"./umd/react.development": "./umd/react.development.js",
"./umd/react.development.js": "./umd/react.development.js",
"./umd/react.production.min": "./umd/react.production.min.js",
"./umd/react.production.min.js": "./umd/react.production.min.js",
"./umd/react.profiling.min": "./umd/react.profiling.min.js",
"./umd/react.profiling.min.js": "./umd/react.profiling.min.js",
"./package.json": "./package.json"
}
}
์ด ๋๋ ํ ๋ฆฌ์์ .js
๋ฅผ ํ์ฅ์๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋๋ .mjs
์ฌ์ฉํ ์ ์์ง๋ง ๋๊ตฌ์์ ํ์ฅ์ ํ์ธํ ๋ ์ ์ฌ์ ์ธ ๋ถ์์ฉ์ด ์์ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ .js
๋ ์์ ํฉ๋๋ค.
{
"type": "module"
}
์ด ๋ํผ๋ Node.js๊ฐ ์ด์ค ์ํ ๋ฌธ์ ๋ฅผ ํผํ๊ธฐ ์ํด ํ์ํฉ๋๋ค.
import React from "../cjs/index.js";
export const {
Children,
Component,
...,
useState,
version
} = React;
export { React as default };
development
๋ฐ production
์กฐ๊ฑด์ด ์ง์๋์ง ์์ ๋ Node.js์์ ์ฌ์ฉํฉ๋๋ค.
'use strict';
if (process.env.NODE_ENV === 'production') {
module.exports = require('./cjs/react.production.min.js');
} else {
module.exports = require('./cjs/react.development.js');
}
์ด๋ฌํ ๋ํผ๋ ์ด์ค ์ํ ๋ฌธ์ ๋ฅผ ํผํ๊ธฐ ์ํด Node.js์ ํ์ํฉ๋๋ค.
Node.js๊ฐ development
๋ฐ production
์กฐ๊ฑด์ ์ถ๊ฐํ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉ๋ฉ๋๋ค.
import React from "../cjs/index.development.js";
export const {
Children,
Component,
...,
useState,
version
} = React;
export { React as default };
์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ํด.
module.exports = require('./cjs/index.js');
์ด๊ฒ์ exports
ํ๋, module
์กฐ๊ฑด ๋ฐ production
/ development
์กฐ๊ฑด์ ์ง์ํ๋ ๋๊ตฌ์์ ์ฌ์ฉ๋ฉ๋๋ค.
/* React in ESM format */
// compat for the default exports with support for tree-shaking
import * as self from "./esm/index.development.js";
export { self as default }
./esm/index.development.js
๋๋ ./esm/index.production.min.js
./cjs/index.js
./cjs/index.js
./esm/wrapper.js
./cjs/index.js
(ํ์) ๋๋ ./esm/wrapper.js
(๊ฐ์ ธ์ค๊ธฐ)./cjs/index.js
./esm/wrapper.development.js
๋๋ ./esm/wrapper.production.min.js
์์
, ./cjs/index.development.js
๋๋ ./cjs/index.production.min.js
์ ํ์ํ์กฐ๊ฑด๋ถ๋ก ๋ฒ์ ์ ์ ํํ๋ ๊ฒ์ ์ฃผ์ ์ ์ถฉ ์์ด ESM์์ ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ esm/index.js
๋ ์์ต๋๋ค.
๋๊ตฌ๋ exports
ํ๋, module
์กฐ๊ฑด(์ด์ค ์ํ ๋ฌธ์ ๋๋ฌธ์) ๋ฐ production
/ development
๋ฅผ ์ง์ํ๋ ๊ฒฝ์ฐ์๋ง ๋ฐ์ ESM์ ์ด์ ์ ์ถฉ๋ถํ ๋๋ฆด ์ ์์ต๋๋ค
๋๊ตฌ๋ module
ํ๋ ๋๋ exports
ํ๋๋ฅผ ์ง์ํ ๋ ๋ฐ์ ESM์ ์ด์ ์ ๋ถ๋ถ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
import { useState } from "react"
๋๋ import * as React from "react"
๋ long react๊ฐ CommonJs ๋ชจ๋์ธ ํ ๊ธฐ์ ์ ์ผ๋ก ๋ถ๋ฒ์
๋๋ค.
๋๋ถ๋ถ์ ๋๊ตฌ๋ ์ฌ์ ํ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ง์ํ์ง๋ง ์ผ๋ถ๋ ์ง์ํ์ง ์์ต๋๋ค(์: Node.js).
๋ฐ๋ผ์ ํ์ฌ ๋ชจ๋ ๊ณณ์์ ์ ํจํ react๋ฅผ ์ฌ์ฉํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ import React from "react"
์
๋๋ค.
์ด ๋ฐฉ๋ฒ์ ๊ณ์ ์ง์๋์ด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ง๊ธ ๋ฐ์ํ๊ณ ESM ์ถ๊ฐ ํ ๋ฐ์์ ์ ํจํ ๊ตฌ๋ฌธ์ด ์๋ ๊ฒฝ์ฐ(์: Node.js 14)๊ฐ ์์ต๋๋ค.
Node.js๋ฅผ๊ฐ ์ฒจ๊ฐ ๊ฑฐ๋ถ development
/ production
๋ํ ์กฐ๊ฑด exports
์ง๊ธ์๋ค.
๊ทธ๊ฒ์ ์ฌํ๊ณ , ๋๋ ์ฌ์ ํ ๊ทธ๋ค์ด ๊ฒฐ๊ตญ ๊ทธ๊ฒ์ ์ถ๊ฐํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์์ exports
ํ๋์ ์ด์ ๋ํ ์ง์์ด ์ค๋น๋์ด ์์ต๋๋ค.
@sokra ํ๋ฅญํ ๋ถ์, ๋งค์ฐ ๋์์ด ๋์์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค!
์์ ์ง๋ฌธ ํ๋:
Node.js๋ ํ์ฌ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ์ํ ๊ฐ๋ฐ/์์ฐ ์กฐ๊ฑด ์ถ๊ฐ๋ฅผ ๊ฑฐ๋ถํ์ต๋๋ค.
๋ด ์ดํด๋ ๊ทธ๊ฒ์ด ์์ง ์์ ์ค์ด๋ผ๋ ๊ฒ์ ๋๊น? https://github.com/nodejs/node/pull/33171 ํ์ง๋ง ์๋ง๋ ๋ด๊ฐ ๊ทธ PR์ ์คํดํ๊ณ ์๋ ๊ฒ ๊ฐ์ต๋๋ค
[ํธ์ง] ๋ด๊ฐ ๋งํฌํ ์์ PR์ https://github.com/nodejs/node/pull/34637 ๋ก ๋์ฒด๋์์ต๋๋ค.
[edit2] ์ด์ nodejs์ ๋ณํฉ๋์์ต๋๋ค.
@sokra ๊ฐ์ฌํฉ๋๋ค. ๋งค์ฐ ์ ์ฉํ ์ ์์ ๋๋ค.
๋ด๊ฐ ๋ณด๋ ์ต์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋ชจ๋ ๊ธฐ์ ์ ์ผ๋ก ๊ฐ๋ฅํ๊ณ ๊ฒฐ์ ์ ๊ธฐ์ ๊ตฌํ๋ณด๋ค ์ ๋ต ์ค ํ๋์ธ ๊ฒ ๊ฐ์ต๋๋ค.
export default React
๋ฅผ React 17 ESM ๋น๋์ ์ถ๊ฐํ๊ณ import React from 'react'
๋ํ CJS ์ง์์ด ์ค๋จ๋๋ฉด ์ ๊ฑฐํฉ๋๋ค(์๋ง๋ React 18์์?).
export default React
์ถ๊ฐํ์ง ๋ง๊ณ ๋ช
๋ช
๋ ๋ด๋ณด๋ด๊ธฐ๋ง ์๋ React 17 ESM ๋น๋๋ฅผ ์์ฑํ์ธ์.
React 17 ESM ๋น๋๋ฅผ ๊ฒ์ํ์ง ๋ง์ญ์์ค. (๐ข) ESM ๋น๋๋ฅผ ์์ฑํ๊ธฐ ์ ์ import React from 'react';
์ง์์ด ์ค๋จ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ธ์.
| | ์ต์
1 | ์ต์
2 | ์ต์
3 |
| - | -------- | -------- | -------- |
| ์ฐธ์กฐ๋์ง ์์ ESM ๋น๋ | v17 | v17 | v18+ |
| package.json "module"(๊ธฐ๋ณธ์ ์ผ๋ก ํธ๋ฆฌ ํ๋ค๊ธฐ) | v17 | v18+ | v18+ |
| package.json "์ ํ" / "๋ด๋ณด๋ด๊ธฐ"(NodeJS๋ ESM ์ฌ์ฉ) | v18+ 1 | v18+ | v18+ |
์์์ ์ค๋ช ํ ๊ฒ์ฒ๋ผ ๋ด ์ ํธ๋๋ ์ต์ 1์ ๋๋ค. ๊ทธ๋ฌ๋ ์ต์ 2๋ ๋์๊ฒ ๋งค์ฐ ํฅ๋ฏธ์ง์งํฉ๋๋ค. ์ต์ 3์ ๋ฌผ๋ก ๋ ํฅ๋ฏธ๋กญ์ต๋๋ค. ์ด github ๋ฌธ์ ์์ ์์งํ ๊ฒ์์ ์ฐ๋ฆฌ๋ ์ด๋ฌํ ์ผ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ธฐ์ ์ ์ ๋ฌธ ์ง์์ ๊ฐ์ถ๊ณ ์์ต๋๋ค(์๋ง๋ ๋ ธ๋๋ ฅ๊น์ง!).
์ด ๋ฌธ์ ์ ๋ํ ์ด๊ธฐ ๋ฐ์์ "์ด ๋ฌธ์ ๊ฐ 3๋ ์ด ์ง๋ ํ์๋ ๊ณต๊ฐ๋๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?"์์ต๋๋ค. ์ผ๋ถ๋ฅผ ์ฝ๊ณ ๋๋ฉด ์ ๊ทธ๋ ๊ฒ ์ค๋ ๊ฑธ๋ฆฌ๋์ง ์ดํด๊ฐ ๋ฉ๋๋ค. React์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ์ง ๊ด๋ฆฌํ๋ ๊ฒ์ ์์ฒญ๋ ์์ ์ ๋๋ค. ๊ทธ๋์ ๐๐ป
React 17์ ๋ํ ์ต๊ทผ ๋ด์ค๋ฅผ ๊ณ ๋ คํ์ฌ ํฅํ ๊ณํ์ ๋ํด React 16 ๋์ React 17์ ์ฐธ์กฐํ๋๋ก ์ด์ ์๊ฒฌ์ ์ ๋ฐ์ดํธํ์ต๋๋ค.
์์ ์ธ ๊ฐ์ง ์ต์ ์ค ์ด๋ ๊ฒ์ด ์ ํธ๋๋์ง์ ๋ํ ์๊ฒฌ์ ๋ณด๋ด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
React 17์ package.json
์ exports
ํ๋๋ฅผ ์ถ๊ฐํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด์ ๋ฒ์ ์ผ๋ก๋ ๋ฐฑํฌํธํ ์ ์์ต๋๋ค.
{
"exports": {
".": {
"development": "./esm/react.development.mjs",
"production": "./esm/react.production.mjs",
"node": {
"import": "./esm/react.node.mjs",
"require": "./index.js"
},
"default": "./index.js"
},
"./jsx-dev-runtime": {
"development": "./esm/react-jsx-dev-runtime.development.mjs",
"production": "./esm/react-jsx-dev-runtime.production.mjs",
"node": {
"import": "./esm/react-jsx-dev-runtime.node.mjs",
"require": "./jsx-dev-runtime.js"
},
"default": "./jsx-dev-runtime.js"
},
"./jsx-runtime": {
"development": "./esm/react-jsx-runtime.development.mjs",
"production": "./esm/react-jsx-runtime.production.mjs",
"node": {
"import": "./esm/react-jsx-runtime.node.mjs",
"require": "./jsx-runtime.js"
},
"default": "./jsx-runtime.js"
},
"./": "./"
},
}
์๋ก์ด esm ๋ฒ๋ค์ด ํ์ํ์ง๋ง ๋กค์ ์ผ๋ก ์ถ๊ฐํ๋ ๊ฒ์ด ๊ทธ๋ฆฌ ์ด๋ ต์ง ์์์ผ ํฉ๋๋ค.
./esm/react.development.mjs
๋ฐ ./esm/react.production.mjs
๋ฒ๋ค์ process.env.NODE_ENV
์ํ๊ฐ ์์ด์ผ ํฉ๋๋ค.exports
ํ๋๋ฅผ ํตํด ๊ฐ์ ธ์ค๊ธฐ/๋ฒ๋ค ์๊ฐ์ ํด๊ฒฐ๋ฉ๋๋ค.process
๋ ๋
ธ๋ API์ด๋ฉฐ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ ์๋ฏธ๊ฐ ์์ผ๋ฉฐ ์๋ฅผ ๋ค์ด webpack 5์์ _default_์์ ์ง์ํ์ง ์์ต๋๋ค../esm/react.node.mjs
๋ process.env.NODE_ENV
์ํ๋ฅผ ์ ์งํฉ๋๋ค.--conditions
CLI ํ๋๊ทธ๋ฅผ ํตํด dev/prod ๋ฒ๋ค์ ๊ณ์ ์ตํธ์ธํ ์ ์์ต๋๋ค.exports
ํ๋๋ฅผ ์ง์ํฉ๋๋ค.๋๋ ์ด๊ฒ์ด WDYT๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์คํ๋ ค ์์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
https://webpack.js.org/guides/package-exports/
https://nodejs.org/dist/latest-v15.x/docs/api/packages.html
"./": "./"
๋ ์์ ํ์ง๋ง ์บก์ํ๋ ๋ฐฉ์งํ๋ฏ๋ก semver-major๊ฐ ์๋ ์ฆ์ ์ ๊ฑฐํ๊ณ ์ถ์ ๊ฒ์
๋๋ค.
FWIW babel์ ์๋ก์ด jsx ๋ฐํ์ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ถ๋ ฅํฉ๋๋ค.
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
๊ทธ๋ฌ๋ Node์์ ์ด์ ๊ฐ์ ๋ชจ๋์ ๋ก๋ํ๋ฉด ํ์ผ ํ์ฅ์๊ฐ ์๋ค๊ณ ๋ถํํ ๊ฒ์ ๋๋ค.
> node .\node.mjs
node:internal/process/esm_loader:74
internalBinding('errors').triggerUncaughtException(
^
Error [ERR_MODULE_NOT_FOUND]: Cannot find module 'test\node_modules\react\jsx-runtime' imported from test\node_modules\react-data-grid\lib\bundle.js
Did you mean to import react/jsx-runtime.js?
at new NodeError (node:internal/errors:259:15)
at finalizeResolution (node:internal/modules/esm/resolve:307:11)
at moduleResolve (node:internal/modules/esm/resolve:742:10)
at Loader.defaultResolve [as _resolve] (node:internal/modules/esm/resolve:853:11)
at Loader.resolve (node:internal/modules/esm/loader:85:40)
at Loader.getModuleJob (node:internal/modules/esm/loader:229:28)
at ModuleWrap.<anonymous> (node:internal/modules/esm/module_job:51:40)
at link (node:internal/modules/esm/module_job:50:36) {
code: 'ERR_MODULE_NOT_FOUND'
}
exports
์ถ๊ฐํ๋ฉด ํด๊ฒฐ๋ฉ๋๋ค ๐ค
@nstepien์ด ์ด์ ๊ฒ์๋ฌผ์์ ๋ณด์ฌ์ฃผ๋ฏ์ด ์ ์ฒด exports
์ง๋๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ์ ๊ฐ ์๊ฐํ๋ ์ต์
์ด ์๋๋๋ค. cjs interop๊ณผ ๊ด๋ จํ์ฌ ๊ตฌํํ๋ ๋
ธ๋๋ ๊ธฐ์กด ์ํ๊ณ์ ์ ์ด์ธ๋ฆฌ์ง ์์ต๋๋ค. ์ด์ค ํจํค์ง ์ํ์ ํ์ค์ ์
๋๋ค. ํนํ ๋จ์ผ ์ฌ๋ณธ์ด ํ์ํ Reac๊ณผ ๊ฐ์ ํจํค์ง์ ๊ฒฝ์ฐ ๊ทธ๋ ์ต๋๋ค.
commonjs ์ ์ฉ ํ์ผ์ด ํฌํจ๋ exports
๋งต์ ์ ์ฌ์ ์ผ๋ก ์๋ฌด ๊ฒ๋ ์์์ํค์ง ์๊ณ ์ถ๊ฐํ ์ ์์ง๋ง ์ด์ ๋ํ ์ ์ ํ e2e ํ
์คํธ๋ฅผ ํตํด ๊ฐ๋ณํ ์ฃผ์ํด์ ์ํํด์ผ ํฉ๋๋ค.
@Andarist ๊ทธ๊ฒ์ ์ ์๋ํ๊ณ ๋ฐ์์ ๊ฒฝ์ฐ์๋ ๋ค๋ฅด์ง ์์ต๋๋ค. ํญ์ ๊ทธ ์ํ์ด ์์๊ณ ์ํ๊ณ๋ ๋ฐ์์ ๋ชจ๋ ๊ณณ์์ ํผ์ด ๋์ผ๋ก ๋ง๋ค์ด ์ด๋ฅผ ํด๊ฒฐํฉ๋๋ค. ESM ํ์ผ๊ณผ CJS ํ์ผ์ด ๋์ผํ ์ํ๋ฅผ ๊ณต์ ํ๋ ํ "๋ด๋ณด๋ด๊ธฐ" ๋งต์ ์ฌ๊ธฐ์์ ์ ๋๋ก ์๋ํ ์ ์์ต๋๋ค. ์ด๋ ๊ฐ๋จํ ESM ๋ํผ๋ฅผ ์์ฑํ์ฌ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
์ ์ด์ ์ด๋ ์๋๋ React์ ๋ชจ๋ ์ข ์์ฑ์ด React(์ด ๊ฒฝ์ฐ์๋ ์์)์ ์ ์ด ํ์ ์๊ณ ๋ชจ๋ ESM ์ง์ ์ ์ด CJS ์ฝํ ์ธ ๋ฅผ ๋ค์ ๋ด๋ณด๋ด๋ ๊ฒฝ์ฐ ์ด ํน์ ๊ฒฝ์ฐ์ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
ESM ํญ๋ชฉ์ ์ค์ ๋ชจ์์ด ์ด๋ ํด์ผ ํ๋์ง์ ๋ํ ์ ์ฒด ๋๋ผ๋ง๊ฐ ์ฌ์ ํ ์์ต๋๋ค(์ด๋ฆ ์ง์ , ๊ธฐ๋ณธ๊ฐ, ๋ ๋ค).
import React from 'react'
์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก๋ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋์ง ์์ต๋๋ค. ์ด๋ ESM์ ์ฌ์ฉํ ๋ ๋
ธ๋์์ ์ค์ ๋ก React๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ ์ ์ผํ ๋ฐฉ๋ฒ์ด๊ธฐ๋ ํฉ๋๋ค.import * as React from 'react'
์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก ์ด์ ๋ฒ์ ๊ณผ ํธํ๋์ง ์์ต๋๋ค. ์ด๊ฒ์ ์ข
์ข
์ ํ ๊ฒ์ฌ๊ธฐ ๋ฐ ๊ธฐํ ๋๊ตฌ์ ์ํด ์น๊ฒฉ๋์์ต๋๋ค.๋๋ ์์์์ฒ๋ผ ๋๊ปด์ง๊ธฐ ๋๋ฌธ์ ESM ๋ํผ์ ๊ฐ๋ฅ์ฑ์ ๋์์์ด ์์ด ๋ฒ๋ฆฝ๋๋ค. ๊ทธ๋ฌ๋ ์ด ๊ธฐ์ ์ ๋ชจ๋ ์ข ์์ฑ์ ์ ์ดํ ๋๋ง ์๋ํ๊ณ ์ค์ ๋ก "๊ทธ๋ฅ ์๋ํ๋" ๋ณดํธ์ ์ธ ์ ๋ต์ผ๋ก ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค ๐ข
๋ ๊ฐ์ง ๋ชจ๋๋ฅผ ์ ๊ณตํ๋ ์ ์ผํ ๋ณดํธ์ ์ธ ์ ๋ต์ ์ฌ์ค ๋ชจ๋ ์ค์ ์ฝ๋๋ฅผ CJS๋ก ๋ง๋ค๊ณ ๊ทธ ์ฃผ์์ ESM ๋ํผ๋ฅผ ์์ฑํ์ฌ ๋ช ๋ช ๋ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ์ ๊ณตํ๋ ๊ฒ๋ฟ์ ๋๋ค. ์ํ ์ ์ฅ์ด ์๋๊ฑฐ๋ ID์ ์์กดํ๋ ์ฝ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ ๋ค์ ์์ฑ ๋ ์ ์์ง๋ง ์ด๋ ํ์ ์งํฉ์ ๋ถ๊ณผํฉ๋๋ค.
jsx-runtime
๋ ์คํ
์ดํธํ(Stateful)์ด ์๋๊ฐ์? ๋ํผ ์์ด esm/cjs๋ฅผ ๋ชจ๋ ๋ฐฐ์กํ๋ ๊ฒ์ด ์์ ํด์ผ ํฉ๋๋ค.
esm ๋
ธ๋์์ react/jsx-runtime
๊ฐ์ ธ์ค๊ธฐ์ ๋ํด ๋ณ๋์ ๋ฌธ์ ๋ฅผ ๊ธฐ๋กํด์ผ ํฉ๋๊น?
ํ๋ก ํธ์๋ ํจํค์ง์ ๊ฒฝ์ฐ ์ถ๊ฐ ๋ฌธ์ ๊ฐ ์ด์ค ์ํ ์ํ์ ํฉ๋ฅํฉ๋๋ค. ์ด๋ฅผ ์ด์ค ๋ฒ๋ค ์ํ์ด๋ผ๊ณ ๋ถ๋ฅด๊ฒ ์ต๋๋ค.
ESM ๋ฐ CJS ๋ฒ์ ์ ๋ด๋ณด๋ด๊ณ require
๋ฐ import
๋ฅผ ํตํด ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ ๋ฒ์ ์ด ๋ชจ๋ ๋ฒ๋ค๋ก ์ ๊ณต๋๊ณ ํจํค์ง์ ์ ํจ ๋ฒ๋ค ํฌ๊ธฐ๊ฐ ๋ ๋ฐฐ๊ฐ ๋ฉ๋๋ค.
@sokra ์ค์ ๋ก ๊ฐ๋ฅํฉ๋๊น? ์๋ฅผ ๋ค์ด ๋กค์ ์ ์ฌ์ฉํ๋ฉด cjs ๋ชจ๋์ด esm ๋ชจ๋๋ก ๋ณํ๋๋ฏ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ๋๋ง๋ค esm ๋ชจ๋์ ๊ฐ์ ธ์ค๋ ๊ฒ์ ์ ํธํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
์ค์ ๋ก๋ webpack 5์ ๊ฐ์ ๋ ธ๋ ์๋ฏธ ์ฒด๊ณ๋ฅผ ๋ฐ๋ฅด๋ ๋ฒ๋ค๋ฌ์ ๋ํด ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ ธ๋์์ ์คํํ ๋์ ๋ฒ๋ค ์ฝ๋๋ฅผ ์คํํ ๋ ์ ์ฌ์ ์ผ๋ก ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๊ฒฝํํ ์ ์๊ธฐ ๋๋ฌธ์ ์๋ฏธ ์ฒด๊ณ๋ฅผ ์ผ์น์ํค๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๊ทธ๋ฌ๋ webpack 5๋ esm/cjs(export ๋งต์์ ์ค๋ ๊ฒ)๋ฅผ ์ค๋ณต ์ ๊ฑฐํ๋ ๋ฐ ์ฌ์ฉ๋๋ ํน๋ณํ "module"
์กฐ๊ฑด์ ์ฒ๋ฆฌํฉ๋๋ค.
@ljharb์ ์ ์์ ๊ณ ๋ คํ๋ฉด ์ด๊ฒ์ esm ํ์ผ์ด cjs ํ์ผ์ ๋ค์ ๋ด๋ณด๋ด๋ ๋ช ์ค์ ๋ํผ ์ฝ๋์ผ ์ ์๋ค๊ณ ์ ์ํ๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก ๊ด๋ จ์ด ์์ต๋๋ค.
์์ ESM ๋ํผ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฒ๋ค๋ฌ๊ฐ ์๋ ์๋ ์ถ๊ฐ ์ํ์ด ์์ต๋๋ค. ๊ทธ๋ํ์ ์์์์ ๋ํด ํผ์ด dep๊ฐ ํผํ๋ ์ผ๋ฐ์ ์ธ ์ํ๋ฟ์ ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด์ ๊ฑฐ์ 2020๋ ์ธ๋ฐ ๊ณต์ FB ํ์์ ์ ๋ฐ์ดํธ๊ฐ ์๋์ง ์๊ณ ์ถ์ต๋๋ค. React v17์์ ์ด์ ๊ด๋ จ๋ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ต๋๊น?