D.evelop/React
React 18 + tailwindcss 세팅 (eslint, prettierrc)
Danne
2024. 1. 15. 09:43
라이브러리 설치
CRA, react-dom설치
# CRA + typescript
npx create-react-app inflinker-v3-front --template typescript
# react-dom 추가
npm i --save react react-dom typescript
Tailwind 설치
#Tailwind CSS 설치, 세팅파일
npm install -D postcss autoprefixer
npx tailwindcss init
npm install -D postcss-import
npm install postcss-nesting --save-dev
컴포넌트 라이브러리 등등 설치
# React-Select 설치
# <https://react-select.com/home#getting-started>
npm i --save react-select
eslint, prettier설치
# eslient 설치
npm install -D eslint
# eslient 설정
npx eslint --init
# prettier 설정 설치
npm install -D prettier
npm install -D prettier-plugin-tailwindcss
# eslint, prettier에서 겹치는 포메팅 삭제
npm i -D eslint-plugin-prettier eslint-config-prettier
설정파일 세팅
tsconfig.json 세팅
{
"compilerOptions": {
"target": "es5",
"lib": [
"dom",
"dom.iterable",
"esnext"
],
"baseUrl": "./src", // 절대 경로 설정
"allowJs": true,
"skipLibCheck": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"noFallthroughCasesInSwitch": true,
"module": "esnext",
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx",
"paths": {
"assets/*": ["./assets/*"],
"components/*": ["./components/*"],
"layout/*": ["./layout/*"],
"pages/*": ["./pages/*"],
}
},
"include": [
"src"
],
"exclude": ["node_modules"]
}
postcss.config.js
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
};
tailwind.config.js
/** @type {import('tailwindcss').Config} */
module.exports = {
content: ['./src/**/*.{html,js,ts,jsx,tsx}', 'public/*.{html,js}'],
theme: {
screens: {
sm: '480px',
md: '768px',
lg: '976px',
xl: '1440px',
},
colors: {
blue: '#1fb6ff',
purple: '#7e5bef',
pink: '#ff49db',
orange: '#ff7849',
green: '#13ce66',
},
borderWidth: {
...
},
boxShadow: {
'3xl': '0 35px 60px -15px rgba(0, 0, 0, 0.3)',
},
fontFamily: {
sans: ['Pretendard', 'sans-serif'],
serif: ['Merriweather', 'serif'],
digiNumber: ['DS-DIGII', 'sans-serif'],
},
fontSize: {
...
},
container: {
padding: {
..
},
},
extend: {
spacing: {
....
},
padding: {
0.8: '0.8rem',
},
borderRadius: {
deflaut: '1.0rem',
'4xl': '2rem',
},
backgroundImage: {
bgMainImg: "url('assets/images/bg_main.png')", // 메인 - 배경
...
IconChecked: "url('assets/images/icons/icon_checked.svg')", // 아이콘 - 체크박스
IconClose: "url('assets/images/icons/icon_close.svg')", // 아이콘 - 닫기
},
brightness: {
11: '1.1',
},
boxShadow: {
bottom: '0px 1px 0 rgba(0, 0, 0, 0.1)',
},
},
},
future: {
hoverOnlyWhenSupported: true, // 모바일에서 - hover 제거
},
// plugins: [require('@tailwindcss/forms')],
plugins: ['prettier-plugin-tailwindcss'],
};
prettier.config.js
module.exports = {
plugins: ['prettier-plugin-tailwindcss'],
};
.prettierrc
{
"plugins": ["prettier-plugin-tailwindcss"],
"singleQuote": true,
"semi": true,
"useTabs": false,
"tabWidth": 2,
"trailingComma": "all",
"printWidth": 80,
"arrowParens": "always",
"orderedImports": true,
"bracketSpacing": true,
"jsxBracketSameLine": false
}
.eslintrc.js
module.exports = {
env: {
browser: true,
es2021: true,
},
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
'plugin:react/recommended',
'plugin:prettier/recommended',
'plugin:tailwindcss/recommended',
],
overrides: [
{
env: {
node: true,
},
files: ['.eslintrc.{js,cjs}', '*.ts', '*.tsx', '*.js'],
parserOptions: {
sourceType: 'script',
},
},
],
parser: '@typescript-eslint/parser',
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
},
plugins: ['@typescript-eslint', 'react', 'prettier'],
rules: {
'prettier/prettier': [
'error',
{
endOfLine: 'auto',
},
],
'linebreak-style': 0,
'import/prefer-default-export': 0,
'import/extensions': 0,
'no-use-before-define': 0,
'import/no-unresolved': 0,
'react/react-in-jsx-scope': 0,
'@typescript-eslint/no-explicit-any': 'off',
'import/no-extraneous-dependencies': 0,
'no-shadow': 0,
'react/prop-types': 0,
'react/jsx-filename-extension': [
2,
{ extensions: ['.js', '.jsx', '.ts', '.tsx'] },
],
'jsx-a11y/no-noninteractive-element-interactions': 0,
'@typescript-eslint/explicit-module-boundary-types': 0,
},
settings: {
'import/resolver': {
node: {
extensions: ['.js', '.jsx', '.ts', '.tsx'],
},
},
},
};
반응형