Vue가 프로젝트 프록시를 최적화하는 방법

php中世界最好的语言
풀어 주다: 2018-04-28 11:45:33
원래의
1102명이 탐색했습니다.

이번에는 Vue가 프로젝트 에이전트를 최적화하는 방법을 보여드리겠습니다. Vue가 프로젝트 에이전트를 최적화하는 주의사항은 무엇인가요?

Vue 유형 프로젝트 개발의 프로젝트 구조는 기본적으로 Vue-cli 생성 방법과 유사합니다. 이 개발 방법에서 가장 일반적으로 사용되는 모드는 모의 디버깅 또는 원격 디버깅을 위해 에이전트를 켜는 것입니다. 즉, -cli로 설정된 Vue 구성 ProxyTable을 사용하거나 Webpack-dev-server에서 제공하는 프록시 옵션을 직접 사용합니다. http-proxy 라이브러리를 사용하므로 특정 구성을 볼 수 있습니다.

https://github.com/nodejitsu/node-http-proxy#options

이러한 구성된 매개변수를 사용하면 더 유연하게 만들 수 있습니다. 더 나은 결과를 얻기 위한 구성

사용 요구 사항

로컬 개발이 현재 다음 상태에 있다고 가정합니다.

  • 로컬 개발, 데이터는 로컬 모의 서버를 사용합니다

  • 관련 권한 인터페이스는 로컬을 사용합니다. 모의 데이터, 다른 모든 인터페이스는 지정된 원격 시스템을 사용

  • 관련 권한 인터페이스는 로컬 모의 데이터를 사용하고, 다른 데이터 하위 인터페이스는 다른 원격 시스템을 사용

  • 모든 인터페이스는 동일한 원격 시스템을 사용

솔루션

먼저 고전적인 ProxyTable 작성 방법을 살펴보겠습니다.

proxyTable: {
 '/authui/': {
  target: target,
  changeOrigin: true
 },
 '/vendor/': {
  target: target,
  changeOrigin: true
 }
}
로그인 후 복사

changeOrigin 필드는 주로 요청 헤더를 변경하는 데 사용됩니다. 요구 사항 개선:

  • 로컬 개발: 대상은 로컬 호스트의 특정 포트를 가리킵니다. 호스트 확인은 절대 필요하지 않습니다

  • 일부는 로컬이고 다른 하나는 고정 원격 시스템입니다. 대부분의 원격 주소는 확인해야 하는 로컬 호스트와 원격 주소를 구성해야 합니다. 호스트

  • 둘과 동일하지만 머신에 여러 머신이 있음: 여러 머신을 수동으로 구성해야 합니다

  • 동일한 원격 머신의 경우 이 시점에서 머신을 엄격하게 검증해야 할 수도 있습니다. , IP도 도메인 이름을 사용해야 하며 시스템 호스트를 사용하기 전에 구성해야 합니다

참고: 호스트를 엄격하게 확인하고 일반 확인 호스트 간의 주요 차이점은 엄격한 확인에서 요청된 URL은 다음과 같아야 한다는 것입니다. 요청된 헤더의 호스트 구현은 직접 수정할 수 없습니다. 즉, 도메인 이름은 시스템 호스트 수준에서 구성되어야 합니다.

구체적인 요구사항을 분석한 후 구현 방법 준비를 시작하세요. 원래 개발 방법은 npm run dev를 실행하는 것입니다. 명령줄 수준에서 구성을 추가해야 하는 경우 npm run dev --param=paramvalue로 설정해야 합니다. >. npm의 스크립트 스크립트를 사용하여 실행되는 명령의 경우

매개변수는 process.env를 통해 얻을 수 없으며 process.env.npm_config_paramName을 통해 얻을 수 있습니다. npm run dev,如果我们需要在命令行层面添加配置,就需要设置为 npm run dev --param=paramvalue 的方式。对于使用 npm 的 script 脚本执行的命令,
它参数的获取无法通过 process.env 获得,而且通过 process.env.npm_config_paramName 기성품을 사용하는 명령 line 매개변수 구문 분석 라이브러리는 그다지 편리하지는 않지만 문제를 해결하기 위해 당분간은 npm과 함께 제공되는 구문 분석을 사용합니다.

