2015-04-30 13 views
8

Nie można znaleźć żadnej opcji debugowania lub wtyczki w pakiecie sieci Web, aby pokazać, co dokładnie poszło w porcję.Jak uzyskać listę wszystkich plików (lub modułów) zawartych w pakiecie w pakiecie Webpack

Dlaczego tego potrzebuję? Zauważyłem przypadki, w których podział kodu dosłownie sprawia, że ​​wszystko jest o wiele większe niż po prostu umieszczanie wszystkiego w jednym pliku. Jest to nieco sprzeczne z intuicją, ponieważ nie wierzę, że kod bootstrapowy z webpacka jest tak znaczący; Podejrzewam, że może to być zminimalizowanie/deduplikacja, ale nie wiedząc, które moduły są w rzeczywistości chowane, trudno jest zrobić kilka izolowanych testów, aby to potwierdzić.

Mój proces kompilacji wykorzystuje łyk; jeśli to robi jakąkolwiek różnicę.

Odpowiedz

0

Rozwiązaniem jest napisanie skryptu, który analizuje pliki .js.map, ponieważ zawierają one wpis sources, który można wykorzystać do rozpoznania wszystkich plików zawartych w porcji.


Oto mały skrypt łyk że będzie to zadanie,

var debugWebpackMapFile = function (file) { 

    var cleanupRules = { 
     // executed in order 
     '/src/client/javascript/node_modules/': '', 
     '/src/client/javascript/': 'static/' 
    }; 

    return new Promise(function (resolve, reject) { 
     var match = /\/([^\/]+).js.map$/.exec(file); 
     if (match != null) { 
      var filename = match[1]; 
      console.log("\n " + filename + "\n =======================\n"); 
      var mapjson = JSON.parse(fs.readFileSync(file)); 

      var dependencies = []; 
      var sourcefiles = []; 

      _.each(mapjson.sources, function (srcfile) { 
       srcfile = srcfile.replace('webpack://source-code', '', srcfile); 
       var match = /^\/node_modules\/([^\/]+)/.exec(srcfile); 
       if (match == null) { 
        match = /^(\/src\/.*\.js)(\?.*)?/.exec(srcfile); 
        if (match != null) { 
         // project source file 
         srcfile = match[1]; 
         _.each(cleanupRules, function (to, from) { 
          srcfile = srcfile.replace(from, to); 
         }); 

         // the sources are in random order in the map file, 
         // so we'll need to sort before displaying anything 
         sourcefiles.push(srcfile); 
        } 
       } 
       else { 
        // dependency 
        var pkg = match[1]; 
        if (dependencies.indexOf(pkg) == -1) { 
         dependencies.push(pkg); 
        } 
       } 
      }); 

      sourcefiles.sort(); 
      _.each(sourcefiles, function (srcfile) { 
       console.log(" " + srcfile); 
      }); 

      if (dependencies.length > 0) { 

       console.log("\n ---- 3rd Party ------------------\n"); 

       dependencies.sort(); 
       _.each(dependencies, function (pkg) { 
        console.log(" " + pkg); 
       }); 
      } 
     } 

     console.log("\n\n"); 

     resolve(); 
    }); 
} 

gulp.task('js:debug', function (cb) { 
    var conf = webpackConf.mainjs; 
    glob(conf.output.path + '/*.map', {}, function (er, files) { 
     var promises = []; 
     _.each(files, function (file) { 
      promises.push(debugWebpackMapFile(file)); 
     }); 

     Promise.all(promises).lastly(cb); 
    }); 
}); 

Musisz zmodyfikować skrypt spotkać swoją własną konfigurację.

Tylko w przypadku jej to oczywiste, webpack://source-code część to ze względu na ustawienia devtool w WebPacka output ustawienia, a mianowicie:

devtoolModuleFilenameTemplate: "webpack://source-code/[resource-path]", 
devtoolFallbackModuleFilenameTemplate: "webpack://source-code/[resource-path]?[hash]", 

