æ¬èšäºã¯ é»éåœéæ
å ±ãµãŒãã¹ Advent Calendar 2022 ã®8æ¥ç®ã®èšäºã§ãã å·çè
㯠X ã€ãããŒã·ã§ã³ æ¬éš AI ãã©ã³ã¹ãã©ãŒã¡ãŒã·ã§ã³ã»ã³ã¿ãŒæå±ã®å±±ç°ã§ãã ãã®èšäºã§ã¯å
æ¥ïŒ2022幎11æäžæ¬ïŒã«å®å®çããªãªãŒã¹ããã Nuxt 3 ã«ã€ããŠç޹ä»ããŸãã ãªããå·çæç¹ã§ã®ç§ãã¡ã®ããŒã ã§ã¯ãæ¬çªãããžã§ã¯ããžã® Nuxt 3 ã®å°å
¥ã«ã¯è³ã£ãŠããŸããã æ¬èšäºã¯ããããŸã§æè¡èª¿æ»ãããªããç°¡åãªã¢ããªã±ãŒã·ã§ã³ãéçºããŠã¿ãå
容ããŸãšãããã®ã«ãªããŸãã æ¬èšäºã§ç޹ä»ãã ãœãŒã¹ã³ãŒã ã¯ä»¥äžã® ãªããžã㪠ã§å
¬éããŠããŸãã github.com Nuxt 3 ã«ã€ã㊠éçºç°å¢ Nuxt 3 ã®ãããžã§ã¯ãäœæãš TypeScript ã®èšå® TypeScript ã®èšå® ESLint ã®èšå® ç°¡åãªã¢ããªã±ãŒã·ã§ã³ãéçºããŠã¿ã ã³ã³ããŒãã³ãã®èšèš pages/index.vueã®äœæ app.vue ã®åé€ API åŒã³åºãã§ã®ããŒã¿ååŸ åäœç¢ºèª ã³ã³ããŒãã³ãã®äœæ CatCard ã³ã³ããŒãã³ãã®äœæ CatCardList ã³ã³ããŒãã³ãã®äœæ pages/index.vueããäœæããã³ã³ããŒãã³ããåŒã³ã ã ãã¹ã æºå ã³ã³ããŒãã³ãã¬ãã«ã®ãã¹ã Vitest ã® VSCode ãã©ã°ã€ã³ãšãããã° ãŸãšã Nuxt 3 ã«ã€ã㊠ã¯ããã«ãç°¡åã« Nuxt 3 ã«ã€ããŠç޹ä»ããŠãããŸãã Nuxt 㯠Vue.js ã® ãã¬ãŒã ã¯ãŒã¯ ã§ãã åé ã§ãè¿°ã¹ãŸãããã2022幎11æäžæ¬ã« Nuxt 3 ã®å®å®çãã€ãã«ãªãªãŒã¹ãããŸããã Announcing Nuxt 3.0 stableã https://nuxt.com/v3 Nuxt 3 ã®ãªãªãŒã¹ã§å€§ããã®ã¯ Vue 3 ã®æ£åŒãªãµããŒãã§ãã Vue 3 㯠2020幎9æã«ãªãªãŒã¹ãããŠããŸããããNuxt 2 ã§ã¯ãµããŒããããŠããŸããã§ããã Vue 3 ãã远å ããã Compositon API ãªã©ãå©çšããããã«ãNuxt 2 ã®ãããžã§ã¯ãã§ Nuxt Composition API ãªã©ã®ããã±ãŒãžãå©çšããŠãã人ãå€ãã£ãã®ã§ã¯ãªãã§ããããã ä»åãªãªãŒã¹ããã Nuxt 3 㯠Vue 3 ãå
¬åŒã«ãµããŒãããŠããŸããããµãŒããšã³ãžã³ã Nitro ã«å·æ°ãããããã©ãŒãã³ã¹ãåäžããŠããŸãã éçºç°å¢ æ¬èšäºã§ã®å©çšããéçºç°å¢ã®æ
å ±ãèšèŒããŸãã éçºç°å¢/ IDE ïŒ GitHub Codespaces ãªãŒãžã§ã³ïŒSoutheast Asia ã¹ããã¯ïŒCPU 4ã³ã¢ãã¡ã¢ãª 8 GB Node.js ã®ããŒãžã§ã³ç®¡çããŒã«ïŒnvm Node.js ããŒãžã§ã³ïŒv18.12.1 ããã±ãŒãžãããŒãžã£ãŒã»ããŒãžã§ã³ïŒYarn / 1.22.19 ãã©ãŠã¶ïŒ Google Chrome ãã£ãããªã®ã§ã GitHub Codespaces ãçšããŠã¿ãŸããã Node.js ã®ããŒãžã§ã³ç®¡çãœããã«ã¯ GitHub Codespaces äžã§ããã©ã«ãã§ã€ã³ã¹ããŒã«ãããŠãã nvm ãå©çšããŠããŸãã Node.js ã®ããŒãžã§ã³ã¯ LTS ã®ææ°ããŒãžã§ã³ã§ãã v18 ç³»ããããã±ãŒãžãããŒãžã£ãŒã«ã¯ Yarn ã䜿ã£ãŠããŸãã VSCode ã® æ¡åŒµæ©èœ ã¯ä»¥äžã®ãã®ãå©çšããŸãã Volar Vue Language Features TypeScript Vue Plugin ESLint Chrome ã® æ¡åŒµæ©èœ ã¯ä»¥äžã®ãã®ãå©çšããŸãã Vue.js devtools Nuxt 3 ã®ãããžã§ã¯ãäœæãš TypeScript ã®èšå® Nuxt 3ã®ãããžã§ã¯ãäœæã¯ npx nuxi init ã³ãã³ãã§è¡ããŸãã npx nuxi init ${ ãããžã§ã¯ãå } ãããžã§ã¯ãäœææ®µéã§ã§ãã ãã£ã¬ã¯ã ãªæ§æã¯ä»¥äžã®ããã«ãªããŸãã ãããžã§ã¯ãå âââ README.md âââ app.vue âââ nuxt.config.ts âââ package.json âââ tsconfig.json TypeScript ã®èšå® Nuxt ã¯ããã©ã«ãã ãš TypeScript ã®å³æ Œãªåãã§ãã¯ãæå¹ã«ãªã£ãŠããªãã®ã§æå¹ã«ããŸãããã ãŸã㯠TypeScript ãš vue- tsc ã devDependency ã«è¿œå ããŸãã yarn add -D typescript vue-tsc 次㫠nuxt.config.ts ã以äžã®ããã«ç·šéããŸãã // https://nuxt.com/docs/api/configuration/nuxt-config export default defineNuxtConfig ( { typescript: { shim: false , strict: true , typeCheck: true } , } ); shim: false ãšããŠããã®ã¯ã VSCode ã§ TypeScript Vue Plugin (Volar) ãå©çšããããã§ãã strict: true ã«ããããšã§ãåãã§ãã¯ã峿 Œã«ãªããŸãã typeCheck: true ãšããŠããã®ã¯ãéçºæããåãã§ãã¯ãæå¹ã«ããããã§ããNuxt ã§ã¯ãã«ãããã©ãŒãã³ã¹ãæé©åããããã«ããã©ã«ãã§ã¯åãã§ãã¯ãè¡ãããŸããã ãã®ãããã®è©³çްã«ã€ããŠã¯ä»¥äžã®å
¬åŒããã¥ã¡ã³ããåç
§ããŠãã ããã Nuxt - Installationã https://nuxt.com/docs/getting-started/installation Nuxt - type-checkingã https://nuxt.com/docs/guide/concepts/typescript ãŸã Nuxt 3 ãã㯠CLI ã§ã®åãã§ãã¯ãå®è¡ã§ããŸãã yarn nuxi typecheck ãããéçºäžã®ããããªããŒãæã«ãã«ãããã©ãŒãã³ã¹ãæ±ãããªãã°ã typeCheck: false ãšã㊠CLI ã§ã®æåã§ã®ãã§ãã¯ãšããéžæè¢ããããŸãã 以äžã®ããã« npm ã¹ã¯ãªãã ã« typecheck ã³ãã³ããç»é²ããŠãããŠããããããããŸããã { " scripts ": { " build ": " nuxt build ", " dev ": " nuxt dev ", " generate ": " nuxt generate ", " preview ": " nuxt preview ", " postinstall ": " nuxt prepare ", " typecheck ": " nuxt typecheck " } } ESLint ã®èšå® 次㫠ESLint ã®èšå®ãããŸãããã Nuxt ã§ã¯ VSCode ã§éçºããéã«ã¯ ESLint ãã©ã°ã€ã³ ãå©çšããããšãæšå¥šãããŠããŸãã æ³šæç¹ãšã㊠Prettier ã¯ç¡å¹ã«ããããšãå§ããããŠããŸãã Nuxt - use-eslintã https://nuxt.com/docs/community/contribution#use-eslint ãšããããšã§ããŸã㯠ESLint ã devDependency ã«è¿œå ããŸãã yarn add -D @nuxtjs/eslint-config eslint ãã㊠ESLint ã®èšå®ãã¡ã€ã« .eslintrc ãäœæããŸãã touch .eslintrc .eslintrc ã¯ä»¥äžã®ããã«èšè¿°ããŸãã { " extends ": [ " @nuxtjs/eslint-config-typescript " ] } ãã§ã« Prettier ãå°å
¥ããŠããéçºè
ã«é
æ
®ããŠãPrettier ã«ãããã©ãŒããããããããªãããã«ããŸãããã .prettierignore ãçšæãããããžã§ã¯ãå
ã®ãã¹ãŠã®ãã¡ã€ã«ããã©ãŒããã察象å€ã«ããŠããŸããŸãããã 以äžã .prettierignore ã®èšè¿°å
容ã«ãªããŸãã # ãããžã§ã¯ãå
ã®ãã¹ãŠã®ãã¡ã€ã«ãPrettierã®å¯Ÿè±¡å€ã«ãã ** .vscode/settings.json ãèšå®ããä¿åæã« ESLint ã«ãããã©ãŒãããããããããã«ããŸãããã { " editor.codeActionsOnSave ": { " source.fixAll ": false , " source.fixAll.eslint ": true } } æåŸã« npm ã¹ã¯ãªãã ã« lint ã³ãã³ããç»é²ããŠãããŸãããã { " scripts ": { " build ": " nuxt build ", " dev ": " nuxt dev ", " generate ": " nuxt generate ", " preview ": " nuxt preview ", " postinstall ": " nuxt prepare ", " typecheck ": " nuxt typecheck ", " lint ": " eslint --ext .ts,.js,.vue . " , }, } ããã«ãã以äžã®ã³ãã³ãã§ ESLint ã«ããã³ãŒãã®éçè§£æããã©ãŒãããã宿œã§ããŸãã # éçè§£æ yarn lint # ãã©ãŒããã yarn lint --fix ç°¡åãªã¢ããªã±ãŒã·ã§ã³ãéçºããŠã¿ã ç°å¢ãæŽã£ãã®ã§ãããããã¯ç°¡åãªã¢ããªã±ãŒã·ã§ã³ãéçºããªãã Nuxt 3 ã«ã€ããŠè§ŠããŠãããŸãããã ä»å㯠The Cat API ãå©çšãããç«ãæã§ãããšãã§ããã¢ããªã±ãŒã·ã§ã³ãäœããŸãã The Cat API - Cats as a Service. https://thecatapi.com/ The Cat API ã§ã¯ API ããŒããªããŠãã10æãŸã§ã¯ã©ã³ãã ã«ç«ã®ç»åãååŸã§ããŸãã å®æåœ¢ã®ã€ã¡ãŒãžãšããŠã¯ãååŸããç«ç»åãã°ãªãã圢åŒã§è¡šç€ºããã¢ããªã±ãŒã·ã§ã³ãšããŸãã ã³ã³ããŒãã³ã ã®èšèš ã¯ããã« ã³ã³ããŒãã³ã ãèšèšããŸãããã Vue.js 㯠ã³ã³ããŒãã³ã æå㪠ãã¬ãŒã ã¯ãŒã¯ ã§ãã®ã§ãç»é¢ãã¶ã€ã³ãã ã³ã³ããŒãã³ã ãèšèšããŠããã®ã倧äºã§ãã ç»ååºå
žïŒ ã³ã³ããŒãã³ã ã®åºæ¬ - ã³ã³ããŒãã³ã ã®æ§æã https://v3.ja.vuejs.org/guide/component-basics.html ä»åã¯æå§ãã«ä»¥äžã®ãã㪠ã³ã³ããŒãã³ã æ§æãèããŸãããã index.vue ⊠ããŒãž ã³ã³ããŒãã³ã ã API åŒã³åºãã¯ããã§è¡ãã CatCardList.vue ⊠ç«ç»åã®ãªã¹ãã衚瀺ãã ã³ã³ããŒãã³ã CatCard.vue âŠ æ£æ¹åœ¢ã®ç«ç»å1æã衚瀺ãã ã³ã³ããŒãã³ã ããªãŒåœ¢åŒã§å¯èŠåãããšä»¥äžã®ããã«ãªããŸãã pages/index.vue ã®äœæ ã¯ããã« pages ã³ã³ããŒãã³ã ã® index.vue ã®è¿œå ããŸãããã Nuxt 3 ã§ã¯ nuxi add ã³ãã³ãã§ç°¡åã« pages ã³ã³ããŒãã³ã ã远å ã§ããŸãã npx nuxi add page index äœææç¹ã§ã¯ä»¥äžã®ãããªåœ¢ã«ãªã£ãŠããŸãã <script lang="ts" setup></script> <template> <div> Page: foo </div> </template> <style scoped></style> Nuxt 2 ãŸã§ã®åäžãã¡ã€ã« ã³ã³ããŒãã³ã å
ã§ã¯ã template script style ãšããé çªã§èšè¿°ãããã®ãäžè¬çã§ããããNuxt 3ã§ã¯ script template style ã®é ã§èšè¿°ããã®ãäžè¬çãªããã§ãã ãŸã script éšå㯠<script setup> æ§æã§ã®èšè¿°ãããŒã¹ãšãªã£ãŠããŸãã <script setup> æ§æã®è©³çްã«ã€ããŠã¯ Vue.js 3 ã®å
¬åŒããã¥ã¡ã³ããåç
§ããŠãã ããã Vue.js - SFC <script setup> ã https://v3.ja.vuejs.org/api/sfc-script-setup.html app.vue ã®åé€ Nuxt ã§ã¯ pages é
äžã® Vue ãã¡ã€ã«ã§ã¢ããªã±ãŒã·ã§ã³ã®ã«ãŒãã£ã³ã°ãçæãããŸãã ãã®ããããããžã§ã¯ãäœææç¹ã§ã®ãšã³ããªãã€ã³ãã§ãã app.vue 㯠pages ã³ã³ããŒãã³ã ãäœæåŸã¯äžèŠã«ãªãããåé€ããŸãã rm app.vue API åŒã³åºãã§ã®ããŒã¿ååŸ pages/index.vue ã§ The Cat API ãåŒã³åºããŠãããŒã¿ãååŸããåŠçãèšè¿°ããŸãã å€éš API åŒã³åºãã«ã¯ Nuxt çµèŸŒã¿ã® useFetch ãå©çšããŸãã useFetchã https://nuxt.com/docs/api/composables/use-fetch åŒã³åºãåã«ååŸããããŒã¿ã®åãå®çŸ©ããŠãããŸãããã ä»åãå©çšãã The Cat API ã®ã¬ã¹ãã³ã¹ã¯ä»¥äžã®ããã«ãªã£ãŠããŸãã [ { " id ": " 5ni ", " url ": " https://cdn2.thecatapi.com/images/5ni.jpg ", " width ": 500 , " height ": 375 } ] https://api.thecatapi.com/v1/images/search ãã®æ
å ±ãããšã«åæ
å ±ãå®çŸ©ããŸãããã åå®çŸ©ã¯ types ãã£ã¬ã¯ã ãªé
äžã«èšè¿°ããããšã«ããŸãã # typesãã£ã¬ã¯ããªã®äœæ mkdir types touch types/index.ts interface ã§ã¬ã¹ãã³ã¹ã®åãå®çŸ©ããŸãã export interface CatResponse { id: string ; url: string ; width: number ; height: number ; } ãããŠå®çŸ©ããåæ
å ±ãã€ã³ããŒããã€ã€ã useFetch ã§ã® API åŒã³åºãã®ã³ãŒããèšè¿°ããŸãã <script lang="ts" setup> import { CatResponse } from '~/types' const { pending, error, data } = useFetch<CatResponse[]>( 'https://api.thecatapi.com/v1/images/search?limit=10' ) </script> <template> <div> Page: foo </div> </template> <style scoped></style> useFetch ãå©çšããéã«ãã€ã³ããŒãæãæžããŠããªãããšã«éåæãããæ¹ãããã®ã§ã¯ãªãã§ããããïŒ Nuxt 3 ã§ã¯ãAuto Imports æ©èœããããVue.jsæšæºã® ref ã computed Nuxt çµèŸŒã¿ã® useFetch ãªã©ã®é¢æ°ãæç€ºçã«ã€ã³ããŒãããããšãªãèšè¿°ã§ããŸãã Nuxt - auto-importsã https://nuxt.com/docs/guide/concepts/auto-imports åäœç¢ºèª ãããŸã§ã§ã¢ããªã±ãŒã·ã§ã³ãèµ·åãã Chrome ã® Vue.js devtoolsã確èªããŸãããã # éçºãµãŒãã§ã¢ããªã±ãŒã·ã§ã³ãèµ·å yarn dev Chrome ã® Vue.js devtoolsã確èªãããšããã¡ããšããŒã¿ååŸã§ããŠããããšãããããŸãã ã³ã³ããŒãã³ã ã®äœæ ç¶ã㊠ã³ã³ããŒãã³ã ãäœæããŠãããŸãããã ã³ã³ããŒãã³ã ã nuxi add ã³ãã³ãã§ç°¡åã«è¿œå ã§ããŸãã # CatCardListã³ã³ããŒãã³ãã®äœæ npx nuxi add component CatCardList # CatCardã³ã³ããŒãã³ãã®äœæ npx nuxi add component CatCard CatCard ã³ã³ããŒãã³ã ã®äœæ ãŸãã¯ããå°ããé局㮠CatCard ã³ã³ããŒãã³ã ãäœæããŸãã CatCard ã³ã³ããŒãã³ã ã§ã¯ã props ãä»ããŠ1ã€ã® CatResponse ãªããžã§ã¯ããåãåããŸãã ãããŠç»åã®URLã <img> ã¿ã°ã® src ã«æž¡ããŸãã 以äžã CatCard ã³ã³ããŒãã³ã ã®ã³ãŒãã«ãªããŸãã <script lang="ts" setup> import { CatResponse } from '~/types' interface Props { catData: CatResponse; } defineProps<Props>() </script> <template> <div> <img class="card-img" :src="catData.url" alt="cute cat" :data-testid="catData.id" > </div> </template> <style scoped> .card-img { border-radius: 8px; width: 320px; height: 320px; object-fit: cover; } </style> CatCardList ã³ã³ããŒãã³ã ã®äœæ 次㫠CatCardList ã³ã³ããŒãã³ã ãäœæããŸãã CatCardList ã³ã³ããŒãã³ã ã§ã¯ã props ãä»ã㊠CatResponse ãªããžã§ã¯ãã®é
ååãåããŸãã ãã㊠v-for æ§æã§é
åãå±éãã CatCard ã³ã³ããŒãã³ã ãè€æ°æç»ããŸãã 以äžã CatCardList ã³ã³ããŒãã³ã ã®ã³ãŒãã«ãªããŸãã <script lang="ts" setup> import { CatResponse } from '~/types' interface Props { catList: CatResponse[]; } defineProps<Props>() </script> <template> <div class="card-list" data-testid="cat-list"> <cat-card v-for="(cat, i) in catList" :key="i" :cat-data="cat" /> </div> </template> <style scoped> .card-list { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 16px; } </style> pages/index.vue ããäœæãã ã³ã³ããŒãã³ã ãåŒã³ã ã äœæãã CatCardList ã³ã³ããŒãã³ã ã index.vue ããåŒã³åºããŸãã ã³ã³ããŒãã³ã ã«ã€ããŠã Nuxt åŽã§ã® Auto Imports ãæå¹ã«ãªã£ãŠãããããæç€ºçã«ã€ã³ããŒãããå¿
èŠã¯ãããŸããã <script lang="ts" setup> import { CatResponse } from '~/types' const { pending, error, data } = useFetch<CatResponse[]>( 'https://api.thecatapi.com/v1/images/search?limit=10' ) </script> <template> <div v-if="!pending && data" class="content"> <cat-card-list :cat-list="data" /> </div> </template> <style scoped> .content { margin: auto; } </style> CatCardList 㯠data ã®å€ãããããã£ã«ãããå¿
èŠããããã v-if ã§æ¡ä»¶ä»ã ã¬ã³ããªã³ã° ã«ããŸãã ããšã¯ãå°ãã¬ã€ã¢ãŠããæŽããã°ä»¥äžã®ãããªã¢ããªã±ãŒã·ã§ã³ã宿ããŸãã isid.github.io ãã¹ã æåŸã«ãã¹ãã«ã€ããŠãè§ŠããŸãããã Vue.js 3 ç³»ããã¯ãã¹ãããŒã«ãšã㊠Vitest ãæšå¥šãããŠããŸãã Vue.js - ãã¹ã #æšå¥šäºé
ã https://ja.vuejs.org/guide/scaling-up/testing.html#recommendation Nuxt 3 ã®å
¬åŒããã¥ã¡ã³ãã§ã¯ãã¹ãçšããŒã«ã« @nuxt/test-utils-edge ã玹ä»ãããŠããŸããããã¡ãã¯éçºäžã§äžå®å®ã§ãã ãªã®ã§ä»å㯠ã³ã³ããŒãã³ã ã¬ãã«ã®ãã¹ãã ãã宿œãã Vue Testing LibraryïŒ@testing-library/vueïŒ ãçšããæ¹æ³ã玹ä»ããŸãã ãªã Vue.js ã®ãã¹ãããŒã«ãšããŠã¯ã Vue Test Utils ããããŸããã ã³ã³ããŒãã³ã ã¬ãã«ã®ãã¹ãã§ã¯ @testing-library/vue ã®å©çšãæšå¥šãããŠããŸãã Vue.js - ãã¹ã ã³ã³ããŒãã³ã ã®ãã¹ã#æšå¥šäºé
ã https://ja.vuejs.org/guide/scaling-up/testing.html#recommendation-1 æºå ãŸãã¯å¿
èŠãªããã±ãŒãžãã€ã³ã¹ããŒã«ããŸãã ãã¹ãæã« ã³ã³ããŒãã³ã ãæç»ããDOMç°å¢ã«ã¯ happy-dom ã䜿çšããŸãã yarn add -D vitest @testing-library/vue happy-dom Vitest ã®èšå®ãã¡ã€ã« vitest.config.ts ãäœæããŸãã /// <reference types="vitest" /> import { defineConfig } from 'vitest/config' import Vue from '@vitejs/plugin-vue' export default defineConfig ( { plugins: [ Vue () ] , resolve: { alias: { '~' : ` ${__dirname} ` } } , test: { root: '.' , globals: true , environment: 'happy-dom' } } ) npm ã¹ã¯ãªãã ã« test ã³ãã³ãã远å ããŸãã { " scripts ": { " build ": " nuxt build ", " dev ": " nuxt dev ", " generate ": " nuxt generate ", " preview ": " nuxt preview ", " postinstall ": " nuxt prepare ", " typecheck ": " nuxt typecheck ", " lint ": " eslint --ext .ts,.js,.vue . ", " test ": " vitest " , }, } ã³ã³ããŒãã³ã ã¬ãã«ã®ãã¹ã CatCard ã³ã³ããŒãã³ã ã®ãã¹ããèšè¿°ããŸãããã CatResponse 圢åŒã®ãªããžã§ã¯ãã props ã«æž¡ããéã«ã ã³ã³ããŒãã³ã ãæç»ã§ããããã¹ãããŸãã ãã¹ãã³ãŒã㯠tests ãã£ã¬ã¯ã ãªé
äžã« *.spec.ts ã®åœ¢ã§é
眮ããŸãã @testing-library/vue ã§ã®ãã¹ãã³ãŒãã¯ä»¥äžã®ãããªããŸãã ã³ã³ããŒãã³ã ãæç»ã§ããŠãããã®å€æã«ã¯ data-testid 屿§ã䜿ã£ãŠããŸãã import { describe , expect , test } from 'vitest' import { render } from '@testing-library/vue' import CatCard from '~/components/CatCard.vue' import { CatResponse } from '~/types' describe ( 'CatCard' , () => { test ( 'ã³ã³ããŒãã³ãã®æç»ãã§ããããš' , () => { const catData: CatResponse = { id: 'test' , url: 'https://example.com' , width: 100 , height: 100 } const { getAllByTestId , html } = render ( CatCard , { props: { catData } } ) const results = getAllByTestId ( catData.id ) expect ( results.length ) .toBe ( 1 ) expect ( html ()) .contain ( `data-testid=" ${ catData.id } "` ) } ) } ) ãã¹ããå®è¡ããŠã¿ãŸãããã yarn test ãã¡ããšãã¹ããéãã°ã以äžã®åºåãåŸãããŸãã RERUN tests/components/CatCard.spec.ts x20 â tests/components/CatCard.spec.ts (1) Test Files 1 passed (1) Tests 1 passed (1) Start at 09:40:00 Duration 230ms PASS Waiting for file changes... press h to show help, press q to quit Vitest ã® VSCode ãã©ã°ã€ã³ ãš ãããã° ãã¹ãã³ãŒããæžãããšã«ãã£ãŠãå°ããç¯å²ã§ã³ãŒããåãããããã«ãªããŸããã ããã« ãããã° ãã§ãããšéçºãããæããŸãã Vitest ã§ã¯å
¬åŒã§ VSCode ã® ãã©ã°ã€ã³ ããªãªãŒã¹ããŠããããã¡ããæŽ»çšããããšã§ãã¹ãã³ãŒããããšã«ãããã¬ãŒãèµ·åã§ããŸãã Vitestã https://marketplace.visualstudio.com/items?itemName=ZixuanChen.vitest-explorer VItes - IDE Integrations ã https://vitest.dev/guide/ide.html ãã¹ãã³ãŒãã« ãã¬ãŒã¯ãã€ã³ã ãä»èŸŒãã§ããã¹ãã¿ãããããã¹ãã® ãããã° ããéžæãããšãããã¬ãŒãèµ·åã§ããŸãã ããã§éçºç°å¢ã¯ããããªã§ããã ãŸãšã æ¬èšäºã§ã¯ãNuxt 3 ã«ã€ããŠç޹ä»ããŸããã ä»åãèšäºãæžããªãã ããããŸã§ã® Nuxt ã®è¯ããåŒãç¶ããªããæ£åœã«é²åããŠãããšæããŸããã nuxi ã³ãã³ãã®å
å®ã TypeScriptã VSCode ãšã®èŠªåæ§ã®åäžãNitroã«ãããã«ãé床ã®åäžãªã©éçºãããæ¥œãããªãå¯èœæ§ãæããŸããã äžæ¹ã§ãã¹ãã®éšåã¯ãŸã äžå®å®ã ãšèšããããåŸãŸããã Nuxt åŽã® Auto Imports æ©èœãš Vitest ã®é£æºãããŸããããªãã£ãã @nuxt/test-utils-edge ã¢ãžã¥ãŒã«ãéçºäžã§ãããã Nuxt 3 ã®ã¢ããªã±ãŒã·ã§ã³ããã¹ãããæ¹æ³ã確ç«ããŠããŸããã support for unit testing in a nuxt environment #2465ã https://github.com/nuxt/framework/issues/2465 Nuxt - Testingã https://nuxt.com/docs/getting-started/testing#testing çŽè¿ã§ Nuxt 3 ã®å°å
¥ãæ€èšããŠãããªãã°ããã®éšåã«ã¯æ³šæãããå¿
èŠããããŸãã æåŸã«ãç§ãã¡AIãã©ã³ã¹ãã©ãŒã¡ãŒã·ã§ã³ã»ã³ã¿ãŒã§ã¯ãäžç·ã«åããŠããã仲éãæ¢ããŠããŸãã AI 補åéçºã«èå³ãããæ¹ã®ãå¿åããåŸ
ã¡ããŠãããŸãã AIãšã³ãžãã¢ïŒãããã¯ãéçºïŒ AIãããã¯ããããŒãžã£ãŒ AIã³ã³ãµã«ã¿ã³ã AIããžãã¹ãããžã§ã¯ããããŒãžã£ãŒ å·çïŒ @yamada.y ãã¬ãã¥ãŒïŒ 寺山 èŒ (@terayama.akira) ïŒ Shodo ã§å·çãããŸãã ïŒ