├── README.md
├── dev-tools
├── prettier
│ └── option
│ │ └── ignore-path.md
└── eslint
│ └── vscode-extension
│ └── fix-all-on-save.md
├── css
└── ellipsis
│ └── n-line-ellipsis-in-flex-box.md
├── javascript
└── date
│ └── month-start-idx-zero.md
├── next-js
├── library
│ └── third-parties.md
└── config
│ └── typed-routes.md
├── html
└── tags
│ └── video
│ └── video-vs-video-with-source.md
└── css-in-js
└── styled-components
└── transient-props.md
/README.md:
--------------------------------------------------------------------------------
1 | ## Wiki
2 |
3 | > 저의 지식 저장 창고입니다
4 |
5 | [웹에서 보기 →](https://study.sunwoo.xyz)
6 |
--------------------------------------------------------------------------------
/dev-tools/prettier/option/ignore-path.md:
--------------------------------------------------------------------------------
1 | ## --ignore-path
2 |
3 | prettier에서 format 대상에서 제외할 **설정 파일**의 경로를 지정할 수 있는 옵션이다.
4 |
5 | 예시 :
6 |
7 | ```json
8 | {
9 | "scripts": {
10 | "format:fix": "prettier --write --ignore-path .gitignore ."
11 | }
12 | }
13 | ```
14 |
--------------------------------------------------------------------------------
/css/ellipsis/n-line-ellipsis-in-flex-box.md:
--------------------------------------------------------------------------------
1 | ## flex-box에서 n번째 줄부터 ellipsis 처리하기
2 |
3 | 우선 일반적인 n번째 줄부터의 ellipsis 는 아래의 css 코드를 사용하여 처리할 수 있다.
4 |
5 | ```css
6 | display: -webkit-box;
7 | overflow: hidden;
8 | text-overflow: ellipsis;
9 | -webkit-box-orient: vertical;
10 | -webkit-line-clamp: {n};
11 | ```
12 |
13 | 하지만 이 방식은 flex-box 내에서는 동작하지 않는다.
14 |
15 | 방법을 찾던 중 https://css-tricks.com/flexbox-truncated-text/ 에서 힌트를 얻어 `word-wrap: break-word` 를 추가하여 해결하였다.
16 |
--------------------------------------------------------------------------------
/javascript/date/month-start-idx-zero.md:
--------------------------------------------------------------------------------
1 | ## 자바스크립트 Month가 0부터 시작하는 이유
2 |
3 | javascript `Date` 객체의 월(月) 인수는 0부터 시작해서 11로 끝난다.
4 |
5 | "`index`와 같은 이유가 아닐까? 문제는 없어보이는데" 라고 말하는 사람이 있을 수 있다. 하지만 일(日) 인수는 1부터 31 사이의 숫자이다.
6 | 개발을 하며 항시 통일성이 있는것이 좋다고 생각했는데, 이를 어길 이유가 있는가 궁금하여 찾아봤다.
7 |
8 | 이유는 javascript의 `Date`가 Java의 `JDK1.0 (1995)`의 `java.util.Date` 를 카피하였기 때문에 발생하는 일이다.
9 |
10 | [자바스크립트를 창시한 브렌든 아이크의 트윗](https://twitter.com/BrendanEich/status/481939099138654209)
11 |
--------------------------------------------------------------------------------
/next-js/library/third-parties.md:
--------------------------------------------------------------------------------
1 | ## @next/third-parties
2 |
3 | Google Tag Manager를 설정하기 위해 서치 중 발견한 라이브러리로 타사 라이브러리를 사용하는 방법을 제공한다.
4 |
5 | 아직은 실험 단계라고 한다.
6 |
7 | 지금까지는 아래와 같은 기능만 지원해주는 것 같다.
8 |
9 | - Google Analytics
10 | - 유튜브 임베드
11 | - 구글 맵 임베드
12 |
13 | GTM 액션 사용이 용이해보여 아티클 사이트에 적용해보려고 한다.
14 |
15 | [공식 문서](https://nextjs.org/docs/app/building-your-application/optimizing/third-party-libraries)
16 |
17 | [데모 페이지](https://test-next-script-housseindjirdeh.vercel.app/)
18 |
--------------------------------------------------------------------------------
/dev-tools/eslint/vscode-extension/fix-all-on-save.md:
--------------------------------------------------------------------------------
1 | ## vscode에서 코드 저장 시 마다 eslint fixAll 실행하기
2 |
3 | vscode에서 코드 저장 시 마다 eslint fixAll을 실행하기 위해서는 아래와 같이 설정해야 한다.
4 |
5 | ```json
6 | {
7 | "editor.codeActionsOnSave": {
8 | "source.fixAll.eslint": "explicit"
9 | }
10 | }
11 | ```
12 |
13 | 이렇게 설정하면 vscode에서 코드 저장 시 마다 eslint fixAll을 실행하게 된다.
14 |
15 | 이전에는 `source.fixAll.eslint`에 값으로 `true`를 넣어주면 되었지만, 아래와 같이 현재는 사용하지 않는다.
16 |
17 | > true: 명시적으로 저장된 경우에만 코드 동작을 트리거합니다. 이 값은 "explicit"에 대해 더 이상 사용되지 않습니다.
18 |
--------------------------------------------------------------------------------
/next-js/config/typed-routes.md:
--------------------------------------------------------------------------------
1 | ## Next.js router pathname type-safe하게 개발하기
2 |
3 | 회사에서 Next.js 15를 사용하고 있는데, `router.push()` 부분에 매번 일일이 pathname 입력해주는게 처음엔 참을만 했는데, 점점 router가 깊어질수록 귀찮아졌다.
4 |
5 | 방법이 없을까 하다가 typedRoutes 옵션을 사용하는 방법이 있었다.
6 |
7 | ```js
8 | // next.config.js
9 | const nextConfig = {
10 | experimental: {
11 | typedRoutes: true,
12 | },
13 | };
14 |
15 | module.exports = nextConfig;
16 | ```
17 |
18 | 위와 같이 간단하게 설정해주면 되는데 experimental 설정이라서 그런가 turbopack 옵션으로 실행하는 dev에서는 구동이 되지 않았다.
19 |
20 | 다이나믹 라우팅에서도 구동이 되지 않는다고 하는데 랜딩 페이지 개발에서 다이나믹 라우팅을 사용할 것 같지는 않고, path를 type recommend해주는 기능만 있으면 되는거라서 앞으로 애용하는 옵션이 될 것 같다.
21 |
22 | https://nextjs.org/docs/app/api-reference/next-config-js/typedRoutes
23 |
--------------------------------------------------------------------------------
/html/tags/video/video-vs-video-with-source.md:
--------------------------------------------------------------------------------
1 | ## video 태그만 사용하는 방법과 source 태그를 함께 사용하는 방법의 차이점
2 |
3 | 회사에서 오래된 에셋들을 신규 에셋으로 바꾸는 작업을 하던 중, 기존 코드가 video를 두가지 방법으로 다루고 있다는걸 알게되었다.
4 |
5 | 1. `` 태그를 작성하고, video 태그의 src attribute를 작성하는 방법
6 | 2. `` 태그 안에 `` 태그를 사용하는 방법
7 |
8 | 각기의 방법의 장단점을 찾고 생각해봤다. 우선 video 태그 단일로만 사용했을때의 장점은 단일 형식의 비디오 파일만 필요한 간단한 경우에 빠르게 개발 가능 정도...
9 |
10 | 그에 반해 우선 source 태그를 함께 사용하는 방법은 아래와 같은데,
11 |
12 | ```html
13 |
17 | ```
18 |
19 | 이렇게 다양한 포맷의 video를 제공할 수 있고, 브라우저는 이를 순차적으로 읽어 지원 가능한 첫 번째 형식의 비디오를 재생해준다고 한다.
20 |
21 | 이로 인해 브라우저가 지원하지 않는 비디오 형식이 있을 수 있는데, 이를 fallback 시켜 최적의 포맷의 (브라우저 구현체에 따라 다를 듯 하다.) 비디오를 재생시켜 주는 장점이 있을 것 같다.
22 |
23 | 여기서 하나 더 팁을 주자면, source 태그에 type 속성을 명시하면 브라우저가 지원하지 않는 형식을 빠르게 건너뛰어 성능을 향상시킬 수 있다.
24 |
25 | 우선 현재 신규 에셋들은 모두 mp4의 단일 형식의 에셋들이기에, 두가지 방법 중 무얼 선택하여도 성능의 영향을 준다거나하는 퍼포먼스적 차이는 없을 것 같다.
26 |
27 | 하지만 하나의 컴포넌트로 관리하기 위해 각기의 장단점이 없는 상황에서 두가지 방법을 모두 사용하도록 개발하는 것은 필요하지 않다고 생각이 들어, video 태그 안에 source 태그를 넣어 사용하는 방향으로 통일하여 개발하기로 결정했다.
28 |
--------------------------------------------------------------------------------
/css-in-js/styled-components/transient-props.md:
--------------------------------------------------------------------------------
1 | ## transitent props
2 |
3 | `transient props` 일시적인 props 이라는 뜻이다.
4 |
5 | `styled-components` 에서 만든 개념인데, 간단하게 말하면 "조건부 스타일링이 필요할때, 일시적으로 쓰이기 위한 Props" 라고 할 수 있겠다.
6 |
7 | 왜 일시적인 Props가 필요한지 아래 예시와 함께 설명하겠다.
8 |
9 | React에서 컴포넌트에 전달되는 모든 Props는 기본적으로 해당 컴포넌트의 최상위 DOM 요소로 전달된다. 이는 대부분의 경우 문제가 되지 않지만, 때로는 의도하지 않은 결과를 초래할 수 있다.
10 |
11 | ```jsx
12 | const StyledButton = styled.button`
13 | background-color: ${(props) => (props.isActive ? "blue" : "gray")};
14 | `;
15 |
16 | Click me;
17 | ```
18 |
19 | 이 경우, `isActive` prop은 스타일링을 위해 사용되지만, React는 이 prop을 실제 DOM 요소인 `` 에도 전달하려고 한다. 그러나 `isActive` 는 HTML `button` 요소의 유효한 속성이 아니기 때문에 React는 다음과 같은 경고를 발생시킨다.
20 |
21 | ```sh
22 | Warning: Received `true` for a non-boolean attribute `isActive`.
23 | If you want to write it to the DOM, pass a string instead: isActive="true" or isActive={value.toString()}.
24 | ```
25 |
26 | 이러한 경고는 코드가 예상대로 작동하지 않을 수 있음을 나타내며, DOM에 불필요한 속성이 추가되는 것을 의미한다.
27 |
28 | 아래는 해결을 위해 transient props를 사용하는 예시이다.
29 |
30 | ```jsx
31 | const StyledButton = styled.button`
32 | background-color: ${(props) => (props.$isActive ? "blue" : "gray")};
33 | `;
34 |
35 | Click me;
36 | ```
37 |
38 | 이렇게 transiten props를 사용하면 불필요한 DOM 속성을 방지하고, React가 알 수 없는 props에 대해 경고하는 것을 막을 수 있다. 일반적인 attribute와 형태를 달리함으로서 의미적으로도 도움이 될 것 같다.
39 |
--------------------------------------------------------------------------------