From 5a835e1728c91b73da47de9831187ea4d83cf791 Mon Sep 17 00:00:00 2001 From: Steffen Deusch Date: Fri, 17 Apr 2026 18:29:18 +0200 Subject: [PATCH] support NODE_PATH in standalone build (#19617) References https://github.com/tailwindlabs/tailwindcss/pull/19391. References https://github.com/tailwindlabs/tailwindcss/pull/16274. Right now, when using the standalone build of the TailwindCSS CLI, you cannot use a custom `NODE_PATH`, but you can when using it via Node.js directly. A custom NODE_PATH allows you to resolve imports from multiple locations. For example, in [Phoenix LiveView](https://github.com/phoenixframework/phoenix_live_view/), we have a feature where you can write scripts in templates that we extract at compile time to a custom folder and users can import those in their application bundle by saying ```javascript import { hooks as colocatedHooks } from "phoenix-colocated/my_app" ``` where the "phoenix-colocated" folder lives in a different location than the usual `node_modules` folder. This works fine with the default esbuild setup, as it respects `NODE_PATH`, so we can pass it a custom location. We want to also support colocating CSS in templates soon, but the same approach doesn't work with the standalone Tailwind CLI we ship with default Phoenix projects. It works when running Tailwind through Node.js, but we don't want to tell users they need to install it, just to use the feature. This patch changes the lookup logic for the standalone CLI to also account for `NODE_PATH`. Note that you can pass multiple paths, that are split according the the OS PATH separator. --------- Co-authored-by: Robin Malfait --- CHANGELOG.md | 1 + packages/@tailwindcss-node/src/compile.ts | 2 +- packages/@tailwindcss-standalone/scripts/build.ts | 3 --- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cdebce6d8..3986a3823 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Canonicalization: move the `-` sign inside the arbitrary value `-left-[9rem]` → `left-[-9rem]` ([#19858](https://github.com/tailwindlabs/tailwindcss/pull/19858)) - Canonicalization: move the `-` sign outside the arbitrary value `ml-[calc(-1*var(--width))]` → `-ml-(--width)` ([#19858](https://github.com/tailwindlabs/tailwindcss/pull/19858)) - Improve performance when scanning JSONL / NDJSON files ([#19862](https://github.com/tailwindlabs/tailwindcss/pull/19862)) +- Support `NODE_PATH` environment variable in standalone build ([#19617](https://github.com/tailwindlabs/tailwindcss/pull/19617)) ## [4.2.2] - 2026-03-18 diff --git a/packages/@tailwindcss-node/src/compile.ts b/packages/@tailwindcss-node/src/compile.ts index 7eb959d3b..ed2126da9 100644 --- a/packages/@tailwindcss-node/src/compile.ts +++ b/packages/@tailwindcss-node/src/compile.ts @@ -194,7 +194,7 @@ async function importModule(path: string): Promise { } } -const modules = ['node_modules', ...(process.env.NODE_PATH ? [process.env.NODE_PATH] : [])] +const modules = ['node_modules', ...(process.env.NODE_PATH ? [...process.env.NODE_PATH.split(path.delimiter)] : [])] const cssResolver = EnhancedResolve.ResolverFactory.createResolver({ fileSystem: new EnhancedResolve.CachedInputFileSystem(fs, 4000), diff --git a/packages/@tailwindcss-standalone/scripts/build.ts b/packages/@tailwindcss-standalone/scripts/build.ts index 7ff572d3b..0aee26435 100644 --- a/packages/@tailwindcss-standalone/scripts/build.ts +++ b/packages/@tailwindcss-standalone/scripts/build.ts @@ -60,9 +60,6 @@ for (let { target, name } of builds) { // This simplifies the Oxide loading code a small amount 'process.env.NAPI_RS_NATIVE_LIBRARY_PATH': JSON.stringify(''), - - // No need to support additional NODE_PATHs in the standalone build - 'process.env.NODE_PATH': JSON.stringify(''), }, compile: {