Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
58b2132
refactor!: disable externals tracing by default
pi0 Nov 17, 2025
da1bc0a
update
pi0 Nov 17, 2025
5c39d67
tmp fixes
pi0 Nov 17, 2025
93bf265
lint
pi0 Nov 17, 2025
0a41856
dev externals
pi0 Nov 18, 2025
ad9b9f1
Merge branch 'main' into bundle-by-default
pi0 Nov 18, 2025
7820804
wip
pi0 Nov 19, 2025
0524e66
Merge branch 'main' into bundle-by-default
pi0 Nov 24, 2025
0df8543
update
pi0 Nov 24, 2025
2591e1d
workaround a
pi0 Nov 25, 2025
98bcc79
improve plugin
pi0 Nov 25, 2025
073b0bd
rolldown fixes
pi0 Nov 25, 2025
103a3c6
Merge branch 'main' into bundle-by-default
pi0 Nov 25, 2025
cddda42
improve handling cjs externals
pi0 Nov 25, 2025
833ac46
remove buildDir from default noExternal
pi0 Nov 25, 2025
c7c9968
update
pi0 Nov 27, 2025
7b53271
Merge branch 'main' into bundle-by-default
pi0 Nov 27, 2025
eb57f0f
Merge branch 'main' into bundle-by-default
pi0 Dec 1, 2025
7318c30
remove logs
pi0 Dec 1, 2025
9e450cb
update
pi0 Dec 1, 2025
c17ea99
`traceDeps` config
pi0 Dec 1, 2025
50a626a
Merge branch 'main' into bundle-by-default
pi0 Dec 1, 2025
19641cd
add missing import
pi0 Dec 1, 2025
6734433
add back traceDeps
pi0 Dec 1, 2025
8dce052
windows safety
pi0 Dec 3, 2025
5fb374a
Merge branch 'main' into bundle-by-default
pi0 Dec 3, 2025
8738a87
Merge branch 'main' into bundle-by-default
pi0 Dec 3, 2025
bc7885e
win/wasm fixes
pi0 Dec 3, 2025
3d45f28
fix defaults
pi0 Dec 3, 2025
08f7c98
perf: skip nested rollup node resolutions
pi0 Dec 3, 2025
5752b39
enable rolldown test for tracing+absolute
pi0 Dec 3, 2025
25a14fd
fix prerender externals
pi0 Dec 3, 2025
6836c85
remove absolute external test
pi0 Dec 3, 2025
51d2da3
remove unused import
pi0 Dec 3, 2025
6dd1dcc
hot fixes for vite (e2e)
pi0 Dec 3, 2025
23a87a0
less noExternal matchers
pi0 Dec 3, 2025
0834380
remove explicit runtimeDependencies rule
pi0 Dec 3, 2025
11174c2
optional dep
pi0 Dec 3, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions examples/shiki/nitro.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,4 @@ import { defineConfig } from "nitro";

