Nuxt TypeScript - ChoDragon9/posts GitHub Wiki
Angular ๊ธฐ๋ฐํ ํ๋ก์ ํธ๋ฅผ ํ ๊ฒฝํ์ด ์๋ค. Angular๋ TypeScript๋ฅผ ํ์๋ก ์ฌ์ฉํ๋ค. ๊ทธ ํ๋ก์ ํธ์์ TypeScript๋ฅผ ์ฌ์ฉํ๋ฉด ์์ฐ์ฑ์ด ๋์์ง๋ ๊ฒ์ ๋ชธ์ ๋๋ผ๊ฒ ๋์๋ค. ๊ทธ๋์ ์๋กญ๊ฒ ํ๋ก์ ํธ๋ฅผ ํ๊ฒ๋๋ฉด TypeScript๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ๋ง์(?)๋จน์๋ค.
์ด ๊ธ์์๋ Nuxt๋ฅผ TypeScript ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ฐํ๋ ๊ฒ์ ๊ฐ์ด๋ํ๋ค. Nuxt๋ฅผ TypeScript๋ก ๊ฐ๋ฐํ๋ ๊ฒ์ ๋ํ ๋ ํผ๋ฐ์ค๊ฐ ์์ง ๋ง์ด ์๊ธฐ ๋๋ฌธ์ ์ง์ ์์ฑํ๊ธฐ๋ก ํ๋ค. ์ด ๊ธ์์๋ Nuxt์ TypeScript๋ฅผ ์ธํ ํ๋ ๋ฐฉ๋ฒ๊ณผ TypeScript๋ก ์์ฑํ Vue์ Vuex ์ฝ๋๋ฅผ ์๊ฐํ๋ค.
๋จผ์ ๊ฐ๋ฐํ๊ฒฝ์ ์ก๊ธฐ ์ํด์ ํ์ํ ๋ชจ๋ ์ค์น์ ํ๊ฒฝ์ค์ ์ด ํ์ํ๋ค.
TypeScript๋ก ์์ฑ๋ Nuxt๋ npx
๋ฅผ ํตํด์ ์ปค๋ฉ๋๋ฅผ ์คํํ๋ ๊ฒ ์ข๋ค. ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ dev
๋ช
๋ น์ด๋ TypeScript๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์คํํด์ฃผ์ง ์๊ธฐ ๋๋ฌธ์ npx
์ค์น๋ ํ์์ด๋ค.
npx๋ node_modules/.bin
์ ์ค์น๋๋ ์ปค๋ฉ๋๋ฅผ ํ๋ก์ ํธ ๋ก์ปฌ์์ ์คํ๊ฐ๋ฅํ๋๋ก ํด์ฃผ๋ ๋ชจ๋์ด๋ค.
$ npm install -g npx
๊ณต์ ๊ฐ์ด๋ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ๋ค.
Nuxt๋ฅผ ์ค์นํ๋ ๊ฒ์ JS๋ก ๊ฐ๋ฐํ ๋์ ๋์ผํ๋ค. ์ด ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด UI Framework์ Server-side Framework ์ ํ์ด ๋์จ๋ค. ์ํ๋ Framework๋ฅผ ์ ํํ๋ฉด ๋๋ค.
$ npx create-nuxt-app <project-name>
์ปดํ์ผ ํ์์ ํ์
์ฒดํฌ๋ฅผ ํ๊ธฐ ์ํด์ devDependencies
์ @nuxt/typescript
์ nuxt-property-decorator
๋ฅผ ์ค์นํ๋ค.
$ npm install -D @nuxt/typescript nuxt-property-decorator
nuxt.config.ts
์ serverMiddlewares
์ TypeScript๋ฅผ ๋ฐํ์์ ์ง์ํ๊ธฐ ์ํด์ dependencies
์ ts-node
๋ฅผ ์ค์นํ๋ค.
$ npm install ts-node
๋ชจ๋ ์ค์น๊ฐ ๋๋๋ฉด TypeScript๋ก ๊ฐ๋ฐํ ์ ์๋๋ก ์ค์ ์ด ํ์ํ๋ค.
-
touch tsconfig.json
๋ช ๋ น์ด๋ก TypeScript ์ค์ ํ์ผ์ ๋ง๋ ๋ค. -
npx nuxt
๋ช ๋ น์ด๋กtsconfig.json
์ ์์ ํ๋ค.nuxt
๋ฅผ ์ฒ์ ์คํํ๋ฉดtsconfig.json
์ ์๋์ผ๋ก ์ ๋ฐ์ดํธ ํด์ค๋ค. -
tsconfig.json
์@nuxt/config
์ ์ถ๊ฐํ๋ค. nuxt ํ์ ์ IDE์์ ์๋์์ฑ ๊ฐ๋ฅํ๊ฒ ๋๋ค.
"types": [
"@types/node",
"@nuxt/vue-app",
+ "@nuxt/config"
]
-
nuxt.config.js
๋ฅผnuxt.config.ts
๋ก ๋ณ๊ฒฝํ๋ค. - TypeScript๋ก
nuxt.config.ts
๋ฅผ ์์ ํ๋ค.
import NuxtConfiguration from '@nuxt/config'
const config: NuxtConfiguration = {
// Type or Press `Ctrl + Space` for autocompletion
}
export default config
Nuxt์์ TypeScript๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ํด๋น ๋ช
๋ น์ด๋ก ์คํํด์ผ ํ๋ค.
npm run dev
๋ช
๋ น์ด๊ฐ ๊ธฐ๋ณธ์ผ๋ก ์ค์ ๋์ด ์์ง๋ง ํด๋น ๋ช
๋ น์ด๋ก๋ TypeScript๊ฐ ๋์ํ์ง ์๋๋ค.
$ npx nuxt
๋น๋๋ 2๊ฐ์ง๊ฐ ์๋ค. SPA
์ ์ ์ ํ์ผ ์์ฑ
์ด๋ค.
-
npx nuxt build
: SPA ๋น๋ -
npx nuxt generate
: ์ ์ ํ์ผ ์์ฑ
๋น๋ ๊ฒฐ๊ณผ๊ฐ ์๋ dist
ํด๋๋ฅผ ์คํํ๊ธฐ ์ํด์๋ ์๋ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ค.
$ npx nuxt start
๋จผ์ ์ฃผ์ํ ์ ์ .vue
ํ์ผ์ <script>
๋ <script lang="ts">
๋ก๋ง ์์ฑํด์ผ ํ๋ค. lang="ts"
๋ฅผ ์ถ๊ฐํ๋ฉด IDE์์ ์ปดํฌ๋ํธ๋ฅผ ์๋์ผ๋ก import
๊ฐ๋ฅํ๋ค.
v-for
๋ฅผ ์ฌ์ฉํ๋ฉด:key
๋ฅผ ํ์๋ก ์ฌ์ฉํด์ผ ํ๋ค.
<template>
<div class="VueToNuxtLogo">
<template v-for="item in classes">
<div :class="`${COMMON_CLASS} ${item}`" :key="item"></div>
</template>
</div>
</template>
<script lang="ts">
import Component from 'vue-class-component'
import { Vue } from 'nuxt-property-decorator'
@Component({})
class Logo extends Vue {
COMMON_CLASS = 'Triangle'
classes: string[] = [
'Triangle--two',
'Triangle--one',
'Triangle--three',
'Triangle--four'
]
}
export default Logo
</script>
<template>
<div class="container">
<logo />
<a class="button--green" @click.prevent="upCount()">
Up
</a>
{ { count } }
<a class="button--grey" @click.prevent="downCount()">
Down
</a>
</div>
</template>
<script lang="ts">
import Component from 'vue-class-component'
import { Vue } from 'nuxt-property-decorator'
import Logo from '~/components/Logo.vue'
@Component({
components: {
Logo
}
})
class Page extends Vue {
count: number = 0
upCount() {
this.count++
}
downCount() {
this.count++
}
}
export default Page
</script>
๋ฃจํธ์ ์ ์ํ ๋๋ store/index.ts
์ state
, mutations
, getters
, actions
๋ฅผ ์ ์ํ๋ค.
export const state = () => ({
count: 0
})
export const mutations = {
upCount(state) {
state.count++
},
downCount(state) {
state.count--
}
}
์ปดํฌ๋ํธ์์๋ ๋ฐ์ฝ๋ ์ดํฐ๋ง ๋ถ์ด๋ฉด ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
class Page extends Vue {
@State count
@Mutation upCount
@Mutation downCount
}
๋ชจ๋ ๋ชจ๋๋ก ์ ์ํ ๋๋ store
์ ๋ค๋ฅธ ํ์ผ์ ์ ์ํ๋ค. ํ์ผ ๋ด๋ถ์๋ state
, mutations
, getters
, actions
๋ฅผ ์ ์ํ๋ค.
// page.ts
export const state = () => ({
count: 0
})
export const mutations = {
upCount(state) {
state.count++
},
downCount(state) {
state.count--
}
}
์ปดํฌ๋ํธ์์ ์ฌ์ฉํ ๋๋ ๋ชจ๋์ ์ ๊ทผํด์ ์ฌ์ฉํ๋ค.
class Page extends Vue {
@State((state) => state.page.count)
count
@Mutation('page/upCount')
upCount
@Mutation('page/downCount')
downCount
}
์ด ๊ธ์์ ์์ฑ๋ ์ค์ ๊ณผ์ ์ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ๋ก ๋ง๋ค์ด์ create-nuxt-ts์ ์ฌ๋ ธ๋ค. ์ด ์ ์ฅ์๋ฅผ ๋ด๋ ค๋ฐ์ผ๋ฉด ์ค์ ๊ณผ์ ์์ด ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ฒ์ ์ธํ ๋ฆฌ์ ์ด๋ฅผ ํตํด์ ๊ฐ๋ฐํ๊ฒฝ์ธํ ์ ํ๋ ๋ฐ, ์ธํ ๋ฆฌ์ ์ด๋ IDE์ ์ค์ ๊ณผ์ ์์ ๋ง์ ์ฝ์ง์ด ํ์ํ๋ค. ์น์คํฐ์ ์ฌ์ฉํ๋ฉด ๋ณ๋๋ก IDE ์ค์ ํ์์์ด ๋ฐ๋ก ์ฌ์ฉ๊ฐ๋ฅํ๋ค.