2๋ ์ ๊ฐ๊น์ด ์๊ฐ ๋์ 4k์ ์ปค๋ฐ, 50ํ ์ด์์ ํ๋ฆฌ ๋ฆด๋ฆฌ์ฆ, ๊ทธ๋ฆฌ๊ณ ๋ง์ ๋์์ ํ์ ์ด ๋ฐ๋ฒจ 7 ์ ์ ์ถ์๋ฅผ ๋ฐํํ๊ฒ ๋์ด ํฅ๋ถ๋๋ค. ์ด๋ฒ ์ถ์๋ ๋ฐ๋ฒจ 6 ์ดํ ๊ฑฐ์ 3๋ ย ๋ง์ด๋ค! ๋ง์ ๋ถ๋ถ์ด ๋ณ๊ฒฝ๋์์ผ๋ฏ๋ก, ์ถ์ ์ฒซ ์ฃผ์๋ ์ฐ๋ฆฌ์ ์ฌ์ดํธ์ ํจ๊ป ํ๊ธธ ๋ฐ๋๋ค. ๋ฐ๋ฒจ 7์์๋ ๋ ๋นจ๋ผ์ก๊ณ ์ ๊ทธ๋ ์ด๋ ๋๊ตฌ, ์๋ฐ์คํฌ๋ฆฝํธ ํ๊ฒฝ ์ค์ , "overrides" ์ค์ ์ต์ , ์ฉ๋/์์ถ์ ์ํ ์ถ๊ฐ ์ต์ , JSX ํ๋ ๊ทธ๋จผํธ, ํ์ ์คํฌ๋ฆฝํธ, ์๋ก์ด ์ ์ ๋ฑ ๋ง์ ๊ฒ๋ค์ด ๋ง๋ค์ด์ก๋ค!
๋ฐ๋ฒจ์๊ฒ ๊ณ ๋ง์์ ๋๋๋ค๋ฉด, Open Collective์์ ๋ฐ๋ฒจ์ ํ์ํ๊ฑฐ๋ Patreon์์ ๋๋ฅผ ์ง์ํด๋ฌ๋ผ. ๋๋ ๋น์ ๋๋ ๋น์ ์ ํ์ฌ๊ฐ ๋ฐ๋ฒจ๊ณผ ๊ด๋ จ๋ ์ผ์ ํ๊ธธ ๋ฐ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์ปค๋ฎค๋ํฐ์์ ์ค์ํ ํ๋ก์ ํธ์ ๊ณต๋ ์์ ๊ถ์ ๊ฐ์ง ์ ์์ด ๊ฐ์ฌํ๋ค!
์ ๋ ์๋ฒฝํ ์๋ ์๊ฒ ์ง๋ง ์ด์ ๋ ๋ด๋ณด๋ผ ์ค๋น๊ฐ ๋์๋ค! @babel/core๋ Next.js 6, vue-cli 3.0, React Native 0.56๊ณผย ๊ฐ์ ๋๊ตฌ ์ฌ์ฉ ๋ฐ ์๋ํ๋ ์ค ํ๋ก ํธ์๋ ๋๋ถ์ ์ด๋ฏธ ์๊ฐ 510๋ง ๋ค์ด๋ก๋๋ฅผ ๋ฌ์ฑํ์๋ค๐!
์ง๋ ๋ช ๋ ๋์ ์๋ฐ์คํฌ๋ฆฝํธ ์ํ๊ณ์์์ ๋ฐ๋ฒจ์ ์ญํ ์ ๋ค์ ์๊ฐํ๋ ๊ฒ์ผ๋ก์จ ์ด๋ฒ ๊ธ์ ์์ํ๋ ค๊ณ ํ๋ค.
์ต์ด์ ๋ฌธ์ ๋ ์๋ฒ ์ธ์ด์ ๋ค๋ฅด๊ฒ, ๋ชจ๋ ์ฌ์ฉ์๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ํด์ ๊ฐ์ ์ง์์ ๋ณด์ฅ๋ฐ์ ์ ์๋ค๋ ๊ฒ์์ ์์๋์๋ค. (ํนํ ์ธํฐ๋ท์ต์คํ๋ก๋ฌ ๊ตฌ ๋ฒ์ ์ ํด๋น) ๋ง์ฝ ๊ฐ๋ฐ์๋ค์ด ์๋ก์ด ๊ตฌ๋ฌธ(์: class A {}
)์ ์ฌ์ฉํ๋ ค๊ณ ํ๋ค๋ฉด, ์ฌ์ฉ์๋ค์ ๊ตฌํ ๋ธ๋ผ์ฐ์ ์์ SyntaxError
๋๋ฌธ์ ๋น ํ๋ฉด์ ๋ณด๊ฒ ๋ ๊ฒ์ด๋ค.
๋ฐ๋ฒจ์ ๊ฐ๋ฐ์๋ค์ด ์ต์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ฉด์ ๋ณํ์ ํตํด ์ฌ์ฉ์์ ํ์ ํธํ์ฑ์ ์ ์งํ ์ ์๋๋ก ๋ฐฉ์์ ์ ์ํ๋ค. (class A {}
๋ฅผ var A = function A() {}
๋ก ๋ณํ)
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ๋ณํํ ์ ์๊ธฐ ๋๋ฌธ์, ์๋ก์ด ๊ธฐ๋ฅ์ ๊ตฌํํ๋๋ฐ์๋ ์ฌ์ฉ๋ ์ ์๋ค. ๋ฐ๋ฒจ์ TC39(์๋ฐ์คํฌ๋ฆฝํธ ์ธ์ด์ ์คํ์ ์ ํ๋ ์กฐ์ง)๋ฅผ ๋๋ ๋ค๋ฆฌ๊ฐ ๋์๋ค.
๋ฐ๋ฒจ์ ์ค๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์์ ํ์์ด๋ค. ํ์ฌ ๊นํ์์๋ 130๋ง ๊ฐ ์ด์์ ๋ํ๋์ ๋ฆฌํฌ์งํฐ๋ฆฌ๊ฐ ์์ผ๋ฉฐ, npm์์ ์๊ฐ 1700๋ง ๋ค์ด๋ก๋๋ฅผ ๋ฌ์ฑ, ๊ทธ๋ฆฌ๊ณ ์ฃผ์ ํ๋ ์์ํฌ(๋ฆฌ์กํธ, ๋ทฐ, ์ ๋ฒ, ํด๋ฆฌ๋จธ)์ ํ์ฌ(ํ์ด์ค๋ถ, ๋ทํ๋ฆญ์ค, ์์ด๋น์ค๋น)๋ฅผ ํฌํจํด ์๋ฐฑ ๋ช ์ ์ฌ์ฉ์๋ฅผ ๊ฐ์ง๋ค. ๋ฐ๋ฒจ์ ๋ง์ ์ฌ๋์ด ์ฌ์ฉ๋ฒ์ ๋ชจ๋ฅด๋ฉด ์๋๋, ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์ ์ํ ํ ๋๊ฐ ๋์๋ค. ๋ฐ๋ฒจ์ ์ง์ ์ฌ์ฉํ์ง ์๋๋ผ๋ ๋ํ๋์๋ค์ด ์ฌ์ฉํ๊ณ ์์ ๊ฐ๋ฅ์ฑ์ด ํฌ๋ค.
๋ฐ๋ฒจ์ ์ธ์ด์ ๋ฏธ๋๋ฟ๋ง ์๋๋ผ ์ปค๋ฎค๋ํฐ์ ์ํ๊ณ์ ํฐ ์ํฅ์ ๋ฏธ์ณค๋ค. ์ด๋ฌํ ๋ชจ๋ ์ฑ ์์ ์ง๊ณ ์์ง๋ง, ๋ฐ๋ฒจ์ ๋ช ๋ช ์ ์์๋ด์ฌ์๋ค์ด ์ด๋๋ ์ปค๋ฎค๋ํฐ ์ค์ฌ์ ํ๋ก์ ํธ์ ๋ถ๊ณผํ๋ค.
์๋ ์ ์ฒ์์ผ๋ก ํ์์ ๋ช ๋ช ์ด ๋ง๋ ์ ์์๋ค.
์ด ๊ธ์ ํตํด์, ์ด ํ๋ก์ ํธ์ ์ํ๋ฅผ ๋ชจ๋ ์ฌ๋์๊ฒ ์๊ธฐ์ํฌ ์ ์๋ ๊ธฐํ๊ฐ ๋๊ธธ ๋ฐ๋๋ค.
๋๋ 6.0 ๋ฒ์ ์ถ์ ๋ช ๋ฌ ์ ์ ํฉ๋ฅํ๋๋ฐ, ๋น์ ๋ฐ๋ฒจ์ ๋ ผ์๊ฑฐ๋ฆฌ์๋ค. ์กฐ์ง ๋๋ถ๋ถ์ ๋ฒ์์๋ ๋ฉ์ธํ ์ด๋๋ค(๋ฐ๋ฒจ ์ฐฝ์์์ธ Sebastian์ ํฌํจํด)์ด ์ด๋๊ณ ์์๊ณ , ๋จ์์๋ ๋ช ๋ช ์กฐ์ฐจ๋ ๋ฐ๋ฒจ์ ๋ํ ์ ์ ์ด ์๋ ์ํ์๋ค.
๋ง์ ๋ฉ์ธํ ์ด๋๋ค๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก, ์ฐ๋ฆฌ์ ์ญํ ์ ๋ํด์ ์ด๋ ค์์ ๊ฒช์๋ค. ๋ง์ ์ฌ๋๋ค์ด ์ปดํ์ผ๋ฌ์ ๋์ ๋ฐฉ์์ด๋ ์คํ ์์ค ํ๋ก์ ํธ๋ฅผ ์ ์งํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ณต์์ ์ธ ๊ต์ก์ ๋ฐ์ง ๋ชปํ์๋ค. ์์ด๋ฌ๋ํ๊ฒ๋, ๋๋ ์ผ๋ถ๋ฌ ๋ํ์์ ์ปดํจํฐ ๊ณตํ์ ์ ๊ณตํ์ง ์์์๋ค. ์๋ํ๋ฉด ์ปดํ์ผ๋ฌ๋ ๋ฎ์ ์์ค์ ์์ ์ ์ฌ๋ฏธ์๊ณ ์ด๋ ต๊ฒ ๋ณด์๊ธฐ ๋๋ฌธ์ด๋ค. ๋์ ๋๋ ํด๋ง, ๋ฆฐํฐ, ๋ฐ๋ฒจ ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ธ์ด์ ๋ ๋๋ ธ๋ค.
๋๋ ์คํ ์์ค๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ์ฌ๋๋ค์ด ์คํ ์์ค ํ๋ก์ ํธ๋ฅผ ๋ค์ฌ๋ค๋ณด๊ณ , ๊ทธ ์คํ ์์ค๋ค์ ์ง์ํด ์ฃผ์์ผ๋ฉด ์ข๊ฒ ๋ค. (๊ฐ๋ฅํ๋ค๋ฉด ์๊ฐ๊ณผ ๊ธ์ ์ ์ง์์ ํตํด์ ๋ง์ด๋ค)
๋ง์ ๋ฉ์ธํ ์ด๋๋ค์ ๊ทธ๋ค์ด ํ๋ ์์ ์ ๋ํด ๊ทผ๋ณธ์ ์ผ๋ก ์ ๋ฌธ๊ฐ๋ ์๋๋ค. ๋จผ์ ์ผ์ ์์ํ ๊ฒ๋ง์ผ๋ก๋ ๋ง์ ๊ฒ์ ์ฑ์ทจํ๊ฒ ๋๋ค. ๋ฉ์ธํ ์ด๋๊ฐ ๋๋ฉด ๋น์ ์ ํธ๊ธฐ์ฌ๊ณผ ๊ฒธ์์ ๊ฒธ๋นํ๊ฒ ๋ ๊ฒ์ด๋ค. ๋์ ๋ฐ๋์ ์ฐ๋ฆฌ๊ฐ ๋ชจ๋ย "์ผ"์ ํ๋ ๊ฒ๋ณด๋ค ํ๋ก์ ํธ์ ๋น์ ์ ๋ํ ํฌ๋ง์ด๋ค.
๋ฐ๋ฒจ์ ํ์ด์ค๋ถ๊ณผ ๊ฐ์ ์ฃผ์ ํ์ฌ์ ์คํ ์์ค ํ์ด๋ ํ์ฌ๊ฐ ์๋๋ค. ์์์ ์์๋ด์ฌ์๋ง์ด ๋ฐ๋ฒจ์์ ์ผํ๊ณ ์์ผ๋ฉฐ, ๋์ ๊ฒฝ์ฐ์๋ ์ง์ฅ์ ๊ทธ๋ง๋๊ณ ์คํ ์์ค์์ ํํ์์ผ๋ก ์ผ์ ํ ์ง ๋ถ๊ณผ ๋ช ๋ฌ๋ฐ์ ๋์ง ์์๋ค. ์ฌ๋๋ค์ ์ด "์ทจ๋ฏธ" ์ธ์๋ ๊ฐ์์ ์ถ์ด ์๋ค. ์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ๊ฐ ์ผํ๋ ๋ฐฉ์์ ํ ๋๊ฐ ๋๋ ๊ฒ์ ์ ์งํ๊ธฐ ์ํด ๋คํจ๊ป ๋ฌด์ธ๊ฐ๋ฅผ ํ๊ณ ์๋๊ฐ? ์๋๋ฉด ๊ทธ ํ ๋๊ฐ ์์ํ ๋ฌด๋์ง๋๋ก ๋ด๋ฒ๋ ค๋๋ ๊ฒ์ ์๋๊ฐ? ์ด๋ป๊ฒ ์คํ ์์ค๋ฅผ ์ ์งํ๊ณ ์ด๋ ์ ๊น์ง ๋ฐ์๋ค์ผ ๊ฒ์ธ๊ฐ? ๋ค๋ฅธ ๋ฉ์ธํ ์ด๋๋ค์ ๊ฒฝํ์ผ๋ก๋ถํฐ ๋ฐฐ์ธ ์ ์๋๊ฐ?
๋ถ๋ช ํ ์คํ ์์ค๊ฐ ์ํํธ์จ์ด๋ฅผ ์ง๋ฐฐํ์ง๋ง, ๊ทธ ๋ค์ ์๋ ์ฌ๋๋ค(๋ฉ์ธํ ์ด๋๋ค)์ ๊ณ ๋ คํ์ง ์๊ณ ๋ ์คํ ์์ค๊ฐ ๊ฑด๊ฐํ ์ํ๋ผ๊ณ ๋ณผ ์ ์์๊น?
์คํ ์์ค์ ์ง์ ๊ฐ๋ฅ์ฑ์ ์๊ฐ์ ์ผ๋ก ๋ ๋ฐ๊ตฌ๋๋ฅผ ๋ด๋ฏธ๋ ๊ฒ๊ณผ ๊ฐ๋ค. ์คํ ์์ค๋ฅผ ์ฌ์ฉํ๋ ์์ฒ ๋ช ์ ์ฌ๋๊ณผ ํ์ฌ์ ์คํ ์์ค ํ๋ก์ ํธ์ ๊ฐ์น๋ฅผ ๋งํ๊ธฐ๋ ์ฝ์ง๋ง, ๊ธฐ๊บผ์ด ๊ทธ ์ผ์ ์ฐธ์ฌํ๋ ๋ช๋ช ์ฌ๋๋ค์ ๊ฐ์น๋ฅผ ์์๋ณด๋ ์ผ์ ์ด๋ ต๋ค.
์คํ ์์ค๋ฅผ ์ง์ํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ ์ ์์ง๋ง, ๊ฐ ํ๋ก์ ํธ ๋๋ ์ฌ๋๋ค์๊ฒ ๋ชจ๋ ํตํ๋ ๊ฒ์ ์๋๋ค.
๊ทธ๋ผ ์ง๊ธ๋ถํฐ ๋ณ๊ฒฝ ์ฌํญ๋ค์ ๋ณด๋ฌ ๊ฐ์!
์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํด์๋ ๋ง์ด๊ทธ๋ ์ด์ ๊ฐ์ด๋์ ์ ๋ฆฌํด ๋์๋ค. ๋ณ๊ฒฝ ์ฌํญ๋ค์ ์๋ก์ด
babel-upgrade
๋๊ตฌ๋ฅผ ํตํด ์๋์ผ๋ก ์ ์ฉ๋ ์ ์๊ณ ์์ผ๋ก๋ ๊ณ์ ์ถ๊ฐ๋ ์์ ์ด๋ค.
@babel
๋ค์์คํ์ด์ค๋ก ๋ณ๊ฒฝํ๋ค. (์ฐธ์กฐ) ์ด๊ฒ์ ๊ณต์ ํจํค์ง๋ฅผ ๊ตฌ๋ถํ๋ ๋ฐ ๋์์ด ๋๋ฉฐ, babel-core
๋ @babel/core
๊ฐ ๋๋ค.preset-es2015
์ ๊ฐ์ ์ฐ๋๋ณ ํ๋ฆฌ์
์ผ๋ถ๋ฅผ ์ ๊ฑฐํ์๋ค. (์ฐธ์กฐ). @babel/preset-env
๋ ๋ชจ๋ ์ฐ๋๋ณ ์ถ๊ฐ ๊ธฐ๋ฅ๊ณผ ํน์ ๋ธ๋ผ์ฐ์ ๋ค์ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์ด ์์ด ๊ธฐ์กด ํ๋ฆฌ์
์ ๋์ฒดํ๋ค.@babel/preset-stage-0
์ ๊ฐ์ "Stage" ํ๋ฆฌ์
์ ์ ๊ฑฐํ๊ณ , ๊ฐ๋ณ ์ ์์ ๋ช
์ํ์ฌ ์ฌ์ฉํ๋๋ก ํ๋ค. ๋น์ทํ ์ด์ ๋ก ๊ธฐ๋ณธ์ ์ธ @babel/polyfill
์ ์ ์๋ ์ ๊ฑฐํ๋ค. (์ฐธ์กฐ) ์ด ๋ด์ฉ์ ๋ํ ๋ ์์ธํ ์ค๋ช
์ ์ ์ฒด ๊ธ์ ์ฝ์ด๋ณด๊ธธ ๋ฐ๋๋ค.-transform
๋์ ์ -proposal
๋ก ๋ฐ๋๋ค. (์ฐธ์กฐ) ๊ทธ๋์ @babel/plugin-transform-class-propertie
๋ @babel/plugin-proposal-class-propertie
๊ฐ ๋๋ค.@babel/core
์ peerDependency
๋ฅผ ์ถ๊ฐํ๋ค. (์: babel-loader
, @babel/cli
๋ฑ) (์ฐธ์กฐ)babel-upgrade
babel-upgrade
๋ package.json
์ .babelrc
ํ๊ฒฝ ์ค์ ์ ์๋ ๋ํ๋์๋ค์ ํ์ฌ ๋ฒ์ ์ผ๋ก ์๋ ์
๊ทธ๋ ์ด๋ํด ์ค ์ ์๋ ์๋ก์ด ๋๊ตฌ์ด๋ค.
npx babel-upgrade
์ปค๋ฉ๋๋ก git ๋ฆฌํฌ์งํฐ๋ฆฌ(ํ๋ก์ ํธ ํด๋)์์ ์ง์ ์คํํ๋ ๊ฒ์ด ์ข๋ค. ๋๋ npm i babel-upgrade -g
๋ก ๊ธ๋ก๋ฒํ๊ฒ ์ค์นํ ์๋ ์๋ค.
ํ์ผ์ ์์ ํ๋ ค ํ๋ค๋ฉด, --install
๋ฟ๋ง ์๋๋ผ --write
๋ ์ฌ์ฉํ ์ ์๋ค.
npx babel-upgrade --write --install
๋ฐ๋ฒจ 7์ ๋ชจ๋ ๋ณํ์ ๋์์ด ๋ ์ ์๋๋ก ์ด์๋ฅผ ๋ฆฌํฌํ ํ๊ฑฐ๋ PR์ ๋ ๋ ค์ฃผ๊ธธ ๋ฐ๋๋ค! ์์ผ๋ก์ ์๋ง์ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ๋ค์ ๋ํด ์ด ๋์ผํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๊ณ ์ ๋ฐ์ดํธ๋ฅผ ์ํ PR ํ๋ก์ ํธ ๋ด์ ๋ง๋๋ ๊ฒ์ด๋ค.
babel.config.js๋ฅผ ์๊ฐํ๋ค. ์ด๊ฒ์ .babelrc
๋ฅผ ๋์ฒดํ๊ฑฐ๋ ํ์ ์๊ตฌ ์ฌํญ์ ์๋๋, ์ด๋ค ๊ฒฝ์ฐ ์ ๊ต์ฅํ ๋์์ด ๋ ๊ฒ์ด๋ค.
*.js
ํ๊ฒฝ ์ค์ ํ์ผ๋ค์ ์๋ฐ์คํฌ๋ฆฝํธ ํ๊ฒฝ์์ ๊ฝค ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ค. ESLint์ ์นํฉ์ ๊ฐ๊ฐ .eslintrc.js
, webpack.config.js
ํ๊ฒฝ์ค์ ํ์ผ๋ค์ ์ฌ์ฉํ๋ค.
์๋๋ "production" ํ๊ฒฝ์์๋ง ํ๋ฌ๊ทธ์ธ์ ์ปดํ์ผํ๋ ์์ ์ด๋ค. (.babelrc
ํ์ผ์์ "env"
์ต์
์ ์ด๋ฏธ ์ค์ ํ์ ์๋ ์๋ค)
var env = process.env.NODE_ENV;
module.exports = {
plugins: [
env === "production" && "babel-plugin-that-is-cool"
].filter(Boolean)
};
babel.config.js
์ .babelrc
๊ณผ ๋ค๋ฅธ ์ค์ ๋ฒ์๋ฅผ ๊ฐ์ง๋ค. ๋ฐ๋ฒจ์ด ์ค์ ํ์ผ์ ์ฐพ์ ๋๊น์ง ๊ฐ ํ์ผ์ ์ฐพ์ ์ฌ๋ผ๊ฐ๋ฉด์ ์๋ ํ์ผ๊ณผ ์ค์ ํ์ผ์ ๋น๊ตํ๋ค. ์ด๋ ์๋ ์๊ฐ๋ overrides
์ต์
์ฌ์ฉ์ ์ข๋ค.
overrides
๋ก ์ ํ์ ์ค์ ํ๊ธฐ์ต๊ทผ ES2015+ ํจํค์ง ๋ฐฐํฌ์ ์ฌ์ฉ/์ปดํ์ผ๋ง์ ๋ํ ๊ธ์ ์์ฑํ์๋ค.
์๋ก์ด ๋ฐ๋ฒจ ์ค์ overrides
๊ฐ ๋ํ ์น์
์ ๋ณด๋ฉด, overrides
๋ ๊ฒฝ๋ก์ ๋ฐ๋ผ ๋ค๋ฅธ ์ค์ ์ ์ง์ ํ ์ ์๋ค.
module.exports = {
presets: [
// defeault config...
],
overrides: [{
test: ["./node_modules"],
presets: [
// config for node_modules
],
}, {
test: ["./tests"],
presets: [
// config for tests
],
}]
};
์ด๋ ๊ฒ ํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์
์์ ํ
์คํธ, ํด๋ผ์ด์ธํธ ์ฝ๋, ์๋ฒ ์ฝ๋์ ๋ํด ๋ค๋ฅธ ํธ์ง ์ค์ ์ ํ ์ ์๋ค. ํด๋๋ง๋ค .babelrc
ํ์ผ์ ์์ฑํ์ง ์์๋ ๋๋ค.
๋ฐ๋ฒจ์ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ ๋น๋ํ๋๋ฐ ์๊ฐ์ด ๋ ๋ ๋ค! v8 ํ์์ ์์ฒญํ ํจ์น๋ฅผ ๋ฐ์๋ค์ด๊ณ ์ฝ๋๋ฅผ ์ต์ ํํ๊ธฐ ์ํด ๋ง์ด ๋ณ๊ฒฝ๋์๋ค. ๋ค๋ฅธ ํ๋ฅญํ ์๋ฐ์คํฌ๋ฆฝํธ ๋๊ตฌ๋ค๊ณผ ํจ๊ป ์น ๋๊ตฌ ๋ฒค์น๋งํฌ์ ์ผ๋ถ๊ฐ ๋ ๊ฒ์ ๊ธฐ์๊ฒ ์๊ฐํ๋ค.
๋ฐ๋ฒจ์ ํ์ฌ ํ๋ฆฌ์ ๊ณผ ํ๋ฌ๊ทธ์ธ ์ต์ ์ ์ง์ํ๊ณ ์๋ค. ๋ฐฐ์ด์ ํ๋ฌ๊ทธ์ธ์ ๊ฐ์ธ๊ณ ์ต์ ๊ฐ์ฒด๋ฅผ ํ๋ฌ๊ทธ์ธ์ ์ ๋ฌํ ์ ์๋ค.
{
"plugins": [
- "pluginA",
+ ["pluginA", {
+ // options here
+ }],
]
}
์ผ๋ถ ํ๋ฌ๊ทธ์ธ์ loose
์ต์
์ ์กฐ๊ธ ๋ณ๊ฒฝํ๊ณ ๋ค๋ฅธ ํ๋ฌ๊ทธ์ธ๋ค์ ์ํ ์๋ก์ด ์ต์
์ ์ถ๊ฐํ๋ค! ์ด ์ต์
๋ค์ ์ฌ์ฉํ๋ ค๋ฉด ๋น๊ท๊ฒฉ ์ค์ ๋์(noe-spec compliant behavior)์ ์ ํํ๊ณ ๋ฌด์์ ํ๊ณ ์๋์ง ์์์ผ ํ๋ค. ์ด๋ ๋ค์ดํฐ๋ธ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๊ธฐ ์ํด ์ปดํ์ผ์ ๋ ๋ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค. ์ด๋ฌํ ์ข
๋ฅ์ ์ต์
๋ค์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข๋ค.
class A {}
๊ฐ classCallCheck
ํฌํผ๋ฅผ ํฌํจํ์ง ์์ ๊ฒ์ด๋ค.class A {}
var A = function A() {
- _classCallCheck(this, A);
};
for-of
๋ฃจํ์์ ์ฌ์ฉ๋๋ ๊ฐ์ด ๋ฐฐ์ด์ธ ๊ฒฝ์ฐ์ ์๋ก์ด ์ต์
["transform-for-of", { "assumeArray": true }]
์ ์ฌ์ฉํ ์ ์๋ค.let elm;
for (elm of array) {
console.log(elm);
}
let elm;
for (let _i = 0, _array = array; _i < _array.length; _i++) {
elm = _array[_i];
console.log(elm);
}
preset-env
์ ์ํด loose
๋ชจ๋์์ transform-typeof-symbol
ํ๋ฌ๊ทธ์ธ์ ์ ์ธํ๋ค. #6831์ฐ๋ฆฌ๋ ์ด๋ฏธ ์ด๋ฌํ ์ผ์ ์ฒ๋ฆฌํ๋ ๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐพ์์ผ๋ฏ๋ก, ๊ธฐ๋ณธ์ ์ผ๋ก ์ด ์์ ์ ์ฒ๋ฆฌํ๋๋ก ํ๋ค.
๊ธฐ๋ณธ ๋์์ ๋ฐ๋ฒจ์ ๋๊ฑฐ๋ preset-env
๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๊ฐ๋ฅํ ํ ๊ท๊ฒฉ์ ์ค์ํ๋ ๊ฒ์ด๋ ์ ์ ์ฉ๋์ ์์ํ์ ํ์๋ก ํ ์๋ ์๋ค(๊ฐ ํ๋ก์ ํธ๋ง๋ค ์ ์ถฉ์์ ๋ง๋ค ์ ์๋ค). ์ฐ๋ฆฌ๋ ์ด ์ผ์ ์ฝ๊ฒ ํ ์ ์๋๋ก ๋ ๋์ ๋ฌธ์์ ๋๊ตฌ๋ฅผ ๋ง๋ค๋ ค๊ณ ํ๋ค.
#6209 ์ดํ์, ํธ๋์คํ์ผ ๋ ES6 ํด๋์ค๋ค์ /*#__PURE__*/
์ฃผ์์ด ๋ฌ๋ฆฌ๊ฒ ๋์๋ค. ์ด ์ฃผ์์ ์ฌ์ฉ๋์ง ์๋ ์ฝ๋๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด Uglify
์ babel-minify
์ ๊ฐ์ ๋ฏธ๋ํ์ด์ด์๊ฒ ํํธ๋ฅผ ์ ๊ณตํ๋ค. ์ด ์ฃผ์์ ๋ค๋ฅธ ํฌํผ ํจ์์๋ ์ถ๊ฐ๋์๋ค.
class C {
m() {}
}
var C =
/*#__PURE__*/
function () {
// ...
}();
๋ฏธ๋ํ์ด์ด ํํธ์ ์ต์ ํ์ ๋ํ ๋ ์ข์ ๋ฐฉ๋ฒ๋ค์ด ์๋ค๋ฉด ์๋ ค์ฃผ๊ธธ ๋ฐ๋๋ค!
์คํ ์ด์ง ํ๋ฆฌ์ ์ ์ ๊ฑฐํ๊ณ , ์คํ ์ด์ง 4 ๋ฏธ๋ง์ ์ ์์ ๋ํด์๋ ์ฌ์ฉ์๊ฐ ์ง์ ๋ช ์ํ๋๋ก ๋ณ๊ฒฝํ ์ ์ฑ ์ ๋ํด ๋ค์ ํ ๋ฒ ์ธ๊ธํ๊ณ ์ถ๋ค.
ํ ๊ฐ์ง ์ฐ๋ ค๋๋ ์ ์, ์ฌ๋๋ค์ด ์ด๋ค ๋ฌธ๋ฒ์ด ์์ผ๋ก ๋ณ๊ฒฝ๋์ง ์์ ๊ฑฐ๋ผ๋ ์ฐฉ๊ฐ์ ํ๋๋ก ๋ง๋๋ ๊ฒ์ ์๋๊น ํ๋ ์ ์ด๋ค. ํ์ง๋ง, ์ด๋ ์ฌ์ค์ด ์๋๋ฉฐ, ํนํ ์คํ ์ด์ง 0 ๋๋ 1์ ๊ฒฝ์ฐ ์์ผ๋ก ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ฑ ๋๋ค. ์ด ๊ธ์์ ์๋ก์ด ์์ด๋์ด์ ๋ํ ์์ธํ ์ด์ผ๊ธฐ๋ฅผ ๋ค๋ฃจ๊ณ ์๋ค.
์ฌ๊ธฐ ๋ฐ๋ฒจ์ด ์ง์ํ๋ ์๋ก์ด ๊ตฌ๋ฌธ์ ๋ํ ๋ชฉ๋ก์ด ์์ผ๋ฉฐ(์ด ๊ธฐ๋ฅ๋ค์ ์ถ๊ฐ, ์ญ์ , ์ค์ง๋ ์ ์๋ค๋ ์ ์ ์ ์ํ๊ธฐ ๋ฐ๋๋ค), ์ด๋ค์ ๋ชจ๋ 7 ๋ฒ์ ์ ์ถ๊ฐ๋์๋ค.
var a = { b, ...c }
)new.target
class A { #b = 2 }
)class A { static #a() {} }
)try { throw 0 } catch { do() }
import("a")
)import.meta
(syntax only) (import.meta.url
)1_000
)function.sent
export-namespace-from
(export * as ns from 'mod'
), export-extensions
์์ ๋ถ๋ฆฌ๋์๋ค.export-default-from
(export v from 'mod'
), split from export-extensions
a?.b
)a &&= b; a ||= b
)a ?? b
)a |> b
)() => throw new Error("a")
)๋ชจ๋ ์ ์๋ค์ ๋ณ๊ฒฝ ์ฌํญ์ ๋งค๋ฒ ํ์ธํ๋ ๊ฒ์ ๋๊ตฌ์๊ฒ๋ ์ด๋ ค์ด ์ผ์ด๋ฏ๋ก, ์ฐ๋ฆฌ๊ฐ ์ ๋ฆฌํ๊ณ ์๋ babel/proposals๋ฅผ ํ์ธํ๊ธธ ๋ฐ๋๋ค.
@babel/preset-typescript
)์ฐ๋ฆฌ๋ ํ์
์คํฌ๋ฆฝํธ ํ๊ณผ ํ๋ ฅํด ๋ฐ๋ฒจ์ด @babel/preset-typescript
๋ฅผ ์ฌ์ฉํ์ฌ ํ์
๊ตฌ๋ฌธ์ ํ์ฑํ๊ณ ๋ณํํ ์ ์๋๋ก ํ๋ค. @babel/preset-flow
๋ก ํ๋ก์ฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ๊ณผ ๋น์ทํ๋ค.
๋ ์์ธํ ๋ด์ฉ์ ํ์ ์คํฌ๋ฆฝํธ ํ์ด ์์ฑํ ๊ธ์ ํ์ธํ๋ผ!
์ด์ (ํ์ ์ด ์ฌ์ฉ๋จ):
interface Person {
firstName: string;
lastName: string;
}
function greeter(person : Person) {
return "Hello, " + person.firstName + " " + person.lastName;
}
์ดํ(ํ์ ์ด ์ ๊ฑฐ๋จ):
function greeter(person) {
return "Hello, " + person.firstName + " " + person.lastName;
}
ํ๋ก์ฐ์ ํ์ ์คํฌ๋ฆฝํธ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฌ์ฉ์๊ฐ ์ ์ง์ ์ธ ํ์ดํ์ ํ ์ ์๊ฒ ๋์์ฃผ๋ ๋๊ตฌ์ด๋ฉฐ, ๋ฐ๋ฒจ์์ ์ด ๋ ๊ฐ์ง๋ฅผ ๋ชจ๋ ์ฌ์ฉํ๊ณ ์ ํ๋ค. ์ฐ๋ฆฌ๋ ํธํ์ฑ์ ์ ์งํ๊ณ ์๋ก์ด ๊ธฐ๋ฅ์ ์ง์ํ๊ธฐ ์ํด ํ์ด์ค๋ถ๊ณผ ๋ง์ดํฌ๋ก์ํํธ ํ๊ณผ ๊ฐ๊น๊ฒ ์ผํ ๊ณํ์ด๋ค.
์ด ํตํฉ์ ์๋กญ๊ธฐ ๋๋ฌธ์ ๋ช๋ช ๊ตฌ๋ฌธ์ ์๋ฒฝํ๊ฒ ์ง์๋์ง ์์ ์ ์๋ค. ์ด์๋ฅผ ๋ฆฌํฌํ ํ๊ฑฐ๋ PR์ ๋ ๋ ค์ฃผ๋ฉด ๊ฐ์ฌํ๊ฒ ๋ค.
<>
)๋ฆฌ์กํธ ๋ธ๋ก๊ทธ์์ ์ธ๊ธํ๋ฏ์ด, JSX ํ๋ ๊ทธ๋จผํธ๋ beta.31
๋ถํฐ ์ง์๋์๋ค.
render() {
return (
<>
<ChildA />
<ChildB />
</>
);
}
// output ๐
render() {
return React.createElement(
React.Fragment,
null,
React.createElement(ChildA, null),
React.createElement(ChildB, null)
);
}
babel-upgrade PR์ ์งํ์ค์ด๋ค.
@babel/runtime
์ @babel/runtime
๊ณผ @babel/runtime-corejs2
๋ก ๋ถ๋ฆฌ๋์๋ค. (PR) @babel/runtime
์ ๋ฐ๋ฒจ ํฌํผ ํจ์๋ง ํฌํจํ๊ณ ์์ผ๋ฉฐ, @babel/runtime-corejs2
์ ๋ฐ๋ฒจ ํฌํผ ํจ์ ๋ฟ๋ง ์๋๋ผ Symbol
, Promise
์ ๊ฐ์ ๋ค๋ฅธ ํด๋ฆฌํ ํจ์๋ค๋ ํฌํจํ๋ค.
๋ฐ๋ฒจ์ ์ฌ์ฌ์ฉ ๋ ์ ์๋ ์ฝ๋์ ์ด๋ค ํจ์๋ฅผ ์ฃผ์ ํด์ผ ํ ์๋ ์๋ค. ์ด๊ฒ์ ๋ชจ๋ ๊ฐ์ ๊ณต์ ๋๋ ํจ์์ฒ๋ผ "ํฌํผ ํจ์"๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ด๊ฒ์ ๋ํ ์์ ๋ก class
์ปดํ์ผํ๋ ๊ฒ์ ๋ค ์ ์๋ค. (loose
๋ชจ๋๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ)
๋ช
์ธ์ ๋ฐ๋ฅด๋ฉด ํด๋์ค๋ฅผ ํธ์ถํ ๋์๋ new Person()
๊ณผ ๊ฐ์ด ์ฌ์ฉํด์ผ ํ์ง๋ง, ํด๋์ค๊ฐ ํจ์๋ก ์ปดํ์ผ๋๊ณ ๋ ํ์๋ ๊ธฐ์ ์ ์ผ๋ก Person()
์ด๋ผ๊ณ ํธ์ถํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์, ๋ฐํ์์ ์ด๋ฅผ ์ํ ์ฒดํฌ๋ฅผ ์ถ๊ฐํด์ฃผ๊ณ ์๋ค.
class Person {}
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var Person = function Person() {
_classCallCheck(this, Person);
};
๋ํ๋์๋ก์จ @babel/plugin-transform-runtime
๊ณผ @babel/runtime
์ ์ฌ์ฉํ๋ฉด, ๋ฐ๋ฒจ๋ก ๊ฐ๋ณ ํจ์๋ฅผ ์ถ์ถํ ์ ์๊ณ ๋ค์์ฒ๋ผ ๋ชจ๋์ ํฌํจ์ํฌ ์ ์๋ค.
var _classCallCheck = require("@babel/runtime/helpers/classCallCheck");
var Person = function Person() {
_classCallCheck(this, Person);
};
๊ฐ์ ๋์์ ํ๋ ๊ฒ์ผ๋ก external-helpers
์ rollup-plugin-babel
์ด ์๋ค. ์ฐ๋ฆฌ๋ ์์ผ๋ก ์ด ์์
์ ์๋์ผ๋ก ํด์ค ์ ์๋์ง๋ฅผ ์กฐ์ฌํ๊ณ ์๋ค. ์กฐ๋ง๊ฐ ๋ฐ๋ฒจ ํฌํผ์ ๋ํ ๊ธ์ ์ฐพ์๋ณด์๋ผ.
ํด๋ฆฌํ์ Promise
, Symbol
๊ณผ ๊ฐ์ ๊ธฐ๋ฅ๋ค์ด ์ง์๋์ง ์๋ ํ๊ฒฝ์์ ์ฌ์ฉํ ์ ์๋๋ก ๋์์ค๋ค. ์ปดํ์ผ๋ฌ๋ก์จ ๋ฐ๋ฒจ(๊ตฌ๋ฌธ ๋ณํ)๊ณผ ํด๋ฆฌํ์ด ํ๋ ์ผ(๋ด์ฅ๋ ํจ์/๊ฐ์ฒด ๊ตฌํ)์ ๊ตฌ๋ถํ๋ ๊ฒ์ ์ค์ํ๋ค.
@babel/polyfill
์ ์ฌ์ฉํ๋ฉด ํฌํจํ๋ ๋ชจ๋ ๊ฒ์ ๊ฐ์ ธ์ค๊ธฐ์ ์ฝ๋ค.
import "@babel/polyfill";
์ด๊ฒ์ ์ ์ฒด ํด๋ฆฌํ์ ํฌํจํ์ง๋ง, ๋ธ๋ผ์ฐ์ ์์ ์ด๋ฏธ ๊ธฐ๋ฅ์ ์ง์ํ๋ ๊ฒฝ์ฐ ๋ชจ๋ import ํ ํ์๊ฐ ์๋ค. ์ด๋ @babel/preset-env
๋ก ๊ตฌ๋ฌธ์ ํด๊ฒฐํ๋ ค๊ณ ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฌธ์ ์ด๋ค. useBuiltins: "entry"
์ต์
์ ์ฌ์ฉํ๋ฉด ์ ์ฒด์์ ํ์๋ก ํ๋ ๊ฒ๋ง ๋ถํ ํด์ import ํ๊ฒ ๋๋ค.
๊ทธ๋ฌ๋ ์ฝ๋์์์ ์ฌ์ฉ๋๋ ํด๋ฆฌํ๋ง import ํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข๋ค. "useBuiltIns: "usage"
๋ ์ด๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ์ฒซ ์๋์ด๋ค. (๋ฌธ์)
์ด ์ต์ ์ ๊ฐ ํ์ผ์ ํตํด ์คํ๋๋ฉฐ, ์ฝ๋์์ "์ฌ์ฉ๋๋" ๊ฒ๋ง ๊ฐ ํ์ผ์ ์ต์๋จ์์ import๋ก ์ฃผ์ ๋๋ค. ๋ค์์ ์์ด๋ค.
import "core-js/modules/es6.promise";
var a = new Promise();
์๋ ์ถ๋ก ์ ์๋ฒฝํ์ง ์์ผ๋ฉฐ ๊ฑฐ์ง์ด ์์ ์ ์์์ ์ ์ํ๋ผ.
import "core-js/modules/es7.array.includes";
a.includes // assume a is an []
์ด ๋ถ์ผ์ ๋ ๋ค๋ฅธ ์์ด๋์ด๋ก๋, ์๋น์ค์ ์์กดํ๋ ๊ฒ์ด ๊ด์ฐฎ๋ค๋ฉด polyfill.io๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. (๋๋ Kent C. Dodds๊ฐ ์ฌ์ฉํ ํ์ดํ์์ ํธ์คํ ๋ ์๋น์ค๋ฅผ ๋น๋ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ธ์ ์ฝ์ด๋ณด๋ผ)
๋ฐ๋ฒจ์ ์ข์ ์ ์ ์ฐ๊ฒฐ ๊ฐ๋ฅํ ๋๊ตฌ๋ผ๋ ๊ฒ์ด๋ค. ์๋ ์ ๊ฑธ์ณ, ๋ฐ๋ฒจ์ ์ฝ๋ ๋ณํ ํ๋ซํผ ์์ "6to5" ์ปดํ์ผ๋ฌ(์ญ์์ฃผ: ES6 ์ฝ๋๋ฅผ ๋ฐ๋๋ผ ES5 ์ฝ๋๋ก ๋ณ๊ฒฝ)๊ฐ ๋์๋ค. ์ฌ์ฉ์์ ๊ฐ๋ฐ์ ๊ฒฝํ์ ์ํด ๋ช ๊ฐ์ง ๋ฉ์ง ์ต์ ํ๋ฅผ ํ๋ค. ํน์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ API ์ฑ๋ฅ ๋ฐ ํธํ์ฑ์ ๊ฐ์ ํ๊ธฐ ์ํ ์ฌ์ฉ ์ฌ๋ก๋ก๋ถํฐ ์๋ง์ ๋ฐ๋ฒจ ํ๋ฌ๊ทธ์ธ์ด ๊ฐ๋ฐ๋์๋ค. (์ผ๋ถ "๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค"์ ์๋ฒฝํ๊ฒ ๋ณํ๋์ด ๋ฐํ์์ด ์ ํ ์๋ค)
๋ถํํ๊ฒ๋, ์ฝ๋์์ ์ด๋ฌํ ํ๋ฌ๊ทธ์ธ๋ค์ ์ถ๊ฐํ๋ ๊ฒ์ ์ค์ ๋ณ๊ฒฝ์ ํ์๋ก ํ๋ค(create-react-app๊ณผ ๊ฐ์ ์ด๋ค ํดํท๋ค์ ํ์ํ์ง ์๋ค). ๊ทธ๋ฆฌ๊ณ ๋ฐ๋ฒจ์ด ์คํ๋๋ฉด์ ์ผ์ด๋ ์ผ๋ค์ ๋ํด์ ๊ฐ๋ฐ์๊ฐ ์์์ผํ๊ธฐ ๋๋ฌธ์ ์ฝ๋๋ ๋ ๋ณต์กํด์ง๋ค. ์ด๋ฌํ ๋ฌธ์ ์ ๋ค์ Kent C. Dodds์ babel-plugin-macros๋ก ํด๊ฒฐ๋ ์ ์๋ค.
์ผ๋จ babel-plugin-macros
๋ฅผ ์ค์นํ๊ณ ์ค์ ํ์ผ์ ์ถ๊ฐ(์ด๊ฒ์ create-react-app
๋ฒ์ 2๋ฅผ ํฌํจํ๋ค)ํ๋ฉด, ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ค์ ์ ๊ณ ๋ฏผํ ํ์๊ฐ ์๋ค. ์ถ๊ฐ๋ก ์ฑ์ด๋ ์ฝ๋ ํน์ ๋ถ๋ถ์ ์ํด ์ฌ์ฉ์ ์ ์ ๋ณํ์ ์์ฑํ๊ธฐ์๋ ์ฝ๋ค.
"babel-plugin-macros์ ํจ๊ป ํ๊ฒฝ ์ค์ ์๋ ์ฝ๋ ๋ณํ"์ ๋ํ ์๋ฌธ์์ babel-plugin-macros
์ ๋ํด ๋ ๋ฐฐ์ธ ์ ์๋ค.
๋ฐ๋ฒจ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ฑ์์๊ฒ ์ ๊ณต๋๋ ๋ณํ๊ณผ ํธํ์ฑ ์ํฅ์ ๊ท ํ์๊ฒ ๋ง์ถ๋ ค๊ณ ๋ ธ๋ ฅํด ์๋ค. ๋ฐ๋ฒจ 7์์๋ ๋ชจ๋/๋ชจ๋ ํจํด์ ์ธ๊ธฐ๊ฐ ๋์์ง์ ๋ฐ๋ผ ๋ฐ๋ฒจ ์ค์ ์ด ํจ์ฌ ์ฌ์์ก๋ค.
ํนํ ๋ฐ๋ฒจ๋ก ํธ๋์คํ์ผ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํด ์ธ๊ธฐ์๋ ์น ํ๋ ์์ํฌ(1, 2) CLI ๋๊ตฌ๋ค์ ํตํด ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๊ฐ ์ฝ 20% ์ ๋ ๊ฐ์๋๋ ํจ๊ณผ๋ฅผ ๋ณด์๋ค.
@babel/core
์ caller
์ต์
์ ์ถ๊ฐํด ํ๋ฆฌ์
/ํ๋ฌ๊ทธ์ธ์ ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ์ ์๋ค. ์๋ฅผ ๋ค์ด, babel-loader
๋ ์ด์ ๊ฐ์ ๊ฒ์ ์ถ๊ฐํ์ฌ preset-env
๊ฐ ์๋์ผ๋ก ๋ชจ๋ ๋ณํ์ ๋ชปํ๊ฒ ํ ์ ์๋ค. (rollup
๊ณผ ๋์ผ)
babel.transform("code;", {
filename,
presets: ["@babel/preset-env"],
caller: {
name: "babel-loader",
supportsStaticESM: true,
},
});
์ด ์ต์
์ ๊ธฐ๋ณธ ์ค์ ์ ์ข๊ฒ ๋ง๋ค์ด ์ถ๊ฐ ์ค์ ์ ๋ ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๊ธฐ ํฅ๋ฏธ๋กญ๋ค. ๋๋ฌธ์ ์นํฉ/๋กค์
์ ๊ฒฝ์ฐ, ๋ฐ๋ฒจ ๋์ ์ ์์ฒด ๋ชจ๋ ๋ณํ์ ์ฌ์ฉํ๋๋ก ์๋์ผ๋ก ์ง์ฐ์ํฌ ์ ์๋ค. (import("a")
์ ๋์ผ) ๋ฏธ๋์ ์ด ๊ธฐ๋ฅ์ ํ์ฉํ ์ ์๋ ํด๋ง์ ๋ ๋ง์ด ์ฐพ์๋ณด๋ผ.
class C extends HTMLElement {}
๊ฐ์ฅ ์ค๋๋ ์ด์๋ ์ ๋ชฉ์ ์๋ค. (์ฐธ์กฐ)
๋ฐ๋ฒจ์ ๋ค์ดํฐ๋ธ ๋ด์ฅ ๊ฐ์ฒด(Array
, Error
๋ฑ)์ ๋ํ ํ์ฅ์ ์ง์ํ ์ ์๋ค๋ ๊ฒฝ๊ณ ๋ฅผ ํญ์ ํฌํจํ๊ณ ์์์ผ๋, ์ด์ ๋ ์ง์ํ ์ ์๋ค! ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ๋ํด ๋ง์ ๋ฌธ์ ๋ค์ ๊ฒช์๋ค. ๐ Andrea์ฒ๋ผ ์ถํํ๋ค!
์ด ๋ณ๊ฒฝ ์ฌํญ์ ํด๋์ค ํ๋ฌ๊ทธ์ธ์ ์ ์ฉ๋์์ผ๋ฏ๋ก, preset-env
์ ์ฌ์ฉํ๋ค๋ฉด ์๋์ผ๋ก ํ์ฑํ๋์ด์ผ ํ๋ค.
์ฐ๋ฆฌ์ ์ฌ์ดํธ๋ฅผ Jekyll์์ Docusaurus๋ก ๋ณ๊ฒฝํ๋ค.
์ฐ๋ฆฌ๋ Crowdin์ผ๋ก ๋ฒ์ญ์ ์งํํ๊ณ ์์ผ๋ฉฐ, ๋ฐ๋ฒจ 7์ ์ด๊ฒ์ ํ๊ธฐ์ ์ข๋ค.
๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ก REPL์ ๋ค์ ์์ฑํ์ผ๋ฉฐ, Ives์ ํ๋ ฅํด CodeSandbox๋ฅผ ์ ํตํฉํ๋ค. ์ด๊ฒ์ REPL๋ก npm์์ ์ด๋ค ํ๋ฌ๊ทธ์ธ ๋๋ ํ๋ฆฌ์ ์ ์ค์นํ ์ ์๋๋ก ๋์์ค๋ค. ๊ทธ๋ฟ๋ง ์๋๋ผ CodeSandbox์์ ๊ฐ์ ธ์ค๋ ๋ชจ๋ ์ ๋ฐ์ดํธ๋ ๊ฐ์ ธ์ฌ ์ ์๋ค.
์ฐ๋ฆฌ๋ Rails Girls Summer of Code์ ๋ค์ ์ฐธ์ฌํ๊ณ ์๋ค! Gyujin๊ณผ Sujin์ Boopathi์ babel-time-travel์ REPL์ ํตํฉํ๊ธฐ ์ํด ์ด์ฌํ ๋ ธ๋ ฅํ๊ณ ์๋ค.
๋ฐ๋ฒจ, ASTs ๋ฐ ๋ค๋ฅธ ๋๊ตฌ๋ค์ด ์ ๋์ํ๋๋ก ๋ง๋ค ์ ์๋ ๊ธฐํ๊ฐ ์ฌ๊ธฐ ์๋ค.
ํ ๋ ๋ฃจ์ผ - ๋ฐ๋ฒจ์ ์ฐฌ์ก๊ฐ
์ด๋ ๋ Angus๋ ๋๋ผ์ด ๋ ธ๋๋ฅผ ์ฐ๋ฆฌ์๊ฒ ์ ์ฌํ๋๋ฐ, ์ด์ฐ "๊ณต์์ ์ธ" ๋ ธ๋๋ฅผ ๋ง๋ค์ง ์์์๊ฐ ์๊ฒ ๋๊ฐ? Shawn์ ์ฌ๊ธฐ์ ๋ฉ์ง ์ปค๋ฒ๊ณก์ ๋ง๋ค์๋ค.
๋ฆฌํฌ์งํฐ๋ฆฌ์ SONG.md์์ ์ฐพ์ ์ ์๋ค. ์ฐ๋ฆฌ๋ ๋ค๋ฅธ ํ๋ก์ ํธ๋ค์ด ์ด๊ฒ์ ๋ฐ๋ผํด๋ณด๊ธธ ๋ฐ๋๋ค!
๋ฐ๋ฒจ์ ๋ณธ์ง์ ์ผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ปดํ์ผํ๋ ๊ฒ๊ณผ ์ฐ๊ฒฐ๋์ด ์๋ค. ์ ์/์์ ํ ์๋ก์ด ์ถ๊ฐ ์ฌํญ๋ค์ด ์์ ๋ ์ํํด์ผ ํ ์ผ๋ค์ด ์๋ค. ์ด ์์ ์๋ "์์ ํ" ๋๊ธฐ ์ ๊ตฌ๋ฌธ์ ๊ตฌํํ๊ณ ์ ์งํ๊ธฐ ์ํ ์๊ฐ/๋ ธ๋ ฅ์ด ํฌํจ๋๋ค. ์ฐ๋ฆฌ๋ ์ ๊ทธ๋ ์ด๋ ๊ณผ์ , ์๋ก์ด ๊ธฐ๋ฅ ๊ต์ก, ํ์ค/์ธ์ด ๋์์ธ ๊ต์ก, ์ฌ์ฉ ํธ์์ฑ ๋ฐ ๋ค๋ฅธ ํ๋ก์ ํธ์์ ํตํฉ ๋ฑ ๋ชจ๋ ๊ณผ์ ์ ์ ๊ฒฝ ์ด๋ค.
babel-minify
๋ฅผ ๊ด๋ฆฌํด์๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ๊ทธ๋ค์์ 1.0 ๋ฒ์ ์ ์ค๋นํ ๊ฒ์ด๋ค!loose
/์คํ ์ต์
์ฌ์ค๊ณ, ์บ์ฑ, ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ๋ฒจ ์ฌ์ฉ, CI๋ก๋ถํฐ ์์ฒด ๊ตฌ์ถ, ์ค๋ชจํฌ ํ
์คํธ(smoke test), test262 ์คํ ๋ฑ ์๋ก์ด ๊ธฐ๋ฅ์ด ๋ง์ด ์๋ค. ๋ค๋ฅธ ์์ด๋์ด์ ๋ํด์๋ ์ด ๋ก๋๋งต ๋ฌธ์๋ฅผ ํ์ธํ๋ผ!์ฐ๋ฆฌ์๊ฒ๋ ์จ๊ฒจ์ง ๊ณํ์ด ์๋ค. ์ฐ๋ฆฌ๋ ์ด ์ปค๋ฎค๋ํฐ์ ๋ด์ฌํ๋ ๊ฒ์ผ๋ก ์ต์ ์ ๋คํ๊ณ ์๋ค.
์ฐ๋ฆฌ์๊ฒ ๋ชจ๋ ์์ด๋์ด๋ฅผ ๋ฌ์ฑํ ์ ์๋ ์๊ฐ๊ณผ ์์์ด ์๋ค๋ฉด ์ ๋ง ์ข์ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ ์ด๋ฒ ์ถ์์์ ๋ณด์ฌ์ฃผ์๋ฏ์ด ์์๋ณด๋ค ๊ต์ฅํ ์ค๋ ๊ฑธ๋ฆฐ๋ค!
์ด๋ฒ ์ถ์๋ ์ ์ด๋ ๊ฒ ์ค๋ ๊ฑธ๋ฆฐ ๊ฑธ๊น? ์ถ๊ฐํ๊ฑฐ๋ ๊ณ ์น ์ ์๋ ๊ฒ๋ค ์ค์์ ์ฐ์ ์์๋ฅผ ์ ์ ํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ธ๊ฐ? ๋๊น์ง ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ์ ๋์์ ๋ฌธ์ ๋ฅผ ๋น๊ตํ๋ฉด์ ๊ณ ์ณ์์ธ๊ฐ? ๊นํ, ์ฌ๋, ํธ์ํฐ์์ ๋ค๋ฅธ ์ฌ๋๋ค์ ๋์์ฃผ๋๋ผ ์ฐ๋งํด์ ธ์์ธ๊ฐ? ์๊ฐ์ ์์ธกํ๊ณ ์ด๋ฌํ ๋ฌธ์ ๋ค์ ์ด๋ ค์์ ์ดํดํ๋ฉด์ ์์๋ด์ฌ์๋ก์ ๊ณผ๋คํ ์ปค๋ฐ์ ํ๋ ๊ฒ์ ๋์๊ฐ?
์ฐ๋ฆฌ๋ ์์ ์ ๋ํ ๊ธฐ๋์น๋ฅผ ๋๋ฌด ๋๊ฒ ์ฑ ์ ํ ๊ฑธ๊น? ๋๋ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์์ ์ ํ์์ ๋ฐ๋ผ ์๋ ฅ์ ๊ฐํ๊ณ ์๋๊ฐ? ๋๋ ๋ฒ๊ทธ๊ฐ ํด๊ฒฐ๋์ง ์์ ์ด์ ์ ๋์์ ์ ์ถ์๋์ง ์๋์ง๋ฅผ ๋ฌป๋ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ฉด ๋ฌด์ญ๋ค. ๊ทธ๊ฒ๋ค์ ๊ธํ ๋๋ด๊ณ ์ถ์ง๋ง ์ด๊ฒ์ ์ง์งํ๊ฒ ๋ฐ์๋ค์ฌ์ผ ํ๋ค.
๋๋ ์ง๋ ์ฃผ React Rally์์ ์ด๋ฌํ ์๊ฐ๋ค๊ณผ ๊ณ ์๋ค์ ํ ๋กํ๊ณ ์ ํ๋ค. (์คํ ์์ค) ์ ๋ฆฌ์์ ๋ณด๋ ๊ฒ์ ํตํด, ๋น์ ์ด ์ด๋ฐ ๋ด์ฉ๋ค์ ๋ค์ ์ ์๋ ๊ธฐํ๊ฐ ๋๊ธธ ๋ฐ๋๋ค. ๋ด ์์ ์๊ฒ ๋ฌป๋ ์ง๋ฌธ์ผ๋ก๋ ์ ์ง ๋ณด์ ์์ ์๊ฐ์ด ๋์ด๋๊ณ , ๋ถ์ํดํ๊ณ , ๋นํ์ค์ ์ธ ๊ธฐ๋์ ๋ํ ํผํ ์์๋ ์ฌ์ดํด์ ๋ํด ์ด๋ป๊ฒ ํด์ผ ํ๋๊ฐ์ด๋ค.
์ถ์ ๋ง์ ๋ถ๋ถ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก, ์ฐ๋ฆฌ๊ฐ ํ๋ ์ผ์ ์ฑ๊ฒฉ์ ๋ฐ์ํ๊ณ ์ฐ๋ฆฌ๊ฐ ์ค์ ๋ก ์ด๋ค ๋ชจ์ต์ธ์ง๋ฅผ ๋ณด์ฌ์ค๋ค. ์ฐ๋ฆฌ๊ฐ ํ๋ ํ๋์ ๊ทธ ์์ฒด๋ก ๋ ์ข๋ ๋์๋ ๊ฐ์ ์ฐ๋ฆฌ๋ฅผ ๋ณํ์ํฌ ์ ์๋ค. ์ฐ๋ฆฌ์ ์ผ์ ์ง์งํ๊ฒ ๋ฐ์๋ค์ธ๋ค๋ฉด, ์ฐ๋ฆฌ ๋ฌธํ์ ์์ฃผ ๊น์์ด ๋ฐํ์๋ ์ต๊ด๋ค์ ๋ํด ์ฑ ์๊ฐ์ ๊ฐ์ ธ์ผํ๋ค. ์ด ์ต๊ด๋ค์ ์ฆ๊ฐ์ ์ธ ํฌ์ด, ์งํ์์ ์ฑ๊ณต, ๊ถ๋ฆฌ ๋ถ์ฌ vs ๊ฐ์ฌ, ๊ณผ์ ์ ๋ํ ์๋ถ์ฌ์ด๋ค.
์ด ๋ชจ๋ ๊ฒ์๋ ๋ถ๊ตฌํ๊ณ , ์ด๋ฒ ์ถ์๋ ๊ฐ์น์์๋ค.
๋ฐ๋ฒจ 7 ์ถ์๋ ์ ๋ง๋ก ํฅ๋ฏธ๋ก์ด ์ผ์ด๋ค. ์ฐ๋ฆฌ๊ฐ ์ฑ์ทจํ๊ณ ์คํํ ๊ฒ๋ค์ ๋๋์๋ณผ ๋ฟ๋ง ์๋๋ผ ์๋ ์ ์ผ๋ง๋ ๋ง์ ์๊ฐ๊ณผ ๋ ธ๋ ฅ์ ํฌ์ ํ๋์ง๋ฅผ ์ ์ ์๋ค. ์ด ๊ณผ์ ์์ ์ผ์ด๋ ๊ธฐํ์ ๊ฒฝํ๋ค์ ๋ฏฟ๊ธฐ ์ด๋ ค์ธ ์ ๋๋ค. ์ ์ธ๊ณ์ ๊ธฐ์ ๋ค๊ณผ ์ํธ ์์ฉํ๋ฉด์ ๋์์ฃผ์๊ณ , ๋ฐฉ๋ฌธํ ๋ชจ๋ ๋์์์ ์น๊ตฌ๋ค์ ๋ง๋ฌ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๋ฏฟ์ ์ ์๋ ์ฌ์ ์ ๋ํด ์์งํ๊ฒ ์ด์ผ๊ธฐํ๋ฉด์ ์ฐ๋ฆฌ๋ ํจ๊ป ํด์๋ค.
๊ฐ์ธ์ ์ผ๋ก ๋๋ ๋ง์ ์ ์ ์ ์ธ ์๋์ง๋ฅผ ์์๋ถ์ง ์์ ์ ์์๊ณ , ์ฌ์ ๊ณผ ํจ๊ป ํ ๋ง์ ์ฌ๋๋ค์๊ฒ ๊ฐ์ฌํ๋ค. ํนํ Logan Smyth์ Brian Ng์๊ฒ ์ ๋ง ๊ฐ์ฌํ๋ค. Logan Smyth๋ ํต์ฌ ๋์ ๋ฐฉ์์ ๋ณ๊ฒฝํ๊ธฐ ์ํด ๋ง์ ์๊ฐ์ ๋ณด๋๊ณ ํ๋ฆฌ๋์๋ก ์ผํ๋ ๋์์๋ ๋ฉ์ ์ ๋ก ์ฐ๋ฆฌ์๊ฒ ๋ง์ ๋์์ ์ฃผ์๋ค. Brian Ng๋ ๋ฐ๋ฒจ์ ๊ด๋ฆฌํ๊ณ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ๊ณผ ์ด์ผ๊ธฐ๋ค์ ๋ชจ๋ ๊ฒํ ํด์ฃผ์๋ค. Daniel Tschinder, Sven Sauleau, Nicolรฒ Ribaudo, ๊ทธ๋ฆฌ๊ณ Justin Ridgewell ๋ชจ๋๊ฐ ์ด๋ฒ ์ถ์๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๊ณ ์ฆ๊ฒ๊ฒ ์์ ํ ์ ์๊ฒ ๋์์ฃผ์๋ค.
์ฌ๋, ํธ์ํฐ ๋ฐ ๊นํ์ ๋ชจ๋ ํ๋ก์ ํธ์ ์ปค๋ฎค๋ํฐ ํ์๋ค์๊ฒ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉ์๋ฅผ ์ํด ๋ฌด์์ ํ๋์ง ์ดํดํ ์ ์๋๋ก ์ธ์ณ๋ณธ๋ค. Behance/Adobe์ ์น๊ตฌ๋ค์๊ฒ ๊ฐ์ฌ์ ๋ง์ ์ ํ๋ค. ๊ทธ๋ค์ ๋ด๊ฐ ๋ฐ๋ฒจ์์ ํ ํ์์ผ๋ก ์ผํ๊ธฐ ์ ํํ ํ์์ผ๋ก ์ผํ ๋ ๊ฑฐ์ 1๋ ๋์ ํ์ํด์ฃผ์๋ค(๋ํ Babel 7์ ์์ฐ ์ ๋ฐ์ ๊ฑธ์ณ ํ ์คํธ ํ ์ ์๊ฒ ๋์์ฃผ์๋ค). Open Collective์ ์คํฐ์๋ค, ํนํ Trivago์ Handshake์๊ฒ๋ ๊ฐ์ฌํ๋ค. ๊ทธ๋ฆฌ๊ณ ์น๊ตฌ์ ๊ฐ์กฑ ๊ทธ๋ค์ ์ฌ๋๊ณผ ์ง์์ ๊ฐ์ฌ๋๋ฆฐ๋ค.
์ด ์์ ์์ ์ฐ๋ฆฌ๋ ๋ง์ด ์ง์ณค์ผ๋, ์ด๋ ๊ฒ ๋ด์ฌํ๋ ๊ฒ์ ์ง์ ์ผ๋ก ์๊ด์ด๋ฉฐ ํน๊ถ์ด์๋ค๊ณ ์๊ฐํ๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ๋น์ ์ด ์ด๋ฒ ์ถ์์ ๋ํด ๊ฐ์ฌํ๊ธธ ๋ฐ๋๋ค!