欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue 項(xiàng)目代理設(shè)置的優(yōu)化

 更新時間:2018年04月17日 09:57:37   作者:無夢灬  
這篇文章主要介紹了Vue 項(xiàng)目代理設(shè)置的優(yōu)化功能,非常不錯,具有參考借鑒價值,需要的朋友可以參考下

Vue 類的項(xiàng)目開發(fā)中項(xiàng)目結(jié)構(gòu)基本都是類似于 Vue-cli 生成的方式,這種方式開發(fā)中,最常用到的模式是開啟代理進(jìn)行 mock 調(diào)試或遠(yuǎn)程調(diào)試,也就是使用了 Vue-cli 設(shè)置的配置 proxyTable 或者直接使用 Webpack-dev-server提供的 proxy 選項(xiàng)。它是采用了 http-proxy 庫,所以具體配置可查看:

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

利用配置的這些參數(shù)我們可以做更為靈活的配置,達(dá)到更好的效果

使用需求

假設(shè)我們本地開發(fā)目前以下幾種狀態(tài):

  • 本地開發(fā),數(shù)據(jù)使用本地的 mock Server
  • 涉及權(quán)限接口使用本地 mock 數(shù)據(jù),其他全部使用指定的一臺遠(yuǎn)程機(jī)器
  • 涉及權(quán)限接口使用本地 mock 數(shù)據(jù),其他數(shù)據(jù)分接口使用不同的遠(yuǎn)程機(jī)器
  • 所有接口使用同一臺遠(yuǎn)程機(jī)器

方案

先看下經(jīng)典的proxyTable 寫法:

proxyTable: {
 '/authui/': {
  target: target,
  changeOrigin: true
 },
 '/vendor/': {
  target: target,
  changeOrigin: true
 }
}

其中用到了 changeOrigin 字段,主要是用于改變請求的 header。細(xì)化下需求:

  • 本地開發(fā):target 指向 localhost 的某個端口即可。至于 host 的驗(yàn)證肯定是不需要的
  • 部分本地,其他固定的一臺遠(yuǎn)程機(jī)器:需要配置 localhost 和遠(yuǎn)程的地址,遠(yuǎn)程地址多半是需要驗(yàn)證 host 的
  • 同二,但機(jī)器有多臺:需要手動配置多臺機(jī)器
  • 同一臺遠(yuǎn)程機(jī)器,此時機(jī)器可能要嚴(yán)格驗(yàn)證,即 IP 也必須使用域名,配置好系統(tǒng) host 才可使用

說明:嚴(yán)格驗(yàn)證 host 和普通驗(yàn)證 host 區(qū)別主要在于嚴(yán)格驗(yàn)證時,請求的 url 必須是遠(yuǎn)程機(jī)器的域名,
不能直接修改請求的 header 的 host 實(shí)現(xiàn),即必須在系統(tǒng) host 層面配置好域名。

分析完成具體需求好,就開始準(zhǔn)備實(shí)現(xiàn)的方式。原有開發(fā)方式是執(zhí)行 npm run dev,如果我們需要在命令行層面添加配置,就需要設(shè)置為 npm run dev --param=paramvalue 的方式。對于使用 npm 的 script 腳本執(zhí)行的命令,
它參數(shù)的獲取無法通過 process.env 獲得,而且通過 process.env.npm_config_paramName 的方式獲取,
使用現(xiàn)成的命令行參數(shù)解析庫也不是很方便,但為了省事,暫時還是使用 npm 自帶的解析。

請求發(fā)起過程中需要以下幾個參數(shù):

  • host: 發(fā)起請求需要指向的 host,可能每臺機(jī)器驗(yàn)證并不相同
  • port: 代理轉(zhuǎn)發(fā)的端口
  • receiver: 用于 push 的遠(yuǎn)程地址,內(nèi)包含了 ip 地址,為了省事,沒有單獨(dú)列出 ip 地址

然后定義代理請求自定義類型,用于配置:

  • local: 本地地址,即 localhost
  • remote: 指定的遠(yuǎn)程機(jī)器
  • 其他自定義類型:用于在配置文件中已經(jīng)指定的其他類型
  • 原版本的請求,如 'http://xxx' 或者 Object 類型的配置,此類代理永不處理

