Webpack コンポーネントの使用状況統計を実装するための 50 行のコード

Webpack コンポーネントの使用状況統計を実装するための 50 行のコード

背景

最近、リーダーからコンポーネント ライブラリを構築するように依頼があり、プロジェクトで現在使用されているサードパーティ コンポーネント ライブラリのどのコンポーネントが最も頻繁に使用されているかを知りたいと思いました。最初は友達に相談したかったのですが、友達が忙しすぎて自分でやらなければなりませんでした。私のアイデアを実現するために webpack を使用できるかどうか疑問に思います。

効果

@material-uiを使用します。使用するコンポーネントは次のとおりです。

成し遂げる

ローダーのソースは、以下に示すようにファイルの静的文字列であることがわかっています。

最も速い解決策は、正規表現を使用して文字列をカウントすることですが、コメントがある場合は統計が不正確になります。そのため、これを実現するために AST を使用できます。多くの専門家がすでに AST の概念について説明しているので、詳細には触れません。

AST の分析

解析には@babel/parserを使用します。まずはウェブサイト上の次のコードを見てみましょう。

'@material-ui/core' から { Box } をインポートします。
'@material-ui/lab/Autocomplete' から Autocomplete をインポートします。

パスはprogram => bodyで、宣言型はtype: ImportDeclarationであることがわかります。次の構造を見てみましょう。

"ソース": {
     "タイプ": "文字列リテラル",
     "値": "@material-ui/core"
 },
 // 2番目の段落 "source": {
      タイプ": "文字列リテラル",
     "値": "@material-ui/lab/オートコンプリート"
 },

このフィールドには必要なパッケージ名の値を送信するので、最初のコードは

const ast = parser.parse(ソース、{
      ソースタイプ: 'モジュール',
      プラグイン: ['jsx'],
 });
const getImport = 'ImportDeclaration';
const getMaterialImport = packageName || '@material-ui';
const importAst = ast.program.body.filter(
  // type ノード タイプ。ここではインポート宣言タイプをフィルタリングし、同時にフィルタリングします (i) => i.type === getImport && i.source.value.includes(getMaterialImport)、
);

関連するast配列を取得したら、次のステップはコンポーネント名を取得することです。観察すると、指定子識別子フィールドにコンポーネント名を含む2つのフィールドがあることがわかります。インポート、ローカル

  • インポートとは、エクスポートモジュールからエクスポートされた変数を意味します。
  • ローカルはインポート後の現在のモジュールの変数を表します

ここでは、インポートされたフィールドが次のメソッドに表示されないため、local を使用します。

'@material-ui/lab/Autocomplete' から Autocomplete をインポートします。

パッケージ名がわかったので、要点を押さえて完全なコードを投稿するのは簡単になります。

デモ

const パーサー = require('@babel/parser');
定数 loaderUtils = require('loader-utils');
定数合計 = {
  長さ: 0,
  コンポーネント: {},
};
// オブジェクトのソート const sortable = (obj) => Object.fromEntries(Object.entries(obj).sort(([, a], [, b]) => b - a));
module.exports = function(ソース) {
  console.log(ソース、'--');
  const オプション = loaderUtils.getOptions(this);
  const { packageName = '' } = オプション;
  定数コールバック = this.async();
  if (!packageName) は callback(null, source); を返します。
  試す {
    // ast に解析する
    const ast = parser.parse(ソース、{
      ソースタイプ: 'モジュール',
      プラグイン: ['jsx'],
    });
    もし(ast){
      タイムアウトを設定する(() => {
        const getImport = 'ImportDeclaration';
        const getMaterialImport = パッケージ名;
        const importAst = ast.program.body.filter(
          // type ノード タイプ。ここではインポート宣言タイプをフィルタリングし、同時にフィルタリングします (i) => i.type === getImport && i.source.value.includes(getMaterialImport)、
        );
        合計の長さ = 合計の長さ + importAst.length;
        for (let i of importAst) {
          const { 指定子 = [] } = i;
          for (指定子のlet s) {
            (s.local)の場合{
              const {名前} = s.local;
              total.components[名前] = total.components[名前] ? total.components[名前] + 1 : 1;
            }
          }
        }
        合計コンポーネント = ソート可能(合計コンポーネント);
        console.log(合計、'合計');
        コールバック(null、ソース);
      }, 0);
    } そうでない場合はコールバック(null、ソース);
  } キャッチ(エラー){
    コールバック(null、ソース);
  }
};

