4

私はjQueryプラグインを使用しており、MicrosoftAjaxMinifierを介して実行しています。私のスクリプトは私にとってはうまく機能しますが、今はこのプラグインで問題が発生しています。問題は、プラグインが文字列を使用してその名前で関数を呼び出すことです。

var s = (getCachedSortType(table.config.parsers, c) == "text") ? ((order == 0) ? "sortText" : "sortTextDesc") : ((order == 0) ? "sortNumeric" : "sortNumericDesc");

「sortNumeric」と「sortNumericDesc」に注意してください。これにより、次の関数が呼び出されます。

function sortNumeric(a, b) {
            return a - b;
        }

function sortNumericDesc(a, b) {
            return b - a;
        }

これは、これらの関数が呼び出される唯一の場所であるため、IDE VS2010は、関数がどこからも呼び出されているとは見なしません...これらは上記のコードを介して条件付きで実行されます。

**ここに問題があります**

これが縮小されると、関数の文字列名は残りますが、参照されることはないため、関数は削除されます。

これを行わないように設定ミニファイアを調整する方法はありますか?

関数の名前が変わるのも見たので

function testFunctionName(a,b)

になります

function a

これは私のような状況でも問題を引き起こします...このような関数名をハードコーディングするのは悪いコード設計であることを私は知っていることに注意してください。私が言ったように、それは私が使用しているプラ​​グインです。文字列ではなく関数を正しく呼び出すソリューションを受け入れますが、プラグインを変更することを常に躊躇しています。

4

2 に答える 2

2

-unused:keepスイッチを使用して、未使用の機能を保持します。これにより、当然、ミニファイアが実際に使用されていないコードを削除するのを防ぐことができます。

-renameスイッチを使用して、名前で呼び出す関数に永続的な名前を割り当てます。

于 2012-06-29T15:06:02.577 に答える
2

ドキュメントから:

-evals:(ignore | immediate | safeall)は、evalステートメントの処理方法を指定します。これは知っておくべき重要なスイッチです。デフォルトでは、Ajax Minifierはevalステートメントを無視します。これにより、名前付きローカル変数または関数を参照するevalステートメントが含まれている場合、ミニファイされたコードが破損する可能性があります。これは、デフォルトでAjax Minifierがローカル変数と関数の名前も変更するが、eval関数に渡されるテキストを変更しないため、これらの参照が壊れることがあるためです。コードを縮小して正しく機能しなくなった場合は、コードでevalステートメントを確認してください。存在する場合は、他の2つの–evalsスイッチオプションのいずれかを指定してみてください。「即時」オプションは、eval呼び出しと同じスコープ内の変数または関数の名前を変更しません。「safeall」オプションは、eval呼び出しと同じスコープ内だけでなく、変数や関数の名前を変更しません。だけでなく、任意の親スコープでも。これにより、コードの縮小が大幅に損なわれますが、eval関数の呼び出しが期待どおりに機能することを確認する必要があります。デフォルト設定はignoreallです。

次に-evals:immediate、コードがまだ壊れている場合は、使用する必要があります-evals:safeall(これにより、JavaScriptファイルが大きくなる場合でも)。

更新
使用していない場合はeval、関数の名前変更をスキップする必要があります。

-rename:(all | locale | none)は、ローカル変数と関数の名前を自動的に変更するかどうかを指定します。グローバル変数と関数の名前は自動的に変更されません。また、プロパティ名も変更されません。「ローカリゼーション」が指定されている場合、「L_」で始まらない変数のみが名前が変更されます。デフォルト値はallです。

を追加するだけ-rename:noneです。

于 2012-06-29T15:10:31.577 に答える