20 深入Webpack-dev-server

深入Webpack-dev-server

之前介绍了通过配置DevServer可以在本地搭建服务,来对项目进行开发调试,DevServer的相关配置是服务于Webpack-dev-server模块的,本节对该部分内容进行详细介绍。

使用代理

当我们在项目中发起网络请求的时候,为了处理跨域问题避免不了要使用代理来完成请求。可以按照如下所示在DevServer中配置代理:

module.exports = {
    
    
    devServer: {
    
    
        port: 8080,
        proxy: {
    
    
            '/api': {
    
    
                target: 'http://localhost:8888',
                changeOrigin: true, // 处理跨域
                secure: false // 使用http服务的时候使用该配置
            }
        },
        // http://localhost:8080/api -> http://localhost:8888/api
    },
}

当你http://localhost:8888/有服务的时候,那么请求就会代理到该服务上去,为了演示该效果,在这里使用了Express搭建了一个简单的Http服务器,代码如下:

const express = require("express");

const app = express();
app.get('/api', (req, res) => {
    
    
    res.json({
    
     title: '测试' })
});
app.listen(8888);

Before

在每次请求发送之前,可以配置Before充当请求拦截器的角色,以此来做一些请求前的操作:

module.exports = {
    
    
    devServer: {
    
    
        port: 8080,
        proxy: {
    
    
            '/api': {
    
    
                target: 'http://localhost:8888',
                changeOrigin: true, // 处理跨域
                secure: false // 使用http服务的时候使用该配置
            }
        },
        before(app) {
    
    
            app.get('/userInfo', function (req, res) {
    
    
                res.json({
    
     name: 'Render' });
            });
        }
        // http://localhost:8080/api -> 	http://localhost:8888/api
    },
 }

当我们请求/userInfo的时候,会被Before中的配置所拦截,这里的app你可以理解为Express中创建的app实例,还可以配置After,来对请求完成之后做一些操作。

Http-proxy-middleware

代理的实现是因为使用了Http-proxy-middleware库,该库对请求的代理提供了非常好的实现。

一个简单示例如下:

const proxy = require('http-proxy-middleware');

module.exports = (app) => {
    
    
    app.use(
        '/api',
        proxy({
    
    
            target: 'http://localhost:8080',
            changeOrigin: true,
            secure: true
        })
    )
}

在DevServer中的Before中使用该代理配置,就把代理配置抽离了出去:

const proxy = require('./proxy')
module.exports = {
    
    
    devServer: {
    
    
        before(app) {
    
    
            proxy(app)
        }
    }
}

抽离DevServer配置

DevServer的使用只是在开发环境时方便本地开发,良好的实践是抽离该配置,单独进行维护。

新建webpack.devServer.js,内容如下:

module.exports = () => {
    
    
    return {
    
    
        open: true,
        before(app) {
    
    
            require('./proxy')(app)
        }
    }
}

require(’./proxy’)引入的方法就是我们上一节创建的代理配置函数。
start.js中进行如下代码编写:

const WebpackDevServer = require('webpack-dev-server');
const webpack = require('webpack');
const webpackConfig = require('./webpack.config');
const devConfig = require('./src/webpack.devServer')();
// 得到一个compiler编译对象
const compiler = webpack(webpackConfig)

// 需要一个webpack编译对象和devServer配置对象
const server = new WebpackDevServer(compiler, devConfig);
server.listen(8080);

通过new WebpackDevServer得到了一个服务器对象,然后使用该对象创建一个端口号为8080的服务,至此实现了DevServer配置的抽离。只需在package.json的scripts中进行如下配置:

{
    
    
    "scripts": {
    
    
        "dev": "node ./start.js"
    }
}

就可以成功运行DevServer。

本章节提供案例源码下载:https://gitee.com/mvc_ydb/webpack/blob/master/webpack-dev-server.zip

Guess you like

Origin blog.csdn.net/sinat_41212418/article/details/121757213