November 13, 2022 • ☕️☕️ 10 min read
가을 흠뻑
.{~}
으로 .
을 붙이면 variable로 선언한다: &{~}
으로 &를 붙이면 해당 variable을 변수명처럼 사용할 수 있다<<: *
: variable를 사용한다 (inheritance).node_build-cache: &next_build-cache
...
cache:
- <<: *node_build-cache
svelte는 컴포넌트가 커질수록 다른 프레임워크에 비해서 번들사이즈가 빠르게 증가한다. 용량이 몹시 중요하고 상대적으로 복잡하지 않은 애플리케이션이라면 svelte를 고려해볼 수 있다.
The Mobile Performance Inequality Gap에 따르면 2021년 기준 페이지가 처음 로드될 때 사용되는 모든 JS파일 크기의 합은 300~350kB(gzipped 기준)이라고 한다. 이는 느린 네트워크에서 5초 안에 페이지가 로드되는 저성능 디바이스를 타겟팅한 기준으로, 3초를 기준으로 한다면 애플리케이션의 크기는 185kb로 svelte 기준으로는 80개가 조금 안 되는 TodoMVC가 들어갈 수 있다.
Ref https://taegon.kim/archives/10477
css에서 가로 길이에 관계 없이 양쪽 끝이 동그란 막대형의 요소를 그리고 싶을 때는, border-radius
를 아주 큰 px 값으로 주어야 한다. border-radius: 50%
와 같이 percent 값으로 주었을 때는 이상한 타원형의 모양으로 그려지기 때문이다.
border-radius
를 px로 주는 것과 percent로 주는 것의 차이는 무엇일까?
border-radius
는 2가지 값을 받는데, 타원형의 1/4 영역에서 각각 x/y축 기준의 반지름을 의미한다. 값이 하나로만 설정됐을 경우 두 번째 값은 첫 번째 값과 동일한 값으로 설정된다. (즉 border-radius: x
는 border-radius: x/x
와 같다.)
W3C의 설명에 따르면, border-radius
의 값을 percent로 설정하면 border box의 크기에 관여한다. 즉 border-radius: 50%
은, x축과 y축 각각의 반지름을 container의 width, height의 50%로 설정한다.
💡
border-radius
가 해당 요소의 모든 width-height에 먹힌다고 생각하면 쉽다.
반면, border-radius
의 값을 px로 설정하면 x/y의 반지름이 같은 타원형이 된다. 즉, 원형이 된다. border-radius: 999px
로 설정하면, 원의 반지름은 999px이 되어야 하지만 curves overlap이 적용되어 원의 반지름을 가장 작은 측면(요소의 width 또는 height)의 절반의 값으로 설정하게 된다.
💡
border-radius
가 해당 요소의 모든 모서리(corner)에 동일하게 적용된다고 생각하면 쉽다.
사실… 뭔 소린지 다는 이해하지 못했지만, 결과만 잘 알고 있으면 될듯 🫠
Ref
👍 장점
👎 단점
스타일 직렬화, emotion이 CSS 문자열 또는 객체 스타일을 가져와 document에 삽입할 수 있는 일반 CSS 문자열로 변환하는 과정을 가리킨다.
동시성(Concurrent) 이란, 한 번에 하나 밖에 처리하지 못하는 싱글 코어에서 한 번에 여러 일을 처리하는 것처럼 보이는 논리적인 개념이다. 이게 가능한 이유는 동시에 실행하는 것처럼 보이기 위해 내부적으로 문맥 교환(Context Switch)이 일어난다.
병렬성 (Parallel) 이란, 실제로 여러 일을 동시에 처리할 수 있는 멀티 코어에서 멀티 스레드를 동작 시키는 방식이다. 즉, 동시성과는 달리 논리가 아닌 물리적인 의미에서의 동시 실행을 의미한다.
병렬성이 멀티 코어 작업이라 항상 더 좋을 것 같지만 네트워크 통신과 같은 I/O 작업은 CPU 가 거의 일하지 않고, 응답이 올 때까지 대기 상태에 있게 되어 효율적이지 못하다. 또, 작업이 바뀔 때 문맥 교환(Context Switch) 이 발생하고 동시 작업이 너무 많다면 문맥 교환의 오버헤드로 동시성 보다 더 느릴 수 있다.
자바스크립트는 병렬성이 아닌, 동시성을 지원하며, 이 동시성을 지원하기 위해 웹 브라우저(런타임 환경)는 Context Switch(이벤트 루프)를 지원한다 따라서 자바스크립트는 동시성(싱글스레드) 이며 이벤트 루프를 기반으로 한 비동기(논 블로킹) 언어 이다.
encodeURI()
: 인터넷 주소에서 사용하는 :, ;, /, =, ?, & 등을 제외하고 인코딩하는 함수encodeURIComponent()
: 모든 문자를 인코딩하는 함수const uri = "https://mozilla.org/?x=шеллы";
const encoded = encodeURI(uri);
const encodedComponent = encodeURIComponent(uri);
console.log(encoded); // https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B"
console.log(encodedComponent); // https%3A%2F%2Fmozilla.org%2F%3Fx%3D%D1%88%D0%B5%D0%BB%D0%BB%D1%8B
출력값
mkcert를 이용하여 로컬환경에서 신뢰할 수 있는 인증서를 생성해 https를 적용할 수 있다.
mkcert -install
로 local CA를 생성한 후mkcert [beta-ceo-local.baemin.com](http://beta-ceo-local.baemin.com/)
등으로 원하는 호스트 이름에 대한 인증서를 생성하고, mkcert가 이 인증서에 서명하도록 한다.https: {
key: fs.readFileSync('{CERTIFICATE-KEY-FILENAME}.pem', 'utf-8'),
cert: fs.readFileSync('{CERTIFICATE-FILENAME}.pem', 'utf-8'),
},
https://github.com/FiloSottile/mkcert 를 사용하여 local에서 CA를 자동으로 생성 및 설치 할 수 있다.
Ref https://web.dev/i18n/ko/how-to-use-local-https/
데코레이터는 프로퍼티나, 메서드 또는 클래스를 ‘장식(수정, 확장..)’할 수 있다.
자바스크립트의 데코레이터 함수는 target(데코레이터가 적용될 객체), key(데코레이터를 적용할 프로퍼티 이름), descriptor(프로퍼티의 설명자)를 인자로 받는다
다만, 데코레이터는 ES 표준이 아니며, MobX 6에서는 호환성을 고려해 데코레이터를 사용하지 않는 것을 공식적으로 권장한다.
그런데 올해 상반기에 stage3로 승격했다!
Ref https://ui.toast.com/weekly-pick/ko_20200102
프론트 개발자라면 자주 쓰게 되는 lodash 라이브러리는, 알고보면 기본적으로 지연 평가(lazy evaluation)을 사용하여 성능을 개선하고 있다고 한다!
이 방법은 for문 등의 반복적인 작업을 수행할 때, 주기의 ‘횟수’를 줄이는 것이지 주기에 걸리는 ‘시간’을 줄이는 것이 아니다.
다음 예제를 살펴보자.
function priceLt(x) {
return function (item) {
return item.price < x;
};
}
var gems = [
{ name: "Sunstone", price: 4 },
{ name: "Amethyst", price: 15 },
{ name: "Prehnite", price: 20 },
{ name: "Sugilite", price: 7 },
{ name: "Diopside", price: 3 },
{ name: "Feldspar", price: 13 },
{ name: "Dioptase", price: 2 },
{ name: "Sapphire", price: 20 },
];
var chosen = _(gems).filter(priceLt(10)).take(3).value();
$10보다 작은 가격의 보석 3개를 고르려고 할 때, 일반적인 lodash 접근인 엄격한 평가에서는 8개의 보석을 모두 걸러낸 후 앞의 3개를 골라낸다.
지연 평가 알고리즘에서는 이 방식과 대조적으로, 배열에서 작은 가격의 요소만을 가져와 올바른 결과를 얻는다. (즉, Sunstone, Sugilite, Diopside만 가져온다!) 이런 방식으로 쉽게 37.5%의 성능 향상을 만든다.
Ref https://edykim.com/ko/post/introduction-to-lodashs-delay-evaluation-by-filip-zawada/
클라이언트에서 서로 다른 파라미터를 가지고 같은 API endpoint로 수십 개의 API 요청을 보낼 때, 단순히 for문을 사용하여 하나하나 API 요청을 보낼 때와 Promise.all()
을 사용하여 요청을 보낼 때 성능상의 차이가 크게 발생했다. 이를 크롬 Network 탭에서 확인해보았는데, 요청 시작 시간이나 TTFB와 같은 서버 응답 시간 이외에도 Connection Stalled
라는 낯선 항목이 있어서 뭔지 알아봄!
크롬 개발자도구 문서에 따르면, 네트워크의 Timing 탭에서 아래와 같은 phase들을 볼 수 있다고 한다.
즉 동일한 API endpoint로 수십 개의 요청을 보내는 위 작업의 경우, 브라우저의 queueing 작업 때문에 몇몇 요청들이 stalled된 상태였다고 해석하면 될 것 같다!
문서에서 설명하는 그밖의 phase들은 다음과 같다.
enterkeyhint
는 가상 키보드의 엔터키를 커스텀할 수 있는 속성이다. 그렇다고 아무거나로는 안되고, 7가지 지정 값 중에서 선택해서 넣을 수 있다. (Ref)window.location.href
를 이용해 페이지 이동을 할 때 바로 이동이 가능하고, 웹뷰 지면의 경우 URI 인코딩을 해줘야 한다.focusin
, focusout
은 버블링이 일어나고 blur
, focus
는 버블링이 일어나지 않는다.CSS의 transform
속성은 다음과 같이 작성한다.
.target {
transform: translateX(50%) rotate(30deg) scale(1.2);
}
이 방법은 잘 작동하지만, 각각의 속성들을 따로따로 사용하려면 굉장히 귀찮다. 예를 들어, hover 시에 scale
의 동작만 변경하고 싶다 하더라도 앞에 나열했던 모든 속성을 다시 작성해줘야 한다.
.target:hover {
transform: translateX(50%) rotate(30deg) scale(2); /* Only the value of scale() changed */
}
크롬 104부터는 CSS transform의 속성을 각각 사용할 수 있다. (💡 브라우저 지원을 확인하자!)
앞의 예제를 CSS transform 분할 방식으로 사용하면, 다음과 같이 작성할 수 있다.
.target {
translate: 50% 0;
rotate: 30deg;
scale: 1.2;
}
순서는 어떻게 될까? 기존의 transform
문법에서는 왼쪽에서 오른쪽으로 나열된 순서에 따라 속성이 적용됐다. 새로운 transform 속성 분할 방식에서는, 순서가 항상 고정되어 있다. 1. translate
, 2. rotate
, 3. scale
새로운 transform
속성 작성 방식으로 애니메이션을 보다 쉽게 만들 수 있다 😎
Ref https://web.dev/css-individual-transform-properties/
우테캠 분들이 새로 입사하셔서 그런지 TIL이 아주 핫하다..! 정리할 것들이 많아졌다 🤩 (기쁘다는 뜻)
간만에 금요일 휴가 내고 여행 다녀왔다. 안동이라는 크지 않은 동네였는데, 사람도 거의 없고 날씨도 너무 따뜻해서 완전 힐링하고 왔다. 갈비에, 찜닭에, 고등어에… 단백질 가득했던(!) 먹부림은 덤 😋 가을 정취 물씬 느끼고 와서 하루 남은 주말 띵구르르