2015-04-22 19 views
11

Chciałbym taką samą funkcjonalność jak RequireJS empty:http://requirejs.org/docs/optimization.html#emptyWykluczanie modułu z WebPACK wiązki

My use-case jest to, że obejmują jquery-migrate w rozwoju, ale chciałbym, aby wykluczyć tego, kiedy zostanie zbudowany do produkcji.

Użycie tej opcji powoduje, że nie jest ona dołączana, a kiedy require ma to miejsce w kodzie, powoduje to błąd (Uncaught Error: Cannot find module "jquery-migrate").

Chciałbym, aby po prostu powrócił niezdefiniowany lub coś podobnego (np. empty: w RequireJS). Nie chcę dotykać importu kodu, wystarczy go skonfigurować, aby zwrócił undefined.

EDYCJA: Przy użyciu NormalModuleReplacementPlugin działa, jeśli wskazuję zastąpienie pustego pliku. Ale trzymanie pustego pliku tylko dlatego wydaje się niepotrzebne.

Odpowiedz

16

używam null-ładowarka na wygaszania z modułów. Noop-loader może być używany do mniej kłopotliwego, jeśli-else w konfiguracji.

Spróbuj:

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

To wydawało się działać dla mnie i uważam, że najlepiej odpowiada na pytania OP. Bez zmiany kodu, nadal mam 'import foo fro 'excluded-module'' na górze mojego kodu bez zabawnego opakowania' if (DEV) '. Wyobraź sobie 'require ('excluded-module')' działa równie dobrze. –

+2

Uwaga dla innych początkujących, te ładowarki nie są zawarte w pakiecie sieci Web: 'npm install --save-dev null-loader && npm install --save-dev noop-loader' – diachedelic

+0

Uwaga2 - dodanie' -loader' na końcu nazwa programu ładującego. na przykład 'null-loader' ... –

3

Można spróbować zrobić resolve.alias w webpack.config:

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

To wciąż zmusza mnie mieć pusty moduł leżące wokół. Czystsze niż 'NormalModuleReplacementPlugin', choć :) – SimenB

+3

@Simen' npm i -D pusty-moduł' – srcspider

1

Skorzystaj WebPACK za DefinePlugin w połączeniu z normalnymi wtyczek produkcyjnych (Dedupe i zeszpecić).

Następnie w kodzie można napisać:

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

A kiedy to wybudowana w produkcji, DEBUG zostaną zastąpione dosłownym if(false) { ... } która zostanie całkowicie usunięty przez wtyczkę zeszpecić, więc test będzie tylko wymagane w kompilacji debugowania.

Oto próbka Grunt zadanie config dla grunt-webpack który ma development i production cele dla zadania:

 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

Właściwie wolę dekorowanie kodu źródłowego instrukcjami debugowania, niż skryptami narzędzi kompilacji. To sprawia, że ​​o wiele bardziej zrozumiałe dla siebie po powrocie do kodu i innych, gdy próbuje zrozumieć, skąd pochodzi migracja jQuery. –

+0

Prawda. To jednak nie działa czysto dla AMD, przynajmniej jeśli jest wymienione w oryginalnym wywołaniu 'define'. Używanie aliasu jest dokładnie takie, jak 'empty:', z tym że sam muszę utworzyć moduł 'empty'. – SimenB

Powiązane problemy