2022.12.29 - [react] - [React] Webpack์ผ๋ก React ์์ํ๊ธฐ 1 - webpack, babel-loader
๊ธธ๊ณ ํ๋ํ ์นํฉ ์ค์ ์ ๊ธธ..
react ์ค์น
npm i react react-dom
์ด์ ๋๋ต์ ์ธ ์นํฉ ์ค์ ์ ๋ง์น๊ณ ๋ฆฌ์กํธ๋ฅผ ์ค์นํ๋ค.
typescript ์ค์น ๋ฐ ์ค์ ํ์ผ
npm i -D typescript
ํ๋ก์ ํธ ๋ด์์ ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ํ์ผ๋ typescript๋ฅผ ์ค์นํ๋ค.
npx tsc --init
ํ์ ์คํฌ๋ฆฝํธ ์ค์ ํ์ผ์ธ tsconfig.json์ ์ค์ ์ต์ ๋ค์ ์์ฑํ๋ค.
tsconfig.json
// tsconfig.json
{
"compilerOptions": {
// ์ธ์ด, ํ๊ฒฝ
"target": "es2016", // ์๋ฐ์คํฌ๋ฆฝํธ ๋ฒ์
"jsx": "react-jsx", // jsx ์ฝ๋
"jsxImportSource": "react", //
// ๋ชจ๋
"module": "NodeNext", // ๋ชจ๋ ์ค์
"moduleResolution": "node", // ํ์
์คํฌ๋ฆฝํธ
"typeRoots": [
"node_modules/@types",
"src/@types"
],
"resolveJsonModule": true, // json ํ์ผ import ๊ฐ๋ฅ ์ฌ๋ถ
"allowJs": true, //
"allowSyntheticDefaultImports": true, // default export๊ฐ ์์ ๋, import๋ฅผ ํ์ฉํ ์ง
"esModuleInterop": true, //
"forceConsistentCasingInFileNames": true, //
// ํ์
๊ฒ์ฌ
"strict": true,
"skipLibCheck": true, // ๋ชจ๋ .d.ts ํ์ผ์ ํ์
์ฒดํฌ๋ฅผ ๊ฑด๋๋ฐ๋์ง
},
"include": ["src"],
"exclude": ["dist", "node_modules"]
}
typescript ๋ก๋
npm i -D ts-loader typescript @types/node @types/react @types/react-dom
webpack์์ typescript๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ํ์ ์คํฌ๋ฆฝํธ ๋ก๋์ธ ts-loader๋ฅผ ์ค์นํ๋ค.
webpack ๊ธฐ๋ณธ ์ค์
// webpack/webpack.common.js
const commonConfig = {
...
module: {
rules: [
...
{ test: /\.tsx?$/i, loader: "ts-loader" },
],
},
...
};
export default commonConfig;
Webpack ๊ธฐ๋ณธ ์ค์ ํ์ผ์ ts-loader ์ค์ ์ ์ถ๊ฐํด์ค๋ค.
Typescript์์ alias ์ค์ ํ๊ธฐ
npm i -D tsconfig-paths-webpack-plugin
alias๋ฅผ ์ด์ฉํ๋ฉด ๋ณต์กํ ๊ฒฝ๋ก๋ฅผ @๋ฅผ ์ฌ์ฉํด์ ๊ฐ๋จํ๊ฒ ๋ํ๋ผ ์ ์๋ค.
โฉimport ~ from '../../page'โฉ → โฉimport ~ from '@/page'โฉ
webpack ๊ธฐ๋ณธ ์ค์
import { resolve } from 'node:path';
import { TsconfigPathsPlugin } from 'tsconfig-paths-webpack-plugin';
import paths from "./paths.js";
const commonConfig = {
...
resolve: {
modules: ["node_modules"],
extensions: [".js", ".ts", ".tsx"],
alias: {
'@': resolve('src')
},
plugins: [new TsconfigPathsPlugin()],
},
};
export default commonConfig;
Webpack ๊ธฐ๋ณธ ์ค์ ์๋ alias ๊ด๋ จ๋ ์ค์ ์ ์ถ๊ฐํ๋ค.
- ์ค์นํ TsconfigPathsPlugin์ ํ๋ฌ๊ทธ์ธ์ ์ถ๊ฐํ๋ค.
tsconfig.json
// tsconfig.json
{
"compilerOptions": {
...
"baseUrl": ".",
"paths": {
"@/*": ["src/*"]
},
...
}
src ํด๋ ํ์์ ํด๋๋ โฉ'@/page'โฉ, โฉ'@/components'โฉ ๋ฑ์ผ๋ก ๊ฒฝ๋ก๋ฅผ ๋ํ๋ผ ์ ์๋ค.
ESLint & Prettier
prettier
npm i -D prettier
prettier๋ formatter๋ก ์ฝ๋๋ฅผ ์ผ๊ด๋ ์คํ์ผ๋ก ์์ฑํ ์ ์๊ฒ ๋ณํํด์ค๋ค.
.prettierrc
// .prettierrc
{
"arrowParens": "always",
"htmlWhitespaceSensitivity": "css",
"bracketSameLine": false,
"bracketSpacing": true,
"printWidth": 100,
"proseWrap": "preserve",
"quoteProps": "as-needed",
"semi": true,
"singleQuote": true,
"tabWidth": 2,
"trailingComma": "es5",
"useTabs": false
}
prettier ์ถ๊ฐ ์ต์ ์ค์ ์ ์ถ๊ฐํ ์ ์๋ค.
ESLint
npm init @eslint/config
ESLint๋ Linting ๋๊ตฌ๋ก ์ฝ๋์ ๋ฌธ์ ๊ฐ ์๋์ง ๊ฒ์ฌํด์ค๋ค.
์ ๋ช ๋ น์ด๋ก eslint๋ฅผ ์ค์งํ๊ฒ ๋๋ฉด ํฐ๋ฏธ๋์์ ์ง๋ฌธ์ ๋ฐ๋ผ ์ต์ ์ ์ ํํ ์ ์๋ค.
ESLint ํ๋ฌ๊ทธ์ธ ํ์ฅ
npm i -D eslint-plugin-react-hooks eslint-plugin-jsx-a11y eslint-plugin-prettier eslint-config-prettier
'๐ฉโ๐ค ํ๋ก ํธ์๋ > react' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React Router][Webpack] ์ค์ฒฉ ๋ผ์ฐํ ์ฌ์ฉ ์ 404 Not Found ์ค๋ฅ (0) | 2023.01.30 |
---|---|
์ปดํฌ๋ํธ ์ ๋ง๋ค๊ธฐ: ๋ฐ์ดํฐ ์ถ์ํํ๊ธฐ (0) | 2023.01.11 |
[React] useState ์ด๊ธฐ๊ฐ์ด undefined์ด ๋๋ ์ค๋ฅ (0) | 2023.01.05 |
[React] Webpack์ผ๋ก React ์์ํ๊ธฐ 1 - webpack, babel-loader (0) | 2022.12.29 |