mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-03-15 08:31:14 -07:00
perf(cli): enable code splitting and deferred UI loading (#22117)
This commit is contained in:
@@ -228,23 +228,35 @@ const packageJson = JSON.parse(
|
||||
// Helper to calc hash
|
||||
const sha256 = (content) => createHash('sha256').update(content).digest('hex');
|
||||
|
||||
// Read Main Bundle
|
||||
const geminiBundlePath = join(root, 'bundle/gemini.js');
|
||||
const geminiContent = readFileSync(geminiBundlePath);
|
||||
const geminiHash = sha256(geminiContent);
|
||||
|
||||
const assets = {
|
||||
'gemini.mjs': geminiBundlePath, // Use .js source but map to .mjs for runtime ESM
|
||||
'manifest.json': 'bundle/manifest.json',
|
||||
};
|
||||
|
||||
const manifest = {
|
||||
main: 'gemini.mjs',
|
||||
mainHash: geminiHash,
|
||||
mainHash: '',
|
||||
version: packageJson.version,
|
||||
files: [],
|
||||
};
|
||||
|
||||
// Add all javascript chunks from the bundle directory
|
||||
const jsFiles = globSync('*.js', { cwd: bundleDir });
|
||||
for (const jsFile of jsFiles) {
|
||||
const fsPath = join(bundleDir, jsFile);
|
||||
const content = readFileSync(fsPath);
|
||||
const hash = sha256(content);
|
||||
|
||||
// Node SEA requires the main entry point to be explicitly mapped
|
||||
if (jsFile === 'gemini.js') {
|
||||
assets['gemini.mjs'] = fsPath;
|
||||
manifest.mainHash = hash;
|
||||
} else {
|
||||
// Other chunks need to be mapped exactly as they are named so dynamic imports find them
|
||||
assets[jsFile] = fsPath;
|
||||
manifest.files.push({ key: jsFile, path: jsFile, hash: hash });
|
||||
}
|
||||
}
|
||||
|
||||
// Helper to recursively find files from STAGING
|
||||
function addAssetsFromDir(baseDir, runtimePrefix) {
|
||||
const fullDir = join(stagingDir, baseDir);
|
||||
@@ -346,6 +358,22 @@ const targetBinaryPath = join(targetDir, binaryName);
|
||||
console.log(`Copying node binary from ${nodeBinary} to ${targetBinaryPath}...`);
|
||||
copyFileSync(nodeBinary, targetBinaryPath);
|
||||
|
||||
if (platform === 'darwin') {
|
||||
console.log(`Thinning universal binary for ${arch}...`);
|
||||
try {
|
||||
// Attempt to thin the binary. Will fail safely if it's not a fat binary.
|
||||
runCommand('lipo', [
|
||||
targetBinaryPath,
|
||||
'-thin',
|
||||
arch,
|
||||
'-output',
|
||||
targetBinaryPath,
|
||||
]);
|
||||
} catch (e) {
|
||||
console.log(`Skipping lipo thinning: ${e.message}`);
|
||||
}
|
||||
}
|
||||
|
||||
// Remove existing signature using helper
|
||||
removeSignature(targetBinaryPath);
|
||||
|
||||
@@ -357,9 +385,7 @@ if (existsSync(bundleDir)) {
|
||||
|
||||
// Clean up source JS files from output (we only want embedded)
|
||||
const filesToRemove = [
|
||||
'gemini.js',
|
||||
'gemini.mjs',
|
||||
'gemini.js.map',
|
||||
'gemini.mjs.map',
|
||||
'gemini-sea.cjs',
|
||||
'sea-launch.cjs',
|
||||
@@ -373,6 +399,12 @@ filesToRemove.forEach((f) => {
|
||||
if (existsSync(p)) rmSync(p, { recursive: true, force: true });
|
||||
});
|
||||
|
||||
// Remove all chunk and entry .js/.js.map files
|
||||
const jsFilesToRemove = globSync('*.{js,js.map}', { cwd: targetDir });
|
||||
for (const f of jsFilesToRemove) {
|
||||
rmSync(join(targetDir, f));
|
||||
}
|
||||
|
||||
// Remove .sb files from targetDir
|
||||
const sbFilesToRemove = globSync('sandbox-macos-*.sb', { cwd: targetDir });
|
||||
for (const f of sbFilesToRemove) {
|
||||
|
||||
Reference in New Issue
Block a user