* ts설정
- tsconfig.json
{
"compilerOptions": {
"module": "commonjs",
"outDir": "dist",
"sourceMap": true,
"target": "ES6",
"lib": ["es6"],
},
}
- package.json
- -watch => ts파일을 저장할때 자동으로 js로 컴파일
- --onSuccess => 제대로 컴파일 됐을때만 뒤의 명령 실행
{
"scripts": {
"start": "tsc-watch --onSuccess \"node dist/main.js\""
},
"devDependencies": {
"@types/node": "^22.7.4",
"tsc-watch": "^6.2.0",
"typescript": "^5.6.2"
}
}
* favicon
- 개념
- “파비콘(favicon)”은 탭이나 북마크를 위해 브라우저에서 사용되는 아이콘이다. 이 아이콘은 여러분의 웹사이트를 구분하는데 도움을 주고 그 사이트에 유일한 표식을 준다.
- 네이버 탭 좌측의 N 모양이 favicon 이다.
* view to dist
- 문제 : ts는 dist내의 js로 바꿔서 실행됨 -> view도 dist내의 view를 찾음 -> html이나 png같은 것을 dist내에 옮겨줘야 제대로 찾음.
- 해결 :
좋은 질문입니다. TypeScript 프로젝트에서 정적 파일(예: HTML, PNG 등)을 처리하는 것은 중요한 고려사항입니다. 일반적으로 이러한 파일들을 빌드 과정에서 자동으로dist
폴더로 복사하는 것이 좋은 방법입니다. 수동으로 파일을 옮기는 것은 오류가 발생하기 쉽고 비효율적입니다.
이 문제를 해결하기 위한 몇 가지 방법을 제안해 드리겠습니다:
- npm 스크립트 사용:
{
"scripts": {
"build": "tsc",
"copy-views": "cp -R src/views dist/",
"prebuild": "npm run copy-views"
}
}
이 방법은 간단하지만, 운영 체제에 따라 명령어가 다를 수 있습니다 (예: Windows에서는 cp
대신 xcopy
사용).
copyfiles
패키지 사용:
먼저 패키지를 설치합니다:
npm install --save-dev copyfiles
그리고 package.json
에 스크립트를 추가합니다:
{
"scripts": {
"build": "tsc",
"copy-views": "copyfiles -u 1 src/views/**/* dist",
"prebuild": "npm run copy-views"
}
}
이 방법은 크로스 플랫폼에서 작동합니다.
ts-node
스크립트 사용:
더 복잡한 복사 로직이 필요한 경우, TypeScript로 스크립트를 작성할 수 있습니다:
// scripts/copyAssets.ts
import * as fs from 'fs-extra';
import * as path from 'path';
const src = path.resolve(__dirname, '../src/views');
const dest = path.resolve(__dirname, '../dist/views');
fs.copySync(src, dest, {
filter: (src, dest) => {
// 필요한 경우 여기에 필터 로직 추가
return true;
}
});
console.log('Views copied to dist folder');
그리고 package.json
에 스크립트를 추가합니다:
{
"scripts": {
"build": "tsc",
"copy-views": "ts-node scripts/copyAssets.ts",
"prebuild": "npm run copy-views"
}
}
- Webpack 사용:
프로젝트가 이미 Webpack을 사용하고 있다면, copy-webpack-plugin
을 사용할 수 있습니다:
const CopyPlugin = require('copy-webpack-plugin');
module.exports = {
// ... 기타 웹팩 설정
plugins: [
new CopyPlugin({
patterns: [
{ from: 'src/views', to: 'views' }
],
}),
],
};
- TypeScript 프로젝트 참조 사용:
복잡한 프로젝트의 경우, TypeScript의 프로젝트 참조 기능을 사용하여 여러 하위 프로젝트로 나누고, 각각에 대해 outDir
을 설정할 수 있습니다.
권장사항:
- 프로젝트의 규모와 복잡성을 고려하여 적절한 방법을 선택하세요.
- 선택한 방법을 문서화하고 팀원들과 공유하세요.
- CI/CD 파이프라인에 이 과정을 포함시켜 자동화하세요.
이러한 방법들을 통해 정적 파일들을 자동으로 dist
폴더로 복사할 수 있으며, 빌드 프로세스를 더욱 효율적으로 만들 수 있습니다.
* app 의사코드
* 조건부 요청
export const cachePolicy = {
'html': 'no-cache',
'css': 'public, max-age=86400',
'js': 'public, max-age=86400',
'png': 'public, max-age=604800',
'jpg': 'public, max-age=604800',
} as const;
public setCacheControl(value: string): this {
this.header('Cache-Control', `max-age=${value}`);
return this;
}
* 조건부 요청 V1 last-modified
- 아래의 etag와 작동방식은 비슷하다.
* 조건부 요청 V2 etag
- 구현은 etag 방식만 해보기로 한다.
- 문제 : 현재는 모든 요청에 대해 html, image등이 변경점이 없어도, 새로운 파일을 보내준다.
- 네트워크는 돈, 돈이 낭비되고 있는것이다.
- 해결 : etag 조건부요청
- 최초요청은 그냥 body에 파일을 보내준다. && 파일을 해시한 값인 Etag를 같이 보내준다.
- 이후 브라우저는 요청시 if-none-match를 같이 보낸다.
- 이 값을 비교해서, 현재 파일의 해시값과 비교하여,
- 같으면 304 Not Modifed를 보내고
- 다르면 새로운 body에 변경된 content를 보내준다.
'JS > boostCamp' 카테고리의 다른 글
24.10.5~7. 개발일지 // 회원가입구현, redirect, cookie, session, 인증 (0) | 2024.10.07 |
---|---|
24. 10. 4. 개발일지 // 정적서빙버그 fix (2) | 2024.10.05 |
24.10.3. 개발일지 // MemberSaveController 구현, 프론트컨트롤러 v4구현, 유연한 컨트롤러 구현, 어댑터패턴, instanceof interface (0) | 2024.10.03 |
24. 10. 2. 개발일지 // 프론트컨트롤러 v3, 동적렌더링, mapToObj (2) | 2024.10.02 |
24. 10. 1. 개발일지 // 미들웨어, 프론트 컨트롤러, static serving, 동적렌더링 (0) | 2024.10.01 |