今回は、Vue がプロジェクト エージェントを最適化する方法を説明します。Vue がプロジェクト エージェントを最適化する際の 注意事項 は何ですか? 実際のケースを見てみましょう。
Vue タイプのプロジェクト開発におけるプロジェクト構造は、基本的に Vue-cli 生成方法と似ています。この開発方法では、最も一般的に使用されるモードは、模擬デバッグまたはリモート デバッグのためにエージェントを有効にすることです。つまり、Vue を使用して -cli で設定された 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 フィールドは、主にリクエストのヘッダーを変更するために使用されます。要件の詳細化:
ローカル開発: ターゲットはローカルホストの特定のポートを指します。ホストの検証に関しては、絶対に必要ありません
一部はローカルで、もう 1 つは固定リモート マシンです。ローカルホストとリモート アドレスを設定する必要があります。ほとんどのリモート アドレスは検証する必要があります。ホスト
2 つと同じですが、マシンには複数の機能があります: 複数のマシンを手動で構成する必要があります
同じリモート マシンの場合、現時点ではマシンを厳密に検証する必要がある場合があります。 IP もドメイン名を使用する必要があり、使用する前にシステム ホストを構成する必要があります
注: ホストを厳密に検証します。通常の検証ホストとの主な違いは、厳密な検証では、要求された URL が次のとおりである必要があることです。リモート マシンのドメイン名。要求されたヘッダーのホスト実装は直接変更できません。つまり、ドメイン名はシステム ホスト レベルで構成する必要があります。
npm run dev
を実行することです。コマンド ライン レベルで構成を追加する必要がある場合は、それを npm run dev --param=paramvalue
に設定する必要があります。 >。 npm の script
スクリプトを使用して実行されるコマンドの場合、パラメーターは 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 に付属の解析を使用しています。
設定ファイル
で指定された他のタイプのオリジナルバージョンリクエストに使用されます。 ://xxx' またはオブジェクト タイプの設定では、このタイプのプロキシは処理されません
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中文网其它相关文章!
推荐阅读:
以上がVue がプロジェクト プロキシを最適化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。