Skip to content

Commit 5e3bed3

Browse files
authored
Merge pull request #6855 from alibaba/release/next
Release 3.4.7
2 parents 3b2c099 + 9f5c785 commit 5e3bed3

36 files changed

+267
-790
lines changed

packages/ice/CHANGELOG.md

+10
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
# Changelog
22

3+
## 3.4.7
4+
5+
### Patch Changes
6+
7+
- d5c378b6: fix: reduce bundle size by remove runtime module
8+
- 77155bab: feat: remove runtime code when loaders is not export
9+
- Updated dependencies [d5c378b6]
10+
- Updated dependencies [77155bab]
11+
- @ice/runtime@1.4.5
12+
313
## 3.4.6
414

515
### Patch Changes

packages/ice/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@ice/app",
3-
"version": "3.4.6",
3+
"version": "3.4.7",
44
"description": "provide scripts and configuration used by web framework ice",
55
"type": "module",
66
"main": "./esm/index.js",
@@ -49,7 +49,7 @@
4949
"dependencies": {
5050
"@ice/bundles": "0.2.6",
5151
"@ice/route-manifest": "1.2.2",
52-
"@ice/runtime": "^1.4.3",
52+
"@ice/runtime": "^1.4.5",
5353
"@ice/shared-config": "1.2.6",
5454
"@ice/webpack-config": "1.1.13",
5555
"@ice/rspack-config": "1.1.6",

packages/ice/src/bundler/config/output.ts

+1-3
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ async function buildCustomOutputs(
3939
bundleOptions: Pick<BundlerOptions, 'userConfig' | 'appConfig' | 'routeManifest'>,
4040
) {
4141
const { userConfig, appConfig, routeManifest } = bundleOptions;
42-
const { ssg, output: { distType, prependCode } } = userConfig;
42+
const { ssg } = userConfig;
4343
const routeType = appConfig?.router?.type;
4444
const {
4545
outputPaths = [],
@@ -51,8 +51,6 @@ async function buildCustomOutputs(
5151
documentOnly: !ssg,
5252
renderMode: ssg ? 'SSG' : undefined,
5353
routeType: appConfig?.router?.type,
54-
distType,
55-
prependCode,
5654
routeManifest,
5755
});
5856
if (routeType === 'memory' && userConfig?.routes?.injectInitialEntry) {

packages/ice/src/constant.ts

+9
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,15 @@ export const RUNTIME_EXPORTS = [
7070
'usePageLifecycle',
7171
'unstable_useDocumentData',
7272
'dynamic',
73+
// Document API
74+
'Meta',
75+
'Title',
76+
'Links',
77+
'Scripts',
78+
'FirstChunkCache',
79+
'Data',
80+
'Main',
81+
'usePageAssets',
7382
],
7483
alias: {
7584
usePublicAppContext: 'useAppContext',

packages/ice/src/createService.ts

+22-43
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,12 @@ import { Context } from 'build-scripts';
77
import type { CommandArgs, CommandName } from 'build-scripts';
88
import type { Config } from '@ice/shared-config/types';
99
import type { AppConfig } from '@ice/runtime/types';
10-
import fse from 'fs-extra';
1110
import webpack from '@ice/bundles/compiled/webpack/index.js';
1211
import type {
1312
DeclarationData,
1413
PluginData,
1514
ExtendsPluginAPI,
16-
TargetDeclarationData,
1715
} from './types/index.js';
18-
import { DeclarationType } from './types/index.js';
1916
import Generator from './service/runtimeGenerator.js';
2017
import { createServerCompiler } from './service/serverCompiler.js';
2118
import createWatch from './service/watchSource.js';
@@ -41,6 +38,7 @@ import addPolyfills from './utils/runtimePolyfill.js';
4138
import webpackBundler from './bundler/webpack/index.js';
4239
import rspackBundler from './bundler/rspack/index.js';
4340
import getDefaultTaskConfig from './plugins/task.js';
41+
import hasDocument from './utils/hasDocument.js';
4442

4543
const require = createRequire(import.meta.url);
4644
const __dirname = path.dirname(fileURLToPath(import.meta.url));
@@ -75,56 +73,32 @@ async function createService({ rootDir, command, commandArgs }: CreateServiceOpt
7573
let entryCode = 'render();';
7674

7775
const generatorAPI = {
78-
addExport: (declarationData: Omit<DeclarationData, 'declarationType'>) => {
79-
generator.addDeclaration('framework', {
80-
...declarationData,
81-
declarationType: DeclarationType.NORMAL,
82-
});
76+
addExport: (declarationData: DeclarationData) => {
77+
generator.addDeclaration('framework', declarationData);
8378
},
84-
addTargetExport: (declarationData: Omit<TargetDeclarationData, 'declarationType'>) => {
85-
generator.addDeclaration('framework', {
86-
...declarationData,
87-
declarationType: DeclarationType.TARGET,
88-
});
79+
addExportTypes: (declarationData: DeclarationData) => {
80+
generator.addDeclaration('frameworkTypes', declarationData);
8981
},
90-
addExportTypes: (declarationData: Omit<DeclarationData, 'declarationType'>) => {
91-
generator.addDeclaration('frameworkTypes', {
92-
...declarationData,
93-
declarationType: DeclarationType.NORMAL,
94-
});
95-
},
96-
addRuntimeOptions: (declarationData: Omit<DeclarationData, 'declarationType'>) => {
97-
generator.addDeclaration('runtimeOptions', {
98-
...declarationData,
99-
declarationType: DeclarationType.NORMAL,
100-
});
82+
addRuntimeOptions: (declarationData: DeclarationData) => {
83+
generator.addDeclaration('runtimeOptions', declarationData);
10184
},
10285
removeRuntimeOptions: (removeSource: string | string[]) => {
10386
generator.removeDeclaration('runtimeOptions', removeSource);
10487
},
105-
addRouteTypes: (declarationData: Omit<DeclarationData, 'declarationType'>) => {
106-
generator.addDeclaration('routeConfigTypes', {
107-
...declarationData,
108-
declarationType: DeclarationType.NORMAL,
109-
});
88+
addRouteTypes: (declarationData: DeclarationData) => {
89+
generator.addDeclaration('routeConfigTypes', declarationData);
11090
},
11191
addRenderFile: generator.addRenderFile,
11292
addRenderTemplate: generator.addTemplateFiles,
11393
addEntryCode: (callback: (originalCode: string) => string) => {
11494
entryCode = callback(entryCode);
11595
},
11696
addEntryImportAhead: (declarationData: Pick<DeclarationData, 'source'>) => {
117-
generator.addDeclaration('entry', {
118-
...declarationData,
119-
declarationType: DeclarationType.NORMAL,
120-
});
97+
generator.addDeclaration('entry', declarationData);
12198
},
12299
modifyRenderData: generator.modifyRenderData,
123100
addDataLoaderImport: (declarationData: DeclarationData) => {
124-
generator.addDeclaration('dataLoaderImport', {
125-
...declarationData,
126-
declarationType: DeclarationType.NORMAL,
127-
});
101+
generator.addDeclaration('dataLoaderImport', declarationData);
128102
},
129103
getExportList: (registerKey: string) => {
130104
return generator.getExportList(registerKey);
@@ -239,7 +213,7 @@ async function createService({ rootDir, command, commandArgs }: CreateServiceOpt
239213

240214
// get userConfig after setup because of userConfig maybe modified by plugins
241215
const { userConfig } = ctx;
242-
const { routes: routesConfig, server, syntaxFeatures, polyfill, output: { distType } } = userConfig;
216+
const { routes: routesConfig, server, syntaxFeatures, polyfill } = userConfig;
243217

244218
const coreEnvKeys = getCoreEnvKeys();
245219

@@ -270,6 +244,8 @@ async function createService({ rootDir, command, commandArgs }: CreateServiceOpt
270244
// Only when code splitting use the default strategy or set to `router`, the router will be lazy loaded.
271245
const lazy = [true, 'chunks', 'page', 'page-vendors'].includes(userConfig.codeSplitting);
272246
const { routeImports, routeDefinition } = getRoutesDefinition(routesInfo.routes, lazy);
247+
const loaderExports = hasExportAppData || Boolean(routesInfo.loaders);
248+
const hasDataLoader = Boolean(userConfig.dataLoader) && loaderExports;
273249
// add render data
274250
generator.setRenderData({
275251
...routesInfo,
@@ -286,16 +262,15 @@ async function createService({ rootDir, command, commandArgs }: CreateServiceOpt
286262
// Enable react-router for web as default.
287263
enableRoutes: true,
288264
entryCode,
289-
jsOutput: distType.includes('javascript'),
290-
hasDocument: fse.existsSync(path.join(rootDir, 'src/document.tsx')) || fse.existsSync(path.join(rootDir, 'src/document.jsx')) || fse.existsSync(path.join(rootDir, 'src/document.js')),
265+
hasDocument: hasDocument(rootDir),
291266
dataLoader: userConfig.dataLoader,
267+
hasDataLoader,
292268
routeImports,
293269
routeDefinition,
294270
});
295271
dataCache.set('routes', JSON.stringify(routesInfo));
296272
dataCache.set('hasExportAppData', hasExportAppData ? 'true' : '');
297273

298-
const hasDataLoader = Boolean(userConfig.dataLoader) && (hasExportAppData || Boolean(routesInfo.loaders));
299274
// Render exports files if route component export dataLoader / pageConfig.
300275
renderExportsTemplate(
301276
{
@@ -378,8 +353,12 @@ async function createService({ rootDir, command, commandArgs }: CreateServiceOpt
378353
);
379354

380355
const appConfig: AppConfig = (await getAppConfig()).default;
381-
382-
updateRuntimeEnv(appConfig, { disableRouter });
356+
updateRuntimeEnv(appConfig, {
357+
disableRouter,
358+
// The optimization for runtime size should only be enabled in production mode.
359+
routesConfig: command !== 'build' || routesInfo.routesExports.length > 0,
360+
dataLoader: command !== 'build' || loaderExports,
361+
});
383362

384363
return {
385364
run: async () => {

packages/ice/src/plugins/web/index.ts

+1-26
Original file line numberDiff line numberDiff line change
@@ -6,33 +6,8 @@ import { logger } from '../../utils/logger.js';
66

77
const plugin: Plugin = () => ({
88
name: 'plugin-web',
9-
setup: ({ registerTask, onHook, context, generator }) => {
9+
setup: ({ registerTask, onHook, context }) => {
1010
const { commandArgs, command, userConfig } = context;
11-
12-
generator.addTargetExport({
13-
specifier: [
14-
'Meta',
15-
'Title',
16-
'Links',
17-
'Scripts',
18-
'FirstChunkCache',
19-
'Data',
20-
'Main',
21-
'usePageAssets',
22-
],
23-
types: [
24-
'MetaType',
25-
'TitleType',
26-
'LinksType',
27-
'ScriptsType',
28-
'FirstChunkCacheType',
29-
'DataType',
30-
'MainType',
31-
],
32-
source: '@ice/runtime',
33-
target: 'web',
34-
});
35-
3611
const removeExportExprs = ['serverDataLoader', 'staticDataLoader'];
3712
// Remove dataLoader exports only when build in production
3813
// and configure to generate data-loader.js.

packages/ice/src/routes.ts

+11-6
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,15 @@ export async function generateRoutesInfo(
3636
}
3737
});
3838

39+
const routesExports = [];
40+
const configExport = generateRouteConfig(routes, 'pageConfig', (str, imports) => {
41+
routesExports.push(...imports);
42+
return `${str}
43+
export default {
44+
${imports.map(([routeId, importKey]) => `'${routeId}': ${importKey},`).join('\n ')}
45+
};`;
46+
});
47+
3948
return {
4049
routesCount,
4150
routeManifest,
@@ -46,12 +55,8 @@ export default {
4655
${imports.map(([routeId, importKey]) => `'${routeId}': ${importKey},`).join('\n ')}
4756
};` : '';
4857
}),
49-
routesConfig: generateRouteConfig(routes, 'pageConfig', (str, imports) => {
50-
return `${str}
51-
export default {
52-
${imports.map(([routeId, importKey]) => `'${routeId}': ${importKey},`).join('\n ')}
53-
};`;
54-
}),
58+
routesConfig: configExport,
59+
routesExports,
5560
};
5661
}
5762

0 commit comments

Comments
 (0)