あらゆるフレームワークの関数メモマイザー
メモフィ? - JavaScript 関数の軽量メモ化 (1.3KB)
同じパラメータで実行される関数のキャッシュ機構(メモライザー) (わずか1.3 KB)
このプロジェクトは、負荷の高い関数呼び出しの結果をキャッシュすることで、JavaScript または TypeScript プロジェクトのパフォーマンスを向上させるためのメモ化関数を提供します。メモ化することで、同じ引数で繰り返し呼び出しを行うと、キャッシュされた結果が返され、実行が高速化されます。
このモジュールは、react の useMemo フックのように機能しますが、react は必要ありません。任意のフレームワークまたは純粋な JavaScript プロジェクトを使用できます
特徴
- 関数のメモ化: 同じ引数を使用した関数呼び出しの結果をキャッシュします。
- 依存関係の追跡: 依存関係が変更された場合にキャッシュを更新します。
- 柔軟性: JavaScript プロジェクトと TypeScript プロジェクトの両方で使用可能。
- CPU 負荷の高い操作や複雑な計算に最適なソリューション
- 切断された機能はメモリから削除されます。この関数に属するキャッシュも削除されます。
- WeakMap ベースのキャッシュ ストア
- WeakMap 弱い参照リンクと通信できないメソッドを切断し、ガベージ コレクターの起動をトリガーします
なぜmemofyを使用する必要があるのでしょうか?
Memofy を使用すると、関数の実行時間を最大 1500 分の 1 に短縮できます。以下の結果は、重い関数でテストした結果得られました。 ??
Test Case | Function Execute Time (ms) |
---|---|
With Memofy (CACHED) | 0.083 ms |
Without Memofy | 57.571 ms |
Memofy なし
import memofy from "memofy"; const dep1 = /** Variable to track change */ const heavyMethod = memofy((arg1, arg2, ...args) => { // calculate something then return }, [dep1, dep2, ...deps]); // heavyMethod looks at the deps and arguments every time it is called. // If there is no change, it brings it from the cache. If there is a change, it runs the function againしかもとても簡単です
インストール
npm install memofy
故宮
yarn add memofy
糸
使用例
depsパラメータなし
import memofy from "memofy"; const concatPhoneNumber = (extension, number) => { // Heavy calculation // return result }; const memoizedConcatPhoneNumber = memofy(concatPhoneNumber, []); memoizedConcatPhoneNumber(90, 555); // Runs concatPhoneNumber once memoizedConcatPhoneNumber(90, 555); // Don't run because fetched from cache (same parameter) memoizedConcatPhoneNumber(90, 552); // Runs concatPhoneNumber because params is changed
depsパラメータあり
import memofy from "memofy"; const product = { title: "Test product", price: 10 }; const calculateTax = (taxRatio) => { // Calculate tax by product price // Heavy calculation return taxRatio * product.price; }; const memoizedCalculateTax = memofy(calculateTax, [product]); calculateTax(2); // Runs calculateTax when first run -> 20 calculateTax(2); // // Don't run because fetched from cache (same parameter and same deps) -> 20 product.price = 40; calculateTax(3); // Runs calculateTax because product dep changed -> 120
import memofy from "memofy"; const products = [ /**Let's say there are more than 100 products */ ]; // It is costly to cycle through 100 products each time. Just keep the result in the cache when it runs once. const getTotalPrice = (fixPrice) => { return products.reduce((acc, curr) => acc + curr.price, 0); }; const _getTotalPrice = memofy(getTotalPrice, [products]); getTotalPrice(0); // Runs getTotalPrice once getTotalPrice(0); // Don't run because fetched from cache products.push({ /** a few products */ }); getTotalPrice(2); // Runs again getTotalPrice because products and parameter changed
コンテキストあり
import memofy from "memofy"; this.user.name = "Jack"; // For example inject name to context const getName = (suffix) => { return `${suffix} ${this.user.name}`; }; const memoizedGetName = memofy(getName, [], this); memoizedGetName("Mr"); // Result is Mr Jack this.user.name = "John"; memoizedGetName("Mr"); // Result is Mr John because context data changed
type Args = Array<any>; type Deps = Readonly<Array<any>>; type MemoizedFunction<A extends Args, ReturnType> = (...args: A) => ReturnType; declare function memofy<A extends Args, ReturnType extends any>( _functionToMemoize: (...args: Array<unknown>) => ReturnType, _deps?: Deps, _context?: unknown ): MemoizedFunction<A, ReturnType>;
タイプスクリプトの宣言
演奏結果
Case | ms |
---|---|
First execute time (no caching) | > 52.08 ms |
Second execute time (caching) | < 0.03 ms |
and subsequent execution (caching) | < 0.03 ms |
テストカバレッジ結果
File | % Stmts | % Branch | % Funcs | % Lines |
---|---|---|---|---|
All files | 90.69 | 86.95 | 100 | 94.59 |
lib | 88.88 | 92.3 | 100 | 87.5 |
index.ts | 88.88 | 92.3 | 100 | 87.5 |
lib/store | 92 | 80 | 100 | 100 |
DependencyCacheStore.ts.ts | 90 | 75 | 100 | 100 |
FunctionCacheStore.ts | 93.33 | 83.33 | 100 | 100 |
貢献する
以上があらゆるフレームワークの関数メモマイザーの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undress AI Tool
脱衣画像を無料で

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











JavaScriptで日付と時間を処理する場合は、次の点に注意する必要があります。1。日付オブジェクトを作成するには多くの方法があります。 ISO形式の文字列を使用して、互換性を確保することをお勧めします。 2。時間情報を取得および設定して、メソッドを設定でき、月は0から始まることに注意してください。 3.手動でのフォーマット日付には文字列が必要であり、サードパーティライブラリも使用できます。 4.ルクソンなどのタイムゾーンをサポートするライブラリを使用することをお勧めします。これらの重要なポイントを習得すると、一般的な間違いを効果的に回避できます。

PLACSTHETTHETTHE BOTTOMOFABLOGPOSTORWEBPAGESERVESPAGESPORCICALPURPOSESESFORSEO、userexperience、andDesign.1.IthelpswithiobyAllowingseNStoAccessKeysword-relevanttagwithtagwithtagwithtagwithemaincontent.2.iTimrovesexperiencebyepingepintepepinedeeping

イベントキャプチャとバブルは、DOMのイベント伝播の2つの段階です。キャプチャは最上層からターゲット要素までであり、バブルはターゲット要素から上層までです。 1.イベントキャプチャは、AddEventListenerのUseCaptureパラメーターをTrueに設定することにより実装されます。 2。イベントバブルはデフォルトの動作であり、UseCaptureはfalseに設定されているか、省略されます。 3。イベントの伝播を使用して、イベントの伝播を防ぐことができます。 4.イベントバブルは、動的なコンテンツ処理効率を改善するためにイベント委任をサポートします。 5.キャプチャを使用して、ロギングやエラー処理など、事前にイベントを傍受できます。これらの2つのフェーズを理解することは、タイミングとJavaScriptがユーザー操作にどのように反応するかを正確に制御するのに役立ちます。

JavaScriptアプリケーションがゆっくりとロードされ、パフォーマンスが低い場合、問題はペイロードが大きすぎることです。ソリューションには、次のものが含まれます。1。コード分割(コードスプリッティング)を使用し、React.lazy()またはビルドツールを介して大きなバンドルを複数の小さなファイルに分割し、最初のダウンロードを減らすために必要に応じてロードします。 2。未使用のコード(Treeshaking)を削除し、ES6モジュールメカニズムを使用して「デッドコード」をクリアして、導入されたライブラリがこの機能をサポートしていることを確認します。 3.リソースファイルを圧縮してマージし、GZIP/BrotliとTerserがJSを圧縮できるようにし、ファイルを合理的にマージし、静的リソースを最適化します。 4.頑丈な依存関係を交換し、day.jsやフェッチなどの軽量ライブラリを選択します

ESモジュールとCommonJSの主な違いは、ロード方法と使用シナリオです。 1.CommonJSは同期的にロードされ、node.jsサーバー側環境に適しています。 2.ESモジュールは、ブラウザなどのネットワーク環境に適した非同期にロードされています。 3。Syntax、ESモジュールはインポート/エクスポートを使用し、トップレベルのスコープに配置する必要がありますが、CommonJSは実行時に動的に呼ばれるrequire/Module.Exportsを使用します。 4.CommonJSは、Expressなどのnode.jsおよびLibrariesの古いバージョンで広く使用されていますが、ESモジュールは最新のフロントエンドフレームワークとnode.jsv14に適しています。 5.混合することはできますが、簡単に問題を引き起こす可能性があります。

node.jsでHTTPリクエストを開始するには、組み込みモジュール、axios、およびnode-fetchを使用する3つの一般的な方法があります。 1.依存関係のない内蔵http/httpsモジュールを使用します。これは基本的なシナリオに適していますが、https.get()を使用してデータを取得したり、.write()を介してPOSTリクエストを送信するなど、データステッチとエラーモニタリングの手動処理が必要です。 2.Axiosは、約束に基づいたサードパーティライブラリです。簡潔な構文と強力な機能を備えており、非同期/待ち声、自動JSON変換、インターセプターなどをサポートします。非同期リクエスト操作を簡素化することをお勧めします。 3.Node-Fetchは、約束と単純な構文に基づいて、ブラウザフェッチに似たスタイルを提供します

クリーンで保守可能なJavaScriptコードを記述するには、次の4つのポイントに従う必要があります。1。クリアで一貫した命名仕様を使用すると、変数名がカウントなどの名詞で使用され、関数名はfetchdata()などの動詞で開始され、クラス名はユーザープロファイルなどのパスカルケースで使用されます。 2。過度に長い関数や副作用を避けてください。各関数は、ユーザー情報をフォーマットユー、SaveUser、Renderuserに分割するなど、1つのことのみを行います。 3.ページをuserprofile、userstats、その他のウィジェットに分割するなど、モジュール性とコンポーネントを合理的に使用します。 4.主要なロジックとアルゴリズムの選択の説明に焦点を当てて、時代までコメントとドキュメントを書く

var、let、constの違いは、範囲、昇進、繰り返し宣言です。 1.VARは機能範囲であり、変動的なプロモーションを備えており、繰り返しの宣言が可能になります。 2.一時的なデッドゾーンを備えたブロックレベルの範囲であり、繰り返される宣言は許可されていません。 3.Constはブロックレベルの範囲でもあり、すぐに割り当てる必要があり、再割り当てすることはできませんが、参照型の内部値を変更できます。最初にconstを使用し、変数を変更するときにletを使用し、varの使用を避けます。
