Vueプロジェクトのパフォーマンス最適化手法

序文:

        関連情報を整理し、一緒に進歩する

目次:

序文

1つ、gzip圧縮

1. npm icompression-webpack-plugin-Dをインストールします

2.vue.config.jsファイルでの構成

3. npm runbuildを実行します

4.パッケージ分析を追加して、より具体的に表示します

npm runbuild--reportを実行します

5.参考資料:

2、遅延読み込みのルーティング(オンデマンドでの読み込み)

1.ルーティング構成では、インポートメソッドがルーティング遅延読み込みを実現します

2.参考資料

2.サードパーティプラグインのオンデマンド導入(オンデマンドロード)

1.プラグインをインストールします

2..babelrcに構成を追加します

3.コンポーネントをオンデマンドでロードします

4.参考資料:

3、インターフェース要求を減らす

1.ルートがジャンプまたは更新を繰り返すたびに、要求がサーバーに送信されたときに送信された最後のインターフェース要求をキャンセルします

2.キープアライブページキャッシュ

3.防振とスロットル

1.防振工具タイプ方式梱包

2.スロットルツールタイプ方式のパッケージング

第4に、Object.freeze()を使用して、vueロングリストのパフォーマンスを最適化します。

総括する

参考資料:https://blog.csdn.net/weixin_50856920/article/details/112254038


 

1つ、gzip圧縮

Gizp圧縮は、ファイルサイズを小さくすることで読み込み速度を向上させるhttpリクエストの最適化方法です。html、js、cssファイル、さらにはjsonデータも圧縮できるため、ボリュームを60%以上削減できます。(バックエンドのサポートが必要)
リクエストヘッダー

1.インストールnpm i compression-webpack-plugin -D

2. で設定vue.config.jsファイル

