2015-10-10 11 views
45

Ich verwaltete configure webpack, um CSS und JS in entsprechende Unterverzeichnisse auszugeben, d. H. public/asests/css und public/assets/js. Ich weiß jedoch nicht, wie ich das für Bilder und Schriften machen soll.Webpack konfigurieren, um Bilder/Fonts in einem separaten Unterordner auszugeben

Mit anderen Worten, ich möchte Bilder in public/assets/images Ordner und Schriften in public/assets/fonts Ordner ausgeben.

Hier ist meine webpack Konfigurationsdatei:

var path = require('path'); 
var ExtractCSS = require('extract-text-webpack-plugin'); 

module.exports = { 
    context: path.resolve('private/js'), 
    resolve: ['', '.js', '.jsx', '.es6', '.json'], 
    entry: { 
     homepage: './homepage' 
    }, 
    output: { 
     path: path.resolve('public/assets'), 
     publicPath: '/public/assets/', 
     filename: 'js/[name].js' 
    }, 
    plugins: [ 
     new ExtractCSS('css/[name].css') 
    ], 
    devServer: { 
     contentBase: 'public' 
    }, 
    module: { 
     loaders: [ 
      { 
       test: /\.(es6|js|jsx)$/, 
       exclude: /node_modules/, 
       loader: 'babel-loader' 
      }, 
      { 
       test: /\.css$/, 
       exclude: /node_modules/, 
       loader: ExtractCSS.extract('style-loader', 'css-loader') 
      }, 
      { 
       test: /\.less$/, 
       exclude: /node_modules/, 
       loader: ExtractCSS.extract('style-loader', 'css-loader!less-loader') 
      }, 
      { 
       test: /\.(jpg|jpeg|gif|png|woff|woff2|eot|ttf|svg)$/, 
       exclude: /node_modules/, 
       loader: 'url-loader?limit=1024' 
      } 
     ] 
    } 
} 

Antwort

58

Ich kann dies unter Bezugnahme auf url-loader & file-loader Dokumentation auf GitHub herauszufinden.

Alles, was ich tun musste, war ein Name Query-String-Parameter in Loader hinzufügen, um den vollständigen Pfad anzugeben. Ich habe auch gelernt, dass Sie angeben können, wie Dateien am Ausgabeort benannt werden sollen.

{ 
    test: /\.(jpg|jpeg|gif|png)$/, 
    exclude: /node_modules/, 
    loader:'url-loader?limit=1024&name=images/[name].[ext]' 
}, 
{ 
    test: /\.(woff|woff2|eot|ttf|svg)$/, 
    exclude: /node_modules/, 
    loader: 'url-loader?limit=1024&name=fonts/[name].[ext]' 
} 
+3

Hey, das war wirklich hilfreich. Aber aus irgendeinem Grund funktionierten nur die Schriften für mich. Die Bilder werden nicht in einen neuen Bilderordner exportiert. Fehle ich ein Plugin oder wäre die Tatsache, dass ich SVG benutze, ein Problem? – HGB

+2

Ich hatte das gleiche Problem. Ich reparierte es, indem ich das Dateiladeprogramm anstelle des Url-Ladeprogramms für Bilder benutzte 'loader: 'file? Limit = 1024 & name = images/[name]. [Ext]'' – thomas

+1

Ist das für webpack 1? Ich bekomme diesen Fehler: 'Kann nicht 'loader loader & name = images/[name]. [Ext]' – Kokodoko

10
{ 
    test: /\.(ttf|eot|svg|woff2?)(\?v=[a-z0-9=\.]+)?$/i, 
    include: folders.npm, 
    loader: 'file?name=fonts/[name].[ext]' 
}, 
{ 
    test: /\.(jpe?g|png|gif|svg|ico)$/i, 
    include: folders.src, 
    loaders: [ 
     'file?name=images/[sha512:hash:base64:7].[ext]', 
     'image-webpack?progressive=true&optimizationLevel=7&interlaced=true' 
    ] 
} 

Dies ist, was ich in der Produktion verwenden. Ich stoße oft auf Situationen, in denen * .svg Bilder verwendet werden und SVG Fonts für IE Fallback. Hier nehme ich an, dass font immer innerhalb von node_modules liegt. Ich habe auch Entwickler gesehen, die test: /fonts\/[w+].(svg|eot ....) tun.

+0

Ich weiß nicht, ob das Standard-Knoten-Praxis ist, aber die Verwendung von/node_modules/anstelle von folders.npm hat mir geholfen. Ich mochte Ihren Ansatz, weil meine Schriften auch aus dem Ordner node_modules stammen – jarus

+1

folders.npm ist Variable, die ich am Anfang deklariert habe. const Pfade = { root: path.resolve (' '), NPM: path.resolve ('.', '/ Node_modules') ... etc. }; – gcerar

Verwandte Themen