rn-bundle-analyzer 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +80 -0
  2. package/dist/builders/treeBuilder.d.ts +2 -0
  3. package/dist/builders/treeBuilder.js +47 -0
  4. package/dist/collectors/fileCollector.d.ts +2 -0
  5. package/dist/collectors/fileCollector.js +27 -0
  6. package/dist/collectors/inverseDependencyCollector.d.ts +2 -0
  7. package/dist/collectors/inverseDependencyCollector.js +29 -0
  8. package/dist/config.d.ts +12 -0
  9. package/dist/config.js +15 -0
  10. package/dist/fileInfoCollector.d.ts +4 -0
  11. package/dist/fileInfoCollector.js +44 -0
  12. package/dist/index.d.ts +3 -0
  13. package/dist/index.js +48 -0
  14. package/dist/templates/analyse.html +1082 -0
  15. package/dist/templates/analyse.pug +321 -0
  16. package/dist/templates/analyseTemplate.d.ts +3 -0
  17. package/dist/templates/analyseTemplate.js +41 -0
  18. package/dist/templates/icons-inline.js +27 -0
  19. package/dist/templates/lucideIcons.d.ts +2 -0
  20. package/dist/templates/lucideIcons.js +28 -0
  21. package/dist/templates/tailwindcss.js +83 -0
  22. package/dist/types.d.ts +41 -0
  23. package/dist/types.js +2 -0
  24. package/dist/utils/envSetup.d.ts +1 -0
  25. package/dist/utils/envSetup.js +21 -0
  26. package/dist/utils/fileUtils.d.ts +3 -0
  27. package/dist/utils/fileUtils.js +27 -0
  28. package/dist/writers/fileInfoWriter.d.ts +12 -0
  29. package/dist/writers/fileInfoWriter.js +42 -0
  30. package/dist/writers/inverseDependencyWriter.d.ts +2 -0
  31. package/dist/writers/inverseDependencyWriter.js +48 -0
  32. package/dist/writers/treeWriter.d.ts +2 -0
  33. package/dist/writers/treeWriter.js +26 -0
  34. package/index.js +1 -0
  35. package/package.json +24 -0
  36. package/scripts/compile-pug.js +17 -0
  37. package/src/builders/treeBuilder.ts +57 -0
  38. package/src/collectors/fileCollector.ts +24 -0
  39. package/src/collectors/inverseDependencyCollector.ts +32 -0
  40. package/src/config.ts +14 -0
  41. package/src/fileInfoCollector.ts +50 -0
  42. package/src/index.ts +15 -0
  43. package/src/templates/analyse-app.js +988 -0
  44. package/src/templates/analyse.pug +321 -0
  45. package/src/templates/analyseTemplate.ts +45 -0
  46. package/src/templates/icons-inline.js +27 -0
  47. package/src/templates/tailwindcss.js +83 -0
  48. package/src/types.ts +43 -0
  49. package/src/utils/envSetup.ts +18 -0
  50. package/src/utils/fileUtils.ts +21 -0
  51. package/src/writers/fileInfoWriter.ts +44 -0
  52. package/src/writers/inverseDependencyWriter.ts +50 -0
  53. package/src/writers/treeWriter.ts +24 -0
  54. package/tsconfig.json +20 -0
