React ๊ตฌ์ฑ ์์์๋ .jsx ํ์ผ ํ์ฅ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด webpack์ .jsx ํ์ฅ์๋ฅผ ์ถ๊ฐํ๋ฉด ์ข์ง ์์๊น์?
์ด๊ฒ์ ๋ํ ๊ตฌ๋ฌธ ๊ฐ์กฐ ๋ฐ ๋ฆฐํ ์ ์ํํ๋ ํธ์ง์์๊ฒ๋ ๋์์ด ๋ฉ๋๋ค.
ํฅ๋ฏธ๋ก์ด. .jsx
๊ฐ ๊ถ์ฅ ํ์ฅ ํ๋ก๊ทธ๋จ์ด๋ผ๋ ์ ๋ณด๋ ์ด๋์ ์ป์ผ์
จ๋์? ๋๋ ๋น ๋ฅธ ๊ตฌ๊ธ ๊ฒ์์ํ์ง๋ง ์ด๊ฒ์ ๋ํ ๊ณต์์ ์ธ ์ฝ๋ฉํธ๋ฅผ ์ฐพ์ ์ ์์์ต๋๋ค. ๋ด Google foo๊ฐ ์ต๊ณ ๊ฐ ์๋์ ์ธ์ ํด์ผ ํฉ๋๋ค.
์, ์ ๋ ํธ์ง๊ธฐ์์ ์๋ ์ธ์ด ์ ํ์ ์ํด .jsx๋ฅผ ์ ํธํฉ๋๋ค.
์ค์ ๋ก JavaScript ํ๋ก์ ํธ Linting์์ ์ฃผ๋ก ์ฌ์ฉ๋๋ airbnb ์คํ์ผ ๊ฐ์ด๋ ์์.
@7s4r ์๊ฒ ์ต๋๋ค . ์์ด๋น์ค๋น ์คํ์ผ ๊ฐ์ด๋๋ฅผ ์๊ณ ์์ต๋๋ค. ๋ด๊ฐ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ ํ์ด์ค๋ถ์ด๋ babel์์ ์ง์ ์จ ๋๊ธ์ด์๋ค. ๊ทธ๋ฌ๋ ์์ด๋น์ค๋น ์คํ์ผ ๊ฐ์ด๋๊ฐ ์ข์ ์ ์ ํ์คํฉ๋๋ค. ์๋ง๋ ๋ ๊ฐ์ง๋ฅผ ๋ชจ๋ ์ง์ํ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ผ ๊ฒ์ ๋๋ค. ๋ฌธ์ ์ ๋ํ ์ค๋ช ์์ ์ด๋ฏธ ์ธ๊ธํ์ต๋๋ค. ๊ทธ๋์ ์ด๊ฒ์ ๋์๊ฒ์ :+1: ์ ์ป์ต๋๋ค. :).
.jsx
ํ์ฅ์ ์ง์ํ๋ ๋ฐ ์ ๋ฆฌํ ๋ ๋ค๋ฅธ ์ ์ ES6/ES2015๋ฅผ ๋์์ผ๋ก ํ ๋๋ง๋ค TypeScript๊ฐ ํด๋น ํ์ฅ์ผ๋ก ์ปดํ์ผ๋๋ค๋ ๊ฒ์
๋๋ค.
airbnb
/ eslint-plugin-react
์ด react/jsx-filename-extension ๊ท์น์ ๋ํด ๋ถํํ๊ณ ์์ต๋๋ค.
์ด์ ์นํฉ ๊ตฌ์ฑ์ ์กฐ์ํ ์ ์์ผ๋ฏ๋ก https://github.com/zeit/next.js#customizing -webpack-config๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
next.config.js๋ฅผ ์ฌ์ฉํ์ฌ ์ด ์์
์ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์๊ฐ ์์ต๋๊น? ๋ด๊ฐ ๋งํ ์ ์๋ ํ, ์ด๊ฒ์ ํ๋ ์์ํฌ( babel-loader
, hot-self-accept-loader
, react-hot-loader/webpack
, emit-file-loader
)์์ ์์ฑํ 4๊ฐ ์ด์์ ๋ก๋๋ฅผ ๋ฎ์ด์จ์ผ ํฉ๋๋ค. ๊ทธ ๋ฌธ์๋ ๋ช
์์ ์ผ๋ก ๋์ ์๊ฐ์ด๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ ํ๋ ์์ํฌ์ ๋ชฉ์ ์ ๋ฌดํจํํฉ๋๋ค.
๊ณต์ ์ ์ฅ์ด๋ผ๋ฉด ์ง์งํ์ง ์๋ ๊ฒ์ ๊ด์ฐฎ์๋ฐ, ์์ ๋๊ธ์ด ๊ทธ๋ ๋ค๊ณ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
@AlteredConstants๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
module.exports = {
webpack: (config, { dev }) => {
config.resolve.extensions = ['', '.js', '.jsx'];
return config;
}
}
_ํ์ง๋ง_, ๋ฐฉ๊ธ ์๋ํ ๊ฒฐ๊ณผ ์ด โโ์ ๊ทผ ๋ฐฉ์ ์ด ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค . ์ด์ ๋ฅผ ์์๋ด๋ ค๋ฉด ํํค์ณ ๋ด์ผ๊ฒ ์ต๋๋ค.
@rossipedia, ๊ทธ๊ฒ์ ๋จ์ง ํ์ฅ์ด ์๋ฅผ ๋ค์ด, ๊ฐ์ ธ ์ค๊ธฐ์์ ์ ์ธ ๋ ๋ ์นํฉ์ .jsx ํ์ฅํ์ฌ ๊ฐ์ ธ์จ ๋ชจ๋์ ์ธ์ ํ ์ ์๋๋ก import Foo from './Foo'
๋์ import Foo from './Foo.jsx'
.
Webpack์ด ํด๋น ๋ชจ๋์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋๋ก ํ๋ ค๋ฉด ์์์ ์ธ๊ธํ ๋ก๋์ test
์์ฑ์ .jsx
๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ์ฝ๊ฐ ๋ฌด๊ฒ๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์ฐ๋ฉฐ ์์ ๋งํฌ๋ ๋ฌธ์์ ๋ฐ๋ผ ๋ฏธ๋ฆฌ ๋ ๋๋ง๋ ์ผ์ด์ค๋ฅผ ์ฒ๋ฆฌํ์ง ์์ต๋๋ค. ๋ํ ์๋ page/
๊ฐ์ ธ์ค๊ธฐ๊ฐ ์ด ๊ฒฝ์ฐ์๋ ์๋ํ๋์ง ํ์ ํ ์ ์์ต๋๋ค. Webpack ํ๋ก์ธ์ค ์ธ๋ถ์์ ๋ฐ/๋๋ ๋ณ๋์ ์ง์
์ ์ผ๋ก ๋ฐ์ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๊น?
๋น์ฐํ ์ด ํ๋ ์์ํฌ์์ ๋ชจ๋ ํ์ธ์ ๋จ์ํ Webpack ๊ตฌ์ฑ ์ต์ ๋ณด๋ค ๋ ๋ณต์กํฉ๋๋ค. ๊ทธ๋์ ๋ค์ ๋งํ์ง๋ง, ๋ด๊ฐ ํ๋ฆฌ์ง ์๋ ํ ์ด ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ "ํด๊ฒฐ ๋ฐฉ๋ฒ"๋ณด๋ค "์์ ๋์ง ์์ ๊ฒ"์ธ ๊ฒ ๊ฐ์ต๋๋ค. ์ ๋ ๋จ์ง ํ์ ์ ์ฅ์ ๋ถ๋ช ํ ํ๊ณ ์ถ์์ต๋๋ค. @improuncciable , ๋ ๋ง์ ํต์ฐฐ๋ ฅ์ด ์์ต๋๊น?
์ด๊ฒ์ FAQ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
module.exports = {
webpack: (config) => {
config.resolve.extensions = ['.js', '.jsx'];
config.module.rules.push(
{test: /\.(js|jsx)$/, use: 'babel-loader'}
);
return config;
}
}
@JF-Liu๋ ๋๋ฅผ ์ํด ์๋ํ์ง ์์ต๋๋ค.
Error: Cannot find module '../components/Page'
๋๋ Module build failed: Error: Couldn't find preset "stage-3" relative to directory "/Users/cla/Projects/with-mobx/node_modules/styled-jsx"
๋ฐ๊ณ ์์ต๋๋ค.
next.js 2-beta + mobx + airbnb ์ค์ ์๋
๋ด๊ฐ ๋ญ๊ฐ๋ฅผ ๋์น๊ณ ์๋ ๊ฑด ์๋๊น? .babelrc
์ฝํ
์ธ ๋ ๋ฌด์์
๋๊น?
pages
ํ์ฅ์๋ .jsx
์ ์์ต๋๋ค.
@foxhound87 ์, ์๋ํ์ง ์์ต๋๋ค. ์ ๋ ํฌ๊ธฐํฉ๋๋ค.
TypeScript 2.2๋ ์ด์ "jsx": "react-native"
์ง์ํฉ๋๋ค. ์ด๊ฒ์ .js
ํ์ผ์ ์ถ๋ ฅํ์ง๋ง JSX๋ ๋ณด์กดํฉ๋๋ค. ์ฌ๊ธฐ๋ฅผ ์ฐธ์กฐ
์ฌ๊ธฐ์ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค :<, ์ด๊ฒ์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ด๋์ด๊ฐ ์์ต๋๊น?
์ฐ๋ฆฌ ํ์ฌ ํ์ค์ jsx ๋งํฌ์
์ด ํฌํจ๋ ๋ชจ๋ ํ์ผ์ .jsx
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ฏ๋ก ๋ฒ ์ดํฌ์คํ๋ฅผ ์์ฑํ๋ ๋์ ์ด ๋ฌธ์ ์ ๋ถ๋ช์ณค์ต๋๋ค. ์ด๊ฒ์ ์ดํดํ๋ ๊ฒ์ ์นํฉ ๊ตฌ์ฑ์ด๋ฉฐ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น์ง ์์์ผ ํฉ๋๋ค. ํนํ Next.js๊ฐ jsx ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ง์ํ์ง ์๋ ์ด์ ๊ฐ ์์ต๋๊น?
_ํธ์งํ๋ค:_
์์์ ์ธ๊ธํ๋ฏ์ด webpack ๊ตฌ์ฑ์ ์ฌ์ฉํ๋ฉด ๊ตฌ์ฑ ์์๋ฅผ ๊ฐ์ ธ์ฌ ๋ ์ ์๋ํ์ง๋ง /pages/
ํ์ผ์ ์ฌ๋ฐ๋ฅด๊ฒ ๋ผ์ฐํ
ํ๋ ค๋ฉด .js ํ์ฅ์๊ฐ ์์ด์ผ ํฉ๋๋ค. ์ด ๋ฌธ์ ๊ฐ ์ด๋ฆฌ์์ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ง๋ง ๋๊ท๋ชจ ํ์ ํ์ค/๊ท์ฝ์ ์ค์ํด์ผ ์ด ํ๋ฅญํ ํ๋ ์์ํฌ์ ์ฑํ์ด ์ฐจ๋จ๋ ์ ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ ์ ์ธํ๊ณ Next์ ๋ํ ๋ชจ๋ ๊ฒ์ด ์ ๋ง ๋ง์์ ๋ญ๋๋ค. ๋ถํํ๋ ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ์ฌ์ฉํ์ง ๋ชปํ๋ ๊ฒ์
๋๋ค.
๊ทธ๋๋ ์ง์ ์ด ์๋์ง ๋ค์ ํ์ธํ๊ฒ ์ต๋๋ค.
์ด ๋ฌธ์ ๋ Webpack๊ณผ Babel๋ณด๋ค ํจ์ฌ ๋ ๊น์ด ํ์ฅ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ฌ๋ฌ ๊ณณ์ ํ๋์ฝ๋ฉ๋์ด ์์ต๋๋ค. :(
์ง๊ธ๊น์ง ๋ด๊ฐ ํ ์ ์ผํ ๋
ธ๋ ฅ์ server/resolve.js:34
์ "jsx" ํ์ ์ถ๊ฐํ๋ ๊ฒ์
๋๋ค. ๋ด ํ๋ก์ ํธ์ node_modules/next/dist/
์๋์ ์๋ ํ์ผ์ ์์ ํ์ฌ ์ด ์์
์ ์ํํ๊ณ ์์ต๋๋ค.
์์ ํ๋ฉด ์ฝ์์์ ์๋์ ๊ฐ์ด ์ถ๋ ฅ๋ฉ๋๋ค. ์ฐธ๊ณ ์ฝ์์ด ์ง๊ธ ๋งํ๋ค Building page: /
๊ฐ ์๋๋ผ, Client pings, but there's no entry for page: /
.
DONE Compiled successfully in 12156ms 8:34:44 PM
> Ready on http://localhost:3000
> Building page: /
DONE Compiled successfully in 10983ms 8:34:58 PM
SyntaxError: Unexpected token m in JSON at position 0
at JSON.parse (<anonymous>)
at _callee$ (/Users/Jason/Repositories/radioapp/node_modules/next/dist/server/read-page.js:48:32)
at tryCatch (/Users/Jason/Repositories/radioapp/node_modules/regenerator-runtime/runtime.js:64:40)
at Generator.invoke [as _invoke] (/Users/Jason/Repositories/radioapp/node_modules/regenerator-runtime/runtime.js:299:22)
at Generator.prototype.(anonymous function) [as next] (/Users/Jason/Repositories/radioapp/node_modules/regenerator-runtime/runtime.js:116:21)
at step (/Users/Jason/Repositories/radioapp/node_modules/babel-runtime/helpers/asyncToGenerator.js:17:30)
at /Users/Jason/Repositories/radioapp/node_modules/babel-runtime/helpers/asyncToGenerator.js:28:13
.eslintrc
ํ์ผ๋ก server
๋๋ ํ ๋ฆฌ๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฌธ์ ๋ ์ค์ ๋ก ๊ฒฌ๋ ์ ์์ต๋๋ค.
{
"parser": "espree",
"parserOptions": {
"ecmaVersion": 6,
},
"env": {
"node": true
},
}
๋๊ตฐ๊ฐ์๊ฒ ๋์์ด ๋๋ ๊ฒฝ์ฐ ๋๋ ํ ๋ฆฌ๋ณ๋ก ๋ค๋ฅธ ๋ฆฐํฐ ์ Sublime ์ค์ ์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค. Next.js ํ์ผ์ด ํฌํจ๋ public
๋๋ ํ ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ ์ ์ ํ .eslintrc
ํ์ผ์ ๊ฑฐ๊ธฐ์ ๋ฃ์ ์๋ ์์ต๋๋ค.
๋๋ babel-sublime ๋ฐ SublimeLinter-contrib-eslint ์ ํจ๊ป Sublime์ ์ฌ์ฉ
@jasonszhao ๋์ํฉ๋๋ค. ๊ทธ๋ฌ๋ .jsx
์ง์์ ์ง์ํ ๊ฐ๋ฅ์ฑ์ ๊ฑฐ์ ์์ต๋๋ค. .js
ํ์ฅ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
@arunoda ์ค๋ก ์ ๋๋ค. ์ฐ๋ฆฌ ์ค ๋ง์ ์ฌ๋๋ค์ด ์ด ์์์ ์ธ ๋์์ธ ์ ํ ๋๋ฌธ์ ๊ทธ๊ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ๊ฑฐ ์ค์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๊ตฌ์ฑํ ์ ์๋๋ก ํ๋ ๊ฒ์ด ๋ ํฉ๋ฆฌ์ ์ด์ง ์์ต๋๊น? next.config.js
ํ๊ณ ๊ธฐ๋ณธ๊ฐ์ด ['.js']
์ธ ์ต์
์ด ์๊ฑฐ๋ Jest์ ๊ฒฝ์ฐ .test.js
๋๋ .spec.js
์ ๊ฐ์ ๊ฒ์ ํํฐ๋งํ ์ ์๋ ๊ธฐ๋ฅ์ด ๋ ์ข์ต๋๋ค.
ํธ์ง: TypeScript์์ ์ฌ์ฉ์ ์ ์ ์๋ฒ๋ ์คํํ๋ ค๊ณ ํ๋ฏ๋ก TypeScript ์์ ์์ tsc
์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก .tsx
๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํฉ๋๋ค.
.jsx
์์ง ์ง์๋์ง ์์ต๋๊น? ๋ํ React ๊ตฌ์ฑ ์์์ .jsx
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํ์ค์ด๊ธฐ ๋๋ฌธ์ ํ์ฌ์์ next.js
์ฌ์ฉ์ ์ฐจ๋จํ๋ ๋ฌธ์ ์ ์ง๋ฉดํด ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ด ์ฌ์ํด ๋ณด์ด์ง๋ง ์ฐ๋ฆฌ ํ์ด Next๋ฅผ ์ฑํํ๋ ๊ฒ์ ์ ๋นํํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
ํต์ฌ ํ์ ๋๊ตฐ๊ฐ๊ฐ ์ด ๊ฒ๋ณด๊ธฐ์ ์ค์ํ์ง ์์ ๋์์ธ ๊ฒฐ์ ์ ๋ํด ์กฐ๊ธ ๋ ์์ธํ ์ค๋ช ํ ์ ์๋ค๋ฉด ์ ๋ง ์ข์ ๊ฒ์ ๋๋ค.
.jsx ํ์ฅ ์ง์์ ์ํด +1
.jsx ์ง์์ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์์ง๋ง... SSR์ ์ง์ํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง๋ง ์ฝ๋์์ ๋ฌด์ธ๊ฐ๋ฅผ ๋ณ๊ฒฝํ๊ณ ํซ ๋ฆฌ๋ก๋ํ๋ฉด ํ์ด์ง๊ฐ ํ์๋ฉ๋๋ค. F5์ ๋ถ, ์ค๋ฅ.
ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
const originalJS = "/\\.js(\\?[^?]*)?$/";
config.resolve.extensions = [".js", ".jsx", ".json"];
config.module.rules.forEach((rule) => {
if (String(rule.test) === originalJS) {
rule.test = /\.jsx?(\?[^?]*)?$/;
}
});
๋ง์ ์ฌ๋๋ค๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋๋ ์ด๊ฒ์ด ์ ์ผ์ด๋ ์ ์๋์ง ์ดํดํ ์ ์์ต๋๋ค.
๋ง์ ์ฌ๋๋ค์ด jsx ์ฌ์ฉ์ด๋ผ๋ ๋ฆฐํฐ ๊ตฌ์ฑ์ ์ฌ์ฉํฉ๋๋ค. ํธ์ง์๋ ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ผ๋ฐ js์ jsx๋ฅผ ๊ตฌ๋ถํ๊ณ ... ์ง์งํ๊ฒ ์ถ๊ฐํ๋ ๊ฒ์ด ๊ทธ๋ ๊ฒ ํฐ ๋ฌธ์ ์ ๋๊น? ์ฝ๋๋ฅผ ์ถฉ๋ถํ ์ดํดํ๋ค๋ฉด ํผ์ ํ๊ฒ ์ง๋ง...
ํ๋ฆฌ์ฆ
.jsx
๊ฐ "์ฆ์" ์๋ํ ๊ฒ์ผ๋ก ํฉ๋ฆฌ์ ์ผ๋ก ๊ธฐ๋ํ ์ ์๋ค๋ ์์ด๋์ด์ ๋ํด ๋ ๋ง์ ์ง์์ ์ ๊ณตํฉ๋๋ค. ๋๊ตฐ๊ฐ๊ฐ ๋ฌธ์ ๊ฐ ๋ฌด์์ธ์ง ํ์
ํ๊ณ (์ด ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๋ฉด) ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฌ์ํ์ง๋ง ์ ๊ฒฝํ์ .jsx
ํ์ฅ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ _๋๋ฆฌ ์ฑํ๋ ๊ด๋ก_(์ฌ๊ธฐ์ ์๋์ ์ผ๋ก "๊ถ์ฅ" ํํ์ ํผํจ)์
๋๋ค. ์ฃผ๋ก React ๊ตฌ์ฑ ์์๋ฅผ ๋ด๋ณด๋ด๋ ํ์ผ์ ๊ฒฝ์ฐ.
ํ์ฅ ๊ธฐ๋ฅ์ ๊ต์ฒดํ๊ณ ๊ณ์ ์งํํ๋ ค๊ณ ํฉ๋๋ค. ํ์ง๋ง ์ ์ด์ ๋ํ ์ ํญ์ด ์๋์ง ์ดํดํ๊ธฐ ์ด๋ ต์ต๋๋ค. ์ด๊ฒ์ด ํฉ๋นํ ์์ฒญ์ด๋ผ๋ ๊ฒ๋ณด๋ค ๋ ์ค์ํ ๊ฒ์ ๋ง์ ๊ฐ๋ฐ์์๊ฒ ์์๋๋ ๋์์ด๋ฉฐ (๊ฑฐ์) ์ง์
์ฅ๋ฒฝ์ด ๋์์ง๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ํ์ฅ์ผ๋ก .jsx
์ ์ฅ์ ์ ๋ํ ๋
ผ์์ผ๋ก ๋ง๋ค๊ณ ์ถ์ง๋ ์์ง๋ง .js
์์ ์ ํจํ JavaScript๋ง ์ํ๋ค๋ ๊ฒ์ด ์์ ํ ๋ถํฉ๋ฆฌํ ๊ฒ์ ์๋๋ผ๊ณ ๋งํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํฉ๋๋ค.
Btw, ์ด์ ๋ง ์์ํ์ง๋ง ์ง๊ธ๊น์ง๋ ์ฌ๋ํ๊ณ ์์ต๋๋ค. ๋ชจ๋ ๋ฉ์ง ์์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
์๋ง๋ ์ฐ๊ฒฐ๋์ด ์์ ๊ฒ์
๋๋ค. .md
ํ์ฅ์๋ฅผ ์ฌ์ฉํ ์ ์์์ต๋๋ค. ์๋ฒ( .md.js
)์์ ์๋ํ๋๋ก ํ๋ ค๋ฉด ๋ค์ ํธ๋ฆญ์ ์ฌ์ฉํด์ผ ํ์ต๋๋ค.
next.config.js
// ...
{
test: /\.md\.js$/,
loader: 'raw-loader',
},
// ...
๋๋ airbnb์ ํจ๊ป eslint๋ฅผ ์ฌ์ฉํ๊ณ ๊ฒฝ๊ณ ๋ฅผ ์นจ๋ฌต์ํค๋ ๋ ๋ค๋ฅธ ๊ท์น์ ์ถ๊ฐํ์ต๋๋ค.
{
"extends": "airbnb",
"rules": {
"react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx"] }]
}
}
.jsx
ํ์ผ์ด ์๋ ์ค์ ์์ ๊ฐ ์๋ ์ฌ๋์ด ์์ต๋๊น?
pages
๋๋ ํ ๋ฆฌ ๋ด๋ถ,?
์ด๊ฒ์ /examples
๋๋ ํ ๋ฆฌ์ ํฐ ๋์์ด ๋ ๊ฒ์
๋๋ค.
+1 jsx ์ง์ ์ถ๊ฐ.
@rossipedia ๊ฐ ์ ์ํ ๊ฒ๊ณผ ์ ์ฌํ ์์ ์ ์ํํ์ฌ ๋ฌธ์ ๋ฅผ
์์ง ์์ผ๋ฉด ํ๋ก์ ํธ ๋ฃจํธ์ next.config.js ๋ฅผ ๋ง๋ญ๋๋ค.
๊ทธ๋ฐ ๋ค์ config.resolve.extensions ๋ฐฐ์ด์ 'jsx'๋ฅผ ํธ์ํ๋ฉด ์ ์๋ํฉ๋๋ค.
module.exports = {
webpack: function (config, { isServer }) {
config.resolve.extensions.push('.jsx');
return config
}
}
ํธ์งํ๋ค
์ด ์์ ์ ์ฑ๋ฅ์ ๋์ ์ํฅ์ ๋ฏธ์น ๊ฒ ๊ฐ์ต๋๋ค. ์ถ๊ฐ ์กฐ์ฌ๋ฅผ ์งํํฉ๋๋ค.
๋ค์ v5๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ฌด์์ด๋ ๋ณ๊ฒฝํ ํ์๊ฐ ์์ต๋๋ค. .jsx ํ์ฅ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์๋ฉ๋๋ค. ์ฑ๋ฅ๊ณผ ๊ด๋ จ๋ ๊ฒ์ด ๋ณด์ด๋ฉด next@canary๋ก ์ ๊ทธ๋ ์ด๋ํด ๋ณด์ญ์์ค
๋๋ ๊ทธ๊ฒ์ ๋์น ์ฑ๋ค, ๊ต์ฅํ๋ค!
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
.jsx ํ์ฅ ์ง์์ ์ํด +1