webpack/internal i node_modules są z poniższego skryptu normalizacji (nie lubię funkcja zastępowania "~" WebPacka).

var normalizeMaps = function (conf, cb) { 
    glob(conf.output.path + '/*.map', {}, function (er, files) { 
     var promises = []; 
     _.each(files, function (file) { 
      promises.push(replaceInFile(file, [ 
       [ /\/~/g, '/node_modules' ], 
       [ /\.\//g, ''], 
       [ /source-code\/\(webpack\)/g, 'source-code/webpack/internal' ] 
      ])); 
     }); 

     Promise.all(promises).lastly(cb); 
    }); 
}; 
8

Możesz napisać wtyczkę, która to robi.

Na przykład

var PrintChunksPlugin = function() {}; 
PrintChunksPlugin.prototype.apply = function(compiler) { 
    compiler.plugin('compilation', function(compilation, params) { 
     compilation.plugin('after-optimize-chunk-assets', function(chunks) { 
      console.log(chunks.map(function(c) { 
       return { 
        id: c.id, 
        name: c.name, 
        includes: c.modules.map(function(m) { 
         return m.request; 
        }) 
       }; 
      })); 
     }); 
    }); 
}; 

Aby uzyskać więcej informacji, sprawdź stronę http://webpack.github.io/docs/plugins.html. Zawiera dokumentację wszystkich miejsc, w które można się podłączyć. Znajdź odpowiedni hak, który zostanie wywołany z chunks: Chunk[] lub chunk, a wewnątrz tego będziesz mieć dostęp do wszystkiego, co chcesz.

Ponadto obiekt statystyki zawiera wszystkie potrzebne informacje z zakresu post-build. Jest dostępny w wtyczce done.

+0

działa jak czar ! Zauważam jednak, że czasami 'm.request' nie jest zdefiniowany. Czy widzisz, że tak się też dzieje, a jeśli tak, to wiesz, dlaczego tak się dzieje? – AjaxLeung

+0

Trochę się nad tym zastanawiałem. Myślę, że ma to jakiś związek z require.context, który jest używany w określony sposób. – AjaxLeung

+0

Awesome! bardzo mi pomogło. –

0

Wydaje się, że ma klucz wie jak --display-modules aby pokazać wszystkie moduły:

$ webpack --display-modules 

Następnie otrzymasz listę używanych modułów podobną o następującej treści:

    Asset  Size Chunks    Chunk Names 
javascripts/webpack/app.js 211 kB  0 [emitted] javascripts/webpack/app 
stylesheets/webpack/app.js 4.13 kB  1 [emitted] stylesheets/webpack/app 
stylesheets/webpack/app.scss 2.99 kB  1 [emitted] stylesheets/webpack/app 
[0] ./app/webpack/js/behaviors/lory-icon-slider.js.coffee 1.1 kB {0} [optional] [built] 
[1] ./app/webpack/css/components (\.scss|\.css)$ 160 bytes {1} [built] 
[2] ./app/webpack/js/behaviors (\.js|\.js.jsx|\.js.coffee)$ 252 bytes {0} [built] 
[3] ./~/pickmeup/css/pickmeup.scss 41 bytes {1} [built] 
[4] ./app/webpack/css/app.js 205 bytes {1} [built] 
[5] ./app/webpack/js/app.js 250 bytes {0} [built] 
[6] ./app/webpack/js/behaviors/pickmeup-fixed-calendar.js 3.47 kB {0} [optional] [built] 
[7] ./~/lory.js/dist/jquery.lory.js 25 kB {0} [built] 
[8] ./~/pickmeup/js/pickmeup.js 41.4 kB {0} [built] 
[9] (webpack)/buildin/global.js 509 bytes {0} [built] 
Child extract-text-webpack-plugin: 
    [0] ./~/css-loader/lib/css-base.js 1.51 kB {0} [built] 
    [1] ./~/css-loader!./~/sass-loader/lib/loader.js!./~/pickmeup/css/pickmeup.scss 3.23 kB {0} [built] 
Powiązane problemy