欢迎光临嘉善九九信息网
详情描述
修改Vue2项目运行端口号配置后端代理教程

一、修改Vue2项目端口号

方法1:通过package.json配置(推荐)

// package.json
{
  "scripts": {
    "serve": "vue-cli-service serve --port 8081",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint"
  }
}

运行命令:

npm run serve  # 将在8081端口启动

方法2:通过vue.config.js配置

// vue.config.js
module.exports = {
  devServer: {
    port: 8081,  // 设置端口号为8081
    host: 'localhost',  // 指定主机
    open: true,  // 启动后自动打开浏览器
    https: false  // 是否使用https
  }
}

方法3:命令行参数临时修改

# 临时指定端口
npm run serve -- --port 8081

# 或使用完整命令
vue-cli-service serve --port 8081 --host 0.0.0.0

方法4:环境变量配置

创建.env.development文件:

# .env.development
PORT=8081
HOST=localhost

二、配置后端代理

基础代理配置

// vue.config.js
module.exports = {
  devServer: {
    port: 8081,

    // 代理配置
    proxy: {
      // 代理所有以/api开头的请求
      '/api': {
        target: 'http://localhost:3000',  // 后端服务器地址
        changeOrigin: true,  // 是否改变源地址
        pathRewrite: {
          '^/api': ''  // 重写路径,移除/api前缀
        }
      }
    }
  }
}

多代理配置

// vue.config.js
module.exports = {
  devServer: {
    port: 8081,

    proxy: {
      // 用户服务代理
      '/user-api': {
        target: 'http://localhost:3001',
        changeOrigin: true,
        pathRewrite: {
          '^/user-api': '/api'
        }
      },

      // 商品服务代理
      '/product-api': {
        target: 'http://localhost:3002',
        changeOrigin: true,
        pathRewrite: {
          '^/product-api': '/api'
        }
      },

      // 文件上传代理
      '/upload': {
        target: 'http://localhost:3003',
        changeOrigin: true
      }
    }
  }
}

完整示例:带WebSocket和详细配置

// vue.config.js
const path = require('path')

module.exports = {
  devServer: {
    port: 8081,
    host: 'localhost',
    open: true,
    hot: true,  // 热更新
    compress: true,  // 开启gzip压缩
    overlay: {  // 错误显示在页面上
      warnings: true,
      errors: true
    },
    headers: {
      'Access-Control-Allow-Origin': '*',
    },

    proxy: {
      '/api': {
        target: 'http://localhost:3000',
        changeOrigin: true,
        secure: false,  // 如果是https接口,需要配置这个参数
        pathRewrite: {
          '^/api': ''
        },
        logLevel: 'debug',  // 打印代理日志

        // 自定义代理响应头
        onProxyRes: function(proxyRes, req, res) {
          proxyRes.headers['x-proxy-by'] = 'vue-cli';
        }
      },

      // WebSocket代理
      '/ws': {
        target: 'ws://localhost:3001',
        ws: true,  // 启用WebSocket代理
        changeOrigin: true,
        pathRewrite: {
          '^/ws': ''
        }
      }
    }
  }
}

三、在项目中使用代理

1. 配置axios

// src/utils/request.js
import axios from 'axios'

// 创建axios实例
const service = axios.create({
  baseURL: process.env.NODE_ENV === 'development' ? '/api' : 'https://api.yourdomain.com',
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json'
  }
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 在发送请求之前做些什么
    const token = localStorage.getItem('token')
    if (token) {
      config.headers['Authorization'] = 'Bearer ' + token
    }
    return config
  },
  error => {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    // 对响应数据做点什么
    return response.data
  },
  error => {
    // 对响应错误做点什么
    return Promise.reject(error)
  }
)

export default service

2. 在组件中使用

// src/api/user.js
import request from '@/utils/request'

export function login(data) {
  return request({
    url: '/auth/login',
    method: 'post',
    data
  })
}

export function getUserInfo() {
  return request({
    url: '/user/info',
    method: 'get'
  })
}

// src/views/Login.vue
<script>
import { login } from '@/api/user'

export default {
  methods: {
    async handleLogin() {
      try {
        const result = await login({
          username: this.username,
          password: this.password
        })
        console.log('登录成功:', result)
      } catch (error) {
        console.error('登录失败:', error)
      }
    }
  }
}
</script>

四、常见问题解决方案

1. 代理不生效

检查步骤:

// vue.config.js
module.exports = {
  devServer: {
    proxy: {
      '/api': {
        target: 'http://localhost:3000',
        changeOrigin: true,
        logLevel: 'debug',  // 添加这行查看代理日志
        onProxyReq: (proxyReq, req, res) => {
          console.log('代理请求:', req.url)
        }
      }
    }
  }
}

2. 跨域问题

如果代理后仍有跨域问题:

devServer: {
  proxy: {
    '/api': {
      target: 'http://localhost:3000',
      changeOrigin: true,

      // 设置CORS头
      onProxyRes: function(proxyRes) {
        proxyRes.headers['Access-Control-Allow-Origin'] = '*'
        proxyRes.headers['Access-Control-Allow-Methods'] = 'GET,POST,PUT,DELETE'
        proxyRes.headers['Access-Control-Allow-Headers'] = 'Content-Type,Authorization'
      }
    }
  }
}

