@@ -17,23 +17,17 @@ const formatBytes = (bytes) => {
1717const analyze = ( bundle , opts = { } , format = false ) => {
1818 let { root, limit, filter } = opts ;
1919 let deps = { } ;
20+ let entrySize ;
2021 let bundleSize = 0 ;
2122 let bundleModules = bundle . modules ;
2223
2324 return new Promise ( ( resolve , reject ) => {
24- if ( bundleModules && ! Array . isArray ( bundleModules ) ) {
25- bundleModules = Object . keys ( bundleModules ) . map ( ( id ) => {
26- let { originalLength, renderedLength } = bundleModules [ id ] ;
27- return { id, dependencies : [ ] , originalLength, renderedLength}
28- } ) ;
29- }
30-
3125 let modules = bundleModules . map ( ( m , i ) => {
32- let id = m . id . replace ( root , '' ) ;
33- let size = m . renderedLength ;
34- if ( ! size && size !== 0 ) {
35- size = m . code ? Buffer . byteLength ( m . code , 'utf8' ) : 0 ;
36- }
26+ let { id , originalLength : origSize , renderedLength , isEntry , code } = m ;
27+ id = id . replace ( root , '' ) ;
28+ let size = renderedLength ;
29+ if ( ! size && size !== 0 ) size = code ? Buffer . byteLength ( code , 'utf8' ) : 0 ;
30+ if ( isEntry ) entrySize = size ;
3731 bundleSize += size ;
3832
3933 if ( Array . isArray ( filter ) && ! filter . some ( ( f ) => id . match ( f ) ) ) return null
@@ -45,14 +39,17 @@ const analyze = (bundle, opts = {}, format = false) => {
4539 deps [ d ] . push ( id ) ;
4640 } ) ;
4741
48- return { id, size}
42+ return { id, size, origSize , isEntry }
4943 } ) . filter ( ( m ) => m ) ;
5044
45+ if ( entrySize ) bundleSize = entrySize ;
46+
5147 modules . sort ( ( a , b ) => b . size - a . size ) ;
5248 if ( limit || limit === 0 ) modules = modules . slice ( 0 , limit ) ;
5349 modules . forEach ( ( m ) => {
5450 m . dependents = deps [ m . id ] || [ ] ;
5551 m . percent = ( ( m . size / bundleSize ) * 100 ) . toFixed ( 2 ) ;
52+ m . reduction = 100 - ( ( m . size / m . origSize ) * 100 ) . toFixed ( 2 ) ;
5653 } ) ;
5754
5855 if ( ! format ) return resolve ( modules )
@@ -62,9 +59,12 @@ const analyze = (bundle, opts = {}, format = false) => {
6259 let formatted = `${ borderX } ${ heading } ${ displaySize } ${ borderX } ` ;
6360
6461 modules . forEach ( ( m ) => {
62+ if ( m . isEntry ) return
6563 formatted += `file:${ buf } ${ m . id } \n` ;
6664 formatted += `size:${ buf } ${ formatBytes ( m . size ) } \n` ;
6765 formatted += `percent:${ buf } ${ m . percent } %\n` ;
66+ formatted += `orig. size:${ buf } ${ formatBytes ( m . origSize || 'unknown' ) } \n` ;
67+ formatted += `code reduction:${ buf } ${ m . reduction } %\n` ;
6868 formatted += `dependents:${ buf } ${ m . dependents . length } \n` ;
6969 m . dependents . forEach ( ( d ) => {
7070 formatted += `${ tab } -${ buf } ${ d . replace ( root , '' ) } \n` ;
@@ -82,15 +82,39 @@ const plugin = (opts = {}) => {
8282 let cb = opts . writeTo || ( opts . stdout ? console . log : console . error ) ;
8383 if ( opts . onAnalysis ) cb = opts . onAnalysis ;
8484 let written ;
85+ let modules ;
8586
86- let runAnalysis = ( outputOptions , bundle , isWrite ) => {
87+ let runAnalysis = ( out , bundle , isWrite ) => new Promise ( ( resolve , reject ) => {
88+ resolve ( ) ;
8789 if ( written ) return
88- if ( outputOptions . bundle ) bundle = outputOptions . bundle ;
8990 written = true ;
90- return analyze ( bundle , opts , ! opts . onAnalysis ) . then ( cb )
91- } ;
91+ if ( out . bundle ) bundle = out . bundle ;
92+ if ( ! Array . isArray ( bundle . modules ) ) {
93+ modules . forEach ( ( m ) => {
94+ let bm = bundle . modules [ m . id ] ;
95+ bm . id = bm . id || m . id ;
96+ bm . isEntry = bm . isEntry || m . isEntry ;
97+ bm . dependencies = m . dependencies || [ ] ;
98+ } ) ;
99+ modules = Object . keys ( bundle . modules ) . map ( ( k ) => bundle . modules [ k ] ) ;
100+ } else {
101+ modules = bundle . modules ;
102+ }
103+ return analyze ( { modules} , opts , ! opts . onAnalysis ) . then ( cb )
104+ } ) ;
92105 return {
93106 name : 'rollup-analyzer-plugin' ,
107+ transformChunk : ( _a , _b , chunk ) => new Promise ( ( resolve , reject ) => {
108+ resolve ( null ) ;
109+ if ( ! chunk || ! chunk . orderedModules ) return
110+ modules = chunk . orderedModules . map ( ( m ) => {
111+ return {
112+ id : m . id ,
113+ isEntry : m . isEntryPoint ,
114+ dependencies : m . dependencies . map ( ( d ) => d . id )
115+ }
116+ } ) ;
117+ } ) ,
94118 generateBundle : runAnalysis ,
95119 ongenerate : runAnalysis
96120 }
0 commit comments