2015-04-22 3 views
11

Я хотел бы такую ​​же функциональность как RequireJS empty:http://requirejs.org/docs/optimization.html#emptyИсключить модуль из WebPack пачке

Мой вариант использования является то, что я включаю jquery-migrate в развитии, но я хотел бы, чтобы исключить это, когда построен для производства.

Использование IgnorePlugin просто делает его не включенным, а когда require Вводя его в код, он затем выдает ошибку (Uncaught Error: Cannot find module "jquery-migrate").

Что бы я хотел сделать, так это просто вернуть неопределенный или что-то подобное (например, empty: в RequireJS). Id нравится не касаться импорта в коде, просто настраивая его, чтобы вернуть undefined.

EDIT: Использование NormalModuleReplacementPlugin работает, если я указываю замену на пустой файл. Но держать пустой файл вокруг только для этого кажется ненужным.

ответ

16

Я использую нуль-загрузчик для гашения модулей. Noop-loader можно использовать для менее неудобного if-else в конфигурации.

Try:

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

Казалось, это сработало для меня, и я думаю, что ответы на вопросы лучше всего. Никаких изменений в коде, у меня все еще есть 'import foo fro 'excluded-module'' в верхней части моего кода без смешной' if (DEV) 'wrapper. Представьте, что 'require ('excluded-module')' работает так же хорошо. –

+2

Примечание для других новичков, эти загрузчики не включены в webpack: 'npm install --save-dev null-loader && npm install --save-dev noop-loader' – diachedelic

+0

Note2 - добавление' -loader' в конце имя загрузчика. например 'null-loader' ... –

3

Вы можете попробовать сделать resolve.alias в webpack.config:

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

Это все еще заставляет меня иметь пустой модуль валяется. Чище, чем 'NormalModuleReplacementPlugin', хотя :) – SimenB

+3

@Simen' npm i -D empty-module' – srcspider

1

Используйте WebPack в DefinePlugin в сочетании с обычными производственными плагинами (Dedupe и уродовать).

Тогда в вашем коде, вы можете написать:

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

И когда он построен в производстве, то DEBUG будет заменен буквальным if(false) { ... }, который будет полностью удален с помощью уродовать плагина, так test будет только требуется в отладочной сборке.

Вот пример Grunt задача конфигурация для grunt-webpack, который имеет development и production цели для выполнения этой задачи:

 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

Я действительно предпочитаю украшать исходный код операциями отладки, а не скриптами инструмента сборки. Это делает его намного более понятным для себя после возврата кода и других, когда вы пытаетесь понять, откуда идет эта jQuery-migrate. –

+0

Правда. Это не работает чисто для AMD, хотя, по крайней мере, если указано в исходном вызове 'define'. Использование псевдонима в точности как 'empty:', за исключением того, что я должен сам создать модуль 'empty'. – SimenB

Смежные вопросы