Skip to content

Commit 1d28b7c

Browse files
authored
Merge pull request #7412 from maiieul/better-preview-chunk-names-in-debug-mode
refactor(rollup): move build mode + debug:true chunk names logic out of manualChunks
2 parents d297d3e + 8f05cfc commit 1d28b7c

File tree

4 files changed

+87
-17
lines changed

4 files changed

+87
-17
lines changed

packages/qwik/src/optimizer/src/plugins/plugin.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -891,14 +891,7 @@ export const manifest = ${JSON.stringify(manifest)};\n`;
891891
// Maybe a better solution would be to mark those files as entires earlier in the chain so that we can remove this check and the one above altogether.
892892
// We check .(tsx|jsx) after node_modules in case some node_modules end with .jsx or .tsx.
893893
if (/\.(tsx|jsx)$/.test(id)) {
894-
const optimizer = getOptimizer();
895-
const path = optimizer.sys.path;
896-
const relativePath = path.relative(optimizer.sys.cwd(), id);
897-
const sanitizedPath = relativePath
898-
.replace(/^(\.\.\/)+/, '')
899-
.replace(/^\/+/, '')
900-
.replace(/\//g, '-');
901-
return sanitizedPath; // We return sanitizedPath for qwikVite plugin with debug:true
894+
return id;
902895
}
903896

904897
return null;

packages/qwik/src/optimizer/src/plugins/rollup.ts

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ export function qwikRollup(qwikRollupOpts: QwikRollupPluginOptions = {}): any {
7878

7979
outputOptions(rollupOutputOpts) {
8080
return normalizeRollupOutputOptionsObject(
81+
qwikPlugin.getOptimizer(),
8182
qwikPlugin.getOptions(),
8283
rollupOutputOpts,
8384
false,
@@ -160,6 +161,7 @@ export function qwikRollup(qwikRollupOpts: QwikRollupPluginOptions = {}): any {
160161
}
161162

162163
export function normalizeRollupOutputOptions(
164+
optimizer: Optimizer,
163165
opts: NormalizedQwikPluginOptions,
164166
rollupOutputOpts: Rollup.OutputOptions | Rollup.OutputOptions[] | undefined,
165167
useAssetsDir: boolean,
@@ -173,18 +175,31 @@ export function normalizeRollupOutputOptions(
173175
}
174176

175177
return rollupOutputOpts.map((outputOptsObj) => ({
176-
...normalizeRollupOutputOptionsObject(opts, outputOptsObj, useAssetsDir, manualChunks),
178+
...normalizeRollupOutputOptionsObject(
179+
optimizer,
180+
opts,
181+
outputOptsObj,
182+
useAssetsDir,
183+
manualChunks
184+
),
177185
dir: outDir || outputOptsObj.dir,
178186
}));
179187
}
180188

181189
return {
182-
...normalizeRollupOutputOptionsObject(opts, rollupOutputOpts, useAssetsDir, manualChunks),
190+
...normalizeRollupOutputOptionsObject(
191+
optimizer,
192+
opts,
193+
rollupOutputOpts,
194+
useAssetsDir,
195+
manualChunks
196+
),
183197
dir: outDir || rollupOutputOpts?.dir,
184198
};
185199
}
186200

187201
export function normalizeRollupOutputOptionsObject(
202+
optimizer: Optimizer,
188203
opts: NormalizedQwikPluginOptions,
189204
rollupOutputOptsObj: Rollup.OutputOptions | undefined,
190205
useAssetsDir: boolean,
@@ -201,9 +216,31 @@ export function normalizeRollupOutputOptionsObject(
201216
? `${opts.assetsDir}/${assetFileNames}`
202217
: assetFileNames;
203218
}
204-
// Friendly name in dev or preview with debug mode
205-
const fileName =
206-
opts.buildMode == 'production' && !opts.debug ? 'build/q-[hash].js' : 'build/[name].js';
219+
220+
let fileName: string | ((chunkInfo: Rollup.PreRenderedChunk) => string) | undefined;
221+
if (opts.buildMode === 'production' && !opts.debug) {
222+
fileName = 'build/q-[hash].js';
223+
} else {
224+
// Friendlier names in dev or preview with debug mode
225+
fileName = (chunkInfo) => {
226+
if (chunkInfo.moduleIds.some((id) => id.endsWith('core.prod.mjs'))) {
227+
return 'build/core.js';
228+
}
229+
if (chunkInfo.moduleIds.some((id) => id.endsWith('qwik-city/lib/index.qwik.mjs'))) {
230+
return 'build/qwik-city.js';
231+
}
232+
233+
// The chunk name can often be a path. We sanitize it to use dashes instead of slashes, to keep the same folder structure as without debug:true.
234+
// Besides, Rollup doesn't accept absolute or relative paths as inputs for the [name] placeholder for the same reason.
235+
const path = optimizer.sys.path;
236+
const relativePath = path.relative(optimizer.sys.cwd(), chunkInfo.name);
237+
const sanitized = relativePath
238+
.replace(/^(\.\.\/)+/, '')
239+
.replace(/^\/+/, '')
240+
.replace(/\//g, '-');
241+
return `build/${sanitized}.js`;
242+
};
243+
}
207244
// client production output
208245
if (!outputOpts.entryFileNames) {
209246
outputOpts.entryFileNames = useAssetsDir ? `${opts.assetsDir}/${fileName}` : fileName;

packages/qwik/src/optimizer/src/plugins/vite.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,7 @@ export function qwikVite(qwikViteOpts: QwikVitePluginOptions = {}): any {
360360
updatedViteConfig.build!.rollupOptions = {
361361
input: opts.input,
362362
output: normalizeRollupOutputOptions(
363+
qwikPlugin.getOptimizer(),
363364
opts,
364365
viteConfig.build?.rollupOptions?.output,
365366
useAssetsDir,

packages/qwik/src/optimizer/src/plugins/vite.unit.ts

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,29 @@ import {
1212

1313
const cwd = process.cwd();
1414

15+
const chunkInfoMocks: Rollup.PreRenderedChunk[] = [
16+
{
17+
exports: [''],
18+
name: 'chunk.tsx',
19+
facadeModuleId: 'chunk.tsx',
20+
isDynamicEntry: false,
21+
isEntry: false,
22+
isImplicitEntry: false,
23+
moduleIds: ['chunk.tsx'],
24+
type: 'chunk',
25+
},
26+
{
27+
exports: [''],
28+
name: cwd + '/app/chunk.tsx',
29+
facadeModuleId: cwd + '/app/chunk.tsx',
30+
isDynamicEntry: false,
31+
isEntry: false,
32+
isImplicitEntry: false,
33+
moduleIds: [cwd + '/app/chunk.tsx'],
34+
type: 'chunk',
35+
},
36+
];
37+
1538
function mockOptimizerOptions(): OptimizerOptions {
1639
return {
1740
sys: {
@@ -61,6 +84,12 @@ test('command: serve, mode: development', async () => {
6184
const build = c.build!;
6285
const rollupOptions = build!.rollupOptions!;
6386
const outputOptions = rollupOptions.output as Rollup.OutputOptions;
87+
const chunkFileNames = outputOptions.chunkFileNames as (
88+
chunkInfo: Rollup.PreRenderedChunk
89+
) => string;
90+
const entryFileNames = outputOptions.entryFileNames as (
91+
chunkInfo: Rollup.PreRenderedChunk
92+
) => string;
6493

6594
assert.deepEqual(opts.target, 'client');
6695
assert.deepEqual(opts.buildMode, 'development');
@@ -71,8 +100,10 @@ test('command: serve, mode: development', async () => {
71100
assert.deepEqual(rollupOptions.input, normalizePath(resolve(cwd, 'src', 'entry.dev')));
72101

73102
assert.deepEqual(outputOptions.assetFileNames, 'assets/[hash]-[name].[ext]');
74-
assert.deepEqual(outputOptions.chunkFileNames, 'build/[name].js');
75-
assert.deepEqual(outputOptions.entryFileNames, 'build/[name].js');
103+
assert.deepEqual(chunkFileNames(chunkInfoMocks[0]), `build/chunk.tsx.js`);
104+
assert.deepEqual(entryFileNames(chunkInfoMocks[0]), `build/chunk.tsx.js`);
105+
assert.deepEqual(chunkFileNames(chunkInfoMocks[1]), 'build/app-chunk.tsx.js');
106+
assert.deepEqual(entryFileNames(chunkInfoMocks[1]), 'build/app-chunk.tsx.js');
76107
assert.deepEqual(outputOptions.format, 'es');
77108

78109
assert.deepEqual(build.dynamicImportVarsOptions?.exclude, [/./]);
@@ -131,6 +162,12 @@ test('command: build, mode: development', async () => {
131162
const build = c.build!;
132163
const rollupOptions = build!.rollupOptions!;
133164
const outputOptions = rollupOptions.output as Rollup.OutputOptions;
165+
const chunkFileNames = outputOptions.chunkFileNames as (
166+
chunkInfo: Rollup.PreRenderedChunk
167+
) => string;
168+
const entryFileNames = outputOptions.entryFileNames as (
169+
chunkInfo: Rollup.PreRenderedChunk
170+
) => string;
134171

135172
assert.deepEqual(opts.target, 'client');
136173
assert.deepEqual(opts.buildMode, 'development');
@@ -144,8 +181,10 @@ test('command: build, mode: development', async () => {
144181
assert.deepEqual(rollupOptions.input, [normalizePath(resolve(cwd, 'src', 'root'))]);
145182

146183
assert.deepEqual(outputOptions.assetFileNames, 'assets/[hash]-[name].[ext]');
147-
assert.deepEqual(outputOptions.chunkFileNames, 'build/[name].js');
148-
assert.deepEqual(outputOptions.entryFileNames, 'build/[name].js');
184+
assert.deepEqual(chunkFileNames(chunkInfoMocks[0]), `build/chunk.tsx.js`);
185+
assert.deepEqual(entryFileNames(chunkInfoMocks[0]), `build/chunk.tsx.js`);
186+
assert.deepEqual(chunkFileNames(chunkInfoMocks[1]), 'build/app-chunk.tsx.js');
187+
assert.deepEqual(entryFileNames(chunkInfoMocks[1]), 'build/app-chunk.tsx.js');
149188

150189
assert.deepEqual(build.dynamicImportVarsOptions?.exclude, [/./]);
151190
assert.deepEqual(build.ssr, undefined);

0 commit comments

Comments
 (0)