web-dev-qa-db-ja.com

jquery 1.9.0およびmodernizrは、ASP.NETWeb最適化フレームワークでは縮小できません。

バンドルとミニファイを備えたASP.NETWeb最適化フレームワークを使用しています。 1つのバンドルにはjqueryとmodernizrが含まれています。これはすべてjquery1.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'))
             );
 */
30
Remy

あなたの問題の原因はjquery-1.9.0.min.jsの最後の行であると確信しています:

//@ sourceMappingURL=jquery.min.map

縮小されていないバージョンのjQuery1.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のバグトラッカーに関する議論 があります。

最後の行を削除するか、複数行のコメント記号で囲むかを選択できます。

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

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

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

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

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

73
awj

上記の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に感謝します、これは大いに役立ちました!

6
djmarquette

回答を読んで、受け入れられた回答であっても、この問題に対する推奨される解決策は、バンドル担当者がこれに問題がないようにスクリプトを変更することです。これは私には意味がありません。これは明らかに、異なるスクリプトを適切に連結しないバンドラーのバグです。特に、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 ...

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

スクリプトの最新行をインラインコメントではなく複数行コメントに変更することが提案されているため、コードが*/で終わる場合、パーサーは関数宣言などの直後に問題ありません。それ。

スクリプトを変更するのは好きではありません。多くは他の誰か(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行のコメントである場合、デフォルトでこれを行う必要があります。

3

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

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

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

0
zach