Next.js typscript 프로젝트를 생성해 상태관리, css, 서버 상태 관리 라이브러리까지 설치하는 초기 셋팅 과정을 진행해보자
npx create-next-app@latest --typescript
프로젝트를 생성하고자 하는 폴더에서 위의 명령어를 실행하자
나는 타입스크립트를 사용할 것이기에 --typescript 옵션을 붙였다.
@latest는 최신 버전의 next app
create-next-app의 12.1.0 버전부터는 ESLint를 자동으로 설정해준다. 하지만 ~~eslint는 설치되어 있지 않기도 하고 직접 설치하고자 No를 택했다.
npm i -D eslint eslint-config-airbnb eslint-config-prettier eslint-plugin-import eslint-plugin-jsx-a11y eslint-plugin-prettier eslint-plugin-react eslint-plugin-react-hooks @typescript-eslint/parser @typescript-eslint/eslint-plugin prettier
{
"parser": "@typescript-eslint/parser",
"plugins": ["@typescript-eslint"],
"extends": [
"prettier",
"airbnb",
"airbnb/hooks",
"plugin:@typescript-eslint/recommended",
"plugin:prettier/recommended"
],
"rules": {
"react/react-in-jsx-scope": "off",
"react/jsx-filename-extension": ["warn", { "extensions": [".tsx"] }],
"react/require-default-props": "off",
"react/jsx-props-no-spreading": "off",
"import/no-unresolved": "off",
"react/function-component-definition": "off",
"import/extensions": "off",
"react/no-unescaped-entities": "off",
"react/button-has-type":"off"
}
}
{
"singleQuote": true,
"parser": "typescript",
"semi": true,
"useTabs": true,
"printWidth": 120
}
{
//...
"scripts": {
"prettier": "prettier --write --config ./.prettierrc \"**/*.{ts,tsx}\"",
"lint": "eslint './src/**/*.{ts,tsx}'",
"lint:fix": "eslint --fix './src/**/*.{ts,tsx}'"
"prettier": "prettier --write --config ./.prettierrc ./src/**/*.{ts,tsx}"
}
//...
}
lint를 실행할 때 무시하고자 하는 파일 및 폴더를 설정할 수 있다.
/node_modules
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init
위 명령어를 입력해 설치후 실행한다.
파일 또는 프로젝트에서 PostCSS가 구성된 모든 위치에 tailwindcssand autoprefixer를 추가 한다.
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
}
}
에서 content 위치에 파일 경로를 입맛에 맞게 수정한다.
/** @type {import('tailwindcss').Config} */
module.exports = {
content: ['./src/**/*.{js,jsx,ts,tsx}', './pages/**/*.{js,jsx,ts,tsx}'],
theme: {
extend: {},
},
plugins: [],
}
Tailwind의 각 레이어에 대한 지시문을 추가한다.
@tailwind base;
@tailwind components;
@tailwind utilities;
npm i zustand
zustand를 설치한다.
// store.ts
import create from 'zustand';
interface IStore {
isDark: boolean;
handleIsDark: () => void;
}
const useStore = create<IStore>((set) => ({
isDark: false,
handleIsDark: () => set((state) => ({ isDark: !state.isDark })),
}));
export default useStore;
store.ts 파일을 만들어서 위 코드를 작성한다.
npm i @tanstack/react-query
next에서 react-query를 사용하려면 @tanstack를 붙여야 한다.
function MyApp({ Component, pageProps }: AppProps) {
const queryClient = new QueryClient();
return (
<QueryClientProvider client={queryClient}>
<ReactQueryDevtools initialIsOpen={false} />
<Component {...pageProps} />
</QueryClientProvider>
);
}
_app.tsx 파일에서 Provider를 생성해 감싸준다. devtools를 사용하려면 <ReactQueryDevtools initialIsOpen={false} />
도 추가해준다.
// index.tsx
const Home: NextPage = () => {
const { isDark, handleIsDark } = useStore();
return (
<div className={`w-screen h-screen ${isDark ? 'bg-black text-white' : 'bg-white text-black'}`}>
<h1 className="text-2xl font-bold underline">Hello world!</h1>
<p className="italic">tailwind TEST</p>
<p>Zustand TEST : 지금 화면은 {isDark ? '다크' : '화이트'} 모드이다</p>
<button onClick={handleIsDark}>클릭시 화면 모드 변경</button>
</div>
);
};
tailwind와 zustand가 작동하는지 확인한다.