2014-11-06 2 views
10

Как достичь «прокси» (аналогично grunt-connect-proxy) с помощью webpack-dev-сервера?Webpack-dev-сервер с байпасным прокси

Я использую webpack и webpack-dev-server с Grunt. Задача в Gruntfile.js (ниже кода) позволяет запустить сервер на порту 8080. Я хочу добавить настройку прокси для всех запросов данных бэкэнд (контекстный URL/ajax/*).

 "webpack-dev-server": { 
     options: { 
      webpack: webpackConfig, 
      publicPath: "/src/assets" 
     }, 
     start: { 
      keepAlive: true, 
      watch: true    
     } 
    } 
+0

могли бы Вы более конкретно? Вы запускаете webpack-dev-сервер через CLI или API? Что вы подразумеваете под «добротой» - вы имеете в виду живую перезагрузку? Трудно ответить фактическими примерами кода, когда вопрос является таким общим. –

ответ

21

В WebPack конфигурации , вы можете использовать devServer.proxy следующим образом:

proxy: { 
    '/ajax/*': 'http://your.backend/' 
} 
+0

отлично, спасибо bro –

+0

Я был успешным с опцией прокси при использовании экспресс, но после перехода на koa и с помощью koa-webpack-dev-derver мне не повезло. Есть идеи? – walkerrandophsmith

+0

Я не могу отладить проблему с настройками 'devServer.proxy'. WebpackDevServer не вызывает прокси-вызовы api в другое место. Но любые прямые вызовы проходят, поэтому это определенно проблема проксирования webpack-dev-server. Как я могу его отладить? – boldnik

1

Я закончил с использованием 'хрюкать-вно-Коннект' и 'хрюканье-подключения прокси' с 'WebPack-DEV-промежуточного слоя'. Таким образом, у меня может быть промежуточное ПО прокси для обработки всех моих запросов данных и промежуточного программного обеспечения webpack для обработки статических запросов файла пакета.

var proxySnippet = require('grunt-connect-proxy/lib/utils').proxyRequest; 
    var mountFolder = function (connect, dir) { 
     return connect.static(require('path').resolve(dir)); 
    }; 

    var prepareDevWebpackMiddleware = function() { 

     webpackConfig.devtool = "eval-source-map"; 
     var compiler = webpack(require("./webpack.config.js")); 

     return webpackDevMiddleware(compiler, { 
      publicPath : "/assets"   
     }); 
    }; 

---- ГРУНТ ЗАДАЧА ----

 connect: { 
      options: { 
       port: 8080, 
       hostname: 'localhost', 
       livereload : true 
      }, 
      proxies: [{ 
       context: '/api', 
       host: 'localhost', 
       port: 8000 
      }], 
      livereload: { 
       options: { 
        middleware: function (connect) { 
         return [ 
          prepareDevWebpackMiddleware(), 
          proxySnippet, 
          mountFolder(connect, 'src') 
         ]; 
        } 
       } 
      } 
     } 
+0

Что такое 'webpackConfig.devtool =" eval-source-map ";' делать в 'prepareDevWebpackMiddleware'? Это похоже на неправильное место для такого побочного эффекта. – Andy

0

WebPack-DEV-сервер не знает, как бороться с вашим контентом, поэтому он имеет конфигурации, которая может замещать все ваши запросить конкретное содержимое дескриптора сервера.

, например:

вы должны запустить 'содержание черновую', чтобы запустить сервер контента затем запустить 'хрюкать служить', чтобы начать развивать

'use strict'; 
 

 
var webpackDistConfig = require('./webpack.dist.config.js'), 
 
    webpackDevConfig = require('./webpack.config.js'); 
 

 
var mountFolder = function (connect, dir) { 
 
    return connect.static(require('path').resolve(dir)); 
 
}; 
 

 
module.exports = function (grunt) { 
 
    // Let *load-grunt-tasks* require everything 
 
    require('load-grunt-tasks')(grunt); 
 

 
    // Read configuration from package.json 
 
    var pkgConfig = grunt.file.readJSON('package.json'); 
 

 
    grunt.initConfig({ 
 
    pkg: pkgConfig, 
 

 
    webpack: { 
 
     options: webpackDistConfig, 
 

 
     dist: { 
 
     cache: false 
 
     } 
 
    }, 
 

 
    'webpack-dev-server': { 
 
     options: { 
 
     hot: true, 
 
     port: 8000, 
 
     webpack: webpackDevConfig, 
 
     publicPath: '/assets/', 
 
     contentBase: {target : 'http://localhost:13800'}, 
 
     }, 
 

 
     start: { 
 
     keepAlive: true, 
 
     } 
 
    }, 
 

 
    connect: { 
 
     options: { 
 
     port: 8000, 
 
     keepalive: true, 
 
     }, 
 
     proxies: [ 
 
     { 
 
      context: '/', 
 
      host: '127.0.0.1', 
 
      port: 8031, 
 
      https: false, 
 
      xforward: false 
 
     } 
 
     ], 
 
     dev: { 
 
     options: { 
 
      port : 13800, 
 
      middleware: function (connect) { 
 
      return [ 
 
       mountFolder(connect, pkgConfig.src), 
 
       require('grunt-connect-proxy/lib/utils').proxyRequest 
 
      ]; 
 
      } 
 
     } 
 
     }, 
 
     dist: { 
 
     options: { 
 
      middleware: function (connect) { 
 
      return [ 
 
       mountFolder(connect, pkgConfig.dist), 
 
       require('grunt-connect-proxy/lib/utils').proxyRequest 
 
      ]; 
 
      } 
 
     } 
 
     } 
 
    }, 
 

 
    open: { 
 
     options: { 
 
     delay: 500 
 
     }, 
 
     dev: { 
 
     path: 'http://localhost:<%= connect.options.port %>/webpack-dev-server/' 
 
     }, 
 
     dist: { 
 
     path: 'http://localhost:<%= connect.options.port %>/' 
 
     } 
 
    }, 
 

 
    karma: { 
 
     unit: { 
 
     configFile: 'karma.conf.js' 
 
     } 
 
    }, 
 

 
    copy: { 
 
     dist: { 
 
     files: [ 
 
      // includes files within path 
 
      { 
 
      flatten: true, 
 
      expand: true, 
 
      src: ['<%= pkg.src %>/*'], 
 
      dest: '<%= pkg.dist %>/', 
 
      filter: 'isFile' 
 
      }, 
 
      { 
 
      flatten: true, 
 
      expand: true, 
 
      src: ['<%= pkg.src %>/styles/*'], 
 
      dest: '<%= pkg.dist %>/styles/' 
 
      }, 
 
      { 
 
      flatten: true, 
 
      expand: true, 
 
      src: ['<%= pkg.src %>/images/*'], 
 
      dest: '<%= pkg.dist %>/images/' 
 
      }, 
 
     ] 
 
     } 
 
    }, 
 

 
    clean: { 
 
     dist: { 
 
     files: [{ 
 
      dot: true, 
 
      src: [ 
 
      '<%= pkg.dist %>' 
 
      ] 
 
     }] 
 
     } 
 
    } 
 
    }); 
 

 
    grunt.registerTask('serve', function (target) { 
 
    if (target === 'dist') { 
 
     return grunt.task.run(['configureProxies', 'build', 'open:dist', 'connect:dist']); 
 
    } 
 

 
    grunt.task.run([ 
 
     'open:dev', 
 
     'webpack-dev-server' 
 
    ]); 
 
    }); 
 

 
    grunt.registerTask('content', ['configureProxies', 'connect:dev']); 
 

 
    grunt.registerTask('test', ['karma']); 
 

 
    grunt.registerTask('build', ['clean', 'copy', 'webpack']); 
 

 
    grunt.registerTask('default', []); 
 
};

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