検索

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エンジン:実装の比較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デバイス制御に使用されます。

    next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)Apr 11, 2025 am 08:23 AM

    私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

    next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)Apr 11, 2025 am 08:22 AM

    この記事では、許可によって保護されたバックエンドとのフロントエンド統合を示し、next.jsを使用して機能的なedtech SaaSアプリケーションを構築します。 FrontEndはユーザーのアクセス許可を取得してUIの可視性を制御し、APIリクエストがロールベースに付着することを保証します

    JavaScript:Web言語の汎用性の調査JavaScript:Web言語の汎用性の調査Apr 11, 2025 am 12:01 AM

    JavaScriptは、現代のWeb開発のコア言語であり、その多様性と柔軟性に広く使用されています。 1)フロントエンド開発:DOM操作と最新のフレームワーク(React、Vue.JS、Angularなど)を通じて、動的なWebページとシングルページアプリケーションを構築します。 2)サーバー側の開発:node.jsは、非ブロッキングI/Oモデルを使用して、高い並行性とリアルタイムアプリケーションを処理します。 3)モバイルおよびデスクトップアプリケーション開発:クロスプラットフォーム開発は、反応および電子を通じて実現され、開発効率を向上させます。

    JavaScriptの進化:現在の傾向と将来の見通しJavaScriptの進化:現在の傾向と将来の見通しApr 10, 2025 am 09:33 AM

    JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。

    javascriptの分解:それが何をするのか、なぜそれが重要なのかjavascriptの分解:それが何をするのか、なぜそれが重要なのかApr 09, 2025 am 12:07 AM

    JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

    pythonまたはjavascriptの方がいいですか?pythonまたはjavascriptの方がいいですか?Apr 06, 2025 am 12:14 AM

    Pythonはデータサイエンスや機械学習により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、簡潔な構文とリッチライブラリエコシステムで知られており、データ分析とWeb開発に適しています。 2。JavaScriptは、フロントエンド開発の中核です。 node.jsはサーバー側のプログラミングをサポートしており、フルスタック開発に適しています。

    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ヘンタイを無料で生成します。

    ホットツール

    mPDF

    mPDF

    mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

    SecLists

    SecLists

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

    EditPlus 中国語クラック版

    EditPlus 中国語クラック版

    サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

    SublimeText3 Linux 新バージョン

    SublimeText3 Linux 新バージョン

    SublimeText3 Linux 最新バージョン

    Dreamweaver Mac版

    Dreamweaver Mac版

    ビジュアル Web 開発ツール