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 ファイル バージョンを含む)

推薦する

MySQL 5.7.30 のインストールとアップグレードの問題に関する詳細なチュートリアル

くさびコンピュータにインストールされている MySQL のバージョンが比較的古く、おそらくバージョン...

Vue モバイル プロジェクトでページ キャッシュを実装する方法のサンプル コード

背景モバイル デバイスでは、ページ ジャンプ間のキャッシュが必須要件です。例: ホームページ =&g...

MySQL NULLデータ変換方法(必読)

MySQL を使用してデータベースをクエリし、左結合を実行すると、関連付けられたフィールドの一部に...

XHTMLコードの一般的なアプリケーション問題をまとめる

<br />しばらくの間、多くの人が XHTML の使い方を知らないことに気付きました。...

Linux に Python クローラー スクリプトを展開し、スケジュールされたタスクを設定する方法

昨年、プロジェクトの必要性により、Python でクローラーを作成しました。クロールされたデータは、...

ReactのuseEffectクロージャの落とし穴についての簡単な説明

問題コードuseEffectによって発生したクロージャの問題コードを見てみましょう 定数 btn =...

ネイティブ js が携帯電話のプルダウン更新を模倣

この記事では、携帯電話のプルダウンリフレッシュを模倣したjsの具体的なコードを参考までに共有します。...

linuxdeployqt を使用して Ubuntu で Qt プログラムをパッケージ化する問題を解決する

いくつかの Qt インターフェース プログラムを作成しましたが、Qt 環境がインストールされていない...

MySQL の Docker インストールと設定手順

目次序文環境インストールMySQLコンテナを作成して起動する思い出させるMySQLコンテナコマンドを...

HTML ウェブページ画像タグ

画像タグ <IMG> を挿入します。今日私たちが目にするカラフルなウェブページはすべて、...

Mysqlデータベースの文字化けに対処する方法

MySQL では、データベースの文字化けは一般的に文字セットを設定することで修正できますが、文字化け...

MySQLで適切なインデックスを選択する方法

まずは栗を見てみましょう EXPLAIN select * from employees where...

Apache Tomcat と IDEA エディターの統合に関する詳細なチュートリアル

1. Apache Tomcat 公式サイトから Tomcat 圧縮パッケージをダウンロードします。...

Alibaba Cloud Server ドメイン名解決手順 (初心者向けチュートリアル)

ウェブサイトの構築を始めたばかりの初心者には、理解し、学ぶべきことがたくさんあります。ウェブサイトを...

Dockerfile を使用して Docker でイメージを構築する方法

イメージを構築するこれまで、テストやデモンストレーションにさまざまなイメージを使用しました。多くの場...