Next.js - next-start code
#!/usr/bin/env node
import arg from 'next/dist/compiled/arg/index.js'
import { startServer } from '../server/lib/start-server'
import { getPort, printAndExit } from '../server/lib/utils'
import isError from '../lib/is-error'
import { getProjectDir } from '../lib/get-project-dir'
import { CliCommand } from '../lib/commands'
import { resolve } from 'path'
import { PHASE_PRODUCTION_SERVER } from '../shared/lib/constants'
import loadConfig from '../server/config'
const nextStart: CliCommand = async (argv) => {
const validArgs: arg.Spec = {
// Types
'--help': Boolean,
'--port': Number,
'--hostname': String,
'--keepAliveTimeout': Number,
// Aliases
'-h': '--help',
'-p': '--port',
'-H': '--hostname',
}
let args: arg.Result<arg.Spec>
try {
args = arg(validArgs, { argv })
} catch (error) {
if (isError(error) && error.code === 'ARG_UNKNOWN_OPTION') {
return printAndExit(error.message, 1)
}
throw error
}
if (args['--help']) {
console.log(`
Description
Starts the application in production mode.
The application should be compiled with \`next build\` first.
Usage
$ next start <dir> -p <port>
<dir> represents the directory of the Next.js application.
If no directory is provided, the current directory will be used.
Options
--port, -p A port number on which to start the application
--hostname, -H Hostname on which to start the application (default: 0.0.0.0)
--keepAliveTimeout Max milliseconds to wait before closing inactive connections
--help, -h Displays this message
`)
process.exit(0)
}
const dir = getProjectDir(args._[0])
const host = args['--hostname']
const port = getPort(args)
const keepAliveTimeoutArg: number | undefined = args['--keepAliveTimeout']
if (
typeof keepAliveTimeoutArg !== 'undefined' &&
(Number.isNaN(keepAliveTimeoutArg) ||
!Number.isFinite(keepAliveTimeoutArg) ||
keepAliveTimeoutArg < 0)
) {
printAndExit(
`Invalid --keepAliveTimeout, expected a non negative number but received "${keepAliveTimeoutArg}"`,
1
)
}
const keepAliveTimeout = keepAliveTimeoutArg
? Math.ceil(keepAliveTimeoutArg)
: undefined
const config = await loadConfig(
PHASE_PRODUCTION_SERVER,
resolve(dir || '.'),
undefined,
undefined,
true
)
await startServer({
dir,
isDev: false,
hostname: host,
port,
keepAliveTimeout,
useWorkers: !!config.experimental.appDir,
})
}
export { nextStart }
코드 분석
- `#!/usr/bin/env node`를 통해 Node.js 실행 파일로 Unix 시스템에서 이 스크립트를 사용하도록 지정한걸로 보인다.
- import 한 라이브러리와 모듈 내용 정리
- `import { startServer } from '../server/lib/start-server'`를 통해 서버 구동
- `import { getPort, printAndExit } from '../server/lib/utils'`를 통해 각각 포트를 가져오고, 메시지를 출력한 후 프로세스를 종료하는 역할
- `import isError from '../lib/is-error'`를 통해 입력된 객체가 에러인지 여부를 확인
- `import { getProjectDir } from '../lib/get-project-dir'`로 프로젝트 디렉터리를 가져오기 위해 사용
- import { CliCommand } from '../lib/commands'`로 커맨드라인 명령에 대한 타입 정의
- `import { resolve } from 'path'`를 통해 경로의 단축이나 상대 경로를 해석하여 절대 경로로 변환하는 데 사용
- `import { PHASE_PRODUCTION_SERVER } from '../shared/lib/constants'` Next.js 프로덕션 서버를 가리키기 위해 사용
- `import loadConfig from '../server/config'` Next.js 애플리케이션의 설정을 로드하는 데 사용
- `const nextStart: CliCommand = async (argv) => {`: `nextStart`이라는 비동기 함수를 정의합니다 (`CliCommand` 타입, 명령행 인수를 전달받음
- const validArgs: arg.Spec = { `arg` 라이브러리를 사용하여 유효한 명령행 인수 및 옵션들 스키마 정의
- 명령행에서 제공된 인수를 파싱 및 처리하며, 사용자에게 알맞은 에러 메시지 출력
- `if (args['--help']) {`: '--help' 옵션에 대한 도움말 메시지를 출력하고 프로세스를 종료
- `const dir = getProjectDir(args._[0`: 사용자가 제공한 프로젝트 디렉토리를 결정하거나 현재 디렉토리를 사용
- `const host = args['--hostname'];`: 사용자가 제공한 호스트명 받아오기
- keepAliveTimeout 인수의 유효성 검사, 값이 유효하지 않으면 에러 메시지 출력. keepAliveTimeout 값 반올림 및 변수에 저장
- 설정을 로드하기 위해 `loadConfig` 함수 호출 (프로덕션 서버 단계)
- startServer` 함수 호출하여 Next.js 서버를 시작 (애플리케이션 설정값 전달)
startServer 함수에 전달된 객체는 서버의 설정을 제공한다. 이 객체에는 프로젝트 디렉터리 이름, 개발 모드 여부, 호스트 이름, 포트 번호, keepAliveTimeout 값 및 워커 사용 여부와 같은 정보가 포함된다. 이 코드를 통해 `next start` 명령어를 실행할 때 Next.js 애플리케이션을 프로덕션 모드로 실행되는 것을 알 수 있다.
'코딩공부 > 학습요약' 카테고리의 다른 글
Prisma 사용/공부 요약 (0) | 2023.04.27 |
---|---|
RESTful API란? (0) | 2023.04.21 |
[FrontEnd 지식] 브라우저 렌더링 원리와 순서(+성능 최적화 고려사항) (0) | 2023.04.11 |
[코드이슈] if문에서 else와 else if를 지양하는 의견 정리 (0) | 2023.04.04 |
브라우저 저장소 정리(feat.localStorage, sessionStorage, IndexedDB) (0) | 2023.03.20 |
댓글