31

バンドルとミニフィケーションで ASP.NET Web 最適化フレームワークを使用しています。1 つのバンドルには jquery と modernizr のみが含まれます。これはすべて jquery 1.8.3 では正常に機能していましたが、1.9.0 に更新して以来、jquery/modernizer バンドルの組み合わせは機能しなくなりました。

bundles.Add(new ScriptBundle("~/st-scripts-load-first.js")
       .Include("~/Resources/JavaScript/jquery-1.9.0.js",
                "~/Resources/JavaScript/modernizr.form-placeholder.js"));

ディレクトリには jquery-1.9.0.js と jquery-1.9.0.min.js の両方があります。.min ファイルがない場合は、最適化フレームワークによって自動的に生成されます。.min ファイルがあるかどうかは機能しません。
コンパイルが debug="true" で、縮小やバンドルがない場合に機能します。

/* Minification failed. Returning unminified contents.
(5,2-3): run-time warning JS1195: Expected expression: *
(11,60-61): run-time warning JS1004: Expected ';': {
(395,2-3): run-time warning JS1195: Expected expression: )
(397,21-22): run-time warning JS1004: Expected ';': {
(397,4590-4591): run-time warning JS1195: Expected expression: )
(398,28-29): run-time warning JS1195: Expected expression: )
(398,84-85): run-time warning JS1002: Syntax error: }
(402,44-45): run-time warning JS1195: Expected expression: )
(408,1-2): run-time warning JS1002: Syntax error: }
(393,5-22): run-time warning JS1018: 'return' statement outside of function: return Modernizr;
(404,5,406,16): run-time warning JS1018: 'return' statement outside of function: return !!('placeholder' in (Modernizr.input || document.createElement('input')) &&
               'placeholder' in (Modernizr.textarea || document.createElement('textarea'))
             );
 */
4

4 に答える 4

73

問題の原因は、jquery-1.9.0.min.js の最後の行にあると確信しています。

//@ sourceMappingURL=jquery.min.map

jQuery 1.9 の縮小されていないバージョンにはこれが含まれていません。その理由をすぐに説明します。

jquery-1.9.0.min.js が別のファイルにバンドルされていて、そのファイルがjquery-1.9.0.min.js に続く場合、次の JS ファイルは、いわば破損しています。

その理由は、次のファイルの先頭が jQuery の「//@」行に追加されているためです。これは、1 つの長い拡張コメントになることを意味します。あなたの場合、これは

window.Modernizr=function(n,t,i){function...

Modernizr の開始時のスクリプトは、バンドル プロセスから次のようなコメントとして出力されました。

//@ sourceMappingURL=jquery.min.map window.Modernizr=function(n,t,i){function...

これに関する jQuery の Bug Tracker に関する議論があります。

オプションは、最後の行を削除するか、複数行のコメント記号で囲むことです。

/*
//@ sourceMappingURL=jquery.min.map
*/

また、Modernizr には縮小版の最後にソース マップも含まれていることがわかります。そして正当な理由があります。

その背後にある理論的根拠は、コードの縮小版が使用されたときに問題をデバッグするのに役立つことです。この行は、この縮小されたファイルがデバッグに役立つ別のファイルにマップされることをブラウザに伝えます。これを利用するには、その参照ファイル (jquery.min.map) をサーバーに置くか、クライアントにダウンロードする必要があります。さらに、現在これをサポートしているブラウザは Chrome だけだと思います。Firefox ではまだ開発中です。

このページには、ソース マップの優れた説明があります。

まとめると、ブラウザーでデバッグ中に元のバージョンのソースにマップし直したい場合を除き、それを削除しても問題は発生しません。あなたの場合、ASP.NET の Optimization Framework の動作方法により、debug="True"の場合、縮小されていないバージョンが提供されるため、おそらく sourceMappingURL を使用する必要はありません。

于 2013-01-24T11:23:30.247 に答える
6

上記のawjの回答に返信できなかったので、投票しました。素晴らしい探偵作品。コメントに追加したかったのですが、問題は実際にはjquery 1.9.1で修正されましたが、jquery-migrate-1.1.0に表示されるようになりました

「jquery-migrate-1.1.0.min.js」ファイルの末尾に、マップ ファイルの参照が 1 行のコメントのみであることに気付きました。そのため、awj の提案に従って、複数行のコメントにしました。

したがって、3 行目:

//@ sourceMappingURL=dist/jquery-migrate.min.map

次のように 3、4、5 行目になります。

/*
//@ sourceMappingURL=dist/jquery-migrate.min.map
*/

ISP にアップロードすると、完全な ajax 機能が再び利用できるようになります。

改めて AWJ に感謝します。これは大いに役立ちました。

于 2013-02-12T13:26:11.283 に答える
3

回答を読んで、受け入れられた回答であっても、この問題に対する推奨される解決策は、スクリプトを変更して、バンドラーが問題を起こさないようにすることです。これは私には意味がありません。これは明らかに、異なるスクリプトを適切に連結しないバンドラーのバグです。具体的には、n スクリプトの最後の行が通常の行コメントである場合、バンドラーに問題があります。

// this is the last line of the n script

そして、次のスクリプトが 1 行のコメントで始まらない

function(){ var ...

バンドラーは、デフォルトで として構成さ;れているConcatenationTokenため、バンドルされたコードは次のようになります。

// this is the last line of the n script;function(){ var ...

確かに、スクリプトの読み込みはどこかで構文エラーで失敗します。

スクリプトの最新行をインライン コメントではなく複数行のコメントに変更することが提案されています。これにより、コードが*/パーサーで終了するときに関数宣言またはその直後の何かで OK になります。

スクリプトを変更するのは好きではありません。多くは他の誰か (jquery など) によって作成されたものであり、それらを変更したくありません。スクリプトをアップグレードする必要があり、Web サイトをアップグレードした後にこのバグが再び見つかる場合はどうすればよいでしょうか。構成では実行されませんdebug="true"

私はこのソリューションが私にとってよりうまく機能しています

bundles.Add(new ScriptBundle("~/bundles/mobile") { 
                ConcatenationToken = ";\r\n" }
       .Include("~/Scripts/jquery-1.11.3*",
                "~/Scripts/jquery-timeago*",
                "~/Scripts/jquery.mobile-1.4.5*",

このようにして、バンドラーが常にスクリプトを改行文字で区切るように強制します。前のスクリプトの最後の行が 1 行のコメントである場合、デフォルトでこれを行う必要があります。

于 2015-08-11T18:40:39.950 に答える
0

modernizr.form-placeholder.js のコピーに問題がある可能性があります。

jquery.peity.js を読み込もうとして同じエラーが発生しました。

ライブラリを削除すると、ページが正常に読み込まれました。だから私は彼らのサイトから生のjsを手に入れてファイルを作り直したところ、問題なく読み込まれました。

于 2013-01-23T21:56:53.993 に答える