NODEJS Roadmap
51 sections • 766 topics
- 1. Installing Node.js
- 2. Managing Node Versions
- 3. Checking Node Version
- 4. Checking npm Version
- 5. Using Node Version Manager
- Example: .nvmrc auto-switch
- 6. Configuring npm Registry
- 7. Setting Up Global Install Directory
- 8. Configuring Environment Variables
- 9. Understanding Node.js Runtime Architecture
- Architecture Stack
- 10. Configuring Node.js for Production
- 1. Starting REPL Session
- 2. Evaluating JavaScript Expressions
- 3. Using Multi-Line Input (.editor)
- Example: Editor mode
- 4. Navigating REPL History
- 5. Using Tab Completion
- 6. Using Underscore for Last Result (_)
- Example: Underscore variables
- 7. Inspecting Objects in REPL
- 8. Loading External Files (.load)
- Example: Load script into REPL
- 9. Saving REPL Session (.save)
- 10. Clearing REPL Context (.clear)
- 11. Using REPL Commands (.help, .exit, .break)
- 1. Using __dirname and __filename
- 2. Understanding global Object
- 3. Using globalThis
- 4. Using console Methods
- 5. Using Buffer Global
- 6. Using process Global
- 7. Using setTimeout/setInterval Globals
- 8. Understanding module Object
- 9. Using require Function
- 10. Using exports and module.exports
- Example: Two export patterns
- 11. Avoiding Global Variable Pollution
- 1. Using CommonJS Modules
- Example: CommonJS
- 2. Understanding module.exports vs exports
- Reference Model
- 3. Using Module Wrapper Function
- 4. Understanding Module Resolution
- 5. Using ES Modules
- Example: ESM
- 6. Configuring Module Type
- 7. Using Dynamic Imports (import())
- Example: Lazy load
- 8. Using Import Assertions
- Example: JSON import
- 9. Loading JSON Files
- 10. Creating Conditional Exports
- Example: package.json exports
- 11. Creating Dual Packages
- 12. Creating Module Aliases
- 1. Initializing Package
- 2. Installing Packages
- 3. Installing Dev Dependencies
- 4. Installing Global Packages
- 5. Updating Packages
- 6. Removing Packages
- 7. Using npx for Package Execution
- 8. Understanding Semantic Versioning (^, ~, exact)
- 9. Managing Lock Files
- 10. Auditing Security
- 11. Publishing Packages
- Publish Workflow
- 12. Using Workspaces
- Example: Monorepo workspaces
- 1. Defining Scripts
- Example: Common scripts
- 2. Setting Entry Point
- 3. Specifying Dependencies
- 4. Using Peer Dependencies
- Example: Plugin requiring host
- 5. Using Optional Dependencies
- 6. Configuring Exports
- Example: Subpath + types
- 7. Setting Module Type (type: module)
- 8. Defining Engines
- Example: Pin engine
- 9. Using Pre and Post Scripts
- 10. Configuring bin for CLI Tools
- Example: CLI binary
- 11. Using Files Field
- 12. Setting Package Metadata
- 1. Accessing Command-Line Arguments
- Example: process.argv
- 2. Reading Environment Variables
- 3. Getting Current Directory (process.cwd)
- 4. Changing Directory (process.chdir)
- Example
- 5. Getting Platform Info
- 6. Getting Process ID (process.pid)
- 7. Accessing Memory Usage (process.memoryUsage)
- 8. Getting CPU Usage (process.cpuUsage)
- Example
- 9. Measuring Performance (process.hrtime, process.hrtime.bigint)
- 10. Handling Process Events
- 11. Exiting Process (process.exit)
- 12. Sending Process Signals (process.kill)
- 1. Loading .env Files
- Example: Built-in loader
- 2. Accessing process.env Variables
- 3. Setting Default Values (|| operator, ?? nullish coalescing)
- Example
- 4. Using NODE_ENV for Environment Detection
- 5. Managing Multiple Environments
- 6. Using config Libraries
- 7. Using Environment-Specific Configs
- Example: Switch by NODE_ENV
- 8. Validating Environment Variables
- Example: Zod schema
- 9. Using cross-env for Cross-Platform
- Example
- 10. Securing Sensitive Data
- 1. Accessing process.argv Array
- 2. Parsing Arguments Manually
- Example: Tiny parser
- 3. Using util.parseArgs for CLI
- Example: util.parseArgs
- 4. Using commander for CLI
- Example
- 5. Using yargs for Argument Parsing
- 6. Handling Flags and Options (--flag, -f)
- 7. Using Positional Arguments
- 8. Implementing Subcommands
- Example: commander subcommands
- 9. Adding Help and Usage Info
- 10. Validating User Input
- 11. Creating Interactive CLIs
- 1. Reading from stdin (process.stdin)
- Example: Async iterator
- 2. Writing to stdout (process.stdout)
- 3. Writing to stderr (process.stderr)
- Example
- 4. Handling Input Events
- 5. Piping Data Between Streams
- Example: Uppercase pipeline
- 6. Setting Raw Mode (setRawMode)
- 7. Using TTY Module (tty.isatty)
- 8. Detecting Terminal Size (process.stdout.columns)
- 9. Handling ANSI Colors
- 10. Creating Progress Bars
- Example: Manual bar
- 1. Creating Readline Interface (readline.createInterface)
- Example: Basic interface
- 2. Reading Line by Line
- Example: Process file lines
- 3. Prompting for Input (rl.question)
- 4. Writing Prompts (rl.prompt)
- 5. Pausing Input (rl.pause)
- 6. Resuming Input (rl.resume)
- 7. Closing Interface (rl.close)
- 8. Handling SIGINT
- Example: Confirm exit
- 9. Using Async Iterators on Interface
- 10. Creating Command-Line Interfaces
- Example: REPL-style loop
- 11. Implementing Auto-Completion
- Example: Completer fn
- 1. Understanding Event Loop Phases
- libuv Phases (per tick)
- 2. Understanding the Call Stack
- 3. Understanding the Callback Queue
- 4. Using process.nextTick for Microtasks
- Example
- 5. Using setImmediate for Check Phase
- 6. Understanding Microtasks vs Macrotasks
- 7. Understanding Promise Resolution Timing
- Example: Order
- 8. Avoiding Event Loop Blocking
- 9. Monitoring Event Loop Lag
- Example: perf_hooks monitor
- 10. Using Event Loop Utilities
- 1. Using Callbacks
- Example: Node-style callback
- 2. Working with Promises
- Example
- 3. Using Async/Await Syntax
- Example
- 4. Converting Callbacks to Promises (util.promisify)
- Example
- 5. Handling Promise Rejection
- 6. Using Promise.all for Parallel Execution
- Example
- 7. Using Promise.race for First Resolution
- 8. Using Promise.allSettled for All Results
- Example
- 9. Using Promise.any for First Fulfillment
- 10. Understanding Async Error Handling (try-catch)
- 11. Using AbortController for Cancellation
- Example
- 12. Using AbortSignal for Timeouts
- 1. Using setTimeout for Delays
- 2. Using setInterval for Repetition
- Example
- 3. Using setImmediate for Next Cycle
- 4. Using process.nextTick for Microtasks
- 5. Clearing Timeouts (clearTimeout)
- Example
- 6. Clearing Intervals (clearInterval)
- 7. Clearing Immediate (clearImmediate)
- 8. Understanding Timer Order
- 9. Using Timers/Promises
- Example: Promise-based timers
- 10. Handling Timer Drift
- 11. Scheduling Delayed Tasks
- 1. Creating Event Emitters
- Example
- 2. Registering Event Listeners
- 3. Using Once Listeners
- Example
- 4. Emitting Events
- 5. Removing Listeners
- 6. Prepending Listeners (prependListener)
- 7. Getting Listener Count (listenerCount)
- 8. Setting Max Listeners (setMaxListeners)
- 9. Handling Error Events
- Example
- 10. Using Async Iterators on Events
- Example
- 11. Creating Custom Event Emitters
- Example: Typed emitter (TS)
- 1. Creating Buffers
- 2. Using Buffer.alloc vs Buffer.allocUnsafe
- 3. Writing to Buffers
- 4. Reading from Buffers
- 5. Converting Encodings
- Example: Convert
- 6. Checking Buffer Length
- 7. Comparing Buffers
- 8. Concatenating Buffers (Buffer.concat)
- Example
- 9. Copying Buffers
- 10. Slicing Buffers
- 11. Understanding Buffer Pooling
- 1. Creating Readable Streams (fs.createReadStream)
- Example
- 2. Creating Writable Streams (fs.createWriteStream)
- 3. Using Transform Streams (stream.Transform)
- Example: gzip on the fly
- 4. Using Duplex Streams
- 5. Handling Stream Events
- 6. Piping Streams
- Example: pipeline (preferred)
- 7. Controlling Stream Flow
- 8. Using Backpressure
- Backpressure
- 9. Working with Object Mode
- Example
- 10. Using stream.Readable.from() Method
- 11. Consuming Streams with Async Iterators
- Example
- 12. Understanding Highwater Mark
- 1. Creating ReadableStream
- Example
- 2. Creating WritableStream
- Example
- 3. Using TransformStream
- 4. Piping Web Streams
- Example
- 5. Converting Node.js Streams to Web Streams
- 6. Converting Web Streams to Node.js Streams
- 7. Using Streams with Fetch API
- Example: Stream response
- 8. Handling Backpressure in Web Streams
- 9. Understanding Web Streams vs Node Streams
- 10. Using Async Iteration with Web Streams
- 1. Reading Files
- Example: Promise API
- 2. Writing Files
- 3. Appending to Files (fs.appendFile)
- Example
- 4. Checking File Existence
- 5. Getting File Stats
- 6. Creating Directories
- 7. Reading Directories
- 8. Deleting Files
- 9. Removing Directories
- 10. Watching Files
- Example
- 11. Using Promises API (fs/promises)
- 12. Working with File Descriptors
- Example: FileHandle
- 13. Copying Files (fs.copyFile)
- 14. Renaming Files (fs.rename)
- 15. Creating Symlinks
- 1. Joining Paths (path.join)
- Example
- 2. Resolving Absolute Paths (path.resolve)
- 3. Getting Directory Name (path.dirname)
- 4. Getting Base Name (path.basename)
- 5. Getting File Extension (path.extname)
- 6. Normalizing Paths (path.normalize)
- 7. Checking Absolute Paths (path.isAbsolute)
- 8. Getting Relative Paths (path.relative)
- Example
- 9. Parsing Paths (path.parse)
- 10. Formatting Paths (path.format)
- 11. Using Platform-Specific Separators
- 1. Getting OS Platform (os.platform)
- 2. Getting OS Architecture (os.arch)
- 3. Getting OS Type (os.type)
- 4. Getting Hostname (os.hostname)
- 5. Getting Home Directory (os.homedir)
- 6. Getting Temp Directory (os.tmpdir)
- 7. Getting User Info (os.userInfo)
- 8. Getting CPU Info (os.cpus)
- Example
- 9. Getting Total Memory (os.totalmem)
- 10. Getting Free Memory (os.freemem)
- 11. Getting System Uptime (os.uptime)
- 12. Getting Network Interfaces (os.networkInterfaces)
- 13. Getting EOL Character (os.EOL)
- 1. Parsing URLs
- Example: WHATWG URL
- 2. Getting URL Components
- 3. Using URLSearchParams
- Example
- 4. Formatting URLs (url.format)
- 5. Resolving URLs (url.resolve)
- 6. Encoding URL Components (encodeURIComponent)
- 7. Decoding URL Components (decodeURIComponent)
- 8. Working with URL Hash
- Example
- 9. Building URLs Programmatically
- Example
- 10. Using WHATWG URL API vs Legacy
- 1. Parsing Query Strings (querystring.parse)
- Example
- 2. Stringifying Objects (querystring.stringify)
- 3. Encoding Values (querystring.escape)
- 4. Decoding Values (querystring.unescape)
- 5. Handling Arrays in Query Strings
- 6. Using Custom Separators (& vs ;)
- Example
- 7. URLSearchParams vs querystring
- 8. Building Query Strings from Objects
- Example
- 9. Handling Nested Objects
- 10. Using qs Package for Complex Queries
- Example
- 1. Promisifying Callbacks (util.promisify)
- Example
- 2. Creating Callbackified Functions (util.callbackify)
- 3. Formatting Strings (util.format)
- 4. Inspecting Objects (util.inspect)
- Example
- 5. Checking Types
- 6. Using TextEncoder and TextDecoder
- Example
- 7. Using Debuglog (util.debuglog)
- Example: Conditional log
- 8. Deprecating Functions (util.deprecate)
- 9. Using parseArgs for CLI (util.parseArgs)
- 10. Using isDeepStrictEqual for Comparison
- Example
- 11. Using MIMEType for Content Types
- 1. Using assert() for Truthy Checks
- Example
- 2. Using assert.ok for Boolean Checks
- 3. Using assert.strictEqual (===)
- 4. Using assert.notStrictEqual (!==)
- 5. Using assert.deepStrictEqual
- Example
- 6. Using assert.notDeepStrictEqual
- 7. Using assert.throws (error testing)
- Example
- 8. Using assert.rejects
- Example
- 9. Using assert.doesNotThrow
- 10. Using assert.ifError
- 11. Using assert.match
- 12. Creating Custom Assertion Messages
- Example: AssertionError
- 1. Creating HTTP Server (http.createServer)
- Example: Minimal server
- 2. Listening on Port (server.listen)
- 3. Handling Requests
- 4. Reading Request Data
- Example
- 5. Handling Request Body
- 6. Using URL Module for Parsing
- Example
- 7. Implementing Routing
- Example: Manual router
- 8. Sending Responses
- 9. Setting Response Headers
- 10. Setting Status Codes (res.statusCode)
- 11. Serving Static Files
- Example: Stream file
- 12. Closing Server (server.close)
- 13. Handling Server Errors
- 1. Creating HTTPS Server (https.createServer)
- Example
- 2. Loading SSL Certificates
- 3. Configuring TLS Options
- 4. Handling Secure Connections
- 5. Testing with Self-Signed Certificates
- Example
- 6. Using Let's Encrypt Certificates
- 7. Redirecting HTTP to HTTPS
- Example
- 8. Implementing Certificate Pinning
- 9. Handling TLS Errors
- 10. Renewing SSL Certificates
- Renewal Workflow
- 1. Using http.get for GET Requests
- Example
- 2. Using http.request Method
- 3. Using https.request for Secure Requests
- 4. Using Native Fetch API (modern approach)
- Example: Modern fetch
- 5. Setting Request Headers
- 6. Sending Request Body
- 7. Working with Query Parameters
- Example
- 8. Handling Response Data
- 9. Following Redirects Manually
- 10. Setting Request Timeout
- Example
- 11. Using AbortController for Cancellation
- 12. Handling Request Errors
- 1. Creating TCP Server (net.createServer)
- Example: Echo server
- 2. Creating TCP Client
- Example
- 3. Handling Connection Events
- 4. Writing Data to Socket (socket.write)
- 5. Ending Connections (socket.end)
- 6. Destroying Sockets (socket.destroy)
- 7. Getting Socket Address (socket.address)
- 8. Setting Socket Timeout (socket.setTimeout)
- Example
- 9. Implementing Keep-Alive (setKeepAlive)
- 10. Using Unix Sockets
- 11. Handling Socket Errors
- 1. Creating UDP Socket (dgram.createSocket)
- Example
- 2. Binding to Port (socket.bind)
- 3. Sending Messages (socket.send)
- Example
- 4. Receiving Messages
- 5. Broadcasting Messages (setBroadcast)
- Example
- 6. Setting TTL (setTTL)
- 7. Joining Multicast Groups (addMembership)
- Example
- 8. Leaving Multicast Groups (dropMembership)
- 9. Closing UDP Socket (socket.close)
- 10. Handling UDP Errors
- 1. Resolving Domain Names (dns.lookup)
- Example
- 2. Resolving with dns.resolve
- 3. Resolving CNAME Records (dns.resolveCname)
- 4. Resolving TXT Records (dns.resolveTxt)
- 5. Resolving SRV Records (dns.resolveSrv)
- 6. Reverse DNS Lookup (dns.reverse)
- 7. Getting Name Servers (dns.getServers)
- 8. Setting Name Servers (dns.setServers)
- Example
- 9. Using Promises API (dns.promises)
- 10. Handling DNS Errors
- 1. Creating WebSocket Server
- Example: ws library
- 2. Handling WebSocket Connections
- 3. Sending Messages (ws.send)
- 4. Receiving Messages
- Example
- 5. Broadcasting to All Clients
- Example
- 6. Implementing Heartbeat/Ping-Pong
- Example: Detect dead clients
- 7. Handling Connection Close
- 8. Handling WebSocket Errors
- 9. Implementing WebSocket Authentication
- 10. Using Socket.io for Real-Time Communication
- 1. Compressing with gzip (zlib.gzip)
- Example
- 2. Decompressing with gunzip (zlib.gunzip)
- 3. Using Deflate Compression (zlib.deflate)
- 4. Using Inflate Decompression (zlib.inflate)
- Example
- 5. Using Brotli Compression (zlib.brotliCompress)
- 6. Creating Compression Streams (zlib.createGzip)
- Example
- 7. Setting Compression Level
- 8. Compressing HTTP Responses
- Example: Negotiate encoding
- 9. Using Promises API (zlib.promises)
- 10. Handling Compression Errors
- 1. Creating Hashes (crypto.createHash)
- Example: SHA-256
- 2. Creating HMAC (crypto.createHmac)
- Example
- 3. Generating Random Bytes (crypto.randomBytes)
- 4. Generating Random UUIDs (crypto.randomUUID)
- Example
- 5. Creating Secure Random Strings
- Example: token
- 6. Encrypting Data (crypto.createCipheriv)
- Example: AES-256-GCM
- 7. Decrypting Data (crypto.createDecipheriv)
- Example
- 8. Creating Public/Private Keys (crypto.generateKeyPair)
- Example
- 9. Signing Data (crypto.sign)
- 10. Verifying Signatures (crypto.verify)
- Example
- 11. Using scrypt for Key Derivation
- Example
- 12. Using bcrypt for Password Hashing
- Example
- 1. Executing Commands (child_process.exec)
- Example
- 2. Executing Files (child_process.execFile)
- Example
- 3. Spawning Processes (child_process.spawn)
- Example: Stream stdout
- 4. Forking Processes (child_process.fork)
- 5. Handling Child Process Events
- 6. Piping Standard I/O
- 7. Communicating with IPC
- Example
- 8. Setting Working Directory
- 9. Configuring Environment Variables
- 10. Detaching Child Processes
- Example: Long-running daemon
- 11. Killing Child Processes
- 12. Using Promisified Exec (util.promisify)
- 1. Creating Master Process
- Example
- 2. Forking Worker Processes (cluster.fork)
- 3. Handling Worker Events
- 4. Load Balancing Requests
- 5. Communicating Between Master and Workers
- Example
- 6. Getting Worker Count (Object.keys(cluster.workers))
- 7. Setting Scheduling Policy (cluster.schedulingPolicy)
- Example
- 8. Graceful Shutdown
- Shutdown Flow
- 9. Respawning Dead Workers
- Example
- 10. Using PM2 for Process Management
- 1. Creating Worker Threads (new Worker)
- Example
- 2. Passing Data to Workers (workerData)
- 3. Communicating with postMessage
- Example
- 4. Handling Messages
- 5. Handling Worker Errors
- 6. Transferring ArrayBuffers
- Example: Zero-copy
- 7. Sharing Memory (SharedArrayBuffer)
- 8. Using Atomics for Synchronization
- 9. Terminating Workers (worker.terminate)
- 10. Using Worker Thread Pools
- 11. Understanding Worker vs Cluster
- 1. Using Try-Catch Blocks
- Example
- 2. Handling Async Errors
- 3. Creating Custom Errors
- Example
- 4. Using Error Stack Traces (error.stack)
- 5. Using Error Codes (error.code)
- 6. Using Error.captureStackTrace
- Example
- 7. Handling Uncaught Exceptions
- Example
- 8. Handling Unhandled Rejections
- 9. Implementing Error Middleware
- Example: Express style
- 10. Using Domain Module
- 11. Graceful Error Recovery
- 12. Logging Errors
- 1. Using console for Basic Logging
- 2. Configuring Log Levels
- 3. Using winston for Advanced Logging
- Example
- 4. Using pino for High-Performance Logging
- Example
- 5. Structured Logging
- 6. Writing Logs to Files
- 7. Using Log Rotation (rotating-file-stream)
- Example
- 8. Adding Context to Logs
- Example: Per-request context
- 9. Sending Logs to External Services
- 10. Implementing Log Aggregation
- Aggregation Pipeline
- 1. Using console.log for Debugging
- 2. Using debugger Statement
- 3. Using Node Inspector (--inspect flag)
- 4. Using node --inspect-brk
- 5. Using Chrome DevTools (chrome://inspect)
- Connect Workflow
- 6. Using VS Code Debugger (launch.json)
- Example: launch.json
- 7. Using Debug Module
- Example
- 8. Setting Breakpoints
- 9. Profiling CPU Usage (--prof flag)
- 10. Analyzing Profile Output (--prof-process)
- Example
- 11. Memory Leak Detection
- 12. Using Clinic.js for Diagnostics
- 13. Using llnode for Post-Mortem Debugging
- 1. Using Node Test Runner (node:test)
- Example: Built-in
- 2. Writing Test Suites
- 3. Using Test Hooks
- 4. Creating Test Assertions
- 5. Testing Async Code
- Example
- 6. Running Tests (node --test flag)
- 7. Using Test Coverage (--experimental-coverage)
- 8. Mocking Dependencies
- Example: Built-in mock
- 9. Using Jest for Testing
- 10. Using Mocha and Chai
- Example
- 11. Testing HTTP Endpoints
- Example: supertest
- 12. Integration vs Unit Testing
- 1. Measuring Performance (performance.now)
- Example
- 2. Creating Performance Marks (performance.mark)
- 3. Measuring Between Marks (performance.measure)
- Example
- 4. Using Performance Observer (PerformanceObserver)
- Example
- 5. Tracking HTTP Timing
- 6. Monitoring Event Loop Lag
- 7. Using perf_hooks for Profiling
- Example: timerify
- 8. Measuring Function Execution Time
- 9. Creating Custom Metrics
- 10. Analyzing Performance Data
- 1. Getting Heap Statistics (v8.getHeapStatistics)
- 2. Getting Heap Space Statistics
- 3. Creating Heap Snapshots (v8.writeHeapSnapshot)
- Example
- 4. Using Serialization
- 5. Using Cached Data
- 6. Setting Heap Limit (--max-old-space-size)
- 7. Profiling Memory Usage
- 8. Understanding Garbage Collection
- 9. Using Weak References
- 10. Monitoring Memory Leaks
- Leak Hunt Workflow
- 1. Opening Inspector (inspector.open)
- Example
- 2. Creating Inspector Session (new inspector.Session)
- 3. Connecting to Chrome DevTools
- 4. Posting Protocol Messages
- Example: Enable profiler
- 5. Enabling Profiler (Profiler.enable)
- 6. Taking CPU Profiles
- Example
- 7. Taking Heap Snapshots (HeapProfiler)
- 8. Using Coverage (Profiler.startPreciseCoverage)
- Example
- 9. Debugging Remotely
- 10. Analyzing Runtime Performance
- 1. Creating Async Hooks (async_hooks.createHook)
- Example
- 2. Using init Callback
- 3. Using before and after Callbacks
- 4. Using destroy Callback
- 5. Getting Current Execution ID (executionAsyncId)
- 6. Getting Trigger Async ID (triggerAsyncId)
- 7. Using AsyncLocalStorage
- Example: Per-request store
- 8. Tracking Request Context
- 9. Debugging Async Operations
- 10. Understanding Performance Implications
- 1. Using Streams Over Buffers
- 2. Avoiding Synchronous Operations
- 3. Using Worker Threads for CPU-Bound Tasks
- 4. Implementing Caching
- 5. Using Connection Pooling
- 6. Optimizing Garbage Collection
- 7. Reducing Memory Footprint
- 8. Using HTTP/2 and HTTP/3
- 9. Compressing Responses (gzip, brotli)
- Example: Express
- 10. Optimizing JSON Operations
- 11. Using Native Modules When Beneficial
- 12. Profiling and Benchmarking
- 1. Validating User Input
- 2. Sanitizing Input (preventing XSS)
- 3. Preventing SQL Injection
- Example: Parameterized query
- 4. Using Prepared Statements
- 5. Implementing Authentication
- 6. Implementing Authorization
- 7. Using HTTPS
- 8. Implementing Rate Limiting
- 9. Using Helmet for Security Headers
- Example
- 10. Preventing CSRF
- 11. Securing Dependencies (npm audit)
- 12. Using Permission Model (--permission flag)
- 1. Formatting Numbers (Intl.NumberFormat)
- Example
- 2. Formatting Dates (Intl.DateTimeFormat)
- Example
- 3. Formatting Currencies
- 4. Comparing Strings (Intl.Collator)
- Example
- 5. Pluralization (Intl.PluralRules)
- Example
- 6. Relative Time (Intl.RelativeTimeFormat)
- Example
- 7. List Formatting (Intl.ListFormat)
- Example
- 8. Display Names (Intl.DisplayNames)
- Example
- 9. Locale Negotiation
- 10. Loading ICU Data (--with-intl)
- 1. Native Fetch API
- Example
- 2. Top-Level Await
- Example: only in ESM
- 3. Import Assertions / Attributes
- Example: Import Attributes
- 4. Web Streams API
- Example: ReadableStream → fetch upload
- 5. AbortController and AbortSignal
- Example
- 6. structuredClone
- Example
- 7. Test Runner (node:test)
- Example
- 8. Watch Mode (--watch)
- 9. Built-In WebSocket Client
- Example
- 10. REPL Enhancements
- Bonus: Single Executable Apps (node:sea)
- Build Workflow