2015-04-22 12 views
11

ich die gleiche Funktionalität wie RequireJS möchten empty:http://requirejs.org/docs/optimization.html#emptyAusschließen eines Moduls aus webpack Bündel

Meine Use-Case ist, dass ich jquery-migrate in Entwicklung sind, aber ich möchte das, wenn für die Produktion gebaut auszuschließen.

Verwenden IgnorePlugin macht es nur nicht enthalten, und wenn es in den Code, es wirft dann einen Fehler (Uncaught Error: Cannot find module "jquery-migrate").

Was ich gerne passieren würde ist, dass es nur undefined oder etwas Ähnliches zurückgibt (wie in RequireJS). Ich möchte den Import im Code nicht berühren und ihn nur so konfigurieren, dass er undefined zurückgibt.

EDIT: Mit NormalModuleReplacementPlugin funktioniert, wenn ich den Ersatz auf eine leere Datei zeigen. Aber dafür nur eine leere Datei zu haben, erscheint unnötig.

Antwort

16

ich die Null-loader verwenden für Module Ausblendung. Der Noop-Loader kann für eine weniger umständliche if-else in der Konfig verwendet werden.

Versuchen:

rules: [{ 
    test: /jquery-migrate/, 
    use: IS_DEV ? 'null-loader' : 'noop-loader' 
}] 
+0

Dies schien für mich zu arbeiten und ich denke, Antworten OP Frage am besten. Keine Änderung am Code, ich habe immer noch ein 'import foo fr 'excluded-modul' am oberen Rand meines Codes ohne lustiges' if (DEV) 'Wrapper. Stellen Sie sich vor, 'require ('excluded-module')' funktioniert genauso gut. –

+2

Hinweis für andere Neulinge, diese Lader sind nicht im Webpack enthalten: 'npm install --save-dev null-loader && npm installieren --save-dev noop-loader' – diachedelic

+0

Note2 -' 'loader'' am Ende von hinzufügen der Name des Ladeprogramms z.B. 'null-loader' ... –

3

können Sie versuchen, eine resolve.alias in webpack.config zu machen:

resolve: { 
    alias: { 
     "jquery-migrate": process.env.NODE_ENV === 'production' ? "empty-module": "jquery-migrate" 
    } 
} 
+0

Diese noch zwingt mich ein leeres Modul haben herumliegen. Cleaner als 'NormalModuleReplacementPlugin', obwohl :) – SimenB

+3

@Simen' npm ich -D leeres Modul ' – srcspider

1

Verwenden Webpack der DefinePlugin in Kombination mit den normalen Produktions Plugins (Deduplizierung und verunstalten).

Dann in Ihrem Code können Sie schreiben:

if(DEBUG) { 
    var test = require('test'); 
    alert(test); 
} 

Und wenn es in der Produktion integriert ist, wird die DEBUG mit einer wörtlichen if(false) { ... } ersetzt werden, die durch die uglify Plugin vollständig entfernt werden, seine test wird so nur erforderlich in einem Debug-Build.

Hier ist eine Beispielaufgabe Grunt Config für grunt-webpack die development und production Ziele für die Aufgabe hat:

 development: { 
      devtool: "sourcemap", 
      output: { 
       pathinfo: true, 
      }, 
      debug: true, 
      production: false, 
      plugins: [ 
       new webpack.DefinePlugin({ 
        DEBUG: true, 
        PRODUCTION: false 
       }) 
      ] 
     }, 

     production: { 
      plugins: [ 
       new webpack.DefinePlugin({ 
        DEBUG: false, 
        PRODUCTION: true 
       }), 
       new webpack.optimize.DedupePlugin(), 
       new webpack.optimize.UglifyJsPlugin({ 
        output: { 
         comments: false, 
        } 
       }) 
      ] 
     }, 
+0

Ich bevorzuge eigentlich dekorieren Quellcode mit Debug-Anweisungen anstatt in Build-Tool-Skripts. Es macht es für Sie selbst viel verständlicher, wenn Sie zum Code und anderen zurückkehren, wenn Sie versuchen herauszufinden, woher diese jQuery-migrate stammt. –

+0

Wahr. Dies funktioniert jedoch nicht sauber für AMD, zumindest wenn es im ursprünglichen 'define'-Aufruf aufgeführt ist. Die Verwendung eines Alias ​​ist genau wie 'empty:', außer dass ich das 'leere' Modul selbst erstellen muss. – SimenB