<span style="color:#000000"><code class="language-javascript"><span style="color:#5c6370">// 导包</span>
<span style="color:#c678dd">const</span> CompressionWebpackPlugin <span style="color:#669900">=</span> <span style="color:#61aeee">require</span><span style="color:#999999">(</span><span style="color:#669900">'compression-webpack-plugin'</span><span style="color:#999999">)</span>
<span style="color:#5c6370">// 匹配文件名</span>
<span style="color:#c678dd">const</span> productionGzipExtensions <span style="color:#669900">=</span> <span style="color:#98c379">/\.(js|css|json|txt|html|ico|svg)(\?.*)?$/i</span>
<span style="color:#5c6370">// 配置</span>
module<span style="color:#999999">.</span>exports <span style="color:#669900">=</span> <span style="color:#999999">{</span>
 configureWebpack<span style="color:#999999">:</span> config <span style="color:#669900">=></span> <span style="color:#999999">{</span>
   <span style="color:#c678dd">if</span> <span style="color:#999999">(</span>process<span style="color:#999999">.</span>env<span style="color:#999999">.</span><span style="color:#98c379">NODE_ENV</span> <span style="color:#669900">===</span> <span style="color:#669900">'production'</span><span style="color:#999999">)</span> <span style="color:#999999">{</span>
     <span style="color:#c678dd">return</span> <span style="color:#999999">{</span>
       plugins<span style="color:#999999">:</span> <span style="color:#999999">[</span>
         <span style="color:#c678dd">new</span> CompressionWebpackPlugin<span style="color:#999999">(</span><span style="color:#999999">{</span>
           filename<span style="color:#999999">:</span> <span style="color:#669900">'[path].gz[query]'</span><span style="color:#999999">,</span>
           algorithm<span style="color:#999999">:</span> <span style="color:#669900">'gzip'</span><span style="color:#999999">,</span>  <span style="color:#5c6370">// 默认为gzip</span>
           test<span style="color:#999999">:</span> productionGzipExtensions<span style="color:#999999">,</span>
           threshold<span style="color:#999999">:</span> <span style="color:#98c379">2048</span><span style="color:#999999">,</span> <span style="color:#5c6370">// 对超过2k的数据进行压缩 </span>
           minRatio<span style="color:#999999">:</span> <span style="color:#98c379">0.8</span><span style="color:#999999">,</span>  <span style="color:#5c6370">// 仅压缩比该比率更好的(minRatio = Compressed Size / Original Size)</span>
           deleteOriginalAssets<span style="color:#999999">:</span> <span style="color:#56b6c2">false</span>  <span style="color:#5c6370">// 是否删除原文件</span>
         <span style="color:#999999">}</span><span style="color:#999999">)</span>
       <span style="color:#999999">]</span>
     <span style="color:#999999">}</span>
   <span style="color:#999999">}</span>
 <span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>

3.実行npm run build

gzip圧縮後、gzip圧縮により、Vueホームページの読み込み速度が大幅に向上します。圧縮の前後は次のとおりです。
gzip圧縮後

4.パッケージ分析を追加して、より具体的に表示します

<span style="color:#000000"><code class="language-javascript"><span style="color:#c678dd">const</span> BundleAnalyzerPlugin <span style="color:#669900">=</span> <span style="color:#61aeee">require</span><span style="color:#999999">(</span><span style="color:#669900">'webpack-bundle-analyzer'</span><span style="color:#999999">)</span><span style="color:#999999">.</span>BundleAnalyzerPlugin
module<span style="color:#999999">.</span>exports <span style="color:#669900">=</span> <span style="color:#999999">{</span>
   <span style="color:#5c6370">// 构建体积分析</span>
   chainWebpack<span style="color:#999999">:</span> config <span style="color:#669900">=></span> <span style="color:#999999">{</span>
     config
       <span style="color:#999999">.</span><span style="color:#61aeee">plugin</span><span style="color:#999999">(</span><span style="color:#669900">'webpack-bundle-analyzer'</span><span style="color:#999999">)</span>
       <span style="color:#999999">.</span><span style="color:#61aeee">use</span><span style="color:#999999">(</span>BundleAnalyzerPlugin<span style="color:#999999">)</span>
       <span style="color:#999999">.</span><span style="color:#61aeee">init</span><span style="color:#999999">(</span>Plugin <span style="color:#669900">=></span> <span style="color:#c678dd">new</span> Plugin<span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">)</span>
   <span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>

実施したnpm run build --report
gzip圧縮構造のボリューム分析

5.参考資料:

CompressionWebpackプラグイン

2、遅延読み込みのルーティング(オンデマンドでの読み込み)

パッケージ化してアプリケーションを構築すると、JavaScriptパッケージが非常に大きくなり、ページの読み込みに影響します。異なるルートに対応するコンポーネントを異なるコードブロックに分割し、ルートにアクセスしたときに対応するコンポーネントをロードできれば、より効率的になります。

1.ルーティング構成では、インポートメソッドがルーティング遅延読み込みを実現します

コードは次のとおりです(例):

<span style="color:#000000"><code class="language-c"><span style="color:#c678dd">const</span> router <span style="color:#669900">=</span> new <span style="color:#61aeee">VueRouter</span><span style="color:#999999">(</span><span style="color:#999999">{</span>
  routes<span style="color:#999999">:</span> <span style="color:#999999">[</span>
    <span style="color:#999999">{</span> path<span style="color:#999999">:</span> <span style="color:#669900">'/foo'</span><span style="color:#999999">,</span> component<span style="color:#999999">:</span> <span style="color:#999999">(</span><span style="color:#999999">)</span> <span style="color:#669900">=</span><span style="color:#669900">></span> <span style="color:#61aeee">import</span><span style="color:#999999">(</span><span style="color:#669900">'./Foo.vue'</span><span style="color:#999999">)</span> <span style="color:#999999">}</span>
  <span style="color:#999999">]</span>
<span style="color:#999999">}</span><span style="color:#999999">)</span>
</code></span>

2.参考資料

Vue公式ドキュメントルーティング遅延読み込み

2.サードパーティプラグインのオンデマンド導入(オンデマンドロード)

例としてVantを取り上げます。babel-plugin-importを使用すると、必要なコンポーネントのみをインポートして音量を下げることができます。

1.プラグインをインストールします

npm i babel-plugin-import -D

2..babelrcに構成を追加します

<span style="color:#000000"><code class="language-c"><span style="color:#5c6370">// 在.babelrc 中添加配置</span>
<span style="color:#5c6370">// 注意:webpack 1 无需设置 libraryDirectory</span>
<span style="color:#999999">{</span>
  <span style="color:#669900">"plugins"</span><span style="color:#999999">:</span> <span style="color:#999999">[</span>
    <span style="color:#999999">[</span><span style="color:#669900">"import"</span><span style="color:#999999">,</span> <span style="color:#999999">{</span>
      <span style="color:#669900">"libraryName"</span><span style="color:#999999">:</span> <span style="color:#669900">"vant"</span><span style="color:#999999">,</span>
      <span style="color:#669900">"libraryDirectory"</span><span style="color:#999999">:</span> <span style="color:#669900">"es"</span><span style="color:#999999">,</span>
      <span style="color:#669900">"style"</span><span style="color:#999999">:</span> true
    <span style="color:#999999">}</span><span style="color:#999999">]</span>
  <span style="color:#999999">]</span>
<span style="color:#999999">}</span>

</code></span>

3.コンポーネントをオンデマンドでロードします

<span style="color:#000000"><code class="language-c"><span style="color:#5c6370">// 接着你可以在代码中直接引入 Vant 组件</span>
<span style="color:#5c6370">// 插件会自动将代码转化为方式二中的按需引入形式</span>
import <span style="color:#999999">{</span> Button <span style="color:#999999">}</span> from <span style="color:#669900">'vant'</span><span style="color:#999999">;</span>
</code></span>

4.参考資料:

Vantはオンデマンドでコンポーネントを自動的に導入します

3、インターフェース要求を減らす

1.ルートがジャンプまたは更新を繰り返すたびに、要求がサーバーに送信されたときに送信された最後のインターフェース要求をキャンセルします

  • リクエストインターセプターのjsファイルに設定
<span style="color:#000000"><code class="language-c"><span style="color:#5c6370">// 取消请求</span>
let cancelArr <span style="color:#669900">=</span> <span style="color:#999999">[</span><span style="color:#999999">]</span>
window<span style="color:#999999">.</span>cancelAxios <span style="color:#669900">=</span> function <span style="color:#999999">(</span>url<span style="color:#999999">,</span> allAxios <span style="color:#669900">=</span> false<span style="color:#999999">)</span> <span style="color:#999999">{</span>
  cancelArr <span style="color:#669900">=</span> cancelArr<span style="color:#999999">.</span><span style="color:#61aeee">filter</span><span style="color:#999999">(</span>item <span style="color:#669900">=</span><span style="color:#669900">></span> <span style="color:#999999">{</span>
    <span style="color:#c678dd">if</span> <span style="color:#999999">(</span>allAxios<span style="color:#999999">)</span> <span style="color:#999999">{</span>
      item<span style="color:#999999">.</span><span style="color:#61aeee">c</span><span style="color:#999999">(</span><span style="color:#999999">)</span>
      <span style="color:#c678dd">return</span> false
    <span style="color:#999999">}</span> <span style="color:#c678dd">else</span> <span style="color:#999999">{</span>
      <span style="color:#c678dd">if</span> <span style="color:#999999">(</span>item<span style="color:#999999">.</span>url <span style="color:#669900">==</span><span style="color:#669900">=</span> url<span style="color:#999999">)</span> <span style="color:#999999">{</span>
        item<span style="color:#999999">.</span><span style="color:#61aeee">c</span><span style="color:#999999">(</span><span style="color:#999999">)</span>
        <span style="color:#c678dd">return</span> false
      <span style="color:#999999">}</span> <span style="color:#c678dd">else</span> <span style="color:#999999">{</span>
        <span style="color:#c678dd">return</span> true
      <span style="color:#999999">}</span>
    <span style="color:#999999">}</span>
  <span style="color:#999999">}</span><span style="color:#999999">)</span>
<span style="color:#999999">}</span>
<span style="color:#5c6370">// 请求拦截器</span>
_fetch<span style="color:#999999">.</span>interceptors<span style="color:#999999">.</span>request<span style="color:#999999">.</span><span style="color:#61aeee">use</span><span style="color:#999999">(</span>
  function <span style="color:#999999">(</span>config<span style="color:#999999">)</span> <span style="color:#999999">{</span>
    window<span style="color:#999999">.</span><span style="color:#61aeee">cancelAxios</span><span style="color:#999999">(</span>config<span style="color:#999999">.</span>url<span style="color:#999999">)</span>
    config<span style="color:#999999">.</span>cancelToken <span style="color:#669900">=</span> new axios<span style="color:#999999">.</span><span style="color:#61aeee">CancelToken</span><span style="color:#999999">(</span>cancel <span style="color:#669900">=</span><span style="color:#669900">></span> <span style="color:#999999">{</span>
      cancelArr<span style="color:#999999">.</span><span style="color:#61aeee">push</span><span style="color:#999999">(</span><span style="color:#999999">{</span>
        url<span style="color:#999999">:</span> config<span style="color:#999999">.</span>url<span style="color:#999999">,</span>
        c<span style="color:#999999">:</span> cancel
      <span style="color:#999999">}</span><span style="color:#999999">)</span>
    <span style="color:#999999">}</span><span style="color:#999999">)</span>
    <span style="color:#c678dd">return</span> config
  <span style="color:#999999">}</span><span style="color:#999999">,</span>
  function <span style="color:#999999">(</span>error<span style="color:#999999">)</span> <span style="color:#999999">{</span>
    <span style="color:#c678dd">return</span> Promise<span style="color:#999999">.</span><span style="color:#61aeee">reject</span><span style="color:#999999">(</span>error<span style="color:#999999">)</span>
  <span style="color:#999999">}</span>
<span style="color:#999999">)</span>
</code></span>

ルーティング構成のフロントガード

<span style="color:#000000"><code class="language-c"><span style="color:#5c6370">// 前置守卫</span>
router<span style="color:#999999">.</span><span style="color:#61aeee">beforeEach</span><span style="color:#999999">(</span><span style="color:#999999">(</span>to<span style="color:#999999">,</span> from<span style="color:#999999">,</span> next<span style="color:#999999">)</span> <span style="color:#669900">=</span><span style="color:#669900">></span> <span style="color:#999999">{</span>
  <span style="color:#5c6370">// 每次跳转路由取消所有请求</span>
  window<span style="color:#999999">.</span><span style="color:#61aeee">cancelAxios</span><span style="color:#999999">(</span><span style="color:#669900">''</span><span style="color:#999999">,</span> true<span style="color:#999999">)</span>
<span style="color:#999999">}</span>
</code></span>

リクエストインターフェースのキャンセル

2.キープアライブページキャッシュ

特定のページを再レンダリングしないようにする場合は、Vueのキープアライブコンポーネントを使用できます。これにより、現在のページデータをキャッシュできるだけでなく、複数回のレンダリングの繰り返しを回避してパフォーマンスを低下させることができます。

  • コンポーネントに名前を付けます
<span style="color:#000000"><code class="language-c">export <span style="color:#c678dd">default</span> <span style="color:#999999">{</span>
  name<span style="color:#999999">:</span> <span style="color:#669900">'article'</span><span style="color:#999999">,</span>
  <span style="color:#5c6370">// keep-alive的生命周期</span>
  <span style="color:#5c6370">// 初次进入时:created > mounted > activated</span>
  <span style="color:#5c6370">// 再次进入:只会触发 activated</span>
  activated <span style="color:#999999">(</span><span style="color:#999999">)</span> <span style="color:#999999">{</span>
    <span style="color:#5c6370">// to do..</span>
  <span style="color:#999999">}</span><span style="color:#999999">,</span>
  <span style="color:#5c6370">// 退出后触发 deactivated</span>
  deactivated <span style="color:#999999">(</span><span style="color:#999999">)</span> <span style="color:#999999">{</span>
    <span style="color:#5c6370">// to do..</span>
  <span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>

ルート出口でキープアライブコンポーネントでラップします

<span style="color:#000000"><code class="language-c">  <span style="color:#669900"><</span><span style="color:#669900">!</span><span style="color:#669900">--</span> 路由出口 <span style="color:#669900">--</span><span style="color:#669900">></span>
   <span style="color:#669900"><</span><span style="color:#669900">!</span><span style="color:#669900">--</span> include <span style="color:#669900">-</span> 字符串或正则表达式。只有名称匹配的组件会被缓存。
        exclude <span style="color:#669900">-</span> 字符串或正则表达式。任何名称匹配的组件都不会被缓存。
        max <span style="color:#669900">-</span> 数字。最多可以缓存多少组件实例。 <span style="color:#669900">--</span><span style="color:#669900">></span>
    <span style="color:#669900"><</span>keep<span style="color:#669900">-</span>alive include<span style="color:#669900">=</span><span style="color:#669900">"article"</span><span style="color:#669900">></span>
      <span style="color:#669900"><</span>router<span style="color:#669900">-</span>view<span style="color:#669900">></span><span style="color:#669900"><</span><span style="color:#669900">/</span>router<span style="color:#669900">-</span>view<span style="color:#669900">></span>
    <span style="color:#669900"><</span><span style="color:#669900">/</span>keep<span style="color:#669900">-</span>alive<span style="color:#669900">></span>
</code></span>

3.防振とスロットル

1.防振工具タイプ方式梱包

<span style="color:#000000"><code class="language-c">  function debounce <span style="color:#999999">(</span>fnEvent<span style="color:#999999">,</span> time<span style="color:#999999">)</span> <span style="color:#999999">{</span>
          var _time <span style="color:#669900">=</span> null
          <span style="color:#c678dd">return</span> function <span style="color:#999999">(</span><span style="color:#999999">)</span> <span style="color:#999999">{</span>
            let _arg <span style="color:#669900">=</span> arguments
            let _this <span style="color:#669900">=</span> this
            <span style="color:#c678dd">if</span> <span style="color:#999999">(</span>_time<span style="color:#999999">)</span> <span style="color:#999999">{</span>
              <span style="color:#61aeee">clearTimeout</span><span style="color:#999999">(</span>_time<span style="color:#999999">)</span>
            <span style="color:#999999">}</span>
            _time <span style="color:#669900">=</span> <span style="color:#61aeee">setTimeout</span><span style="color:#999999">(</span><span style="color:#999999">(</span><span style="color:#999999">)</span> <span style="color:#669900">=</span><span style="color:#669900">></span> <span style="color:#999999">{</span>
              fnEvent<span style="color:#999999">.</span><span style="color:#61aeee">apply</span><span style="color:#999999">(</span>_this<span style="color:#999999">,</span> _arg<span style="color:#999999">)</span>
            <span style="color:#999999">}</span><span style="color:#999999">,</span> time<span style="color:#999999">)</span>
          <span style="color:#999999">}</span>
        <span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

2.スロットルツールタイプ方式のパッケージング

<span style="color:#000000"><code class="language-c">  function throttle <span style="color:#999999">(</span>fnEvent<span style="color:#999999">,</span> time<span style="color:#999999">)</span> <span style="color:#999999">{</span>
        var isLoading <span style="color:#669900">=</span> false
        <span style="color:#c678dd">return</span> function <span style="color:#999999">(</span><span style="color:#999999">)</span> <span style="color:#999999">{</span>
          let _arg <span style="color:#669900">=</span> arguments
          <span style="color:#c678dd">if</span> <span style="color:#999999">(</span><span style="color:#669900">!</span>isLoading<span style="color:#999999">)</span> <span style="color:#999999">{</span>
            isLoading <span style="color:#669900">=</span> true
            let _this <span style="color:#669900">=</span> this
            <span style="color:#61aeee">setTimeout</span><span style="color:#999999">(</span><span style="color:#999999">(</span><span style="color:#999999">)</span> <span style="color:#669900">=</span><span style="color:#669900">></span> <span style="color:#999999">{</span>
              fnEvent<span style="color:#999999">.</span><span style="color:#61aeee">apply</span><span style="color:#999999">(</span>_this<span style="color:#999999">,</span> _arg<span style="color:#999999">)</span>
              isLoading <span style="color:#669900">=</span> false
            <span style="color:#999999">}</span><span style="color:#999999">,</span> time<span style="color:#999999">)</span>
          <span style="color:#999999">}</span>
        <span style="color:#999999">}</span>
      <span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

第4に、Object.freeze()を使用して、vueロングリストのパフォーマンスを最適化します。

Vueは、Object.definePropertyのsetterとgeeterを使用してデータオブジェクトをハイジャックし、データ変更に対するビューの応答を実現します。ただし、コンポーネントが純粋なデータ表示であり、変更がない場合もあります。データをハイジャックするためにVueは必要ありません。 、大量のデータ表示の場合、これによりコンポーネントの初期化時間が明らかに短縮されます。次に、vueによるデータの乗っ取りを禁止するにはどうすればよいですか?object.freezeメソッドを使用してオブジェクトをフリーズできます。オブジェクトがフリーズすると、変更できなくなります。

  • Object.freeze()は
    、オブジェクトをフリーズするためのObject.freeze()メソッドを導入します。凍結されたオブジェクトは変更できなくなります。オブジェクトが凍結されると、新しい属性をオブジェクトに追加したり、既存の属性を削除したり、オブジェクトの既存の属性の列挙可能性、構成可能性、および書き込み可能性を変更したり、作成したりすることはできません。既存の属性の値を変更します。また、オブジェクトのプロトタイプは、フリーズ後に変更することはできません。フリーズ()は、渡されたパラメータと同じオブジェクトを返します。
    Object.freeze()

総括する

上記はVueプロジェクトのパフォーマンス最適化のほんの一部です。今後も皆さんに更新していきます。ありがとうございます。

参考資料:https //blog.csdn.net/weixin_50856920/article/details/112254038

 

おすすめ

転載: blog.csdn.net/weixin_44727080/article/details/112977802