0Pricing
Node.js Backend Development Bootcamp · 강의

tsx, 핫 리로드 및 소스 맵으로 빠르게 반복하기

즉석 트랜스파일, 감시 모드 및 정확한 스택 추적으로 마찰 없는 개발 순환을 설정합니다.

tsx, 핫 리로드 및 소스 맵으로 빠르게 반복하기은(는) CoddyKit의 무료 Node.js Backend Development Bootcamp 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Node.js Backend Development Bootcamp 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Node.js Backend Development Bootcamp 강의에는 총 4개의 강의가 포함되어 있습니다.

이 강의의 일부는 아직 번역되지 않았으며 영어로 표시됩니다.

The Slow Dev Loop Problem

When you write a Node.js backend in TypeScript, the naive workflow is painful: edit a file, run tsc to compile to JavaScript, then run node dist/index.js, then repeat on every change.

This adds friction in three places:

  • Transpile step — you wait for the whole project to build before anything runs.
  • Restart step — you manually kill and relaunch the process.
  • Debugging — errors point to compiled dist/*.js line numbers, not your real source.

In this lesson we wire up a frictionless loop: on-the-fly transpilation with tsx, automatic restarts with watch mode, and accurate stack traces with source maps.

What tsx Actually Does

tsx ("TypeScript Execute") is a CLI that runs TypeScript and ESM files directly, with no separate build step. Under the hood it uses esbuild to transpile each module in memory as Node loads it.

Key facts to remember:

  • It does not type-check — esbuild only strips types and emits JS. You keep tsc --noEmit for type safety in CI.
  • It handles both .ts and modern ESM import syntax transparently.
  • It is meant for development and scripts, not as your production runtime.

Install it as a dev dependency:

// package.json (dev dependency install)
// npm install --save-dev tsx

// Then run any TypeScript file directly:
// npx tsx src/index.ts

// No tsconfig 'outDir', no dist/ folder needed during dev.

Running a File Directly

The simplest use of tsx is replacing node with tsx. Given a TypeScript entry point, you run it directly and tsx transpiles on the fly.

Here is a tiny standalone script. The logic itself is plain JavaScript you can run anywhere; with tsx you would write the same thing in a .ts file using types, and tsx would strip them before executing.

function greet(name) {
  return `Hello, ${name}! Server starting...`;
}

const port = process.env.PORT || 3000;
console.log(greet('developer'));
console.log(`Would listen on port ${port}`);

Watch Mode: Automatic Restarts

The biggest time-saver is tsx watch. It launches your program, watches every file in the dependency graph, and restarts the process automatically whenever a source file changes.

This replaces older tools like nodemon + ts-node with a single fast command. You no longer hit Ctrl+C and re-run after every edit.

Add it to your package.json scripts so the whole team uses the same command:

{
  "name": "my-api",
  "type": "module",
  "scripts": {
    "dev": "tsx watch src/index.ts",
    "start": "node dist/index.js",
    "typecheck": "tsc --noEmit",
    "build": "tsc"
  }
}

A Watchable Server Entry Point

Here is a minimal HTTP server entry point you would run with tsx watch. Edit any handler and tsx restarts the process in milliseconds, so the new code is live almost instantly.

Notice this uses only Node's built-in http module — no Express, no framework. tsx works the same regardless of what libraries you import.

import { createServer } from 'node:http';

const server = createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'application/json' });
  res.end(JSON.stringify({ message: 'Edit me and tsx restarts!' }));
});

server.listen(3000, () => {
  console.log('Listening on http://localhost:3000');
});

Why You Still Need Type Checking

Because tsx (via esbuild) only strips types, it will happily run code that has type errors. That speed is great for iteration but dangerous if it is your only safety net.

The standard pattern is a two-track setup:

  • Fast loop: tsx watch for instant feedback while coding.
  • Correctness gate: tsc --noEmit in a separate terminal or in CI to catch real type errors.

You can even run the type-checker in watch mode alongside tsx:

// Terminal 1 — run + restart on change (no type errors caught)
// npm run dev        ->  tsx watch src/index.ts

// Terminal 2 — continuous type checking
// npx tsc --noEmit --watch

// CI pipeline step
// npm run typecheck   ->  tsc --noEmit

Hot Reload vs Restart

It is worth being precise: tsx watch does a full process restart, not in-place hot module replacement (HMR). The whole Node process exits and a fresh one starts.

For backend APIs this is almost always what you want:

  • State is rebuilt cleanly, avoiding stale modules or leaked listeners.
  • Restarts are fast because only changed modules are re-transpiled.

True HMR (keeping connections and in-memory state alive across edits) exists in some frameworks but adds complexity and subtle bugs. For most Node backends, a fast clean restart is simpler and safer.

Graceful Shutdown for Clean Restarts

Because watch mode kills and relaunches the process, your server should shut down cleanly so ports and resources are released before the next start. Listen for the SIGTERM / SIGINT signals tsx sends.

Without this, a slow-closing server can leave the port in use and the restarted process crashes with EADDRINUSE.

import { createServer } from 'node:http';

const server = createServer((req, res) => res.end('ok'));
server.listen(3000);

function shutdown() {
  console.log('Closing server before restart...');
  server.close(() => process.exit(0));
}

process.on('SIGTERM', shutdown);
process.on('SIGINT', shutdown);

Source Maps: Accurate Stack Traces

When code is transpiled, an error's line and column refer to the generated JavaScript, not your TypeScript. Source maps are mapping files that translate generated positions back to your original source.

Good news for tsx: it generates and applies source maps automatically, so thrown errors already point at your real .ts lines.

For a tsc-built production bundle you must opt in via tsconfig.json:

{
  "compilerOptions": {
    "target": "ES2022",
    "module": "NodeNext",
    "moduleResolution": "NodeNext",
    "outDir": "dist",
    "sourceMap": true,
    "strict": true
  }
}

Enabling Source Maps at Runtime

Generating .map files is only half the story. Node must be told to use them when formatting stack traces. Modern Node supports the --enable-source-maps flag.

With it, a crash in dist/index.js shows the original src/index.ts filename and line in the stack trace. Add it to your production start script:

{
  "scripts": {
    "dev": "tsx watch src/index.ts",
    "build": "tsc",
    "start": "node --enable-source-maps dist/index.js"
  }
}

Seeing a Source-Mapped Trace

To feel why source maps matter, here is a complete program that throws from inside a nested call. When run, the stack trace lists each function and the line it failed on.

In a transpiled project without source maps, those line numbers would belong to the compiled output and be useless. With tsx (or --enable-source-maps), they map back to your original source.

function loadConfig() {
  throw new Error('Missing DATABASE_URL');
}

function startServer() {
  return loadConfig();
}

try {
  startServer();
} catch (err) {
  console.error('Startup failed:', err.message);
  console.error(err.stack);
}

Quick Check

You are setting up the development and production workflow for a TypeScript Node.js API. Answer based on what each tool does.

Recap

You built a frictionless TypeScript dev loop for Node.js backends:

  • tsx runs .ts and ESM directly with esbuild — no separate build step, but no type checking either.
  • tsx watch auto-restarts the process on every file change, replacing nodemon + ts-node with one fast command.
  • Watch mode does a clean full restart, so add graceful shutdown (SIGTERM/SIGINT) to avoid EADDRINUSE.
  • Keep correctness with tsc --noEmit in CI, and build production with tsc.
  • Source maps map errors back to your real source: tsx applies them automatically, and production needs sourceMap: true plus node --enable-source-maps.

Result: edit, save, and see correct behavior and accurate stack traces almost instantly.

자주 묻는 질문

“tsx, 핫 리로드 및 소스 맵으로 빠르게 반복하기” 강의는 무료인가요?

네 — “tsx, 핫 리로드 및 소스 맵으로 빠르게 반복하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Node.js Backend Development Bootcamp 강의 전체를 잠금 해제할 수 있습니다. Node.js Backend Development Bootcamp 강의에는 총 4개의 강의가 포함되어 있습니다.

“tsx, 핫 리로드 및 소스 맵으로 빠르게 반복하기”에서 뭘 배우나요?

즉석 트랜스파일, 감시 모드 및 정확한 스택 추적으로 마찰 없는 개발 순환을 설정합니다. 브라우저에서 직접 실행하는 실습 코드로 Node.js Backend Development Bootcamp을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Node.js Backend Development Bootcamp을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Node.js Backend Development Bootcamp은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“tsx, 핫 리로드 및 소스 맵으로 빠르게 반복하기” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Node.js Backend Development Bootcamp 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Node.js Backend Development Bootcamp 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. CommonJS에서 네이티브 ES 모듈로 마이그레이션
  2. Node 백엔드 프로젝트를 위한 tsconfig 구성
  3. 타입 안전 환경 구성 및 런타임 검증
  4. tsx, 핫 리로드 및 소스 맵으로 빠르게 반복하기
← Node.js Backend Development Bootcamp(으)로 돌아가기