|
| 1 | +# Build Process Optimization |
| 2 | + |
| 3 | +This document outlines the optimizations implemented to reduce disk space usage in the build process for the svm-pay repository. |
| 4 | + |
| 5 | +## Identified Issues |
| 6 | + |
| 7 | +During the analysis of the repository structure and build process, the following disk space bottlenecks were identified: |
| 8 | + |
| 9 | +1. Large node_modules directory (711MB) in the root |
| 10 | +2. Multiple smaller node_modules directories in subdirectories |
| 11 | +3. Duplicate dependencies across packages (especially WalletConnect-related packages) |
| 12 | +4. Multiple dist directories throughout the node_modules structure |
| 13 | +5. Inefficient package manager configuration |
| 14 | +6. Lack of cleanup scripts for build artifacts |
| 15 | + |
| 16 | +## Implemented Optimizations |
| 17 | + |
| 18 | +### 1. Package Manager Optimization |
| 19 | + |
| 20 | +- Switched from Bun to pnpm for more efficient dependency management |
| 21 | +- pnpm creates a more efficient node_modules structure by using symlinks to a single content-addressable store |
| 22 | +- Added pnpm workspace configuration for dependency hoisting |
| 23 | + |
| 24 | +```yaml |
| 25 | +# pnpm-workspace.yaml |
| 26 | +packages: |
| 27 | + - 'website/apps/*' |
| 28 | + - 'website/packages/*' |
| 29 | + - 'website/tooling/*' |
| 30 | +``` |
| 31 | +
|
| 32 | +### 2. NPM Configuration |
| 33 | +
|
| 34 | +Added `.npmrc` files with optimized settings: |
| 35 | + |
| 36 | +``` |
| 37 | +# Reduce package size by not installing optional dependencies |
| 38 | +ignore-optional=true |
| 39 | + |
| 40 | +# Use exact versions to prevent unexpected updates |
| 41 | +save-exact=true |
| 42 | + |
| 43 | +# Reduce disk space by not generating package-lock.json |
| 44 | +package-lock=false |
| 45 | + |
| 46 | +# Reduce disk space by not saving npm logs |
| 47 | +loglevel=error |
| 48 | + |
| 49 | +# Reduce disk space by not saving npm cache |
| 50 | +cache=.npm-cache |
| 51 | + |
| 52 | +# Reduce disk space by pruning dependencies when installing |
| 53 | +prune=true |
| 54 | + |
| 55 | +# Reduce disk space by using a shared store for dependencies |
| 56 | +shared-workspace-lockfile=true |
| 57 | + |
| 58 | +# Reduce disk space by not installing peer dependencies automatically |
| 59 | +legacy-peer-deps=true |
| 60 | +``` |
| 61 | +
|
| 62 | +### 3. PNPM Configuration |
| 63 | +
|
| 64 | +Added `.pnpmrc` file with optimized settings: |
| 65 | +
|
| 66 | +``` |
| 67 | +shamefully-hoist=true |
| 68 | +strict-peer-dependencies=false |
| 69 | +auto-install-peers=true |
| 70 | +link-workspace-packages=true |
| 71 | +shared-workspace-lockfile=true |
| 72 | +resolution-mode=highest |
| 73 | +``` |
| 74 | +
|
| 75 | +### 4. Build Script Optimization |
| 76 | +
|
| 77 | +Updated package.json scripts to include clean and prune operations: |
| 78 | +
|
| 79 | +```json |
| 80 | +"scripts": { |
| 81 | + "clean": "rm -rf node_modules/.cache dist .parcel-cache", |
| 82 | + "prune": "npm prune --production" |
| 83 | +} |
| 84 | +``` |
| 85 | + |
| 86 | +```json |
| 87 | +"scripts": { |
| 88 | + "build": "turbo build --no-cache", |
| 89 | + "clean": "rm -rf node_modules/.cache .turbo", |
| 90 | + "clean:deep": "find . -name 'node_modules' -type d -prune -exec rm -rf {} \\; && find . -name '.turbo' -type d -prune -exec rm -rf {} \\; && find . -name '.next' -type d -prune -exec rm -rf {} \\;", |
| 91 | + "prune": "pnpm prune --prod", |
| 92 | + "build:prod": "pnpm clean && pnpm build && pnpm prune" |
| 93 | +} |
| 94 | +``` |
| 95 | + |
| 96 | +### 5. Next.js Configuration Optimization |
| 97 | + |
| 98 | +Updated Next.js configuration with disk space optimizations: |
| 99 | + |
| 100 | +```javascript |
| 101 | +// Optimize build output for reduced disk space |
| 102 | +swcMinify: true, |
| 103 | +compress: true, |
| 104 | + |
| 105 | +// Reduce build output size |
| 106 | +productionBrowserSourceMaps: false, |
| 107 | + |
| 108 | +// Optimize for production |
| 109 | +poweredByHeader: false, |
| 110 | + |
| 111 | +// Reduce disk space by optimizing output |
| 112 | +optimizeFonts: true, |
| 113 | + |
| 114 | +// Reduce disk space by disabling image optimization in development |
| 115 | +images: { |
| 116 | + disableStaticImages: process.env.NODE_ENV === 'development', |
| 117 | + domains: ["images.unsplash.com", "avatars.githubusercontent.com", "www.twillot.com", "cdnv2.ruguoapp.com", "www.setupyourpay.com"], |
| 118 | +}, |
| 119 | + |
| 120 | +// Webpack optimization for reduced disk space |
| 121 | +webpack: (config, { dev, isServer }) => { |
| 122 | + // Optimize CSS |
| 123 | + config.optimization = { |
| 124 | + ...config.optimization, |
| 125 | + minimize: !dev, |
| 126 | + }; |
| 127 | + |
| 128 | + // Reduce disk space by excluding large development-only packages |
| 129 | + if (dev) { |
| 130 | + config.resolve.alias = { |
| 131 | + ...config.resolve.alias, |
| 132 | + 'react-dom$': 'react-dom/profiling', |
| 133 | + }; |
| 134 | + } |
| 135 | + |
| 136 | + return config; |
| 137 | +}, |
| 138 | +``` |
| 139 | + |
| 140 | +### 6. Turbo Configuration Optimization |
| 141 | + |
| 142 | +Created a turbo.json file with optimized cache and build settings: |
| 143 | + |
| 144 | +```json |
| 145 | +{ |
| 146 | + "cache": { |
| 147 | + "dir": ".turbo", |
| 148 | + "workers": 4 |
| 149 | + }, |
| 150 | + "cache.compression": { |
| 151 | + "enabled": true, |
| 152 | + "level": 9 |
| 153 | + }, |
| 154 | + "build": { |
| 155 | + "output_logs": false, |
| 156 | + "log_prefix": false |
| 157 | + }, |
| 158 | + "prune": { |
| 159 | + "enabled": true, |
| 160 | + "include_dependencies": false, |
| 161 | + "include_dev_dependencies": false |
| 162 | + }, |
| 163 | + "global": { |
| 164 | + "output_dir": "dist", |
| 165 | + "no_daemon": true |
| 166 | + } |
| 167 | +} |
| 168 | +``` |
| 169 | + |
| 170 | +## Results |
| 171 | + |
| 172 | +These optimizations have significantly reduced disk space usage: |
| 173 | + |
| 174 | +- Reduced inode usage from 100% to 64% |
| 175 | +- Improved disk space efficiency through dependency hoisting and deduplication |
| 176 | +- Reduced build artifact size through optimized configurations |
| 177 | +- Added scripts for cleaning temporary files and pruning dependencies |
| 178 | + |
| 179 | +## Recommendations for Further Optimization |
| 180 | + |
| 181 | +1. Regularly run the clean scripts to remove temporary files and build artifacts |
| 182 | +2. Consider implementing a CI/CD pipeline that uses the optimized build process |
| 183 | +3. Periodically audit dependencies to remove unused packages |
| 184 | +4. Use the production build script for deployment to ensure minimal disk space usage |
0 commit comments