export default defineConfig({
serverDir: "./",
externals: {
inline: ["shiki/core"],
},
});
1 change: 0 additions & 1 deletion examples/vite-ssr-solid/vite.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ export default defineConfig({
esbuild: { jsx: "preserve", jsxImportSource: "solid-js" },
environments: {
ssr: {
resolve: { noExternal: true /* fixes tests */ },
build: { rollupOptions: { input: "./src/entry-server.tsx" } },
},
client: {
Expand Down
3 changes: 0 additions & 3 deletions examples/vite-ssr-vue-router/vite.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,6 @@ import { nitro } from "nitro/vite";

export default defineConfig((_env) => ({
plugins: [patchVueExclude(vue(), /\?assets/), devtoolsJson(), nitro()],
nitro: {
noExternals: true,
},
environments: {
client: { build: { rollupOptions: { input: "./app/entry-client.ts" } } },
ssr: { build: { rollupOptions: { input: "./app/entry-server.ts" } } },
Expand Down
10 changes: 7 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@
"release": "pnpm test && pnpm build && changelogen --release --prerelease --push",
"stub": "obuild --stub",
"test": "pnpm lint && pnpm test:types && pnpm test:rollup && pnpm test:rolldown",
"test:rollup": "NITRO_BUILDER=rollup pnpm vitest",
"test:rolldown": "NITRO_BUILDER=rolldown pnpm vitest",
"test:rollup": "NITRO_BUILDER=rollup pnpm vitest",
"test:types": "tsc --noEmit"
},
"resolutions": {
Expand All @@ -63,7 +63,6 @@
"db0": "^0.3.4",
"h3": "2.0.1-rc.5",
"jiti": "^2.6.1",
"nf3": "^0.1.12",
"ofetch": "^2.0.0-alpha.3",
"ohash": "^2.0.11",
"oxc-minify": "^0.101.0",
Expand Down Expand Up @@ -129,6 +128,7 @@
"mime": "^4.1.0",
"miniflare": "^4.20251128.0",
"mlly": "^1.8.0",
"nf3": "^0.1.12",
"nypm": "^0.6.2",
"obuild": "^0.4.4",
"pathe": "^2.0.3",
Expand Down Expand Up @@ -156,20 +156,24 @@
"unctx": "^2.4.1",
"unimport": "^5.5.0",
"untyped": "^2.0.0",
"unwasm": "^0.5.1",
"unwasm": "^0.5.2",
"vitest": "^4.0.15",
"wrangler": "^4.51.0",
"xml2js": "^0.6.2",
"youch": "4.1.0-beta.13",
"youch-core": "^0.3.3"
},
"peerDependencies": {
"nf3": ">=0.2",
"rolldown": "*",
"rollup": "^4",
"vite": "^7",
"xml2js": "^0.6.2"
},
"peerDependenciesMeta": {
"nf3": {
"optional": true
},
"rolldown": {
"optional": true
},
Expand Down
16 changes: 8 additions & 8 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

59 changes: 33 additions & 26 deletions src/build/config.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type { Nitro, NitroImportMeta } from "nitro/types";
import { dirname } from "pathe";
import { defineEnv } from "unenv";
import { pkgDir, runtimeDependencies, presetsDir } from "nitro/meta";
import { pkgDir } from "nitro/meta";
import { pathRegExp, toPathRegExp } from "../utils/regex.ts";

export type BaseBuildConfig = ReturnType<typeof baseBuildConfig>;

Expand Down Expand Up @@ -33,29 +33,6 @@ export function baseBuildConfig(nitro: Nitro) {
...nitro.options.replace,
};

const noExternal: (string | RegExp | ((id: string) => boolean))[] = [
"#",
"~",
"@/",
"~~",
"@@/",
"virtual:",
"nitro",
pkgDir,
nitro.options.serverDir,
nitro.options.buildDir,
dirname(nitro.options.entry),
...(nitro.options.wasm === false
? []
: [(id: string) => id.endsWith(".wasm")]),
...nitro.options.handlers
.map((m) => m.handler)
.filter((i) => typeof i === "string"),
...(nitro.options.dev || nitro.options.preset === "nitro-prerender"
? []
: runtimeDependencies),
].filter(Boolean) as string[];

const { env } = defineEnv({
nodeCompat: isNodeless,
resolve: true,
Expand All @@ -67,8 +44,9 @@ export function baseBuildConfig(nitro: Nitro) {

const aliases = resolveAliases({ ...env.alias });

const noExternal: RegExp[] = getNoExternals(nitro);

return {
presetsDir,
extensions,
isNodeless,
replacements,
Expand All @@ -78,6 +56,35 @@ export function baseBuildConfig(nitro: Nitro) {
};
}

function getNoExternals(nitro: Nitro): RegExp[] {
const noExternal: RegExp[] = [
/\.[mc]?tsx?$/,
/^(?:[\0#~.]|virtual:)/,
new RegExp("^" + pathRegExp(pkgDir) + "(?!.*node_modules)"),
...[
nitro.options.rootDir,
...nitro.options.scanDirs.filter(
(dir) =>
dir.includes("node_modules") || !dir.startsWith(nitro.options.rootDir)
),
].map((dir) => new RegExp("^" + pathRegExp(dir) + "(?!.*node_modules)")),
];

if (nitro.options.wasm !== false) {
noExternal.push(/\.wasm$/);
}

if (Array.isArray(nitro.options.noExternals)) {
noExternal.push(
...nitro.options.noExternals
.filter(Boolean)
.map((item) => toPathRegExp(item as string | RegExp))
);
}

return noExternal.sort((a, b) => a.source.length - b.source.length);
}

export function resolveAliases(_aliases: Record<string, string>) {
// Sort aliases from specific to general (ie. fs/promises before fs)
const aliases = Object.fromEntries(
Expand Down
47 changes: 19 additions & 28 deletions src/build/plugins.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,18 @@
import type { Nitro, NodeExternalsOptions } from "nitro/types";
import type { Nitro } from "nitro/types";
import type { Plugin } from "rollup";
import type { BaseBuildConfig } from "./config.ts";
import { defu } from "defu";

import { virtualTemplates } from "./virtual/_all.ts";
import unimportPlugin from "unimport/unplugin";
import { unwasm } from "unwasm/plugin";
import replace from "@rollup/plugin-replace";
import { unwasm } from "unwasm/plugin";
import { routeMeta } from "./plugins/route-meta.ts";
import { serverMain } from "./plugins/server-main.ts";
import { virtual } from "./plugins/virtual.ts";
import { rollupNodeFileTrace } from "nf3";
import { nitroResolveIds } from "./plugins/resolve.ts";
import { sourcemapMinify } from "./plugins/sourcemap-min.ts";
import { raw } from "./plugins/raw.ts";

import { virtualTemplates } from "./virtual/_all.ts";
import { externals } from "./plugins/externals.ts";

export function baseBuildPlugins(nitro: Nitro, base: BaseBuildConfig) {
const plugins: Plugin[] = [];
Expand Down Expand Up @@ -49,36 +48,28 @@ export function baseBuildPlugins(nitro: Nitro, base: BaseBuildConfig) {
nitro.vfs = virtualPlugin.api.modules;
plugins.push(virtualPlugin);

// Replace Plugin
// Replace
plugins.push(
(replace as unknown as typeof replace.default)({
preventAssignment: true,
values: base.replacements,
})
);

// Externals Plugin
if (!nitro.options.noExternals) {
// Externals (require Node.js compatible resolution)
if (nitro.options.node && nitro.options.noExternals !== true) {
const isDevOrPrerender =
nitro.options.dev || nitro.options.preset === "nitro-prerender";
plugins.push(
rollupNodeFileTrace(
defu(nitro.options.externals, {
outDir: nitro.options.output.serverDir,
moduleDirectories: nitro.options.nodeModulesDirs,
external: nitro.options.nodeModulesDirs,
inline: [...base.noExternal],
traceOptions: {
base: "/",
processCwd: nitro.options.rootDir,
exportsOnly: true,
},
traceAlias: {
"h3-nightly": "h3",
...nitro.options.externals?.traceAlias,
},
exportConditions: nitro.options.exportConditions as string[],
writePackageJson: true,
} satisfies NodeExternalsOptions)
)
externals({
rootDir: nitro.options.rootDir,
conditions: nitro.options.exportConditions || ["default"],
exclude: [...base.noExternal],
include: isDevOrPrerender ? undefined : nitro.options.traceDeps,
trace: isDevOrPrerender
? false
: { outDir: nitro.options.output.serverDir },
})
);
}

Expand Down
Loading
Loading