본문 바로가기
코딩공부/학습요약

Next.js13 프로젝트에서 yarn start(or npm run start) 스크립트를 실행했을 때 실행되는 코드 분석

by 개발지망생 2023. 6. 28.

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 애플리케이션을 프로덕션 모드로 실행되는 것을 알 수 있다.

댓글