Build1 distinct publisher2 min readPublished
A dev.to guide names five tools that each need their own alias resolver. The number that matters is six: one logical mapping, six files to keep in step.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
The piece says deployments fail silently until a dynamic import executes in staging [5], and it never explains why that construct is the tripwire. Worth naming, because it sets what a smoke test is actually worth. An alias specifier that tsc copied verbatim into the output [2] is inert text until something evaluates it. Specifiers in the entry graph are evaluated when the process boots, so a broken one is caught by anything that starts the app. A dynamic import sitting behind an admin route or an error handler is evaluated when someone reaches it, which can be a week after the deploy that broke it.
The article's own model is that the `paths` object is the canonical mapping and every other tool mirrors it [17], with TypeScript validating types, bundlers transforming imports for browsers, and Node resolving modules at runtime [16]. Its printed example shows how well hand-mirroring goes. The sample sets `baseUrl` to `"."` and three prefixes: `@/*` to `src/*`, `@components/*` to `src/components/*`, `@lib/*` to `src/lib/*` [9]. Elsewhere the same piece tells teams to standardize on one prefix mapped to a single source directory, precisely because ambiguous overlapping patterns break in bundlers with first-match semantics [8]. Since `@/*` already reaches `src/components`, the example ships two routes to the same files [14].
The runtime-loader option carries a cost the article states plainly and does not price: `tsx` and `ts-node/esm` avoid transforming files, but require consistent tooling across every environment [7]. That binds the choice to places you may not own, including CI images and base containers, and it means the resolution behaviour of your code is a property of how it was launched rather than of what was shipped.
One more line deserves a version check before you build on it. The article states that without `baseUrl`, TypeScript treats `paths` entries as invalid [10]. That is single-sourced, and the same post carries a disclosure that it was written with AI assistance under human supervision and review [11]. A guide whose worked example already contradicts its own guidance on overlapping prefixes [14] is a guide to read against your installed compiler and your installed bundler, not to copy.
Ranked by verification strength, evidence, and original report placement.
TypeScript's paths in tsconfig.json affect only type-checking and editor autocomplete; the emitted JavaScript retains literal alias imports that crash at runtime without bundler or loader configuration.
tsc emits JavaScript containing the exact import specifier the developer wrote: source '@/components/Button' produces output '@/components/Button'. TypeScript does not rewrite import paths to relative or absolute forms.
Every tool in the build chain (Vite, Webpack, esbuild, Node.js, Jest) requires its own alias resolution setup; a single tsconfig.json never suffices for production.
A project that compiles successfully with tsc --noEmit can still crash when Node.js executes the output, because Node's resolver has no knowledge of TypeScript's paths configuration.
The assumption that one paths object propagates to Vite, Webpack, esbuild, Node.js and Jest is why deployments fail silently until a dynamic import executes in staging.
Post-compilation rewriting with tsc-alias works but adds build steps.
Follow any of these and your For You feed starts watching them — no settings page required.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Specific mechanism, single unversioned source
The central mechanism is stated concretely and reproducibly (tsc emits the literal specifier; Node's resolver ignores paths) and is internally consistent with the article's code sample, which supports a middling-to-fair score. It is held down by there being exactly one publisher in the cluster, an AI-assistance disclosure, no compiler/bundler/Node versions or reproductions cited despite the '2026' framing, and an internal contradiction between the sample config and the article's own anti-overlap rule.
No adoption data in supplied sources
The cluster contains no release, deployment, benchmark, usage, pricing or license event. The only prevalence statement -- that most projects ship zero runtime resolution configs -- is an unsourced assertion, so no adoption level can be measured without guessing.
Mildly overstated framing over a sound core
Slightly positive: the load-bearing technical claims are accurate-sounding and specific, but the packaging overstates. 'Most projects ship with exactly zero' is presented as fact without data, the absolute 'without baseUrl, paths entries are invalid' is asserted without version qualification, and the '2026' urgency framing wraps long-standing compiler behavior. The article also undersells the real maintenance cost -- it names five tools but never states that keeping one mapping alive means six files in step.
No vendor stake; platform volume incentive
Low-to-moderate. The supplied text sells no product, license or service: the tools it recommends (tsc-alias, tsx, ts-node) are named without any disclosed relationship, so there is little commercial pull on the conclusions. The offsetting pressure is format-driven: an AI-assisted, human-reviewed explainer on a developer-content platform rewards evergreen keyword-shaped output ('in 2026', 'why they still break'), which favors confident absolutes over verified qualifiers.
Moderate on mechanics, low on scope
Confidence is moderate for the compile-time-versus-runtime mechanism, which is specific and internally coherent and would be straightforward to reproduce. It is low for anything about scale, version applicability or operational incidence, because the cluster is a single AI-assisted post with no corroborating publisher, no adoption evidence, and at least one internally contradicted recommendation.
build
A build-tool swap that took 70 days and 166 files, and the build was the easy part1 distinct publisher
build
TypeScript 6.0's strict default would turn your callbacks into a variance audit1 distinct publisher
build
A GAN beauty filter is a device budget allocation, not a feature toggle1 distinct publisher
build
A GitHub graph in 21 requests: what PR metadata already knows about your files1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 25, 2026