What I struggled ๐ง/๐ฃ brag In
Week 45, 2024 - Nuxt generate fail in Node v22
[x]์์ Node v20์๋ build ๋๋๋ฐ v22์์ build ์๋๋ ๋ฒ๊ทธ ์ฆ์ - generate command does not return/close on success ๊ฐ์ nuxt ๊ธฐ๋ฐ project์ธ [.co.kr]์ v22์์ build ๋จ
Nuxt 3.13.2 with Nitro 2.9.7์ผ๋ก ๊ฐ๊ณ , vite๋ 5.4.7, 5.4.10๋ก ์ฐจ์ด๋๋ค. (์ ์๊ฐ [x])
์์ฌ๊ฐ๋ ๋ถ๋ถ
5.4.8 (2024-09-25)
Week 36, 2024 - Nuxt hook for page blink during nav
ํ์ด์ง ์ด๋ ์ ๋ค์ ํ์ด์ง๊ฐ ์บ์๋์ง ์์ ๊ฒฝ์ฐ ์ง์ฐ์๊ฐ์ด ์๋๋ฐ,
๊ทธ ๋์ ํ์ฌ ํ์ด์ง top:0์ผ๋ก ์ด๋
ํ์ ๋ค์ ํ์ด์ง๋ก ์ด๋ํด์ UX ์ ๊ฑฐ์ฌ๋ฆผ
Week 35, 2024 - Safari infinite translateX animation flickers on loop
Adding -webkit-transform: translateZ(0);
to img or picture element will do the trick #
scroll element ๋ด์ <picture>
+ lazy loading์ด ์ ๋๋ก ์๋๋ ๋ฒ๊ทธ๋ ์์ด eager๋ก ๋ฐ๊ฟ
Week 25, 2024 - PDF Generator
์ด์ Pdf Generator project๋ฅผ ๋ค์ ์จ์ผ ๋ ์ํฉ์ด ์์ project๋ฅผ ๊ฐ์ ธ์ package upgradeํด์ ์ธํ ํด๋ณด๋ Chromium launch error ๋ช ๊ฐ์ง ๋ฐ์ (Security.setIgnoreCertificateErrors, ๋ฑ) 2~30๋ถ ํ๋๋ฐ ๋ค๋ฅธ error ๋ฐ์ํด์ ์์ version์ผ๋ก ๋๋ฆฌ๋ ์ ๋๋ก ๋๋ค.
Week 24, 2024 - iOS border height style
<section class="!h-4 | flex gap-1 | text-10">
<div
class="w-fit font-bold px-[6px] rounded-full | flex items-center"
:class="
isNutritionCard
? 'text-grey-500 border border-grey-500'
: 'text-grey-50 bg-[#00000099]'
"
>
<!--! chip์์ ์ง์ height๋ฅผ ์ง์ ํ๋ฉด, border ์ ๋ฌด์ ๋ฐ๋ผ iOS safari์ ๋ค๋ฅธ browser์์ height ๊ณ์ฐ์ ๋ค๋ฅด๊ฒ ํด์ parent์์ height๋ฅผ ๊ณ ์ -->
{{ topic.category }}
</div>
</section>
๋น์ทํ๊ฒ chip class style ์์ฑํ ๋, padding-top ์ก๋ ์์น๊ฐ 1px ์ฐจ์ด๋์ ์ด๊ฑธ ๊ณ ์น๋ฉด ํ๋์ฉ ์๋๊ฐ๋ณด์ฌ, height 25px โ 26px ๋ก ์์ ํ case๋ ์๋ค.
Week 21, 2024 - Swiper
์ค๋ฅธ์ชฝ ๋๊น์ง swipe ํ์ ๋ ๋น ๊ณต๊ฐ์ด ๋จ๋๋ค.
|โผ๏ธโผ๏ธโผ๏ธ| โ |โผ๏ธโป๏ธโป๏ธ|
์ด๋ฒ์ major version v11๋ก updateํ Swiper core API๋ฅผ ์ฌ์ฉํ๋ฉด slidesOffsetAfter
๊ฐ์ ์๋์ผ๋ก ๊ณ์ฐํด์ ๋ฃ์ผ๋ฉด ๋๊ธด ํ์ง๋ง,
์ด์ ์ Swiper element ์ด code๋ค์ ์ ๊ณ์ฐ ์์ด ์ ์ ๋์ํ๋ค.
<swiper-container slides-per-view="auto">
<swiper-slide class="w-16" />
</swiper-container>
core API์๋ slidesPerView์ width ์ค์ ํด๋ดค์ง๋ง ์ค๊ฐ์ layer ํ๋๊ฐ ์ถ๊ฐ๋ ๊ฒ ๋๋ฌธ์ธ์ง ์๋จ.
Week 16, 2024 - Blurry text on canvas
๋ชจ๋ํฐ 3๊ฐ ์ฌ์ฉ ์ค์ธ๋ฐ, ๋งฅ๋ถ ๋ชจ๋ํฐ์์ canvas์์ ์ด๋ฏธ์ง ์ ์ฅํ ํ์ผ์ text๊ฐ ํ๋ฆฌ๊ฒ ๋ณด์
const canvas = document.createElement("canvas")
const scale = window.devicePixelRatio || 1 // ํ
์คํธ๊ฐ ํ๋ฆฌ๊ฒ ๋ณด์ฌ device pixel ratio์ ๋ฐ๋ผ ๋ฐฐ์จ ์กฐ์ ํ์ฌ ์ ์ฅ
canvas.width = 360 * scale
canvas.height = 576 * scale
canvas.style.width = "360px"
canvas.style.height = "576px"
const ctx = canvas.getContext("2d")
ctx.scale(scale, scale)
Week 14, 2024 - Dynamic route path on Nuxt generate
๋นํ์ ๋ฆฌํฌํธ ์์ธ ํ์ด์ง๋ฅผ ๋ชจ๋ฐ์ผ์์ ์ด๋ํ๋ค ์๋์น ์๊ฒ ํ๋ฉด์ ๋์ด๋ด๋ ค refresh๋ฅผ ์ผ์ผํด โ dynamic route path๋ nuxt generate ์์ ์ฒ์ access point๋ก ์ฐ๋ฉด / ๋ก redirection ๋จ
/login error ํ๋ฉด์ด ๋์ด โ Navigate Back์ผ๋ก ๋นํ์ ๋ฆฌํฌํธ ์์ฝํ์ด์ง์ ์ด๋ํ๋ฉด, access URI๊ฐ ํ์์ฉ(/login)์ด๊ธฐ ๋๋ฌธ์ $auth.requestAuth๊ฐ setup๋์ง ์์ ํด๋น error๊ฐ ๋ฐ์ (s.requestAuth is not a function)
- mobile์์ ์๋์น ์๊ฒ refresh ๋์ง ์๊ฒ overscroll-behavior: contain ์ผ๋ก mitigate
- $auth.requestAuth ๊ฐ setup์๋๋ฉด page refresh ์์ผ์ ํด๊ฒฐ
Week 12, 2024 - primevue new theme layer
์ฌ์ฉ ์ค์ธ primevue theme์ด
- 3.46.0์์ ์ ์์๋
- 3.47.0์์ checkbox style ๋ง๊ฐ์ง
- 3.48์์ deprecated
https://github.com/primefaces/primevue/issues/5220 https://github.com/primefaces/primevue/blob/master/CHANGELOG.md#3480-2024-02-05 #5201 theme์ ์ฐ์ด๋ class๋ ์ ๋งํด์ ์๋ฐ๋์ค ์์๋๋ฐ minor์์ break๋๋ค๋...
/nonmember/report์์ autocomplete ๊ฒ์ ๊ฒฐ๊ณผ ๋์ด ํ, ํ์ด์ง ์ด๋, ๋์์ค๋ฉด layer ์์๊ฐ ๋ฐ๋์ด์ style์ด ์ฃ๋ค ๊นจ์ง.
์ด์ ์ FOUC ๋๋ฌธ์ primevue์์ dynamicํ๊ฒ import ํ๋ style resource๋ค์ ์ฐ์ ์์ ๋ฎ์ถ๊ธฐ ์ํด ์์ชฝ์ import ์ํค๋ code ๋๋ฌธ์ ๋ฐ์. -> ์ ๊ฑฐ
Week 12, 2024 - Wix shopify referral
Terminology
- ํ์ ๋ฐ์ก ๋ฉ์ผ์์ ์ ๊ทผ ref code ์ดํ rc -> sendgrid ๋์์์ ๊ตฌ๋งค๋ ๊ณ ๋ ค์น ์์์ผ๋ก ์ธํด rc link๊ฐ ํ์ ์๊ฒ ๋จ
- ํ์์ด ๊ณต์ ํ URL๋ก ์ ๊ทผ forward code ์ดํ fc ->
- ํ์์ด ์๋ ์ฌ๋์ด ๊ณต์ ํ๊ฑฐ๋ ์ง์ ์ ๊ทผ no code ์ดํ nc
Access URL
rc - https://promo.genoplan.com/cancer-prevention-support-campaign/?rc={{ref-code}}- fc - https://promo.genoplan.com/cancer-prevention-support-campaign/?fc={{ref-code}}
- nc - https://promo.genoplan.com/cancer-prevention-support-campaign/
๊ณต์ URL
๊ณต์ ํ๊ธฐ ๋ฒํผ์์ clipboard๋ก copy, SNS ๊ณต์
rc - https://promo.genoplan.com/cancer-prevention-support-campaign/?fc={{ref-code}}- fc - https://promo.genoplan.com/cancer-prevention-support-campaign/ (์ ๋จ์ถ ๋ฒ์ ) - ref code ๊ฐ์ง๊ณ 1๋จ๊ณ ์ด์ ์ถ์ ๊ฐ๋ฅํ๊ธด ํ๋ฐ... ์ผ๋จ ์ถ์ ์ ์ํ๋ ๊ฑธ๋ก ๊ธฐํ
- nc - https://promo.genoplan.com/cancer-prevention-support-campaign/ (์ ๋จ์ถ ๋ฒ์ )
ref-code๊ฐ ์๋ชป๋ซด์ ๋ ์ด์ฐ ์ฒ๋ฆฌ๋๋๊ฐ? โ shopify์์ code ์๋ ๊ฑธ๋ก ์ฒ๋ฆฌ๋จ
shopify URL
11,000์ ๊ตฌ์
rc - ref-code ์จ์ ์ถ์ ์ฉ๋๋ก - https://jp.store.genoplan.com/discount/{{ref-code}}?redirect=%2Fproducts%2F%E3%82%AA%E3%83%A0%E3%82%AD%E3%83%AA%E6%A7%98%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88- fc - ref-code ์จ์ ์ถ์ ์ฉ๋๋ก - https://jp.store.genoplan.com/discount/{{ref-code}}?redirect=%2Fproducts%2F%E3%82%AA%E3%83%A0%E3%82%AD%E3%83%AA%E6%A7%98%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88
- nc - https://jp.store.genoplan.com/products/%E3%82%AA%E3%83%A0%E3%82%AD%E3%83%AA%E6%A7%98%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88
wix์์ code ํฌํจ๋ shopify url ๋ฒํผ์ผ๋ก ์ฐ๊ฒฐ - https://www.wix.com/wix-lp/new-wixcode/forum/coding-with-velo/solved-how-to-open-in-new-tab-with-wix-location
9,900์ ๊ตฌ์
rc - ref-code๋ฅผ ๊ฐ์ง๊ณ ๋ฏธ๋ฆฌ ์์ฑํ discount code๋ฅผ ๊ฐ์ ธ์ด - https://jp.store.genoplan.com/discount/{{discount-code}}?redirect=%2Fproducts%2F%E3%82%AA%E3%83%A0%E3%82%AD%E3%83%AA%E6%A7%98%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88- fc - ref-code๋ฅผ ๊ฐ์ง๊ณ ๋ฏธ๋ฆฌ ์์ฑํ discount code๋ฅผ ๊ฐ์ ธ์ด - https://jp.store.genoplan.com/discount/{{discount-code}}?redirect=%2Fproducts%2F%E3%82%AA%E3%83%A0%E3%82%AD%E3%83%AA%E6%A7%98%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88
- nc - https://jp.store.genoplan.com/discount/OMUKIRI?redirect=%2Fproducts%2F%E3%82%AA%E3%83%A0%E3%82%AD%E3%83%AA%E6%A7%98%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88
- ํ ์ธ์ฝ๋ ํฌํจ๋ ๋งํฌ๋ฅผ wix email์ ๋ฃ์ ์ ์๋๊ฐ? form text input์ผ๋ก ์ฒ๋ฆฌํจ + hidden
etc
- discount์ฉ, no-discount์ฉ ๋ ๋ค concatํ URL์ ๋ฉ์ผ๋ก ์๋ฉด code ์ฐพ์ผ๋ ค๊ณ requestํ ํ์๋ ์์
- ํ ์ธ์ด 0์ผ๋ก ํ์๋ ํ ๋ฐ... ์ฌ์ํ๊ฐ
- ๋์ค์ shopify์์ ์ ์ฒด ๋ฆฌ์คํธ ๋ค์ด ๋ฐ์์ code ์ฌ์ฉ ์ ์ถ์ถ
Week 12, 2024 - dynamic page with Lazy component
bo์์ service ํ์ด์ง๋ฅผ ์ด๊ณ , ๋ฆฌํฌํธ์์ ์์ธ ํญ๋ชฉ์ ํด๋ฆญํ๋ฉด
Uncaught (in promise) TypeError: Failed to fetch dynamically imported module:
/_nuxt/_code_.EESJVKCf.js
error๋ฅผ ๋ฑ์ผ๋ฉด์ / ํ์ด์ง refresh ๋๋ค.
๋ค๋ก ๊ฐ๊ธฐํ ๋ค์ ๋ค์ ์์ธ ํญ๋ชฉ ํด๋ฆญํ๋ฉด /_nuxt/_code_._MbpWpiu.js
์ ๊ทผํ๋ฉด์ ์ ์ ๋์.
[code] ๊ฐ์ dynamic page๋ฅผ <Lazy>
component์์ ์ ๊ทผํ๋ฉด lazy์ import์ ๊ฐ์ด ์์ฉํ๋ฉด์ ๋ฒ๊ทธ ๋ฐ์ํ๋ ๋ฏ
lazy ์ ๊ฑฐํ๋ ์ ์ ๋์
Week 10, 2024 - get Shopify order data on wix
requirements
- token of shopify Custom app with read order auth
- Wix backend code calling Shopify API to bypass CORS
shopify order์ status open ์ด ํ๋งค ์ค์ธ ์ํ์ธ์ค ์์๋๋ฐ ๋ฐ์ก ์ํ ์ํ(๋ฏธ์ฒ๋ฆฌ) any, closed์ ์ทจ์ ๊ฑด ์๋ ๋ค์ด๊ฐ
ํ ํ์ด์ง์ 250๊ฐ ์ ํ์ product_id๋ก filter๋ ๋ฐ์ดํฐ ๋ฐ์ ํ์ ๊ฐ๋ฅ. cursor based pagination์ด๋ผ... open+์์ผ๋ก closed ํด์ผ ๊ฒ ๋๋ฐ?
Week 09, 2024 - Nuxt3 template single wrapper
Nuxt3 project์์ ํ์ด์ง ์๋ก ๊ณ ์นจ ํ์ API data ๋ฐ์์ v-if๋ก DOM ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ ๋ค์ error๊ฐ ๋ฐ์
Uncaught (in promise) TypeError: Cannot read properties of null (reading 'insertBefore') at insert (chunk-5V36DLOA.js?v=0e87bacb:9614:12)
์๋ก ๊ณ ์นจ ์ console์์ ๋ค์๊ณผ ๊ฐ์ warning์ด ๋์ด
[Vue warn]: Hydration node mismatch
code๋ ๋ค์๊ณผ ๊ฐ๋ค
<template>
<RegistrationVerifySN v-if="step === 'VERIFY_SN'" @nextStep="nextStep" />
<RegistrationGuide v-else-if="step === 'GUIDE'" @nextStep="nextStep" />
</template>
๊ฐ์ ๊ฒ์ํ๋ค๊ฐ ์ง๋์น comment๋ฅผ ์ ์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ๊ณ ์น๋ warning์ ๊ทธ๋๋ก์ง๋ง error๋ ํด๊ฒฐ ๋จ. vue2์ฒ๋ผ ํ๋์ wrapper๋ก ํด์ผ๊ฒ ๋ค
<template>
<div>
<RegistrationVerifySN v-if="step === 'VERIFY_SN'" @nextStep="nextStep" />
<RegistrationGuide v-else-if="step === 'GUIDE'" @nextStep="nextStep" />
</div>
</template>
Week 09, 2024 - Google maps API syntax error
์ต์ ๋ฒ์ ์ฐ๋๋ฐ ์ ๋ฌธ๋ฒ error๊ฐ ๋ฐ์ํ๋ ๋ณด๋ ์๋ ์ ๋ฃ์ด๋๋ polyfill๊ณผ ์ถฉ๋๋๋ ๋ฏ.
์คํ์๋ ๋ฌธ์ ์์ง๋ง sentry์์ ๊ณ์ error ๋ณด๊ณ ๋๋ google translator๋ tag manager error ์์ธ๋ ์ด๊ฑฐ?
debug ๊ณผ์
host-report-errors.js:5 Unhandled promise rejection TypeError: r is not iterable at Loader.eval (index.mjs:324:44)
error ๋ฉ์์ง๊ฐ ๋ ์ Week 25, 2023 - @babel/preset-env core-js Polyfill์ ๊ฐ์ด babel build script ์์ ํ์ฌ core-js polyfill ์ ์ฉํ๋
Uncaught TypeError: this.Tm is not iterable
p @ https://cdn.polyfill.io/v3/polyfill.min.js:6
_callee$ @ webpack-internal:///./node_modules/.pnpm/@googlemaps+js-api-loader@1.16.6/node_modules/@googlemaps/js-api-loader/dist/index.mjs:547
์๋ ์ ๋ฃ์ด๋๋ polyfill์ด initiator๋ก ์กํ. ์ค๋ง ์ถ์ด์ ์ ๊ฑฐํด๋ณด๋ ๋ฌธ์ ํด๊ฒฐ
Week 08, 2024 - Nuxt definePageMeta code runs unconditionally
page meta ์ง์ ์ด ์๋จนํ๋ ๋ฒ๊ทธ
- ํ์: ์ด๊ธฐ mount ์์ ์์ ์คํ๋์ง ์๋ switch ๋ฌธ์ case ์์ ์๋ meta reset์ฉ definePageMeta code๋ฅผ comment out์ํค๋ ์ ๋๋ก ๋์๊ฐ. ํน์ ์คํ๋๋ ๋ฐ๋ก ์์ log์ฐ์ด๋ณด๋ ์คํ ์๋จ. ๋ญ์ง?
- ์์ธ: ๋ฌธ์ ์ฐพ์๋ณด๋ compiler macro๋ผ๋๋ฐ conditional branch์ ์๊ฑด ์๊ฑด ๋ฌด์กฐ๊ฑด ์คํ๋๋๋ด. ์ด๋ฆ๋ถํฐ define์ผ๋ก ์์๋๊ธด ํ๋ค.
definePageMeta is a compiler macro
const nextStep = () => {
switch (step.value) {
case "VERIFY_SN":
step.value = "FORM"
break
case "FORM":
step.value = "COMPLETE"
console.log("๐ ~ step.value:", step.value, "reset") // not run
definePageMeta({}) // run
break
}
}
Week 01, 2024 - imprv delay of switching checkbox in PrimeVue DataTable
- Motivation: checkbox ๊ฐ์ง 100๊ฐ row์ table์์ ์ผ๊ด ๋ค์ด๋ก๋๋ฅผ ์ํด checkbox๋ฅผ ์กฐ์ํ๋ฉด ๋ฐ์์ด ๋๋ฆผ
- Cause: DataTable์ header์์ญ์์ ๋จ์ํ count๋ง ์ฆ๊ฐ์์ผ๋ ์ ์ฒด Table re-rendering ๋ฐ์
- Solution: header ๋ถ๋ฆฌ
Week 01, 2024 - Nuxt3 nextTick, setTimeout 0
์์ธ ํ์ด์ง์์ table list ํ์ด์ง๋ก ๋์์ฌ ๋, ์ด๋จ์๋ก ๋ฉ์ท๋ค๊ฐ ํ์ด์ง๊ฐ ์ด๋ ๋จ.
fetch cache๊ฐ ์๋์ด fetch delay๊ฐ ์๊ธด ํ๋ฐ, ๊ทธ๊ฒ๋ณด๋ค๋ table rendering์ ์์ฒญ ์๊ฐ ์ก์๋จน์.
๋ฌธ์ ๋ nextTick์ ์จ๋ rendering ๋ง์น๊ณ ๋ฆฌ์คํธ ํ์ด์ง๊ฐ ๋ณด์.
setTimeout 0๋ก ํ๋ ๋ฆฌ์คํธ ํ์ด์ง ๋จผ์ ๋ณด์ด๊ณ , skeleton ๋์ฐ๊ณ rendering ์์.
vue2์์ nextTick๊ณผ setTimeout 0๊ฐ ๋์ผํ๊ฒ ์๋ํ๋๋ฐ Nuxt3์์ ์ ๋์์ฐจ์ด๊ฐ ๋ ๊น?
Week 51, 2023 - Tanstack query, Sentry replay error
์ค๋ ๋ค๋ฅธ ๋ฐฐํฌ 2๋ฒ ํ์ ๊ฐ์๊ธฐ sentry์์ error notification์ด ๋ง๊ตฌ ๋ค์ด์ด.
- TypeError: this[#y].values is not a function or its return value is not iterable
- r.values is not a function or its return value is not iterable
- Spread syntax requires ...iterable[Symbol.iterator] to be a function
์๊ธฐ 3๊ฐ์ error message๊ฐ ๋ช ์ญ ๊ฐ์ฉ.
์ฒซ ๋ฒ์งธ ๋ฐฐํฌ ํ ํ ์คํธ์๋ ์ ์ ๋์, ๋ ๋ฒ์งธ ๋ฐฐํฌ ํ ํ ์คํธ์๋ ์ ์์ด์์. ์ฒซ ๋ฒ์งธ ๋ด์ฉ์ ํ ์คํธ์ ๋จ์ UI style ์์ ์ด์๊ณ , ๋ ๋ฒ์งธ๊ฐ cache bust ๊ด๋ จ bug fix์๋๋ฐ...
์๋น์ค ํ์ด์ง์์ hard refresh ๋ช ๋ฒ ํด๋ณด๋ ๊ทธ์ ์ผ ๋๋ error๊ฐ ๋จ๊ธฐ ์์.
๊ณผ์ ๋ชจ๋ ์ ๊ธฐ์ ๋๋ฌด ์ง์น๊ณ , ๊ฒฐ๊ตญ ์ฒซ ๋ฒ์งธ error message์ ์์ธ์ 40์ผ ์ ์ v4 -> v5๋ก upgradeํ tanstack query์ sentry replay์ polyfill๋ฌธ์ ์์. ์ผ๋จ babel-loader์ package ๊ฒฝ๋ก ํฌํจ์์ผ ํด๊ฒฐ. ๊ทธ ๋์ ๋ฐฐํฌ๋ฅผ ๋ช ๋ฒ ํ๊ณ , ์๋น์ค ํ์ด์ง ํ ์คํธ๋ฅผ ๋ค๋ฅธ ์ฌ๋๋ ๋คํ๋๋ฐ ์ค๋ ๊ฐ์๊ธฐ ์ด error๊ฐ ๋ฌ ์ด์ ๋ ๋๋์ฒด ๋ญ๋.
๋ช ์๊ฐ ๋ค์ ๊ฐ์๊ธฐ ๋ค๋ฅธ project์ sentry replay ์์ธ์ผ๋ก ๋์ผ error notification ๋ค์ด์ด. ์ด์ชฝ๋ ๋ฐฐํฌํ์ง 40์ผ ๋์๋๋ฐ...
Week 51, 2023 - Webpack, tailwindcss ์กฐํฉ์์ app.css cache bust๊ฐ ์๋จ
tailwind์ utility class๋ค์ด app.css๋ก ์ถ๋ ฅ๋๋๋ฐ, ์ด ํ์ผ๋ง file name์ hash๊ฐ ๋ถ์ง ์์ cache bust๊ฐ ์๋จ.
new MiniCssExtractPlugin({
+ filename: '[name].[contenthash].css',
chunkFilename: '[id].[contenthash].css',
ignoreOrder: true,
}),
๋ค์์ app ์ด๊ธฐ loading์ ์ฐ์ด๋ manifest ์ค์
new WebpackAssetsManifest({ // https://webpack.js.org/plugins/mini-css-extract-plugin/#filename
output: 'manifest.json',
customize(entry) {
+ if (['app.js', 'app.css'].includes(entry.key)) return entry
return false
},
}),
Week 50, 2023 - Ver.17 Safari์์ Avif๊ฐ ์๋ณด์
avif, webp, tiny-jpg๋ก ์ด๋ฏธ์ง ์ฉ๋ ์ค์ฌ์ picture ํ๊ทธ๋ก ์ฐ๊ณ ์๋๋ฐ, Safari ver.17์์ ์ด๋ฏธ์ง๊ฐ ์ ๋ณด์. (Version 16.6 (17615.3.12.11.3, 17615) - Monterey Ver.12.6.8์์ ์ ์๋์)
developers cannot rely on the browser to do format selection by using
<picture>
+<source>
.
safari Version 16.6 (17615.3.12.11.3, 17615) ์์ ์ ์ ๋์ํฉ๋๋ค.
์ ์ฌํ๋ฆฌ ๋ฒ์ 17.0(19616.1.27.211.1) ์์๋ ์๋ณด์ฌ์
์ ๊ฐ ์ฐ๋ ์ธ์ฝ๋ฉ ํด๋ก ์์ฑํ avif ํ์ผ์ด ๋ฌธ์ ์๋๊ฑด์ง vanessa safari์์ ์ด๋ฏธ์ง ๋ด์ฉ์ด ์๋์ค๋ค์.
- ๋ค์ด๋ก๋ ์ฉ๋ ํ์ธ ํจ.
- safari inspector์์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์์๋ ํฌ๋ช ํ ์ฌ๊ฐํ๋ง ๋ณด์.
- ๋ค๋ฅธ ์ฌ์ดํธ์ avif ํ์ผ์ ๋ณด์ด๋ ๊ฑธ ํ์ธ (๊ฐ์ธ์ ๋ณด๋ณดํธ ํญ์์, https://libre-software.net/image/avif-test/)
๋ค๋ฅธ feature ๋ฐฐํฌ ์์๋ ๋์ผ ์ฆ์
- 17.1.2์์ ์๋ณด์
- iPhone XR 17.2์์ ์๋ณด์
- https://tests.caniuse.com/avif - animated avif ๋์ ์ํจ (๋์ํ๋ Ver.16.6์์ animated ๋์ํจ)
developers cannot rely on the browser to do format selection by using
<picture>
+<source>
.
๋จ์ img ํ๊ทธ๋ง ์ผ์ ๋ avif ์ ๋ณด์ โ browser๊ฐ safari์ธ์ง checkํ์ฌ picture+srcset์ avif๋ off ์ํด
Week 50, 2023 - Fix Github -> EC2 Deploy
๊ธฐ์กด์ ๊ตฌ์ถํด๋ biz admin project์ CI์์ error ๋ฐ์.
ํ ์ญ์์ git pull์์ file conflict๊ฐ ๋ฐ์, ์ด์์๋ฒ์์ github๋ก์ ssh fingerprint, ์ธ์ฆ ์ ๋ณด๊ฐ invalid.
- Always use the "git" user
- GitHub's SSH key fingerprints
- Github permission denied: ssh add agent has no identities
Week 43, 2023 - NuxtLink tailingSlash
Bug - ๐ NuxtLink defaults์ trailingSlash
๋ฅผ ๋ฃ๋๋ก ์ค์ ํ๋ pdf download link์ /๊ฐ ๋ถ์ด dashboard๋ก redirection ๋จ.
- trailingSlash๊ฐ ํ์ํ ์ด์ ๋ lightsail๋ก ์ฑ๋ฅ ์ธก์ ํ์ ๋ ๋ / ๊ฐ ์๋ url์ ์ ๊ทผํ๋ฉด ๋ / ๊ฐ ์๋ url๋ก redirection์ด ์ผ์ด๋๋ค๊ณ ์ ์ ๊น์ฌ์...
Fix - resource link๋ a tag๋ก ์ฒ๋ฆฌ
Week 36, 2023 - Google Forms ์๋ต ๊ฒฐ๊ณผ API๋ก ์ ๋ ฅ
์๋ต ์ ์ถ ์ trigger๋ฅผ ์ค์ ํ์ฌ Google Apps script function์ ํธ์ถ
Prefilled link
Submit Event trigger
- https://developers.google.com/apps-script/guides/triggers/installable?hl=ko
- https://developers.google.com/apps-script/guides/triggers/events?hl=ko#Google%20Forms-events
Pass URL parameters into survey
- Open a form in Google Forms
- In the top right, click More [...]
- Choose Get pre-filled link
- Fill in any answer fields you want to pre-populate
- Click Submit
- To send the pre-populated form to respondents, copy and send the link at the top
Post API
Week 34, 2023 - Arc42 template์ ๋ฐ๋ผ ๋ฌธ์ํ
Arc42๋ฅผ ์ฐธ๊ณ ํ์ฌ Report PDF generator ํ๋ก์ ํธ ๋ฌธ์๋ฅผ ์์ฑ
๊ฐ๋ ์ด ์ค๋ช ๋์ด ์๋๋ฐ ์ ์ดํด๊ฐ ์๊ฐ์ ์์ ๋ฅผ ์ฐพ์๋ณด๋ ์์ ๋ง๋ค ๋ค๋ฅธ ๋ถ๋ถ๋ ๋ง๊ณ , ๋ฌธ์๋ฅผ ์ํ ๋ฌธ์ํ์ฒ๋ผ ๋์ฌ์ฐ๊ธฐ ์ค๋ช ์ด ๋๊ปด์ ธ์ template์ ์ผ๋ถ๋ถ๋ง ์ฐจ์ฉํด์ ์.
์์์ด ์ ๊ณต๋๋ค๋ณด๋ Quality Goals ๊ฐ์ ์๊ฐ์ง ๋ชปํ ๊ด์ ์ ๊ธฐ์ ์ ํ๊ฒ ๋์ด ์ข์.
์์ฑ ๋ด์ฉ์ Pdf Generator ์ฐธ๊ณ
Week 32, 2023 - Report PDF generator
Deploy to AWS Lambda
- https://towardsserverless.com/articles/nuxt3-ssr-on-aws-lambda
- https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-package.html#gettingstarted-package-zip-cli
Github action
# nuxt build
- name: Make server zip file
run: cd .output/server;zip -qq -r ./server.zip ./*;mv ./server.zip ../../server.zip;cd ../..
shell: bash
- name: Deploy to Lambda
run: aws lambda update-function-code --function-name $functionName --zip-file fileb://./server.zip
Public image base URL
/public์ ์๋ image ๋ค์ ๊ทธ๋๋ก ์ฐ๋ฉด lambda base URL์ ๊ธฐ์ค์ผ๋ก ์ก๊ธฐ ๋๋ฌธ์ ์ ๋๋ก ์ธ ์ ์๋ค. cloudfront์ base URL์ ๊ธฐ์ค์ผ๋ก ์ก์์ผ ํจ
const cdnURL = "https://example.cloudfront.net"
export default defineNuxtConfig({
app: {
cdnURL,
head: {
base: { href: process.env.CI ? cdnURL : "/" },
},
},
})
Pdf Generator
Rendering
Forcing Page Breaks
.page-break {
page-break-before: always;
}
Color
* {
print-color-adjust: exact;
}
Week 30, 2023 - Webpack & Tailwind CSS Setup
Nuxt project์ ์ฌ์ฉํ๋ tailwind๊ฐ ๋๋ฌด ํธํด์ webpack project์๋ ์ ์ฉ
Week 29, 2023 - Nuxt v3.6.0 generate dynamic route path
Nuxt v3.6.0๋ถํฐ Generate ์์ ์ธ๋ถ์์ dynamic route path๋ก ์ ์ํ๋ฉด ์ธ์์ ๋ชปํ๊ณ ์์ path๋ก ์ด๋์ํจ๋ค.
- ex. /n/[code]
์ด์ ์ /n?[code]๊ฐ ์๋์ ์ ๊ฑธ๋ก ํํ๋ดค์๋๋ฐ ๋ณ๋ณ ํ ์คํธ๋ฅผ ํ๋ค๊ฐ /n#[code]๋ก ํํ
Week 28, 2023 - ๊ตญ์์ KDTC ํญ๋ชฉ ๋ฑ๋ก
๋ฑ๋ก ์ฌ์ดํธ๊ฐ ๋ถ์์ ํ๊ณ , ๋ฒ๊ทธ ๋๋ฌธ์ ๊ณ ์ํจ
- ๋๋๋ก ์๋น์ค ์ฃฝ์
- ์ด์ ๋ฐ์ดํฐ ๊ฒฐ์ ๋๋ฌธ์ ์ ํญ๋ชฉ ๋ฑ๋ก์ด ์๋จ
- ํญ๋ชฉ ๊ฐ์๊ฐ ๋์ด๋จ์ ๋ฐ๋ผ ์ฌ์ดํธ ๋ฆฌ์์ค ํ ๋น์ด ๋์์ ธ์ ์ฌ์ดํธ๊ฐ ์ฃฝ์
- ์ญ์ ์์ฒญํ ๋ถ๋ฅ ๋๋ฌธ์ ์ ๋ถ๋ฅ์ index numbering์ด ์๋์ ๋ ๋ฒ์งธ ๋ถ๋ฅ ๋ฑ๋ก์ด ์๋จ
์ง๋ ๋ฒ์ ๋ฑ๋ก์ํค๋ ค๋ ํญ๋ชฉ์ ์ ๋ฐ๋ ๋ชป์์ผ ๋ฑ๋ก๋ง๊ฐ working day 3์ผ ์ ๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ณ ์์ํ๋๋ฐ ์ฌ์ดํธ ๋ฒ๊ทธ ๋๋ฌธ์ ์ผ์์ผ ์ถ๊ทผ๊น์ง...
Week 28, 2023 - nuxt config for primevue v3.30.0
nuxt, primevue, tailwind๊ฐ ๊ณต์กดํ๋ ํ๊ฒฝ์์ primevue์ ๋ณ๊ฒฝ์ฌํญ์ผ๋ก ์ธํด tailwind ์ค์ ์ด ๋จนํ๋ ์ํฉ
Bug1
๊ธฐ์กด primevue.min.css๊ฐ v3.30.0๋ถํฐ deprecated
nuxt config css์ ๋ฑ๋กํ css๋ค์ import ํ์ primevue๊ฐ css ๋ด์ฉ์ importํ๊ธฐ ๋๋ฌธ์ custom components๋ utilities ๋ด์ฉ์ ๋ฎ์ด ์ด๋ค.
Fix1
๋ฎ์ด์จ์ง๋ css๋ค์ ๋ฐ๋ก ์์น์์ผ์ผ ํจ. layouts/default.vue์ ์ด๋
layouts/default.vue ๊ทธ๋ฅ importํ๋ฉด local dev์์๋ ์๋ํ ์์๋ก importํ๋๋ฐ build ๊ฒฐ๊ณผ๋ฌผ์ ๋ primevue ์์ฑ style์ด ๊ฐ์ฅ ๋์ค์ import ๋จ.
layouts/default.vue์ dynamic import๋ก ์ฒ๋ฆฌ
! plugins/primevue.js์ dynamic import ํด๋ดค๋๋ฐ local์์ ๋์ง๋ง build ํ๊ฒฝ์์ ์๋จ
// layouts/default.vue
if (process.client) {
import("~/vue-components/styles/components.scss")
import("~/vue-components/styles/utilities.scss")
}
Bug2 from Fix1
dynamic์ผ๋ก importํ๋ค๋ณด๋ mount ์ดํ์ import ๋์ด FOUC(flash of unstyled content)๊ฐ ๋ฐ์
Fix2
primevue๊ฐ ์์ฑํ๋ style๋ค์ ์์ผ๋ก ๋ณด๋ด ์ฐ์ ์์ ๋ฎ์ถ๋ ๋ฐฉ์์ผ๋ก ํด๊ฒฐ
// plugins/primevue
export default defineNuxtPlugin({
hooks: {
"app:mounted"() {
const target = document.querySelector('link[rel="icon"]')
document.querySelectorAll("[data-primevue-style-id]").forEach((el) => {
target.after(el)
}) // ์ฌ๊ธฐ์ app:mounted๋ก ์ฎ๊ธฐ๋ฉด common, base, toast service๊น์ง ์ฎ๊ธฐ๊ณ layouts/default์์ ์ฎ๊ธฐ๋ฉด sidebar, menu ๋ฑ์ component ๊ธฐ๋ณธ style๊น์ง ์ฎ๊น
},
},
})
tailwind ์ฐ๋ ค๋ฉด ๊ธฐ์กด primevue์์ ์ ๊ณตํ๋ ๊ฑธ ๋ชจ๋ ๋ ๋ฆฌ๋๊ฒ ๊ณต์ ๋ฐฉ๋ฒ ๊ฐ์ ์ด๋ฐ ๊ฑฐ ๋ณด๋ฉด tailwind utility์ ์ถฉ๋๋๋๊ฑฐ ์ ์ ์์ด์ง๊ฑฐ ๊ฐ๊ธดํ๋ค๋งโฆ
Week 25, 2023 - @babel/preset-env core-js Polyfill
๊ณ ๊ฐ์ด ๋ฆฌํฌํธ ํ์ธ์ด ์๋๋ค๊ณ ํจ. logrocket๊ณผ sentry์์ ํ์ธํ error message๋ Unexpected token '='. Expected an opening '(' before a method's parameter list.
๊ด๋ จ ๊ฒ์ ํด๋ณด๋ polyfill ๋ฌธ์ ๊ฐ์instance-fields. ๊ณ ๊ฐ์ browser๋ฅผ ํ์ธํด๋ณด๋ iOS 14์ด๊ณ safari-14_1-release-notes log์ ๊ด๋ จ issuechart.js-issue-11151๋ฅผ ํ์ธํ๊ณ ๋์ค์ chrome์์ ์ ์ ํ์ธํ ๊ฑธ ๋ณด๋ ์ด๊ฒ ๋ง๋ ๊ฑธ๋ก ๋ณด์ฌ ์์ธ๊ณผ polyfill ์์
์ด์ ์ ๊ฐ์ด๋๋ฅผ ์๋ด ํ ์์
์์
๋ฒ๊ทธ๊ฐ ์์ ๋๊ธฐ ์ ์๋ safari์ ๊ฒฝ์ฐ version 14.1 ์ด์์ผ๋ก upgrade๋ฅผ ํ๊ฑฐ๋ chrome 72, firefox 69, edge 79 ์ด์์ browser์์ ํ์ธํ์ ์ผ ํฉ๋๋ค.
Babel config
- useBuiltIns: 'usage', 'entry'
entry ์ฐ๋ target browser์ ํ์ํ polyfill์ entry point์ ์ ๋ถ ๋๋ ค๋ฐ์์ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ์ค ์์์ผ๋ ์ ๋จ. ์๊ณ ๋ณด๋ ์ถ๊ฐ๋๋ polyfill์ function ๊ฐ์๊ฑฐ๊ณ error๋ package code ๋ด์ syntax ๋ฌธ์ ๋ผ code transform์ด ํ์ํด์ ๋ค์ babel-loader config๋ก ํด๊ฒฐ
Webpack babel-loader config
include: [/.+chart\.js.+/]
: error ๋ฐ์ํ๋ package์ path๋ฅผ regex๋ก include (pnpm์ ์ฐ๊ธฐ ๋๋ฌธ์ ๋ฒ์ ๋ง๋ค path๊ฐ ๋ฌ๋ผ์ง)sourceType: "unambiguous"
Polyfill target browser
# .browserslistrc
> 0.25%
not dead
last 4 years
ie 11
Refactoring
์์ ์ ์ฐ๋ ํ๊ธฐ์ plugin๋ค core-js@3์์ ๊ธฐ๋ณธ ์ง์์ ํฌํจ๋์ด์ ์ญ์
- transform-vue-jsx
- @babel/plugin-transform-runtime
- @babel/plugin-syntax-dynamic-import
- @babel/plugin-transform-destructuring
์์ผ๋ก ์ถ๊ฐ์์ผฐ๋ polyfill function๋ค๋ ์ญ์
Week 24, 2023 - Media Query overwritten with non Media Query
Bug
tailwind ๊ธฐ๋ฐ์ component package์์ ์ฐ๋ media query style(style.css)์ด project์์ ์ฐ๋ utility class(restyle.scss)์ ๋ฎ์ด์จ์ง. stack overflow reply
media query๊ฐ style์๋ง ์์ ์๋ ์๊ณ restyle์๋ง ์์ ์ ์์ด์ ์ด๋ ์์๋ก ํด๋ ๋ฌธ์
Fix
๊ฒฐ๊ตญ package ํ๊ณ sub module๋ก
Week 24, 2023 - iOS Safari scroll momentum
Tony์๊ฒ ๋ฌธ์ ๋ฐ์ bug
Feature
dialog ์ ์งํ์ฑ ์์์ ๋์์๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ํ ํญ๋ชฉ์ ๋์ ๋ฐ์ผ๋ฉด Scroll Top์ 0์ผ๋ก ์ด๋์ํจ ํ ๋ค์ ๋์์๋ฅผ ๋ณด์ฌ์ค์ผ ํจ.
Bug
๋๋๋ก iOS safari์์ ๋ค์ ๋์์๊ฐ ๋ณด์ด์ง ์์. ์คํฌ๋กคํ๋ฉด rendering ๋จ.
Cause
iOS safari์ scroll momentum์ด ๊ฑธ๋ฆฐ ์ํ๋ก ๋ค์ ๋์์๋ก ์ ํ๋๋ฉด scrollTop์ด ์ด์ํ ๊ณณ์ ๊ฐ๋ฅดํด.
Fix
scroll-behavior
์ ๊ฑด๋๋ ธ์ง๋ง ํด๊ฒฐ ์๋จ. ์น์์ scroll momentum ๊ธฐ๋ฅ ๋๋ ๋ฐฉ๋ฒ์ ์ฐพ์๋ดค์ง๋ง ๋ฑํ ์ ํจํ ๋ฐฉ๋ฒ์ ๋ชป ์ฐพ๊ณ , ๊ฒฐ๊ตญ overflow
hidden โ auto๋ก ํด๊ฒฐ
Week 23, 2023 - Package โ Submodule
Motivation
vue component + nuxt base module package๋ฅผ peer dependency๋ก ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ์ด project ์์ฒด๋ package๋ผ์ ์์ ์ฌํญ์ด ์์ ๋ ๋ง๋ค
- playground์์ ํ ์คํธ
- package publish
- project์์ install
- project์์ ํ ์คํธ
- project build
๊ณผ์ ์ด ๋๋ฌด ๋ฒ๊ฑฐ๋กญ๋ค. sub module๋ก ์ ํํ์ฌ 1~3 ๊ณผ์ ์ ์์ ๊ณ ์ ์์
vue component๋ package๋ก ๋ฌ๋ ๋ ๊ฑฐ ๊ฐ๊ณ , nuxt base module์ ์ถํ sub module๋ก ๋ฐ๊พธ์
Setup
Week 22, 2023 - Slack notification from Github actions
from | |
to |
Print context of github action
github ๋ฌธ์๋ฅผ ๊ณ์ ์ฐพ์๋ด๋ action์ด ์คํ๋๋ ๋์ ์ ๊ณต๋๋ context์ ๋ํ ์ ๋ณด๊ฐ ๋ถ๋ช ํํด์ ์ง์ ์ถ๋ ฅํ๋ script๋ฅผ ์ฐพ์์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ด
Slack์์ ์ง์ ๋ง๋ app์ผ๋ก ๊ต์ฒด
multiline commit message ์ถ๋ ฅ๋๋๋ก
Release info
Week 19, 2023 - nuxt module error: lodash import
nuxt module์ component์์
import _ from "lodash"
code๊ฐ module์ ์ฐ๋ project์ local dev ํ๊ฒฝ์์
The requested module '/_nuxt/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/lodash.js?v=4a75b04f' does not provide an export named 'default'
error๋ฅผ ๋ฑ์ผ๋ฉด์ ๋ฉ์ถค
build ์์๋ error ๋ฉ์์ง ๋ฐ์ํ์ง๋ง ๋ง๋ฌด๋ฆฌ๋ ๋จ.
import { ceil } from "lodash"
๋ ๊ฐ์ ๋ฉ์์ง ๋์ค๊ธธ๋ ์ด๊ฒ์ ๊ฒ ์๋ํ๋ค๊ฐ ์ฌ์ฉํ๋ project์์ ๋๊ฐ์ ๋ฌธ๊ตฌ ์จ์ ์ถ๋ ฅ๋๋ ๊ฑธ ํ ๋ฒ ๋ณด๋ ์ ์๋์. ์ถ๊ฐํ code์ง์ฐ๊ณ ์ํํ๋๊น ๋ค์๋ถํด ์ ๋จ. ??? ๋ญ์ง?
๋ฐ๋ก destructure code๋ก ์ฌ์ฉํ๋ project๋ฅผ buildํ๋
๐ ~ file: error.vue:10 ~ error undefined Named export 'max' not found. The requested module 'file:///home/runner/work/patients.genoplan.co.kr-2023/patients.genoplan.co.kr-2023/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/lodash.js' is a CommonJS module, which may not support all module.exports as named exports.
CommonJS modules can always be imported via the default export, for example using:import pkg from 'file:///home/runner/work/patients.genoplan.co.kr-2023/patients.genoplan.co.kr-2023/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/lodash.js';
const { round, max } = pkg;
error ๋ฉ์์ง๊ฐ ๋์์ ์ด์ ์ผ๋ก ๋๋ฆฌ๊ณ ...
๊ฒฐ๊ตญ์
import * as _ from "lodash" // https://askjavascript.com/how-to-solve-does-not-provide-an-export-named-default/
๋ก ํด๊ฒฐ...
๋์ง ์์. build๋ ์ ์์ธ๋ฐ local dev์์ ๋ค์๊ณผ ๊ฐ์ error๊ฐ ๋ธ
[Vue warn]: Error in render function: "TypeError: _.max is not a function"
vite build ๊ด๋ จ๋ error์๋ค.
import๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ํ๊ณ ,
import _round from "lodash/round"
๋ค์ ์ค์ ์ถ๊ฐํ์ฌ ํด๊ฒฐ
// nuxt.config.js
export default defineNuxtConfig({
vite: {
optimizeDeps: {
include: ["lodash/ceil", "lodash/round", "lodash/max"], // https://github.com/genoplan/report-module-2023/issues/1#issuecomment-1550532676
},
},
})
Week 19, 2023 - nuxt module: include tailwind utility classes
tailwind์ ์ฒ๋ฆฌ๊ฐ nuxt ์คํ๋๋ playground ์ชฝ์๋ง ๋์ด์ prepack(module export์ฒ๋ฆฌ) ์ด์ ์ build ์์๋ utility classes๊ฐ ๊ฒฐ๊ณผ๋ก ๋์ค๋๋ฐ, prepack ํ ๋๋ ํฌํจ ์๋จ.
unjs/unbuild source code๋ ๋ค์ ธ๋ณด๊ณ ํ์ง๋ง ๊ฒฐ๊ตญ ๋ฏธ๋ด์ฑ
์ผ๋ก module ๊ฐ์ ธ๋ค ์ฐ๋ project์ tailwind.config์์ ์ฒ๋ฆฌํ๋๋ก ํจ.
// tailwind.config.js
module.exports = {
content: ["./node_modules/module/dist/runtime/components/**/*.{js,vue,ts}"],
}
Week 19, 2023 - Nuxt error: Hydration completed but contains mismatches.
Hydration completed but contains mismatches. chunk-TBEUP4O5.js:5346
tbody๋ฅผ ๋ฃ์ด์ฃผ๋ ํด๊ฒฐ
Week 19, 2023 - ๊ตญ์์ DTC ํญ๋ชฉ ๋ณ๊ฒฝ ์ ๊ณ Retrospective
์์์น ๋ชปํ 1950๊ฐ์ ํญ๋ชฉ, ์ฒจ๋ถํ์ผ 12GB over.
google drive์์ local disk๋ก ๋ค์ด ๋ฐ๋๊ฒ bottleneck์ด์๋ค.
download ์๋ํ๋ฉด ๋จผ์ google drive์์ ๊ธด ์์ถ์๊ฐ์ ๋ณด๋ด๊ณ ๋ค์ด๋ฐ๋๋ฐ, ์๊ฐ์ด ๊ธธ์ด์ network error๋ก ์ทจ์๋๊ณ ... 2GB๋ก ์๋ฆฐ ํ์ผ๋ ์์ถ ํ๊ธฐ ์ํด local disk ์ฉ๋ ํ๋ณดํ์ด์ผ ํ๊ณ ...
๊ฒฐ๊ตญ์ ์ธ์ฅํ๋๋ก ์ง์ ์ ๋ก๋. mac ์ด๋ผ windows machine์์ ํ์ผ ๊ธฐ๋ก์ ํ์.
์ฒ์๋ถํฐ ์ธ์ฅํ๋ ์ด์ฉํ์ผ๋ฉด ์๊ฐ ์์ฒญ ์ ์ฝ ๊ฐ๋ฅํ์. ์ ๋น์ด ํญ๋ชฉ ์์ ์ฒจ๋ถํ์ผ ์ฉ๋ ํ์ธ๋ถํฐ ํ์์ด์ผ...
Week 19, 2023 - github actions yarn cache
์์ ์ ํ๋ pnpm์ node cache ์ฐ๋ ๋ฐฉ์์ผ๋ก๋ cache ์์ฑ์ ๋๋๋ฐ yarn์์ ๊ทธ๊ฑธ ์ฐ์ง ๋ชปํจ
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
cache: "yarn"
๊ฒ์ ๋ฐ๋ณตํด๊ฐ๋ฉฐ try & error๋ก ๊ฒฐ๊ตญ ์ฐพ๊ธด ํ์ง๋ง ์ด๊ฑด ๋ญ... 19-yarn
# https://dev.to/mattpocockuk/how-to-cache-nodemodules-in-github-actions-with-yarn-24eh
- uses: actions/cache@v3
with:
path: '**/node_modules'
key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}
- name: Install packages
run: yarn install
Week 18, 2023 - github private package - nuxt module
vue3 ๊ธฐ๋ฐ package๋ ์ง๋ ์ฃผ์ ์ฑ๊ณตํ๋๋ฐ ๋ณธ ๋ชฉ์ ์ธ report ๊ด๋ จ module์ ๋ง๋๋ ค๋ nuxt ๊ธฐ๋ฐ์ผ๋ก๋ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก๋ ์ ๋จ. (cache bust๋ฅผ ์ํ file name์ hash ๋ถ๋ ๊ฒ๋ถํฐ...)
report ๊ด๋ จ code๋ค์ vue3๋ก ๋ณํํ๋๋, ์ข ๋ ๊ณต๋ถํด์ nuxt module๋ก ๋ง๋๋๋... ๊ณ ๋ฏผํ์ง๋ง ๋์ค์ ํ์๊ฐ์ ๋ ๋์ผํ๊ฒ ๋ง๋ค์ด์ผ ํ๋ฏ๋ก nuxt module๋ก ๊ฒฐ์
์ฐพ์๋ณด๋ nuxt์ module ๋ง๋๋ ๋ฐฉ์์ด ๋ฐ๋ก ์์ด์ ์งํ.
Explicit Imports
Published modules cannot leverage auto-imports for assets within their runtime directory. Instead, they have to import them explicitly from #imports
or alike.
Week 17, 2023 - github private package
Q1๋ถํฐ ์๋ก ์์ฑ๋๋ ํ๋ก์ ํธ๋ค์ด ๊ธฐ์กด report ์ฌ์ฌ์ฉ์ด ๋ง์์ ์๋ก์ด report ์ฌ์ดํธ๋ฅผ ๋ง๋ค์ด ์ฐ๋์ํจ๋ค๋ ์ง ํ๋ ๊ฒ ๋ณด๋ค๋ ๊ทธ๋ฅ private package ๋ง๋๋๊ฒ ์ข์๋ณด์ฌ์private-package ์๋. ๊ฒฐ๊ตญ ์์ธ ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง...
๊ธฐ๋ํจ๊ณผ๋
- commit log ์์งํ
- build time ์ค์ - package cache ์ฌ์ฉ
- project๋ณ ํํธํ ์ค์
Release test package
Use test package on local
.npmrc์ token ์ ์ฅํ์ง ์๊ธฐ
<org-name>:registry=https://npm.pkg.github.com
//npm.pkg.github.com/:_authToken=${GITHUB_PACKAGE_READ_TOKEN}
shell rc์ token export.
ex) z shell์ ๊ฒฝ์ฐ ~/.zshrc์ ๋ค์์ ์ถ๊ฐ
```shell
export GITHUB_PACKAGE_READ_TOKEN=~~
Make package of vue 3 component
Building a Vue 3 component library
https://vitejs.dev/guide/build.html#library-mode
Setup tailwind
component์ ์ฐ์ธ tailwind class๊ฐ export ๋์ง ์๋๋ค๋ฉด, export target js ํ์ผ์ tailwind css๋ฅผ import ์ถ์ฒ
Caveats
tailwind
Preflight๋ฅผ ํฌํจํ ๊ธฐ๋ณธ ์ ์๋๋ style์ด ์ ๋ถ export๋๋ค. ์ค๋ณต ๋ด์ฉ์ด๋ฏ๋ก ์ ๊ฑฐ. component์ ์ ์๋ class style๋ง export ๋๋๋ก import ๋๋ css๋ ๋ค์ ๋ด์ฉ๋ง ๋ฃ๋๋ก
@tailwind utilities;
package.json > dependencies
dependencies์ ๋ฃ์ด ๋ฐฐํฌํ๋๊น node_modules๋ ๊ฐ์ด ๋ฐฐํฌ๋๋ค. (package.json์ files๋ก dist directory๋ง ์ ํ ๋ฃ์ด๋ ๊ฐ์ด ๋ฐฐํฌ๋จ)
devDependencies๋ก ์ฎ๊ธฐ๋ ํฌํจ ์๋จ.
dependencies resources ์ ์ธ
0.3.0 ์ primeicons.css๋ font๋ ๋ค ํฌํจํ๋๋ก ๋ง๋ค์๋๋ฐ github package ์ฉ๋ ์ ํ๋ ์๊ณ , prime์ ๊ฒฝ์ฐ๋ peerDependencies๋ก ์ค์น๋๋ ๊ฒฐ๊ตญ ์ค๋ณต์ด๋ผ ์ ๊ฑฐํด์ 0.4.0๋ก...
Week 16, 2023 - Cloudfront uri query
SPA framework - S3 - CloudFront ๋ฐฐํฌ ์ 404 error ์ฒ๋ฆฌ (Private)๋ก ์ธํ ๋ ๋ฐฐํฌ ํ๊ฒฝ์์ ์ฒซ ์ง์ url์ query๋ฅผ ๋ฃ์ ๊ฒฝ์ฐ ์ ๋๋ก ์ ๋ฌ์ด ์๋๋ค.
redirect๋๋ฉด์ query ๊ฐ์ด ๋ ์๊ฐ๋?
Week 16, 2023 - Xstate init children machine
auth.factor === "requiredAccount" &&
auth.accountStatus === "retainingAccountInfo"
์ code์์
- factor๋ ์ ์ ๋๋ url๋ก ๊ณ์ ๋ก๊ทธ์ธ์ด ํ์ํ์ง, ํ์์๋์ง์ ๋ํ ๊ฐ์ ํ ๋นํ๊ณ ๊ฐ๊ฐ์ child machine์ invoke.
- accountStatus๋ ๊ณ์ ๋ก๊ทธ์ธ์ ๋ค๋ฃจ๋ account machine์ ์ฐ์ด๋ฉฐ retainingAccountInfo๊ฐ ์ด๊ธฐ ๊ฐ.
local์์ ๊ณ์ ๋ก๊ทธ์ธ์ด ํ์ ์๋ ๊ฒฝ์ฐ accountStatus ๊ฐ์ด ํ ๋น ์๋๋๋ฐ, ๋ฐฐํฌํ๋ฉด ์ด๊ธฐ ๊ฐ์ธ retainingAccountInfo๋ก ํ ๋น๋จ
์์ฌ๊ฐ๋ ๊ฑด server ํ์ฑํ๋๋ local๊ณผ ๋นํ์ฑํ (SSG, CSR)๋๋ ๋ฐฐํฌ ํ๊ฒฝ
Week 11, 2023 - Nuxt dev/prod env ์ฐจ์ด
๊ฐ๋ฐ์ server ๋์์ ํ๊ณ , prod์ jam stack์ผ๋ก ์ฌ๋ฆฌ๋ ์ฐจ์ด์ ์ด ๋ฐ์.
if (process.server) return
plugin์์ ์จ์ผ ํ ๊ณณ์ด ๋ง๋ค.
Week 10, 2023 - Vue3 flatMap reactive
์ด์ vue2 code๋ฅผ vue3 ๊ธฐ๋ฐ์ nuxt๋ก ์ฎ๊ธฐ๋ค๊ฐ ๋ฐ์ํ ๋ฒ๊ทธ
// data ์์ฑ code
report?.disease.categories.flatMap((d) => d.items).map(
(d) => {d.invalid = !d.code || d.codeSkip == 'Y' return d})
์ ๊ธฐ์ ๋ง์ง๋ง map ์์ชฝ code๊ฐ ๋ฐ์ดํฐ์ ๋ฐ์๋์ง ์๊ณ , sorting๋ ๋์ง ์์.
๋์ค์ ์์๋ธ๊ฑด flatMap ๋จ๊ณ๊น์ง๋ง reactive๋๊ณ ๊ทธ ์ดํ๋ ์๋จ. map์ ๋ ๋ฒ ์จ์ ๊ทธ๋ฐ์ง, flatMap๊น์ง๋ง ๋๋ ๊ฑด์ง, vue3(hook), vue2 code(option) ์์ด์ ์จ์ ๊ทธ๋ฐ์ง ์ด์ ๋ ๋ชจ๋ฆ.
map ๋์ ์ forEach๋ก ๋จผ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌํ๊ณ component์ ๋๊ธธ ๋ flatMap์ผ๋ก ๋๊ฒจ์ฃผ๋ ์ ์ ๋์.
Week 10, 2023 - Vue3 defineProps reactive
skeleton ๋๋ฌธ์ undefined ๋ฐ์ดํฐ๋ props๋ก ์ ๋ฌํ๋๋ฐ vue3์์ defineProps๊ฐ reactive ๋์ง ์์ ์ค์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์์ ๋ ๊ฐฑ์ ์ ์ ํจ.
props ๋ณ์์ toRef๋ก ํ ๋ฒ ๋ wrapping ํ์ฌ ํด๊ฒฐ.
const props = defineProps({ data: Object })
const data = toRef(props, "data")
Updated: Vue(Nuxt?)์ version์ด update ๋จ์ ๋ฐ๋ผ toRef ์์ด ์ ๋๋ ๋ฏ (vue v3.3.4)
Week 10, 2023 - CloudFront์์ /subdir/index.html ์๋น์ค ์ธํ
Week 9, 2023 - XState
์๋ก์ด ํ๋ก์ ํธ์ ์ธ์ฆ๊ด๋ จ ์ํ๋ฅผ XState๋ก ์ ์ฉํด๋ณด๊ณ ์๋๋ฐ Nuxt, global state, XState ์ฝ๋ผ๋ณด๋ก ๋ํญ.
article๋ณด๋ฉด ๋ค๋ค ์ ์ฐ๊ณ ์๋๋ฐ, ๊ทธ ๋์ ๋ณธ ๋ฌธ์ ์ค์์ ์ ์ผ ์ฝ๊ธฐ ํ๋ฌ.
error๋ผ๋ ๋ฑ์ด์ผ ํ๋๋ฐ ์ ์ฃ๋ค ์นจ๋ฌตํ์ง?
-
๋ด๊ฐ ์์ํ๊ธฐ๋ก ์ด๋ค ๊ธฐ๋ฅ์ด ์์ด์ผ ํ๋๋ฐ, ๋ฌธ์์๋ ์๊ณ
-
ํจ์ ๋ด์ navigateTo ์ฒ๋ฆฌ๊ฐ ์๋์ XState ์ชฝ์ ๊ณ์ ๋ดค๋๋ฐ Nuxt์์ error๋ ์๋ด๊ณ ์ฒ๋ฆฌ ์ํ๊ณ ์์๊ณ (lifecycle ๋จ๊ณ ๋ฌธ์ ๋ก ๋ณด์)
-
global instance์ธ์ง ์๋ก instance ์์ฑ๋๋์ง ๋ช ํํ ์๋์์ ์ฃ๋ค ๋ค์ ธ๋ณด๊ณ
-
instance ์์ฑ์ด๋ผ๋ ๊ธ์ github issue์์ ์ฐพ๊ณ state management๋ฅผ ํด๋ณด๋ ๋ invoke ์ฒ๋ฆฌ๊ฐ ์๋๋๊ฑฐ ๊ฐ์์ ๊ณ์ ํ๋ณด๋ state์์๋ถํฐ computeํ์ง ๋ง๊ณ machine๋ถํฐ compute๋ฒ์์ ๋ฃ์ด์ผ ํ๊ณ ...
const authMachine = useAuthMachine() const { state, send } = authMachine.value const loginStatus = computed(() => state.value) // ! state.value ๋ฒํ๊ฐ ์์ const loginStatus = computed(() => authMachine.value.state.value) // ์ด๋ ๊ฒ ํด์ผ state.value ๋ณํ๊ฐ ๊ฐ์ง๋๋ค.
-
store์ชฝ์ useMachine์ ๋ฃ์ผ๋ฉด hook์ด๋ผ์ ๊ทธ๋ฐ๊ฐ invoke๊ฐ ๋ ์๋๊ณ ... (app.vue์์ useMachine์ ๋ฃ์ผ๋ฉด ํด๊ฒฐ๋จ). error๋ผ๋ ๋ฑ๋ ์ง
-
๋ฌธ์๋ ์ ๋ v4๋ v5 alpha ๋ด์ฉ์ด ์์ฌ์๋.
Week 9, 2023 - Layout about scroll bar
ํ์ฌ ๋ฐ์คํฌํ ์คํฌ๋กค ๋ฐ๊ฐ body์๋ง ์ ์ฉ๋์ด ์๊ณ header์๋ ์์ต๋๋ค.
chome ๊ณ์ด์์ ์คํฌ๋กค ๋ฐ๊ฐ width ์ฐจ์ง ์๊ฒ ํ๋ overlay ์์ฑ ๋ฃ๊ฒ ์ต๋๋ค.
- header๊ฐ ์คํฌ๋กค ๋ฌด๊ดํ๊ฒ ๊ณ ์ ์์น๋ผ ๊ทธ๋ฐ์ง ์คํฌ๋กค ๋ฐ width ๋ฌด์ํฉ๋๋ค.
apple site๋ layout ์์น ๋ฒ์ด๋๊ฒ ๋๋ค์.
Week 8, 2023 - Cloudfront: nuxt missing resource by html cache after new deployment
๋ฌธ์
nuxt generateํ์ฌ s3๋ฅผ ํตํด cloudfront๋ก ์๋น์คํ๋ฉด, cache ์ ์ฑ ์ ๋ฐ๋ผ browser์์ ์๋ก ๋ฐฐํฌ ๋๊ธฐ ์ ์ index.html cache๋ฅผ ์ฝ์ด ๋ฐฐํฌ๋ก ์ญ์ ๋ .js, .css๋ฅผ ๋ชป ์ฐพ์ 404 error๊ฐ ๋ฌ๋ค.
ํด๊ฒฐ: Cache control - CloudFront functions
*.html pattern์
cache-control: no-store,must-revalidate;
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
์ฐธ๊ณ
์ด๊ฒ๋ ๊ฐ์ง๋ง... cache control๋ก ๋ณ๊ฒฝํ ์ด์ ์์
A solution based on CloudFront configuration:
Go to your CloudFront distribution, under the "Behavior" tab and create a new behavior. Specify the following values:
- Path Pattern: index.html
- Object Caching: customize
- Maximum TTL: 0 (or another very small value)
- Default TTL: 0 (or another very small value)
- Save this configuration.
CloudFront will not cache index.html anymore.
I think this answer applies to the Use legacy cache settings
option in Cache and origin request settings
. If you want to use an existing managed policy by selecting the Use a cache policy and origin request policy
option, I think the correct value is Managed-CachingDisabled
Week 7, 2023 - Windows Subsystem for Linux
๋ฐ์ ๊ตญ์ฑ์ ์ ์ ์ ๊ฒ์ฌ ์ ๊ณ ์์ . ๋ฐ์ดํฐ ๋ง๋์๋ ๋ถ๋ค์ด ์ผ๊ทผํ๊ณ ํ ์์ผ์๋ ์์ ํ์ ์ ์ผ์์ผ์ ์ ํจ์ฑ ๊ฒ์ฌ๋ ์ค์ ๋ฐ์ดํฐ ๋ฑ๋ก ํ ์คํธ๋ฅผ ํจ.
WSL ์ค์น ํ pnpm i error. ํ๋จ ๋ต๊ธ๋ณด๋ ์ด๊ฒ ๋ญ๊ฐ ์ถ๋ค. ๊ฒฐ๊ตญ windows ์ํฅ์ ๋ฐ๋๋ค๋ ๊ฑฐ์์. ๋ ๋ฆฌ๊ณ windows์ฉ์ผ๋ก ์ธํ
Solution for WSL
I solved this by mounting C:/ with default permissions bound to my user instead of root. I followed the guide here: https://devblogs.microsoft.com/commandline/chmod-chown-wsl-improvements/
sudo umount /mnt/c
sudo mount -t drvfs C: /mnt/c -o metadata,uid=1000,gid=1000,umask=22,fmask=111
This mounts all files on the C drive as my user instead of root. Therefore sudo is not needed to run npm i
Volta
windows ์ค์น ํ ์คํ์ด ์๋จ
https://github.com/volta-cli/volta/issues/1392#issuecomment-1336254236
์ข ์ฐพ์๋ณด๋ ํ๊ฒฝ๋ณ์ ํ์ธํ๋ผ๊ณ ํจ. ๋จ. ๊ณต์ ๋ฌธ์ linux ์ค์น์๋ ํ๊ฒฝ๋ณ์ ๋ฑ๋กํ๋ผ๊ณ ํด๋๊ณ windows์๋ ๊ทธ๋ฐ๊ฑฐ ์์จ์๋๋ฐ?
Week 6, 2023 - ๊ตญ์์ ์ ์ ์ ๊ฒ์ฌ ์ ๊ณ - Playwright script
์คํ์ด ๋น ๋ฅด๊ณ test code recording์ด ํธํ playwright๋กโฆ
๊ตญ์์ ํญ๋ชฉ ์ ๋ ฅ Error
๊ตญ์์ ์ฌ์ดํธ์์ item ์
๋ ฅํ ๋ ํ์ ํญ๋ชฉ์ด ๋น ์ง๋ฉด alert์ ์ฃผ์ง๋ง, max length๊ฐ over๋๋ฉด ๊ฒฝ๊ณ ์์ด ์ ์ฅ๋๋ค๊ฐ ๋์ค์ ํ์ธ๋๋ฉด ์ ์ฅ ์๋๊ฑธ ๋ณผ ์ ์๋ค. ํด์ ํญ๋ชฉ์ ์ฅํ์ธ
function์ผ๋ก ์ ์ฅ๋๋์ง ํ์ธ ์ ์ฐจ๋ฅผ ๋ฃ์
Week 5, 2023 - Cypress โ Playwright โ Cypress
Playwright์ Test code structuring ๋ฌธ์
Playwright
playwright๋ test ๋ง๋ค ๋ ๋ฆฝ์ ์ธ๊ฑธ ๊ฐ์ ํ์ฌ parallelํ๊ฒ ์คํํ๋๋ก ๊ถ์ฅ.
๋ฌธ์ ๋ ํ๋์ story๋ฅผ ํ ์คํธ ํ๋๋ฐ step๋ณ๋ก ๋๋ ์ ์์. (feature request๋ ์๋๋ฐ ๋ฎ์ ์ฐ์ ์์๋ก 1๋ ๋ฐ ๋์ ์ง์ ์์)
- [Feature] It would be nice if test.step showed up in trace view actionsย #8682
- [Feature] Show test stepsย
test.step
ย in theยlist
ย report (and on assertion fails)ย #20532
์ด๋ค ๊ธ์๋ test.step์ ์ฐ๋ผ๊ณ ํ๋๋ฐ, ์จ๋ณด๋ step3์์ error๊ฐ ๋๋ ์ ์ฒด story์์ error๋ฌ๋ค๋ ๋ณด๊ณ ๋ง ๋์จ๋ค. debug mode๋ก ๋๋ ค๋ ๊ฐ์. (interface๊ฐ ๋ฌ๋ผ๋ณด์ด๊ธด ํ๋ฐ...)
test.describe.config serial๋ก test ๋๋ ์ ์ฐ๋ฉด ๊ฐ๋ฅํ๊ธด ํ๋ฐ, testํ๋ ๋๋ ๋๋ง๋ค browser context๊ฐ reset ๋จ. (=page reset)
์์ deal breaker์ธ๋ฐ, playwright๋ฅผ ์จ์ผ ํ๋? global config๋ก serialํ๊ฒ ํ๋ฉด ๋ ๊น? test.describe.config๋ ์ฐจ์ด ์์ ๊ฑฐ ๊ฐ์๋ฐ test๋ง๋ค my-test setting์ ํ๋๋ก ํจ? step์ ์์๋จ๊ณ ๋ง๋ค context๋ฅผ settingํ๋ผ๊ณ ?
๋ฌธ์๋ ๋๋ฌด ๋น์ฝ https://playwright.dev/docs/api/class-test#test-step
test.step
Declares a test step.
Cypress
์ฐพ์๋ณด๋ cypress์์๋ test code recording ๊ธฐ๋ฅ์ด ์๋ค. ์ํ ๊ธฐ๋ฅ์ด์ง๋ง. (experimentalStudio)
ver.10.0์์ ์ญ์ ํ๋ค๊ฐ feedback์์ ๋ถํ์์ผ๋ฌ๋ผ๋ ์์ฒญ์ด ๋ง์์ ver.10.7์์ ๋ถํ. ํ์ฌ ver.12.5.1. ๋ฐ๋ ์ ๋ ์ง๋ฌ๋๋ฐ ์์ง๋ experimental ๋จ๊ณ๋ผ๋๊ฒ ์ข ๊ทธ๋ ์ง๋ง, ๋ด๋ ธ๋ค๊ฐ feedback ๋ฐ๊ณ ๋ถํํ๊ฑฐ๋ผ ์์ด์ง๊ฑฐ ๊ฐ์ง๋ ์์. ํด์ cypress๋ก ๊ณ์ ์ธ ๋ฏ.
์ค๋๋ง์ cypress ๋๋ ค๋ณด๋ env ์คํ ์์ฒด๊ฐ ๋๋ฌด ๋๋ฆฌ๋ค. playwright ์ฐ๋ค๊ฐ ์ฐ๋ ์ญ์ฒด๊ฐ์ด ์ฌํจ.
Week 4, 2023 - AWS EC2 ํ ์คํธ ์๋ฒ ๋ณผ๋ฅจ ์ญ์ ๋จ
๊ฒฝ๊ณผ
์์นจ ์ถ๊ทผํ๋ ํ
์คํธ ์๋ฒ CPU ์ ์ ๊ฒฝ๊ณ ๊ฐ ๋ธ. ํ์ธํด๋ณด๋ 100%์์ ๊ณ์ ์ ์ง๋์ด์ EC2 Instance๋ฅผ reboot.
๋ช ๋ถ ๋ค์ ๋ณํ๊ฐ ์์ด์ suspend. ๋ช ๋ถ ๋ค์ ์น ์ฌ์ดํธ ์ ์ ์๋์ด ํ์ธํด๋ณด๋ ์ข
๋ฃ ๋จ. ??? log๋ฅผ ํ์ธํด๋ณด๋ AutoScailing์ด ์ฃฝ์ฌ๋ฒ๋ฆผ.
๋ ํ์ธํด๋ณด๋ ์๋ ์์ฑ๋ instance์ volumn์ด ๊ณ์น๋์ง ์๊ณ ์๋ก ์์ฑ ๋จ. ์ด๊ฑฐ๊น์ง ์ดํด๊ฐ ๊ฐ๋๋ฐ ๊ธฐ์กด volumn์ ์๋ ์ญ์ ? ์ด๋ฐ ๋ฐฉ์์ด๋ฉด ๋ฏฟ๊ณ ์ธ ์๊ฐ ์๋? ๋์ค์ ์์๋ณด๋ EC2 ์์ฑ ์ ๊ธฐ๋ณธ์ผ๋ก root volumn์ด ์ข ๋ฃ ์ ์ญ์ ์ค์ ๋๋ค. ๐คจ
ํด๊ฒฐ
GitHub Actions - S3 - Code Deploy week4-2023__test-server, GitHub Actions Code Deploy Git Pull๋ฅผ ํตํด ๋ณต๊ตฌ.
Week 3, 2023 - Nuxt generate ์, dynamic route์์ payload error
ํ์
next generate๋ก ์์ฑ๋ ์ฌ์ดํธ์์ payload ์์ฑ ์ํ๋ dynamic route path์์๋ payload๋ฅผ ์๊ตฌssr-prerendering?
ํด๊ฒฐ
crawlLinks: true์ ํจ๊ป nuxt build๋ก ์์ฑ
When using this option with nuxi build, static payloads won't be generated by default at build time. For now, selective payload generation is under an experimental flag. โ https://nuxt.com/docs/getting-started/deployment#selective-pre-rendering
//nuxt.config.js
{
nitro: {
// ์ด config ์์ด nuxt generateํ๋ฉด dynamic route๊น์ง payload๋ฅผ try. error ๋ฐ์.
prerender: {
crawlLinks: true,
routes: ['/', '/ko'], // /ko๋ @nuxtjs/i18n module์ ํ๊ตญ์ด ์ง์์ ์ํด
},
}
}
์ฐธ๊ณ ํ ๋ฌธ์๋ค
- https://nuxtjs.org/docs/concepts/nuxt-lifecycle/
- https://stackoverflow.com/questions/61485508/how-nuxt-generate-dynamic-routes
- https://nuxt.com/docs/api/configuration/nuxt-config/#generate
- https://github.com/nuxt/rfcs/issues/22
- https://nuxtjs.org/docs/features/data-fetching/#:~:text=this%20hook%20blocks%20route%20navigation%20until%20it%20is%20resolved%2C%20displaying%20a%20page%20error%20if%20it%20fails.
Week 2, 2023 - Playwright CORS setting
Allow Extension
๊ฒฐ๋ก ์ ์คํจ. load๋ ๋์ง๋ง ๊ธฐ๋ณธ off๋ก ๋์ด ์์ด browser ์ฒ์ ์คํํ ๋ ์์ผ๋ก on ์์ผ์ผ ํจ.
# Run find . -type d -iname "<EXTENSION ID HERE>"
// playwright.config.js
use: {
launchOptions: { // https://playwright.dev/docs/api/class-testoptions#test-options-launch-options
args: [ // https://playwright.dev/docs/chrome-extensions
`--disable-extensions-except=~/Library/Application Support/Google/Chrome/Default/Extensions/lfhmikememgdcahcdlaciloancbhjino/0.3.5_0`,
],
},
}
Off web security
์ด์ชฝ์ผ๋ก ํด๊ฒฐchromium-only
// playwright.config.js
use: {
launchOptions: { // https://playwright.dev/docs/api/class-testoptions#test-options-launch-options
args: ['--disable-web-security'],
},
}
Week 2, 2023 - Playwright ๋์
cypress์ ๋นํด ๋ค์ ์ด์ ์ด ํ์ฐํ๋ค. (๊ทธ๋ฆฌ๊ณ ๋จ์ ์ด ๋๋ฌ๋๋๋ฐ...)
- ์๋๊ฐ ๋น ๋ฅด๊ณ (browser๋ฅผ ์ง์ ๋์ฐ์ง ์๊ณ ํ ์คํธ๋ง ์คํ์ํฌ ์ ์์)
- VS code์์ ์ฐ๊ฒฐ์ด ๋์ฑ ๊ธด๋ฐํ๋ค.
- browser์์์ ์ ๋ ฅ์ test code๋ก ์์ฑํด์ค.
- vs code์์ selector์ cursor๋ฅผ ๋๋ฉด, browser์์ ํด๋น element๊ฐ ํ์๋จ
Week 2, 2023 - temp branch ์ด์
๋ฌธ์
๋ฐฐํฌ ํ๊ฒฝ์์๋ง ํ
์คํธ ํ ์ ์๋ ๋ด์ฉ์ด๋ผ๋ฉด ์ง์์ ์ผ๋ก ์์ ยท๋ฐฐํฌยทํ
์คํธ๋ฅผ ์งํ
์ด ๊ณผ์ ์ค์ ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ํ
์คํธ ์๋ฒ์ ๋ฐฐํฌํ๋ฉด ๋ด์ฉ์ด ์๋ก ์์ค๋๊ฑฐ๋ ๋ธ๋์น conflict๊ฐ ๋น๋ฒํ๊ฒ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก, ๊ฐ๋ฐ์๋ผ๋ฆฌ ํ
์คํธ ๋ธ๋์น, ์๋ฒ๋ฅผ ์ฐ๊ฒ ๋ค๊ณ ์๋ฆฐ ๋ค์ ๋
์ ์ ์ผ๋ก ์ฌ์ฉ ์ค
(fixup์ผ๋ก ์์๊ฐ๋ฉฐ ํ
์คํธํ ์ ์์ผ๋, ๊ฒฐ๊ตญ์ commit์ ์ ๋ฆฌํ ํ, ์ ๋ฆฌํ ๊ฑธ ๋ค์ ํ
์คํธํด์ผ ํ๋๋ฐ, ์ด ๋ conflict๊ฐ ๋๋ ๋ฐ์ํ ์ ์๋ค.)
ํด๊ฒฐ
temp branch ์ด์. husky๋ฅผ ์ด์ฉํ์ฌ temp branch๋ฅผ pushํ๊ธฐ ์ ์ origin/test branch๋ฅผ merge
https://stackoverflow.com/questions/6372334/git-commit-hooks-per-branch/6376054#6376054
Trouble shooting
pushํ ๋ ๋ค์ error๊ฐ ๋ฐ์ํ๋ฉด chmod
๋ก ํด๋น ํ์ผ์ ์คํ ๊ถํ์ ์ค ๊ฒ
hint: The '.husky/pre-push' hook was ignored because it's not set as executable.
test branch merge ํ remote์๋ push๋๋๋ฐ, local์์๋ push ์๋ ๊ฑธ๋ก ํ์
โ post push hook์ด ์์ด์ merge๊ฐ ์ผ์ด๋๋ฉด ์์ผ๋ก fetch ์
๋ ฅํด์ผ ํจ. ์๋๋ฉด fetch ์ ํ ์
๋ ฅ
git push;git fetch
Week 52, 2022 - Tailwind - Dynamic class names
class = `bg-${ zero ? pageColor : baseColor}` // not work
class = zero ? `bg-${pageColor}` : `bg-${baseColor}` // not work
Week 51, 2022 - SPA framework - S3 - CloudFront ๋ฐฐํฌ ์ 404 error ์ฒ๋ฆฌ
์๋ URI๋ก ์ ๊ทผ ์ 403 error๊ฐ ๋ฌ๋ค. ์๋ง๋ ํด๋น url path๋ฅผ cloudFront์์ ์ธ์ํ์ง ๋ชปํด์ S3๋ก ์์ฒญ์ด ๊ฐ๊ณ public์ด ์๋๋ permission denied ์๋ฌ
cloudfront์์ 403 error๋ฅผ SPA framework index.html๋ก ์ฒ๋ฆฌํ๋๋ก ํด์ฃผ๋ฉด framework์์ 404 ์ฒ๋ฆฌํด ์ค
Week 50, 2022 - tailwind css
์ nuxt3 project์ tailwind ๋์ . ๊ทธ ๋์ ์ ์์ ์๊ฐ๊ธ์์ motivation๊ณผ ๊ฒฐ๊ณผ๊ฐ ๋ชจ์๋๋ ๊ฑธ ๋ด์ ๊บผ๋ ธ๋๋ฐ, code colocation์ผ๋ก ์ธํ DX, ์๋ ํฅ์ ๋๋ฌธ์ ์จ๋ณด๊ธฐ๋ก ํจ.
Week 49, 2022 - Nuxt3 UI Framework
.com์ ์ฐ์ธ buefy UI framework๋ .co.kr์ ์ฐ์ด๋ ํ๋ก์ ํธ ์ง์X (major version)
Candidates
- naiveui - ์ด์ ๋ฑ๋ก ๊ธ์ด ์ค๊ตญ์ด๊ฐ ๋ ๋ง์
- sketch kit free
- Naive UI Snippets - vs code
- antdv - figma kit ๊ตฌ๋งคํจ - ๋ฒ๊ทธ ๋ต๋ณ์ด ์ฃ๋ค ์ค๊ตญ์ด
- primevue โ
- figma$250? - deprecated - https://www.figma.com/community/file/890589747170608208
- vuelidate
- radar chart
- vuetifyjs
- https://element-plus.org/en-US/component/button.html
- figma template - free, non en
- ui-elements
- no figma or sketch
- inkline
- storybook, no figma or sketch
Week 48, 2022 - Refine package.json product section
pnpm install --prod --frozen-lockfile
product์ ์ฐ์ง ์๋ package ์ค์น๋ฅผ ํผํ์ฌ ์ package ์ค์น ์์ ์๊ฐ์ 37 โ 19์ด๋ก ์ค์.
js resource size๋ 9mb ์ ๋ ์ค์ (github cache ํ์ธ)
Week 47, 2022 - nuxt3 generate false negative error
sentry setting test ๋๋ฌธ์ ์ผ๋ถ๋ฌ error๋ฅผ ๋ด๊ณ ๋ฐฐํฌํ๋๋ฐ ๊ณ์ ์ ์ ๋์ํจ.
github actions log ํ์ธํ๋...
generate์์
WARN Using experimental payload extraction for full-static output. You can opt-out by setting experimental.payloadExtraction to false.
๋ผ๊ณ ๋จ๋๋... ๊ด๋ จ์๋?
Week 45, 2022 - TanStack Query ์ ์ฉ
Powerful asynchronous state management, server-state utilities and data fetching.
cache on API request.
report detail modal โ page๋ก ๋ณํํจ์ ๋ฐ๋ผ summary ํ๋ฉด๊ณผ ์ ํ์ด ์ฆ๊ณ ๊ทธ ๋๋ง๋ค API request๋ฅผ ํจ.
stale time์ ์ค์ ํ์ฌ ์ ํด์ง ์๊ฐ ๋ด์๋ request ์์ด cache data ํ์ฉํ๋๋ก ์์
TanStack Query ์ ์ฉ ์ด์ . ๋ฆฌํฌํธ ์์ฝโ์์ธย ํ์ด์ง ์ด๋ ์ ๋ง๋ค API request ๋ฐ์ | TanStack Query ์ ์ฉ ์ดํ. Cache๋ฅผ ํ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ฆฌํฌํธ ์์ฝย ํ์ด์ง์์ ์ถ๊ฐ API request๊ฐ ์์ด์ง |
Week 44, 2022 - Google app script about i18n
Week 39, 2022 - Package manager yarn โ pnpm
๋ฐฐํฌ ์๊ฐ -40s (package ์ค์น ์๊ฐ ๊ฐ์) - ์บ์ํ์ฉ ์ฐจ์ด? ๊ฐ์ script์ธ๋ฐโฆ
local disk space ์ ์ฝ
ํ ๋ฌ 188k transaction
Week 29, 2022 - Webpack v3 โ v5
vue3์ด ๋์จ ์์ ์์ ๋ฌด์กฐ๊ฑด ์ต์ plugin์ ์ฐ๋ฉด ํธํ์ด ์๋๋ฏ๋ก vue2์ ๋ง๋ ๋ฒ์ ์ผ์ผํ ์ฐพ์ ์ค์นํจ.
Week 15, 2022 - Cypress
e
Footnotes
instance fields
: https://stackoverflow.com/a/60026710/5163033หsafari-14_1-release-notes
: https://developer.apple.com/documentation/safari-release-notes/safari-14_1-release-notes#JavaScript-and-WebAssemblyหchart.js-issue-11151
: https://github.com/chartjs/Chart.js/issues/11151ห19-yarn
:--prefer-offline
์ด๋--cache-dir
์ค์ ์ด๋,if: ${{ steps.cache-npm.outputs.cache-hit != 'true' }}
๋ ๋ค ์๋ ์๋์.หprivate-package
: project๋ง๋ค ๋ค๋ฅธ ๊ณณ์ด ์๋ค๋ฉด composition์ด๋ injection์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค. + ๊ด๋ จ code๋ฅผ ํด๋น project์์ ๊ด๋ฆฌํ ์ ์๋ค. report ์ ์ฉ ์ฌ์ดํธ๋ก ๋ง๋ค๋ฉด ๋ค๋ฅธ project ๊ด๋ จ code๋ฅผ ์ฌ์ดํธ์์ ๊ด๋ฆฌํด์ผ ํจ.หweek4-2023__test-server
: ์์ฑํด๋์ ๋ฌธ์์ command text์ spacebar ๋์ ๋ค๋ฅธ ๋ณด์ด์ง ์๋ ๋ฌธ์๊ฐ ๋ค์ด๊ฐ์ copy&paste ํ์ ๋ error ๊ณ์ ๋ฐ์ํ์์ ๐คจหssr-prerendering?
- SSR์ ํตํด prerendering ํ ์๋ ์์ง๋ง, report์ ๊ฒฝ์ฐ๋ ๊ฐ์ฒด ๋ณ ํ์ด์ง๋ฅผ ๋ชจ๋ ์์ฑ์ํค์ง ์์ ์์ ์ด๋ฏ๋กหchromium-only
- chromium๋ง ํด๊ฒฐ. ๋ค๋ฅธ browser๋ ํด๋น option์ ์ฐพ์ ๋ฃ๋ ๊ฐ, CORS ์ธํ ์ ๋ถํํ๋ ๊ฐ ํด์ผ ํจ.ห
Backlinks