ローダーを呼び出す

 {
  テスト: /\.(jsx|)$/,
  除外: /node_modules/、
  インクルード: [appConfig.eslintEntry],
  使用: [
    {
      ローダー: path.resolve(__dirname, './loader/total.js'),
      オプション:
        パッケージ名: '@material-ui',
      },
    },
  ]、
},

簡単な統計関数が完成しました。もちろん、他にももっと良い方法があるかもしれません。私はただこのアイデアを提案しただけです。議論を歓迎します

やっと

これを行うことの重要性は何でしょうか? たとえば、独自のコンポーネント ライブラリがオンラインになった後、コンポーネント参照の数をカウントし、週などの特定の時間ディメンションを使用できます。データを使用して、コンポーネント ライブラリの次のバージョンの最適化の方向性を分析できます。また、KPI レポート ツールとして使用することもできます。結局のところ、それはデータによってサポートされています。

これで、50行のコードでWebpackコンポーネントを使用する方法についての記事は終了です。Webpackコンポーネントの使用統計の詳細については、123WORDPRESS.COMの以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも123WORDPRESS.COMをよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Electron-vueはwebpackを使用して複数ページのエントリファイルをパッケージ化します
  • webpackコード断片化の実装
  • Webpack プロジェクトでローダー プラグインをデバッグする方法
  • Webpackプラグインを書いてnpmに公開するための80行のコード
  • Webpackを使用して複数ページのプログラムを構築するための実装手順
  • webpack -v エラー解決

<<:  CentOS のクローン作成、Linux 仮想マシンの共有の完全な手順

>>:  MySQL 5.7.18 リリース インストール ガイド (bin ファイル バージョンを含む)

推薦する

Node.js における npx コマンドの使用法とシナリオ分析

npx 使用チュートリアル今晩、 Vue-Cli勉強していたところ、ふと最新の@4.xxバージョンを...

下線を実現するための CSS3 トランジションの例コード

この記事では、下線を実現するための CSS3 トランジションのサンプル コードを紹介します。このコー...

CSSは高度に適応したフルスクリーンを実現します

独自のデモを作成するときに、display:flex を使用して垂直方向の中央揃えを実現したいと思い...

MySQL テーブルを削除する際の I/O エラーの原因分析と解決方法

問題現象最近、sysbench を使用して MySQL をテストしました。テストに長い時間がかかった...

CSSにスティッキー効果を追加する方法

前面に書かれたfilter:blur と filter:contrast がこのような素晴らしい化学...

Linux で MySQL スケジュール タスク バックアップ データを実装する方法

序文バックアップは災害復旧の基礎であり、システム操作エラーやシステム障害によるデータ損失を防ぐために...

nginx リバース プロキシの魔法のスラッシュについての簡単な説明

nginx リバース プロキシを設定する場合、location と proxy_pass のスラッシ...

JavaScript でのカスタム スワイパー コンポーネントの詳細な説明

目次エフェクト表示コンポーネント設定ステップ1ステップ2ステップ3コンポーネントの使用ステップ1ステ...

CocosCreatorを使ってシューティングゲームを作る方法

製造手順を分析します。 1. リソースを準備してシーンを構築するオンラインでリソースを探すか、私のリ...

Linux Samba サーバーの超詳細なインストールと構成 (問題解決付き)

目次Samba サーバーの紹介Samba サーバー コンポーネントSamba サーバー関連の設定ファ...

ウェブデザイン経験

<br />著者はかつてWebデザインの初心者でしたが、継続的な探求と実践を通じて、今で...

MySQL データベースの必須条件クエリ ステートメント

目次1. 基本的な文法2. 条件式によるフィルタリング3. 論理式によるフィルタリング4. あいまい...

MySQL 5.7.10 インストール ドキュメント チュートリアル

1. 依存パッケージをインストールする yum -y インストール gcc-c++ ncurses-...

非常に便利なオープンソース Docker ツール 5 つを強くお勧めします

導入Docker コミュニティは、さまざまなユースケースを処理するのに役立つ多くのオープンソース ツ...

mysql 8.0.20 winx64.zip 圧縮版のインストールと設定方法のグラフィックチュートリアル

mysql 8.0.20 winx64.zip圧縮版のインストールチュートリアルは以下のように記録さ...