3. 配置区分环境

// vue.config.js
const targetMap = {
  development: 'http://localhost:3000',
  test: 'http://test-api.example.com',
  production: 'https://api.example.com'
}

module.exports = {
  devServer: {
    port: process.env.VUE_APP_PORT || 8081,
    proxy: {
      '/api': {
        target: targetMap[process.env.NODE_ENV] || targetMap.development,
        changeOrigin: true
      }
    }
  }
}

五、其他相关配置

1. 环境变量配置

# .env.development
VUE_APP_API_BASE=/api
VUE_APP_WS_BASE=/ws
PORT=8081

2. 使用配置文件

// config/proxy.config.js
module.exports = {
  dev: {
    '/api': {
      target: 'http://localhost:3000',
      changeOrigin: true
    }
  },
  test: {
    '/api': {
      target: 'http://test-api.example.com',
      changeOrigin: true
    }
  }
}

// vue.config.js
const proxyConfig = require('./config/proxy.config.js')

module.exports = {
  devServer: {
    port: 8081,
    proxy: proxyConfig[process.env.NODE_ENV] || proxyConfig.dev
  }
}

总结

通过上述配置,您可以:

✅ 轻松修改Vue2项目的运行端口 ✅ 配置多环境的后端代理 ✅ 解决开发环境跨域问题 ✅ 实现更复杂的代理需求

记得修改配置后需要重启开发服务器:

npm run serve

如果遇到任何问题,检查浏览器控制台和终端日志,通常会有详细的错误提示。

相关推荐
2026年直播带货的收益结构可能发生哪些变化,个人主播该如何适应?
2026年直播带货的收益结构可能发生哪些变化,个人主播该如何适应?
社区垃圾分类积分兑换制度如何设计更为公平与实用?
社区垃圾分类积分兑换制度如何设计更为公平与实用?
熊类家族的全球分布:从北极冰盖到热带雨林的生存适应策略
熊类家族的全球分布:从北极冰盖到热带雨林的生存适应策略
不结果不换叶的“另类植物”:百岁兰靠什么在沙漠中代代相传?
不结果不换叶的“另类植物”:百岁兰靠什么在沙漠中代代相传?
大广高速纵穿南北7省:车轮碾过之处藏着哪些鲜为人知的民俗智慧
大广高速纵穿南北7省:车轮碾过之处藏着哪些鲜为人知的民俗智慧
动力电池新增300次快充循环测试,长期依赖快充的车主该怎么办?
动力电池新增300次快充循环测试,长期依赖快充的车主该怎么办?
商铺被要求分摊小区公摊水电,物业把日常充水捆绑进去合规吗?
商铺被要求分摊小区公摊水电,物业把日常充水捆绑进去合规吗?
我们看到的龙吸水水柱,真的是海水被吸上去了还是只是水汽凝结?
我们看到的龙吸水水柱,真的是海水被吸上去了还是只是水汽凝结?
每天进出小区都要刷的门禁卡,它内部到底藏着什么结构,为啥能一靠就开门?
每天进出小区都要刷的门禁卡,它内部到底藏着什么结构,为啥能一靠就开门?
淋浴区防跌扶手横装还是竖装,湿手抓握怎么更稳当?
淋浴区防跌扶手横装还是竖装,湿手抓握怎么更稳当?
2026年技能提升补贴对于参保年限的要求是否有新的调整变化?
2026年技能提升补贴对于参保年限的要求是否有新的调整变化?
为什么监管和平台都强调封签要“一次性、拆开无法复原”,这背后是在防哪些配送风险?
为什么监管和平台都强调封签要“一次性、拆开无法复原”,这背后是在防哪些配送风险?
在线上平台注册或认证时,遇到需要人脸识别的情况该怎么办?
在线上平台注册或认证时,遇到需要人脸识别的情况该怎么办?
未来社区规划中,人车分流是否会与“共享街道”等理念结合出新模式?
未来社区规划中,人车分流是否会与“共享街道”等理念结合出新模式?
48队扩军后强弱断层明显,一边倒比赛变多,这届的观赏性会不会被稀释?
48队扩军后强弱断层明显,一边倒比赛变多,这届的观赏性会不会被稀释?
冲浪圈说的绿浪和白浪到底怎么分,为什么老手都盯着绿浪抓?
冲浪圈说的绿浪和白浪到底怎么分,为什么老手都盯着绿浪抓?
孩子不满两周岁离婚,抚养权是不是原则上都会判给母亲一方?
孩子不满两周岁离婚,抚养权是不是原则上都会判给母亲一方?
拍立得相纸显影后白边轻微发黄是正常的吗,什么样的情况才算真的坏了?
拍立得相纸显影后白边轻微发黄是正常的吗,什么样的情况才算真的坏了?
从废旧衣物到再生面料,整个过程的成本比使用原生原料更高吗?
从废旧衣物到再生面料,整个过程的成本比使用原生原料更高吗?