오늘 한 일
- gachon-extension 개발
- 함수형 프로그래밍 스터디(4주차 - 챕터8)
- 알고리즘 문제 풀이 ffe46e5
gachon-extension 개발
기존에 있는 필터 기능을 개선했다. 그리고 필터링 기능을 하는 순수함수를 만들었다.
const filterAssignmentList = (assignmentList: Assignment[], courseId: string) => {
if (courseId === '-1') {
return assignmentList;
}
return assignmentList.filter(assignment => assignment.courseId === courseId);
};
const sortAssignmentList = (assignmentList: Assignment[]) => {
if (sortType === '마감일 순') {
return assignmentList.sort(
(a, b) => new Date(a.deadline).getTime() - new Date(b.deadline).getTime()
);
}
return assignmentList.sort((a, b) => Number(b.id) - Number(a.id));
};
const filterAssignmentStatus = (assignmentList: Assignment[]) => {
if (StatusType === '진행중인 과제') {
return assignmentList.filter(
assignment => new Date(assignment.deadline).getTime() > new Date().getTime()
);
}
return assignmentList;
};
근데 이걸 사용하려고 보니까 너무 가독성이 떨어졌다.
filterAssignmentStatus(
sortAssignmentList(
filterAssignmentList(assignmentList, selectedCourse.id)
)
).map(assignment => (
<AssignmentItem
key={assi**gnment.id}
assignment={assignment}
courseName={courseList.find(course => course.id === assignment.courseId).name}
/>
)**)
그래서 pipe 함수를 만들어 가독성 좋게 구현했다. 함수형 코딩 스터디 하면서 최대한 액션과 계산을 분리해서 순수함수를 만들어보려고 이런 식으로 구현했다.
function pipe<T>(value: T, ...funcs: ((value: T) => T)[]) {
let acc = value;
for (const f of funcs) {
acc = f(acc);
}
return acc;
}
// ...
pipe(
assignmentList,
assignmentList => filterAssignmentList(assignmentList, selectedCourse.id),
assignmentList => sortAssignmentList(assignmentList, sortType),
assignmentList => filterAssignmentStatus(assignmentList, StatusType)
).map(assignment => (
<AssignmentItem
key={assignment.id}
assignment={assignment}
courseName={courseList.find(course => course.id === assignment.courseId).name}
/>
));
개발 중 겪은 오류
크롬 익스텐션 개발하던 중 오류가 떴다.
React.lazy를 사용하여 dynamic import를 하고, React.Suspense를 사용하여 fallback을 설정했다. 근데 빌드를 하면 에러가 떴다.
이게 왜 떴냐하면, custom-dynamic-imports 플러그인 때문에 생긴 오류이다.
import type { PluginOption } from 'vite';
export default function customDynamicImport(): PluginOption {
return {
name: 'custom-dynamic-import',
renderDynamicImport() {
return {
left: `
{
const dynamicImport = (path) => import(path);
dynamicImport(
`,
right: ')}',
};
},
};
}
이 플러그인이 없으면 다음과 같이 번들링된다.
__vitePreload(
() => import('../../../assets/js/main.d077a1b9.js').then((n) => n.m),
true ? ['assets/js/main.d077a1b9.js', 'assets/js/client.10179973.js'] : void 0
)
그래서 플러그인을 지우고 빌드하면 잘 된다.
하지만 또 한 가지 문제가 있다. React.lazy를 사용했을 때 익스텐션 테스트 시 브라우저 콘솔에서 export를 읽을 수 없다는 에러가 뜬다.
이 오류 때문에 7시간 정도 헤맸다. 하지만 결국 해결하진 못했다.
정리해보자.
- vite의 rollupOptions를 통해 build를 커스텀 해서 생긴 오류인가?
- rollupOptions를 지우고 번들링된 파일만 가지고 manifest를 작성해서 테스트해보자
- 그냥 chrome extension에서 지원하지 않는 건가?
- 테스트해도 변함 없이 에러가 뜬다면, 이슈를 올려야겠다.
내일 할 일
- 바닐라JS로 리액트 만드는 스터디 노션 정리 후 발표 (VirtualDOM)
- 알고리즘 문제 풀이
- gachon-extension 개발
- 오류 테스트 후 해결 안되면 이슈 올리기(vite)
- 새로고침 버튼 추가, Framer Motion 적용