package/src/types.ts ADDED
@@ -0,0 +1,43 @@
1
+ export interface FileInfo {
2
+ path: string
3
+ size: number
4
+ sizeKB: number
5
+ lastModified: string
6
+ extension: string
7
+ }
8
+
9
+ export interface FileTypeStats {
10
+ [ext: string]: { count: number; size: number }
11
+ }
12
+
13
+ export interface InverseDependencyInfo {
14
+ path: string
15
+ dependents: string[]
16
+ dependentCount: number
17
+ }
18
+
19
+ export interface TreeNode {
20
+ path: string
21
+ size: number
22
+ files: FileInfo[]
23
+ children: { [name: string]: TreeNode }
24
+ }
25
+
26
+ export interface TreeOutputNode {
27
+ path: string
28
+ size: number
29
+ ratio: number
30
+ child?: TreeOutputNode[]
31
+ }
32
+
33
+ export interface TreeData {
34
+ totalSize: number
35
+ pathAnalyse: TreeOutputNode[]
36
+ }
37
+
38
+ export interface MetroModule {
39
+ path: string
40
+ inverseDependencies: Iterable<string>
41
+ }
42
+
43
+ export type ProcessModuleFilter = (module: MetroModule) => boolean
@@ -0,0 +1,18 @@
1
+ import path from 'path'
2
+ import { SAVE_DIR, OUTPUT_FILES } from '../config'
3
+ import { ensureDir, writeFile } from './fileUtils'
4
+ import { analyseHtml, iconsInlineJs, tailwindJs } from '../templates/analyseTemplate'
5
+
6
+ let isPrepared = false
7
+
8
+ export function prepareSaveEnv(): void {
9
+ if (isPrepared) return
10
+ isPrepared = true
11
+
12
+ const saveFullPath = path.join(process.cwd(), SAVE_DIR)
13
+ ensureDir(saveFullPath)
14
+
15
+ writeFile(path.join(saveFullPath, OUTPUT_FILES.HTML), analyseHtml)
16
+ writeFile(path.join(saveFullPath, OUTPUT_FILES.ICONS_INLINE), iconsInlineJs)
17
+ writeFile(path.join(saveFullPath, OUTPUT_FILES.TAILWIND_JS), tailwindJs)
18
+ }
@@ -0,0 +1,21 @@
1
+ import fs from 'fs'
2
+ import path from 'path'
3
+
4
+ export function ensureDir(dirPath: string): void {
5
+ if (!fs.existsSync(dirPath)) {
6
+ try {
7
+ fs.mkdirSync(dirPath, { recursive: true })
8
+ console.log(`✅ 创建目录: ${dirPath}`)
9
+ } catch (error: any) {
10
+ console.error(`❌ 创建目录失败: ${dirPath}`, error.message)
11
+ }
12
+ }
13
+ }
14
+
15
+ export function writeFile(filePath: string, content: string): void {
16
+ fs.writeFileSync(filePath, content, 'utf8')
17
+ }
18
+
19
+ export function toRelativePath(filePath: string): string {
20
+ return path.relative(process.cwd(), filePath)
21
+ }
@@ -0,0 +1,44 @@
1
+ import path from 'path'
2
+ import { SAVE_DIR, OUTPUT_FILES } from '../config'
3
+ import { writeFile } from '../utils/fileUtils'
4
+ import { prepareSaveEnv } from '../utils/envSetup'
5
+ import { FileInfo, FileTypeStats } from '../types'
6
+
7
+ export function writeFileInfo(fileInfoArray: FileInfo[]) {
8
+ prepareSaveEnv()
9
+
10
+ const totalSize = fileInfoArray.reduce((sum, file) => sum + file.size, 0)
11
+
12
+ const fileTypeStats: FileTypeStats = {}
13
+ fileInfoArray.forEach(file => {
14
+ const ext = file.extension || 'unknown'
15
+ if (!fileTypeStats[ext]) fileTypeStats[ext] = { count: 0, size: 0 }
16
+ fileTypeStats[ext].count++
17
+ fileTypeStats[ext].size += file.size
18
+ })
19
+
20
+ const fileInfo = {
21
+ timestamp: new Date().toISOString(),
22
+ buildInfo: {
23
+ totalFiles: fileInfoArray.length,
24
+ totalSize,
25
+ totalSizeKB: Math.round(totalSize / 1024 * 100) / 100,
26
+ totalSizeMB: Math.round(totalSize / (1024 * 1024) * 100) / 100,
27
+ },
28
+ fileTypeStats,
29
+ files: fileInfoArray.slice().sort((a, b) => b.size - a.size),
30
+ }
31
+
32
+ const content = `window.packageAnalyseData = ${JSON.stringify(fileInfo, null, 2)};\n`
33
+
34
+ writeFile(path.join(process.cwd(), SAVE_DIR, OUTPUT_FILES.PACKAGE_DATA), content)
35
+ console.log(`✅ RN 包文件信息已保存到 ${OUTPUT_FILES.PACKAGE_DATA}`)
36
+ console.log(`📊 统计信息: ${fileInfo.buildInfo.totalFiles} 个文件, 总大小 ${fileInfo.buildInfo.totalSizeKB} KB`)
37
+
38
+ console.log('📈 文件类型统计:')
39
+ Object.entries(fileTypeStats).forEach(([ext, stats]) => {
40
+ console.log(` ${ext}: ${stats.count} 个文件, ${Math.round(stats.size / 1024 * 100) / 100} KB`)
41
+ })
42
+
43
+ return fileInfo
44
+ }
@@ -0,0 +1,50 @@
1
+ import path from 'path'
2
+ import { SAVE_DIR, OUTPUT_FILES, TOP_DEPENDED_LIMIT } from '../config'
3
+ import { writeFile } from '../utils/fileUtils'
4
+ import { prepareSaveEnv } from '../utils/envSetup'
5
+ import { InverseDependencyInfo } from '../types'
6
+
7
+ export function writeInverseDependencies(inverseDepsArray: InverseDependencyInfo[]): void {
8
+ if (!inverseDepsArray || inverseDepsArray.length === 0) {
9
+ console.log('⚠️ 没有收集到反向依赖信息')
10
+ return
11
+ }
12
+
13
+ prepareSaveEnv()
14
+
15
+ const sortedInverseDeps = inverseDepsArray.slice().sort((a, b) => b.dependentCount - a.dependentCount)
16
+
17
+ const totalFiles = sortedInverseDeps.length
18
+ const totalDependencies = sortedInverseDeps.reduce((sum, item) => sum + item.dependentCount, 0)
19
+ const avgDependencies = totalFiles > 0 ? Math.round((totalDependencies / totalFiles) * 100) / 100 : 0
20
+ const mostDependedFiles = sortedInverseDeps.slice(0, TOP_DEPENDED_LIMIT)
21
+
22
+ const inverseDependencyData = {
23
+ timestamp: new Date().toISOString(),
24
+ summary: {
25
+ totalFiles,
26
+ totalDependencies,
27
+ averageDependencies: avgDependencies,
28
+ mostDependedFiles: mostDependedFiles.map(item => ({
29
+ path: item.path,
30
+ dependentCount: item.dependentCount,
31
+ })),
32
+ },
33
+ inverseDependencies: sortedInverseDeps,
34
+ }
35
+
36
+ const content = `window.inverseDependencyData = ${JSON.stringify(inverseDependencyData, null, 2)};\n`
37
+
38
+ try {
39
+ writeFile(path.join(process.cwd(), SAVE_DIR, OUTPUT_FILES.INVERSE_DEPS), content)
40
+ console.log(`✅ RN 包反向依赖分析已保存到 ${OUTPUT_FILES.INVERSE_DEPS}`)
41
+ console.log(`🔗 反向依赖统计: ${totalFiles} 个文件, ${totalDependencies} 个依赖关系`)
42
+
43
+ console.log('📊 最受依赖的文件 (前5个):')
44
+ mostDependedFiles.slice(0, 5).forEach((item, index) => {
45
+ console.log(` ${index + 1}. ${item.path}: ${item.dependentCount} 个依赖者`)
46
+ })
47
+ } catch (error: any) {
48
+ console.error('❌ 保存反向依赖分析失败:', error.message)
49
+ }
50
+ }
@@ -0,0 +1,24 @@
1
+ import path from 'path'
2
+ import { SAVE_DIR, OUTPUT_FILES, TREE_DISPLAY_LIMIT } from '../config'
3
+ import { writeFile } from '../utils/fileUtils'
4
+ import { prepareSaveEnv } from '../utils/envSetup'
5
+ import { TreeData } from '../types'
6
+
7
+ export function writeTreeAnalysis(treeData: TreeData): void {
8
+ prepareSaveEnv()
9
+
10
+ const content = `window.treeAnalyseData = ${JSON.stringify(treeData, null, 2)};\n`
11
+
12
+ try {
13
+ writeFile(path.join(process.cwd(), SAVE_DIR, OUTPUT_FILES.TREE_DATA), content)
14
+ console.log(`✅ RN 包树形分析已保存到 ${OUTPUT_FILES.TREE_DATA}`)
15
+ console.log(`🌳 树形结构: ${treeData.pathAnalyse.length} 个根目录/文件`)
16
+
17
+ console.log('📊 根级目录大小统计:')
18
+ treeData.pathAnalyse.slice(0, TREE_DISPLAY_LIMIT).forEach(item => {
19
+ console.log(` ${item.path}: ${Math.round(item.size / 1024 * 100) / 100} KB (${(item.ratio * 100).toFixed(2)}%)`)
20
+ })
21
+ } catch (error: any) {
22
+ console.error('❌ 保存树形分析失败:', error.message)
23
+ }
24
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,20 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "module": "commonjs",
5
+ "lib": ["ES2020"],
6
+ "types": ["node"],
7
+ "outDir": "./dist",
8
+ "rootDir": "./src",
9
+ "strict": true,
10
+ "esModuleInterop": true,
11
+ "skipLibCheck": true,
12
+ "forceConsistentCasingInFileNames": true,
13
+ "resolveJsonModule": true,
14
+ "declaration": true,
15
+ "declarationDir": "./dist",
16
+ "sourceMap": false
17
+ },
18
+ "include": ["src/**/*.ts"],
19
+ "exclude": ["node_modules", "dist"]
20
+ }