根據(jù)需要,我們添加以下幾個參數(shù)用于控制代理指向地址:

  1. rd: 遠(yuǎn)程機(jī)器的地址
  2. focus: 嚴(yán)格模式,所有自定義類型的代理轉(zhuǎn)換為指定的 rd 機(jī)器,只在存在 rd 參數(shù)時可用
  3. allLocal:自定義類型代理全部指向本地
  4. host:請求發(fā)現(xiàn)是否使用 host,而不是 IP 地址

總結(jié)一下(序號指向前面的需求):

  • 需要使用 host 進(jìn)行訪問的情形:4
  • 需要更改 host:除 localhost 外都需要更改
  • 需要對已有類型進(jìn)行轉(zhuǎn)換:1: 需要將所有自定義類型都轉(zhuǎn)換為 local, 2和3:什么也不轉(zhuǎn)換,4:所有的自定義類型全部轉(zhuǎn)換為

remote 類型

這么一看,貌似 host 是不需要的,它的存在主要是針對某些 機(jī)器可能需要使用 host 的方式,所以還是保留一下。

實(shí)現(xiàn)

邏輯理清了就很簡單了,配置文件設(shè)置為:

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
// 是否本機(jī)開發(fā),本機(jī)開發(fā) 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 機(jī)器名稱不存在,請?jiān)?config/release.conf.js 中進(jìn)行配置')
  }
  if (!remote.ip) {
   throw new Error('請配置 rd 機(jī)器的 receiver')
  }
 }
 if (isAllRemote && !rdConfig) {
  throw new TypeError('focus 只能在提供了 rd 名稱后可設(shè)置')
 }
 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'
   }
  })
  // 設(shè)置 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'
   }
  }
  // 設(shè)置 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}不正確,請?zhí)峁?http 或 https 類型的接口,或者指定正確的 release 機(jī)器名稱`)
   }
   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 時需要轉(zhuǎn)換,其他不需要轉(zhuǎn)換
     headers: {
      host: `${targetConfig.host}:${targetConfig.port}`
     }
    }
   }
   result[api] = target
  })
  return result
 }
 return {
  proxyTable: setProxy(proxy.proxyTable),
  host: remote.host || defaultHost
 }
}

用法

用法中需要配置兩種指向:系統(tǒng) host 和瀏覽器代理 Host。
之所以要兩種 host, 本質(zhì)上是因?yàn)榻涌谑褂玫挠蛎?br /> 和我們的本地訪問的域名是相同的,同一域名無法指向兩個地址,所以相當(dāng)于對瀏覽器端進(jìn)行了攔截。
系統(tǒng) host 推薦使用 switchHost 進(jìn)行切換,瀏覽器推薦使用 whistle 進(jìn)行切換。

本地開發(fā)

host 配置:無
whistle 配置:默認(rèn)的域名

127.0.0.1 dev.example.com

啟動命令:

npm run dev
npm run dev --allLocal

注: 此時 proxyTable 中配置的 remote 全部轉(zhuǎn)換為 local,在 allLocal 參數(shù)時將所有自定義類型轉(zhuǎn)換為 local

本地 + 1 臺遠(yuǎn)程

host 配置:無
whistle 配置:默認(rèn)的域名
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 臺遠(yuǎn)程

host 配置:無

whistle 配置:默認(rèn)的域名

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

遠(yuǎn)程 1 臺機(jī)器

host 配置:

1.1.1.1 dev1.example.com
1.1.1.1 dev2.example.com

whistle 配置:默認(rèn)的域名

127.0.0.1 dev1.example.com
127.0.0.1 dev2.example.com

啟動命令:

npm run dev --rd=rd1 --focus

組件優(yōu)化

