背景最近、リーダーからコンポーネント ライブラリを構築するように依頼があり、プロジェクトで現在使用されているサードパーティ コンポーネント ライブラリのどのコンポーネントが最も頻繁に使用されているかを知りたいと思いました。最初は友達に相談したかったのですが、友達が忙しすぎて自分でやらなければなりませんでした。私のアイデアを実現するために 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をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: CentOS のクローン作成、Linux 仮想マシンの共有の完全な手順
>>: MySQL 5.7.18 リリース インストール ガイド (bin ファイル バージョンを含む)
1.MySQLの複数インスタンスMySQL マルチインスタンスとは、1 台以上のマシン上で複数の M...
Taobao のウェブページはインポートを使用していますが、多くのウェブサイトはリンクを使用していま...
1. nacosデータベースを再開します。データベース名nacos_configユーザー名とパスワー...
JS タイマーを使用して、要素に移動する効果のあるメソッドを作成します。実装のアイデアは、まず要素の...
CI/CD の概要CIワークフロー設計Gitコードバージョン管理システムはコマンドラインでのみ管理で...
発掘紹介: Dig は、Unix ライクなコマンドライン モードで NS レコード、A レコード、M...
一般的な書き方は次のとおりです。 XML/HTML コードコンテンツをクリップボードにコピー<...
DPlayer.jsビデオプレーヤープラグインは使いやすい主な用途: ビデオの再生、監視の開始、終了...
序文: 正規表現のインターセプションに似た、MySql フィールドの文字列から特定の文字を抽出すると...
1. はじめに● ランダム書き込みではヘッドがトラックを頻繁に変更するため、効率が大幅に低下します。...
結果: 実装コードhtml <div id="価格表" class=&qu...
序文HTTP と HTTPS日常生活でよく使われる URL は、おおまかに次の 2 種類に分けられま...
目次はじめるデータストレージサーバーを構成するRedis セキュリティの管理Redisインストールの...
MySQL は、myisam、innodb、memory、archive、example など、多く...
序文ご存知のとおり、デフォルトでは、Alibaba Cloud にインストールされている MySQL...