Agent skill · software engineering · vercel

dce-edge

DCE-safe require() patterns and edge runtime constraints. Use when writing conditional require() calls, guarding Node-only imports (node:stream etc.), or editing define-env-plugin.ts / app-render / stream-utils for edge builds. Covers if/else branching for webpack DCE, TypeScript definite assignment, the NEXT_RUNTIME vs real feature flag distinction, and forcing flags false for edge in define-env.ts.

Why this skill is useful

Provides specific DCE-safe patterns and edge runtime constraints that the AI wouldn't reliably generate on its own.

What it needs

About 2k tokens when loaded. Last updated 2026-08-07. 141,663 stars on the source repository.

What this skill does

DCE + Edge Use this skill when changing conditional require() paths, Node-only imports, or edge/runtime branching. DCE-Safe require() Pattern Webpack only DCEs a require() when it sits inside the dead branch of an if/else whose condition DefinePlugin can evaluate at compile time. What does NOT work: Early-return/throw guards: webpack doesn't do control-flow analysis for throws/returns, so the require() is still traced. Bare if without else: works for inline node: specifiers but NOT for require('./some-module') that pulls a new file into the module graph. Always test edge changes with pnpm test-start-webpack on test/e2e/app-dir/app/standalone.test.ts (has edge routes), not with NEXTSKIPISOLATE=1 which skips the full webpack compilation. TypeScript + DCE Interaction Use if/else (not two independent if blocks) when assigning a variable conditionally on process.env.X. TypeScript cannot prove exhaustiveness across if (flag) { x = a }; if (!flag) { x = b } and will error with "variable used before being assigned". The if/else pattern satisfies both TypeScript (definite assignment) and webpack DCE. Compile-Time Switcher Pattern Platform-specific code (node vs web) can use a single .ts switcher module that conditionally require()s either .node.ts or .web.ts into a typed variable, then re-exports the shared runtime API as named exports. Keep the branch as if/else so DefinePlugin can dead-code-eliminate the unused require(). Keep shared types canonical in .node.ts, with .web.ts importing them via import type and the switcher re-exporting types as needed. Examples: stream-ops.ts and debug-channel-server.ts. NEXTRUNTIME Is Not a Feature Flag In user-project webpack server compilers, process.env.NEXTRUNTIME is inlined to 'nodejs'. Guarding Node-only require('node:') paths with NEXTRUNTIME === 'nodejs' does not prune anything. For feature-gated codepaths, guard on the real feature define (e.g. process.env.NEXTUSENODESTREAMS). …

How to use it

Reference it in AdaL, Claude Code, Cursor or any coding agent — nothing to install:

@skills vercel/dce-edge

View the source on GitHub

Browse the @skills marketplace