vue 的組件化深受大家喜愛,到底組件拆到什么程度算是合理,還要因項(xiàng)目大小而異,小型項(xiàng)目可以簡單幾個組件搞定,甚至不用 vuex,axios 等等,如果規(guī)模較大就要細(xì)分組件,越細(xì)越好,包括布局的封裝,按鈕,表單,提示框,輪播等,推薦看下 Element 組件庫的代碼,沒時間寫這么詳細(xì)可以直接用 Element 庫,分幾點(diǎn)進(jìn)行優(yōu)化

•組件有明確含義,只處理類似的業(yè)務(wù)。復(fù)用性越高越好,配置性越強(qiáng)越好。

•自己封裝組件還是遵循配置 props 細(xì)化的規(guī)則。

•組件分類,我習(xí)慣性的按照三類劃分,page、page-item 和 layout,page 是路由控制的部分,page-item 屬于 page 里各個布局塊如 banner、side 等等,layout 里放置多個頁面至少出現(xiàn)兩次的組件,如 icon, scrollTop 等

總結(jié)

細(xì)挖需求,可能還有更簡單的方式,在大部分情況下能夠減少代碼修改,是 webpack 配置型的實(shí)現(xiàn)吧。當(dāng)然,方式并不完美,尤其在 mac 下,居然不能支持 --rd xx 這種形式,可以有類似的庫吧,后續(xù)可以做為深入的內(nèi)容。

以上所述是小編給大家介紹的Vue 項(xiàng)目代理設(shè)置的優(yōu)化,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • vue2安裝tailwindcss的詳細(xì)步驟

    vue2安裝tailwindcss的詳細(xì)步驟

    這篇文章主要介紹了vue2安裝tailwindcss,本文分步驟結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • Vue+Three加載glb文件報(bào)錯問題及解決

    Vue+Three加載glb文件報(bào)錯問題及解決

    當(dāng)使用Three.js加載GLB模型時,遇到加載錯誤常常是路徑問題,解決方案:1. 將GLB模型文件置于public目錄,避免打包時路徑編碼變化;2. 從node_modules的three庫中復(fù)制draco解碼器至public目錄;3. 確認(rèn)場景、攝像機(jī)和光源設(shè)置正確
    2024-10-10
  • 詳解Vue中雙向綁定原理及簡單實(shí)現(xiàn)

    詳解Vue中雙向綁定原理及簡單實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了Vue中雙向綁定原理及簡單實(shí)現(xiàn),文中的示例代碼講解詳細(xì),對我們深入了解Vue有一定的幫助,需要的可以參考一下
    2023-05-05
  • VUE 自定義組件模板的方法詳解

    VUE 自定義組件模板的方法詳解

    這篇文章主要介紹了VUE 自定義組件模板的方法,結(jié)合實(shí)例形式詳細(xì)分析了vue.js自定義組件模板的相關(guān)步驟與操作技巧,需要的朋友可以參考下
    2019-08-08
  • Vue 2源碼解讀$mount函數(shù)原理

    Vue 2源碼解讀$mount函數(shù)原理

    這篇文章主要為大家介紹了Vue 2源碼解讀$mount原理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Vue中安裝element-ui失敗問題原因及解決

    Vue中安裝element-ui失敗問題原因及解決

    Vue中安裝element-ui失敗問題原因及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • vue中input type=file上傳后@change事件無效的解決方案

    vue中input type=file上傳后@change事件無效的解決方案

    這篇文章主要介紹了vue中input type=file上傳后@change事件無效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • vue實(shí)現(xiàn)圖片拖拽功能

    vue實(shí)現(xiàn)圖片拖拽功能

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)圖片拖拽功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Vue2父子組件傳值舉例詳解

    Vue2父子組件傳值舉例詳解

    這篇文章主要給大家介紹了關(guān)于Vue2父子組件傳值的相關(guān)資料,Vue 2.0 中父子組件之間的傳值可以通過屬性(prop)和事件(event)實(shí)現(xiàn),文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • vue2.0使用swiper組件實(shí)現(xiàn)輪播效果

    vue2.0使用swiper組件實(shí)現(xiàn)輪播效果

    這篇文章主要為大家詳細(xì)介紹了vue2.0使用swiper組件實(shí)現(xiàn)輪播效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11

最新評論