요청 시작 프로세스 중에 다음 매개변수가 필요합니다.

  • host: 요청을 시작할 때 가리켜야 하는 호스트입니다. 각 컴퓨터마다 확인이 다를 수 있습니다.

  • port: 에서 전달하는 포트입니다. 프록시

  • 수신기: 사용 푸시의 원격 주소에는 IP 주소가 포함되어 있습니다. 문제를 방지하기 위해 IP 주소는 별도로 나열되지 않습니다. 그런 다음 구성을 위한 프록시 요청 사용자 정의 유형을 정의합니다.

local: 로컬 주소, 즉, localhost

rd: 원격 시스템의 주소

  1. focus: 엄격 모드, 모두 자동 정의된 유형의 프록시는 지정된 rd 시스템으로 변환되며, rd 매개변수가 존재할 때만 사용할 수 있습니다.

  2. allLocal: 사용자 정의 유형 프록시는 모두 로컬을 가리킵니다

  3. host:请求发现是否使用 host,而不是 IP 地址

总结一下(序号指向前面的需求):

  • 需要使用 host 进行访问的情形:4

  • 需要更改 host:除 localhost 外都需要更改

  • 需要对已有类型进行转换:1: 需要将所有自定义类型都转换为 local, 2和3:什么也不转换,4:所有的自定义类型全部转换为

remote 类型

这么一看,貌似 host 是不需要的,它的存在主要是针对某些 机器可能需要使用 host 的方式,所以还是保留一下。

实现

逻辑理清了就很简单了,配置文件设置为:

module.export = {
 rd1: {
  host: 'dev1.example.com',
  port: 8838,
  receiver: 'http://1.1.1.1:8888/receiver'
 },
 rd2: {
  host: 'dev2.example.com',
  port: 8838,
  receiver: 'http://1.1.1.1:8888/receiver'
 }
}
로그인 후 복사

proxyTable 配置方式

{
 proxyTable: {
  '/api1': 'remote',
  '/api2': 'rd2',
  '/auth/xx': 'local',
  '/other': 'http://example.com'
 }
}
로그인 후 복사

获取 proxyTable 的代码:

// 处理 proxyTable
const releaseConfig = require('../config/release.conf.js')
const rdConfig = releaseConfig[process.env.npm_config_rd]
const isAllRemote = process.env.npm_config_focus
const useHost = isAllRemote || process.env.npm_config_host
// 是否本机开发,本机开发 remote 会指向 local
const isAllLocal = process.env.npm_config_allLocal
module.exports = function (proxy) {
 const localUrl = `http://localhost:${proxy.localProxyPort}`
 const defaultHost = proxy.defaultRdHost || 'dev-example.com'
 const localProxyPort = proxy.localProxyPort || 8787
 const finalConfig = formatReleaseConfig(releaseConfig)
 const remote = finalConfig.remote || {}
 if (process.env.npm_config_rd) {
  if (!rdConfig) {
   throw new TypeError('RD 机器名称不存在,请在 config/release.conf.js 中进行配置')
  }
  if (!remote.ip) {
   throw new Error('请配置 rd 机器的 receiver')
  }
 }
 if (isAllRemote && !rdConfig) {
  throw new TypeError('focus 只能在提供了 rd 名称后可设置')
 }
 function formatReleaseConfig (config) {
  const result = {}
  Object.keys(config).map((key) => {
   const value = config[key]
   const ipMatch = (value.receiver || '').match(/:\/\/(.*?):\d/)
   const ip = ipMatch && ipMatch[1]
   result[key] = {
    ip,
    host: value.host || defaultHost,
    port: value.port || '8391'
   }
  })
  // 设置 remote
  if (rdConfig) {
   const ipMatch = (rdConfig.receiver || '').match(/:\/\/(.*?):\d/)
   const ip = ipMatch && ipMatch[1]
   result.remote = {
    ip,
    host: rdConfig.host || defaultHost,
    port: rdConfig.port || '8391'
   }
  }
  // 设置 local
  result.local = {
   ip: 'localhost',
   host: 'localhost',
   port: localProxyPort
  }
  return result
 }
 function setProxy (proxyTable) {
  const result = {}
  Object.keys(proxyTable).forEach((api) => {
   let type = proxyTable[api]
   const isCustomType = typeof type === 'string' && !/^http/.test(type)
   if (isCustomType && type !== 'remote' && type !== 'local' && !finalConfig[type]) {
    throw new TypeError(`代理类型${type}不正确,请提供 http 或 https 类型的接口,或者指定正确的 release 机器名称`)
   }
   if (type === 'remote' && !finalConfig.remote) {
    type = 'local'
   }
   if (isCustomType) {
    if (isAllRemote && type !== 'remote') {
     type = 'remote'
    }
    if (isAllLocal && type !== 'local') {
     type = 'local'
    }
   }
   const targetConfig = finalConfig[type]
   let target = type
   if (targetConfig) {
    target = {
     target: `http://${useHost ? targetConfig.host : targetConfig.ip}:${targetConfig.port}`,
     // 使用 host 时需要转换,其他不需要转换
     headers: {
      host: `${targetConfig.host}:${targetConfig.port}`
     }
    }
   }
   result[api] = target
  })
  return result
 }
 return {
  proxyTable: setProxy(proxy.proxyTable),
  host: remote.host || defaultHost
 }
}
로그인 후 복사

