webpack之devserver

334 阅读2分钟

webpack之devserver

devserver.host

指定使用一个 host。默认是 localhost。如果你希望服务器外部可访问,指定如下:0.0.0.0
module.exports = {
  //...
  devServer: {
    host: '0.0.0.0' //默认 localhost
  }
}

devserver.port

指定要监听请求的端口号

module.exports = {
  //...
  devServer: {
    port: 8080
  }
}

devserver.https

默认情况下,devserver 通过 HTTP 提供服务。也可以选择带有 HTTPS提供服务

module.exports = {
  //...
  devServer: {
    https: true
  }
}

devserver.compress

一切服务都启用 gzip 压缩

module.exports = {
  //...
  devServer: {
    compress: true
  }
}

devserver.headers

在所有响应中添加首部内容

module.exports = {
  //...
  devServer: {
    headers: {
      'abc': '1234567'
    }
  }
}

devserver.hot

启用 webpack 的 模块热替换 (HMR)功能

module.exports = {
  //...
  devServer: {
    hot: true
  }
}

devServer.clientLogLevel

控制台日志级别 string: 'none' | 'info' | 'error' | 'warning' 默认值 info

module.exports = {
  //...
  devServer: {
    clientLogLevel: 'info'
  }
}

devServer.overlay

当出现编译器错误或警告时,在浏览器中显示全屏覆盖层。默认禁用

module.exports = {
  //...
  devServer: {
    overlay: true
  }
}
​
//或者指定警告、错误的显示
module.exports = {
  //...
  devServer: {
    overlay: {
      warnings: true,
      errors: true
    }
  }
}

devserver.open

告诉 dev-server 在 server 启动后打开浏览器。默认禁用。

module.exports = {
  //...
  devServer: {
    open: true
  }
}

devServer.openPage

指定打开浏览器时的导航页面。

module.exports = {
  //...
  devServer: {
    openPage: '/index.html?ip=test', // 弹出的页面地址
  }
}

devserver.public

指定打开浏览器浏览器页面host

//获取本机IP地址
let getHost = () => {
    const ServerHost = (function getIPAdress() {
        var interfaces = require('os').networkInterfaces()
        for (var devName in interfaces) {
            var iface = interfaces[devName]
            for (var i = 0; i < iface.length; i++) {
                var alias = iface[i]
                if (alias.family === 'IPv4' && alias.address !== '127.0.0.1' && !alias.internal) {
                    return alias.address
                }
            }
        }
    })()
    return ServerHost
}

let port = 8080

module.exports = {
  //...
  devServer: {
    public: `${getHost()}:${port}`
  }
}

devserver.porxy

代理后端接口Api

请求 /api/users 会代理到 http://www.centrelink.cn:8081/user , pathRewrite 重新把请求的 /api/users 替换成 /users

module.exports = {
  //...
  devServer: {
    proxy: {
      '/api': {
        target: 'http://www.centrelink.cn:8081',
        pathRewrite: {'^/api' : ''},
      }
    }
  }
}

默认情况下,不接受运行在 HTTPS 上,且使用了无效证书的后端服务器需设置 secure : false

module.exports = {
  //...
  devServer: {
    proxy: {
      '/api': {
        target: 'https://www.centrelink.cn:8081',
        pathRewrite: {'^/api' : ''},
        secure: false  //target Api服务器使用https协议且证书无效的时候需要设置false
      }
    }
  }
}

改变请求Host

module.exports = {
  //...
  devServer: {
    proxy: {
      '/api': {
        target: 'https://www.centrelink.cn:8081',
        pathRewrite: {'^/api' : ''},
        changeOrigin: true, //改变请求头host为https://www.centrelink.cn:8081
        secure: false  //target Api服务器使用https协议且证书无效的时候需要设置false
      }
    }
  }
}
高级玩法

代理多个后端服务器Api

// 代理后端服务器群
let proxy = {
    // 后端人员01
    '/person01': {
        target: 'http://192.168.1.3:9999',
        changeOrigin: true,
        pathRewrite: { '^/cgp': '' },
        secure: false
    },

    // 后端人员02
    '/porson02': {
        target: 'http://192.168.1.4:9999',
        changeOrigin: true,
        pathRewrite: { '^/ls': '' },
        secure: false
    },

    // 公司外网测试环境
    '/test': {
        target: 'https://www.test.cn:7779',
        changeOrigin: true,
        pathRewrite: { '^/test': '' },
        secure: false
    },

    // 线上环境
    '/prd': {
        target: 'https://www.prd.com',
        changeOrigin: true,
        pathRewrite: { '^/prd': '' },
        secure: false
    }
}

module.exports = {
  //...
  devServer: {
    proxy
  }
}


// request.js

import axios from 'axios'
import faceConfig from '../../public/faceConfig'

const baseUrl = faceConfig.basePath

//获取url参数转换对象形式
function parseQuery(str = location.search) {
    let qs = str.indexOf('?') === -1 ? str : str.split('?')[1]
    if (qs.length > 0) {
        let s,
            q = {},
            arr = []
        arr = qs.split('&')
        for (let i = 0; i < arr.length; i++) {
            if (!arr[i]) continue
            s = arr[i].split('=')
            q[s[0]] = s[1]
        }
        return q
    } else {
        return {}
    }
}

const queryObj = parseQuery()

let proxy = queryObj.ip ? `/${queryObj.ip}` : ''

// 创建 axios 实例
const request = axios.create({
    baseURL: `${proxy}/${baseUrl}` // API 请求的默认前缀
    timeout: 30000 // 请求超时时间
})

完整devserver配置

//获取本机IP地址
let getHost = () => {
    const ServerHost = (function getIPAdress() {
        var interfaces = require('os').networkInterfaces()
        for (var devName in interfaces) {
            var iface = interfaces[devName]
            for (var i = 0; i < iface.length; i++) {
                var alias = iface[i]
                if (alias.family === 'IPv4' && alias.address !== '127.0.0.1' && !alias.internal) {
                    return alias.address
                }
            }
        }
    })()
    return ServerHost
}

let port = 8080


module.exports = {
  devServer: {
    host: '0.0.0.0', //默认 localhost
    port,
    https: true,
    hot: true,
    compress: true,
    clientLogLevel: 'info',
    overlay: true,
    open: true,
    openPage: '/index.html?ip=test', // 弹出的页面地址
    public: `${getHost()}:${port}`,
    proxy: {
      '/api': {
        target: 'https://www.test.com:8081',
        pathRewrite: {'^/api' : ''},
        changeOrigin: true, //改变请求头host为https://www.centrelink.cn:8081
        secure: false  //target Api服务器使用https协议且证书无效的时候需要设置false
      }
    }
  }
}