検索

Vue プロジェクトを最適化する方法

Jun 08, 2018 am 10:46 AM
vuevueプロジェクトの最適化最適化

今回は、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 に付属の解析を使用しています。

リクエスト開始プロセス中に次のパラメータが必要です:

  • host: リクエストを開始するときに参照する必要があるホスト。検証はマシンごとに異なる場合があります。

  • port: によって転送されるポート。プロキシ

  • 受信者: プッシュのリモート アドレスには IP アドレスが含まれています。次に、設定用のプロキシ リクエストのカスタム タイプを定義します。

ローカル アドレス。つまり、localhost

  • remote: 指定されたリモートマシン

  • その他のカスタムタイプ: 設定ファイルで指定されている他のタイプに使用されます

  • リクエストの元のバージョン (例: 'http:// xxx' またはオブジェクト タイプ設定の場合、このタイプのプロキシは処理されません

  • 必要に応じて、プロキシを指すアドレスを制御する次のパラメータを追加します:

rd: リモート マシンのアドレス

  1. focus: 厳密モード、すべてのカスタム タイプ プロキシは指定された rd マシンに変換され、rd パラメーターが存在する場合にのみ使用可能

  2. allLocal: カスタム タイプのプロキシはすべてローカルを指します

  3. host: かどうかを検出するリクエストIP アドレスの代わりにホストを使用します

  4. 概要 見てみましょう (シリアル番号は前の要件を示しています):

アクセスにホストを使用する必要がある状況: 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 等

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

    推荐阅读:

    redux-thunk实战项目案例详解

    如何使用Angular数据绑定机制

    以上がVue プロジェクトを最適化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    JavaScript in Action:実際の例とプロジェクトJavaScript in Action:実際の例とプロジェクトApr 19, 2025 am 12:13 AM

    現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。

    JavaScriptとWeb:コア機能とユースケースJavaScriptとWeb:コア機能とユースケースApr 18, 2025 am 12:19 AM

    Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。

    JavaScriptエンジンの理解:実装の詳細JavaScriptエンジンの理解:実装の詳細Apr 17, 2025 am 12:05 AM

    JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

    Python vs. JavaScript:学習曲線と使いやすさPython vs. JavaScript:学習曲線と使いやすさApr 16, 2025 am 12:12 AM

    Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

    Python vs. JavaScript:コミュニティ、ライブラリ、リソースPython vs. JavaScript:コミュニティ、ライブラリ、リソースApr 15, 2025 am 12:16 AM

    PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

    C/CからJavaScriptへ:すべてがどのように機能するかC/CからJavaScriptへ:すべてがどのように機能するかApr 14, 2025 am 12:05 AM

    C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

    JavaScriptエンジン:実装の比較JavaScriptエンジン:実装の比較Apr 13, 2025 am 12:05 AM

    さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

    ブラウザを超えて:現実世界のJavaScriptブラウザを超えて:現実世界のJavaScriptApr 12, 2025 am 12:06 AM

    現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。

    See all articles

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

    リアルなヌード写真を作成する AI 搭載アプリ

    AI Clothes Remover

    AI Clothes Remover

    写真から衣服を削除するオンライン AI ツール。

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    AI Hentai Generator

    AI Hentai Generator

    AIヘンタイを無料で生成します。

    ホットツール

    メモ帳++7.3.1

    メモ帳++7.3.1

    使いやすく無料のコードエディター

    SecLists

    SecLists

    SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

    PhpStorm Mac バージョン

    PhpStorm Mac バージョン

    最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

    AtomエディタMac版ダウンロード

    AtomエディタMac版ダウンロード

    最も人気のあるオープンソースエディター

    ZendStudio 13.5.1 Mac

    ZendStudio 13.5.1 Mac

    強力な PHP 統合開発環境