用法

用法中需要配置两种指向:系统 host 和浏览器代理 Host。
之所以要两种 host, 本质上是因为接口使用的域名
和我们的本地访问的域名是相同的,同一域名无法指向两个地址,所以相当于对浏览器端进行了拦截。
系统 host 推荐使用 switchHost 进行切换,浏览器推荐使用 whistle 进行切换。

本地开发

host 配置:无
whistle 配置:默认的域名

127.0.0.1 dev.example.com

启动命令:

npm run dev
npm run dev --allLocal
로그인 후 복사

注: 此时 proxyTable 中配置的 remote 全部转换为 local,在 allLocal 参数时将所有自定义类型转换为 local

本地 + 1 台远程

host 配置:无
whistle 配置:默认的域名
127.0.0.1 dev1.example.com
127.0.0.1 dev2.example.com
로그인 후 복사

启动命令:

npm run dev --rd=rd1
npm run dev --rd=rd1 --host
로그인 후 복사

注: --host 表示使用访问使用 host 而非 ip,使用时需要 host 地址

本地 + n 台远程

host 配置:无

whistle 配置:默认的域名

127.0.0.1 dev1.example.com

127.0.0.1 dev2.example.com

{
 proxyTable: {
  '/api1': 'rd1',
  '/api2': 'rd2',
  '/auth/xx': 'local',
  '/other': 'http://example.com'
 }
}
로그인 후 복사

proxyTable 配置:

启动命令:

npm run dev
로그인 후 복사

远程 1 台机器

host 配置:

1.1.1.1 dev1.example.com
1.1.1.1 dev2.example.com
로그인 후 복사

whistle 配置:默认的域名

127.0.0.1 dev1.example.com
127.0.0.1 dev2.example.com
로그인 후 복사

启动命令:

npm run dev --rd=rd1 --focus
로그인 후 복사

组件优化

vue 的组件化深受大家喜爱,到底组件拆到什么程度算是合理,还要因项目大小而异,小型项目可以简单几个组件搞定,甚至不用 vuex,axios 等等,如果规模较大就要细分组件,越细越好,包括布局的封装,按钮,表单,提示框,轮播等,推荐看下 Element 组件库的代码,没时间写这么详细可以直接用 Element 库,分几点进行优化

•组件有明确含义,只处理类似的业务。复用性越高越好,配置性越强越好。

•自己封装组件还是遵循配置 props 细化的规则。

•组件分类,我习惯性的按照三类划分,page、page-item 和 layout,page 是路由控制的部分,page-item 属于 page 里各个布局块如 banner、side 等等,layout 里放置多个页面至少出现两次的组件,如 icon, scrollTop 等

总结

细挖需求,可能还有更简单的方式,在大部分情况下能够减少代码修改,是 webpack 配置型的实现吧。当然,方式并不完美,尤其在 mac 下,居然不能支持 --rd xx 这种形式,可以有类似的库吧,后续可以做为深入的内容。

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

js中el表达式怎样做出非空判断

VUE对ElTableColumn进行扩展

위 내용은 Vue가 프로젝트 프록시를 최적화하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