March 24, 2023 • ☕️☕️ 8 min read
타지에서 루틴 찾기
Document.execCommand
HTML 문서가 designMode일 때, document 객체의 execCommand 메서드를 사용하여 현재 편집 가능한(editable) 영역(ex. form input, contentEditable 요소)을 조작할 수 있다.
현재는 ClipboardAPI가 나오면서 deprecated되었지만, 여전히 일부 상황에 유용하게 쓰일 수 있다.
예) 사용자가 선택한 영역에서 특정 문자열을 찾아서 교체하는 것
// 텍스트 복사 (클립보드에 저장)
document.execCommand("copy"); // 기존 방식
window.navigator.clipboard.writeText();
Ref https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand
자바스크립트 객체는 두 가지 타입이 있다: 순수(리터럴) 객체, 클래스(생성자) 객체
API 등으로 받아온 리터럴 자바스크립트 객체를 ES6 클래스로 바꾸고 싶을 때, JSON.parse
를 이용하면 원하는 클래스의 인스턴스로 만들 수 없다. (여전히 리터럴 자바스크립트 객체다.)
이 리터럴 자바스크립트 객체를 클래스의 인스턴스로 만들어주고 싶을 때 class-transformer
를 사용한다~
fetch("users.json").then((users: Object[]) => {
const realUsers = plainToClass(User, users);
// 이제 realUsers의 각 user는 User 클래스의 인스턴스가 된다.
});
Ref https://github.com/typestack/class-transformer#what-is-class-transformer
Interceptor
🚦 Interceptor로 Response Transformer 만들기
xor
두 배열에서 서로 중복되지 않은 데이터를 뽑아 새로운 배열로 만든다.
_.xor([2, 1], [2, 3]);
// => [1, 3]
Ref https://lodash.com/docs/4.17.15#xor
scroll listener에 caching과 throttling을 걸어도 IntersectionObserver가 더 부하가 적다.
Ref https://itnext.io/1v1-scroll-listener-vs-intersection-observers-469a26ab9eb6
match
react-router의 match
는 route path와 url의 매칭에 관한 정보를 가지고 있다.
아래처럼 사용
<Switch>
<Route path="/:type" component={MyPage}></Route>
{/* ... */}
</Switch>
// MyPage.tsx
const MyPage = ({ match }) => {
const pageType = match.params.type;
};
🤓 팁
match
는 route → componentprops
는 component → component 로 변수를 넘길 때 사용한다.
role/aria-hidden 어트리뷰트를 지정하는 것은 각각 아래와 같은 의도의 차이가 있다
input에서 엔터키를 눌렀을 때 상위 form의 onSubmit
이벤트의 트리거를 막기 위해서는 e.preventDefault()
를 사용한다.
onKeyDown
, onKeyPress
등 먼저 실행되는 이벤트에 대한 핸들러에 preventDefault
를 사용해도 submit
이벤트가 막히지만, onKeyUp
이벤트의 핸들러에서는 preventDefault
를 해도 submit
이벤트가 막히지 않는다
이미 keydown
, keypress
가 먼저 실행되어 submit이 되버리기 때문이다…
watch
vs getValues
: getValues
는 값이 변경될 때 리렌더링이 트리거되지 않고 인풋의 변경에 subscribe하지 않는다.resetField
option
에 defaultValue
를 넣지 않으면 필드 자체의 defaultValue
로 돌아간다.defaultValue
를 넣으면 해당 값으로 필드 값이 변경되고 필드의 defaultValue
가 해당 값으로 업데이트된다.vite에서 local 환경 실행 시, https를 사용하려면 vite.config.ts
파일에 아래와 같이 서버 설정을 추가해야 한다.
server: {
host: "my.baemin.com",
port: 3000,
https: {
key: fs.readFileSync("./key.pem"),
cert: fs.readFileSync("./cert.pem"),
},
},
HTMLElementEventMap
- window event들을 모아 놓은 집합의 타입 정의(Ref)깃랩 등 마크다운 에디터에서 이미지를 복사+붙여넣기 시 이미지의 크기를 지정할 수 없는데, 붙여넣어진 raw image 텍스트 영역을 선택만 하면 자동으로 <img>
태그로 변환하여 크기를 조절할 수 있게 해주는 익스텐션이다. 최고선배 팀원 분께서 만들어주셨는데 엄청 유용하게 쓰고 있다. 😎
이게 머선 일이고…
Ref https://news.hada.io/topic?id=8782
ChatGPT로도 진짜 코드를 짜주는구나..! 🙀 그러면 Copilot은 무슨 소용이지? (그래도 더 특화됐겠지?)
그래도 아직 실직하진 않을 것 같다.
Ref https://fe-developers.kakaoent.com/2023/230323-chatgpt-and-fe-developer/
대화형 코파일럿으로, 코파일럿을 이미 사용하고 있는 사람만 신청 가능하다고 한다.
대체 어디까지 가는거야…
Ref https://github.com/features/preview/copilot-x
Copilot, ChatGPT 등 AI의 도움을 받은 컨텐츠들이 난무하는 세상 속에 AI 콘텐츠가 아닌 ‘진짜 사람’이 만든 저작물에 붙일 수 있는 notbyai 뱃지라는 것도 등장했다…
(법적으로 실효성이 있는 건 아니다)
ChatGPT 등 텍스트 기반 명령어를 입력하는 ‘프롬프트’ 입력이 기반이 되는 도구에, 내부 기술 정보에 대한 질문을 하여 대외비를 탈탈 털어간다. ㅋㅋㅋ 웃을 일이 아닌데, 웃기다… 🤦♀️
Ref https://yozm.wishket.com/magazine/detail/1939/
한 주를 또 열일하며 보내고, 주말엔 골드코스트에 다녀왔다. 3년 전 호주를 왔던 기억이 제일 생생하게 잘 떠오르던 곳이었다. 넘 어렵지만 재밌었던 바다서핑도 배우고, 코알라 모자를 뒤집어쓴 캥거루 인형을 샀던 스타벅스에서 자바칩 프라푸치노 먹으며 힐링했다. 저녁은 폭립&킹새우로 flex… 근데 사이드로 나온 고구마튀김이 젤 맛있었다 ㅎ 한국에 수입하고 싶다.
그리고 일요일에 온갖 근육통을 안고 테크트리 해커톤 달려버렸다… 🏃♀️ 이렇게 또 호주에서의 주말이 순삭되었당