2014-11-06 18 views
10

Làm thế nào để đạt được tùy chọn 'proxy' (tương tự như grunt-connect-proxy) với webpack-dev-server?Webpack-dev-server với proxy bỏ qua

Tôi đang sử dụng webpackwebpack-dev-server với Grunt. Một nhiệm vụ trong Gruntfile.js (bên dưới mã) có thể khởi động máy chủ trên cổng 8080. Tôi muốn thêm thiết lập proxy cho tất cả các yêu cầu dữ liệu phụ trợ (URL ngữ cảnh/ajax/*).

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

Ông có thể cụ thể hơn? Bạn có chạy webpack-dev-server qua CLI hoặc API không? Ý bạn là gì bởi "lòng tốt" - bạn có nghĩa là tải lại trực tiếp không? Thật khó để trả lời với các ví dụ mã thực tế khi câu hỏi quá chung chung. –

Trả lời

21

Trong cấu hình webpack , bạn có thể sử dụng devServer.proxy như thế này:

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

tuyệt vời, cảm ơn bro –

+0

Tôi đã thành công với tùy chọn proxy khi sử dụng express, nhưng sau khi chuyển sang koa và sử dụng koa-webpack-dev-derver, tôi không có may mắn. Bất kỳ ý tưởng? – walkerrandophsmith

+0

Tôi không thể gỡ lỗi vấn đề với cài đặt 'devServer.proxy'. WebpackDevServer không proxy api gọi đến một vị trí khác. Tuy nhiên, bất kỳ cuộc gọi trực tiếp nào cũng đi qua, do đó, nó chắc chắn là một vấn đề về proxy-web-dev-server. Làm thế nào tôi có thể gỡ lỗi nó? – boldnik

1

Tôi đã sử dụng 'grunt-contrib-connect' và 'grunt-connect-proxy' bằng 'webpack-dev-middleware'. Vì vậy, tôi có thể có phần mềm trung gian proxy để xử lý tất cả các yêu cầu dữ liệu của tôi và phần mềm trung gian webpack để xử lý các yêu cầu tệp bó tĩnh.

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"   
     }); 
    }; 

---- Grunt TASK ----

 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 ";' đang làm trong 'prepareDevWebpackMiddleware' là gì? Điều đó có vẻ như không đúng chỗ cho một tác dụng phụ như vậy. – Andy

0

webpack-dev-server không biết làm thế nào để đối phó với nội dung của bạn, vì vậy nó có một cấu hình mà có thể ủy quyền tất cả các bạn yêu cầu nội dung xử lý máy chủ cụ thể.

ví dụ:

bạn nên chạy 'nội dung grunt' để bắt đầu máy chủ nội dung của bạn sau đó chạy 'grunt phục vụ' để bắt đầu phát triển

'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', []); 
 
};

Các vấn đề liên quan