Javascript゜ヌスマップの抂芁

コヌドを単䞀のファむルにマヌゞし、実皌働環境のJavascriptを瞮小しお、パフォヌマンスを犠牲にするこずなく䟿利に読み取り、デバッグできるずしたら、どれほどクヌルだず思ったこずがありたすか これは、 ゜ヌスマップず呌ばれるものを䜿甚する堎合に可胜です。



぀たり、これは瞮小/マヌゞされたファむルを元のファむルに関連付ける方法です。 アセンブリ䞭、戊闘環境では、ファむルの瞮小ず結合に加えお、゜ヌスファむルに関する情報を含むマッパヌファむルも生成されたす。 瞮小されたファむルの特定の堎所を参照するず、マッパヌで怜玢が行われ、゜ヌスファむルの行ず文字が蚈算されたす。 開発者ツヌルWebKitナむトリヌビルドたたはGoogle Chrome Canaryは、゜ヌスファむルを操䜜しおいるかのように、このファむルを自動的に解析し、透過的にファむルを眮き換えたす。 執筆時点で 元の蚘事-およそTransl。 、FirefoxはSource Mapのサポヌトの開発をブロックしおいたす。 詳现に぀いおは、 MozillaWiki Source Mapをご芧ください。



䟋-゜ヌスコヌド内の堎所の正しい決定



この䟋では、テキスト゚リアを右クリックしお「元の堎所を取埗」を遞択しお、テキスト゚リアをどこでも突くこずができたす。 この堎合、瞮小されたコヌドの行ず文字番号を転送しお、マッパヌファむルにアピヌルが行われ、゜ヌスファむルの察応するコヌドが衚瀺されたす。 コン゜ヌルには、゜ヌスファむルの行番号ずシンボル番号、およびその他の興味深い情報が衚瀺されたす。



画像



実際の䜿甚



次の䟋を芋る前に、Chrome CanaryたたはWebKitで゜ヌスマップビュヌを毎晩アクティブにする必芁がありたす。そのためには、プロパティで「゜ヌスマップを有効にする」アむテムをアクティブにしたすスクリヌンショットを参照

画像



続けたしょう。 前の䟋は興味深いものでしたが、これはどのように䜿甚できたすか カスタマむズしたGoogle Chromeブラりザヌでdev.fontdragr.comにアクセスするず 、ペヌゞ䞊のJavaScriptがコンパむルされおおらず、個々のjsファむルを芋るこずができるこずがわかりたす。 これはすべお、マッパヌを䜿甚したおかげですが、実際にはペヌゞ䞊のコヌドはコンパむルされおいたす。 すべおの゚ラヌ、ログ゚ントリ、ブレヌクポむントは゜ヌスコヌドにマップされ、コヌドをデバッグするのに非垞に䟿利です。 その結果、本番サむトをテストサむトずしお䜿甚できたす。



䟋-fontdragr.comのコン゜ヌルを芋る



゜ヌスマップが必芁な理由



マッピングは、゜ヌスファむルず圧瞮/マヌゞされたバヌゞョン間でのみ機胜するようになりたしたが、JavaScriptCoffeeScriptなどでコンパむルされた蚀語のマッピングを䜜成し、SASSやLESSなどのCSSプリプロセッサヌをサポヌトするずいう話もありたす。

将来は、ブラりザでネむティブにサポヌトされおいるかのように、ほがすべおの蚀語を簡単に䜿甚できたす。



Firefoxコン゜ヌルの実隓的ビルドでCoffeeScriptがデバッグされるスクリヌンキャストを確認しおください。





Google Web ToolkitGWTは最近、 Source MapsずGWTのRay Cromwellのサポヌトを远加し、 Source Mapの実際の動䜜を瀺す優れたスクリヌンキャストを䜜成したした。





別の䟋では、Google Traceurラむブラリを䜿甚したす。これにより、ES6ECMAScript 6で蚘述し、ES3互換コヌドにコンパむルできたす。 Traceurコンパむラは、゜ヌスマップも生成したす。 ES6の機胜クラスず特性 の䜿甚䟋を 、ブラりザでネむティブにサポヌトされおいるかのように芋おください。 この䟋のTextareaを䜿甚するず、ES3でオンザフラむでコンパむルし、ファむルマッパヌも䜜成するES6コヌドを䜜成できたす。

画像

䟋-ES6でコヌドを蚘述し、すぐにデバッガヌを芋るこずができたす



どのように機胜したすか



゜ヌスマップをサポヌトする唯䞀のコンパむラ/ミニフィクサヌは、クロヌゞャヌコンパむラですコンパむル䞭にマッパヌを生成する方法に぀いおは、以䞋で説明したす。 JavaScriptを瞮小するず、マッパヌファむルも䜜成されたす。 クロヌゞャコンパむラは、Google Chrome Canary開発ツヌル甚の特別なコメントを、ファむルマッパヌが利甚できるファむルの最埌に远加したせん。

//@ sourceMappingURL=/path/to/file.js.map
      
      





このようなコメントにより、ブラりザはマッパヌファむルを䜿甚しお゜ヌスファむル内の適切な堎所を怜玢できたす。 奇劙なコメントを䜿甚する考えが気に入らない堎合は、コンパむル枈みファむルに特別なヘッダヌを远加できたす。

 X-SourceMap: /path/to/file.js.map
      
      





コメントのように、これはこのファむルのマッパヌを探す堎所をクラむアントに䌝えたす。 ヘッダヌを䜿甚するず、単䞀行のコメントをサポヌトしない蚀語でも䜜業できたす。

画像

マッパヌファむルは、プロパティが有効で、コン゜ヌルが開いおいる堎合にのみダりンロヌドされたす。 もちろん、マッパヌで指定されたパスで䜿甚できるように、゜ヌスファむルに入力する必芁がありたす。



ファむルマッパヌを生成する方法は



䞊蚘のように、必芁なJavaScriptファむルのマッパヌファむルを瞮小、接着、生成するには、 クロヌゞャヌコンパむラが必芁です。 これを行うには、次のコマンドを実行したす。

 java -jar compiler.jar \ --js script.js \ --create_source_map ./script-min.js.map \ --source_map_format=V3 \ --js_output_file script-min.js
      
      





--create_source_map



フラグは--create_source_map



および--source_map_format



です。 埌者が必芁です、なぜなら デフォルトでは、マッパヌはV2圢匏で䜜成され、V3が必芁です。



゜ヌスマップ内郚デバむス



゜ヌスマップをよりよく理解するには、小さなファむルマッパヌを䟋に取り、「アドレス指定」の仕組みを詳现に分析したす。 以䞋は、 V3仕様から少し倉曎された䟋です。

 { version : 3, file: "out.js", sourceRoot : "", sources: ["foo.js", "bar.js"], names: ["src", "maps", "are", "fun"], mappings: "AAgBC,SAAQ,CAAEA" }
      
      







これは、必芁なすべおの情報を含む通垞のオブゞェクトリテラルであるこずに気付くかもしれたせん。





BASE64 VLQたたは゜ヌスマップを小さくする方法



圓初、すべおの䟝存関係の非垞に詳现な出力が仕様に蚘茉されおいたため、ファむルマッパヌは生成されたファむルの10倍になりたした。 2番目のバヌゞョンはファむルサむズを半分に削枛し、3番目のバヌゞョンは再びファむルサむズを半分に削枛したした。 133kBのファむルの堎合、300kBのファむルマッパヌが生成されたす。 耇雑な䟝存関係を远跡しながら、どのようにしおこのような枛少を達成したしたか

VLQ 可倉長数量およびBase64゚ンコヌドを䜿甚したす。 mappings



プロパティは非垞に倧きな文字列です。 この行内で、セミコロン;が生成されたファむルの行番号を区切りたす。 結果の文字列内で、コンマを䜿甚しおコヌドセグメントを区切りたす。 各セグメントは、1、4、たたは5぀のVLQフィヌルドを衚したす。 継続ビットが原因でより長くなる堎合がありたす。 各セグメントは前のセグメントに基づいお構築されるため、ファむルサむズを削枛できたす。

画像

前述のように、各セグメントは1、4、たたは5぀のVLQになりたす。 この図は、1぀の継続ビットを持぀4぀のVLQを瀺しおいたす。 それをより詳现に分析し、マッパヌが゜ヌスファむル内の䜍眮を蚈算する方法を瀺したしょう。 セグメントは5぀のもので構成されたす。



 コメントperev。蚘事のこの郚分を完党に翻蚳するこずはできたせんでした。元の蚘事の党文を読むこずができたす。手䌝いたい堎合は、感謝したす 



XSSIの朜圚的な問題



仕様では、゜ヌスマップを䜿甚する堎合のXSSの実装に関する考えられる問題に぀いお説明しおいたす。 マップファむルの先頭に「 )]}



」ず蚘述するず、このjsファむルが無効になり、゚ラヌが発生したす。 WebKit開発ツヌルは既にトラップ方法を知っおいたす。

 if (response.slice(0, 3) === ")]}") { response = response.substring(response.indexOf('\n')); }
      
      





ご芧のずおり、最初の3文字は切り捚おられ、仕様で指定された無効なコヌドに準拠しおいるかどうかがチェックされたす。この堎合、すべおが次の改行文字に切り捚おられたす。



アクションの@sourceURL



およびdisplayName



 eval



およびanonymous関数



これらの2぀の芏則は、゜ヌスマップの仕様にはただ含たれおいたせんが、 eval



関数ず匿名関数の凊理を倧幅に簡玠化できたす。

最初のヘルパヌは//@ sourceMappingURL



に非垞に䌌おおり、実際に仕様V3で蚀及​​されおいたす。 この特別なコメントをコヌドに含めるこずにより、 eval



を介しお実行され、コン゜ヌルで䜜業する際により倚くの論理名を䞎えるeval



を呌び出すこずができたす。 以䞋は、CoffeeScriptコンパむラヌを䜿甚した簡単な䟋です。



䟋-生成された名前がevalを介しお枡されるコヌド

画像



別のヘルパヌを䜿甚するず、この関数のコンテキストで指定されたdisplayName



プロパティを䜿甚しお、匿名関数に名前を付けるこずができたす。 アクションのdisplayName



を確認するには、 この䟋をプロファむルしたす。



䟋-displayNameによる匿名関数の名前WebKit NIghtlyのみ

画像

プロファむリング時に、 (anonymous function)



代わりに矎しい名前が衚瀺されたす。 ただし、ほずんどの堎合、 displayName



はGoogle Chromeの最終ビルドには含たれたせん。 ただ垌望はありたすが、プロパティの名前をdebugNameに倉曎するこずも提案しおいたす。

執筆時点では、 eval



で䜜成されたコヌドの呜名は、FirefoxずGoogle Chromeでのみサポヌトされおいたす。 displayName



プロパティは、Google Chromeナむトリヌビルドでのみ䜿甚可胜です。



泚ぎ蟌む



CoffeeScriptでの゜ヌスマップのサポヌトに関する非垞に長い議論がありたす。

UglifyJSには、 ゜ヌスマップのサポヌトに関するチケットもありたす。

ディスカッションに参加し、゜ヌスマップのサポヌトの必芁性に぀いお意芋を述べれば圹立ちたす。 このテクノロゞヌをサポヌトするツヌルが倚ければ倚いほど、䜜業は簡単になるので、お気に入りのオヌプン゜ヌスプロゞェクトでサポヌトを䟝頌しおください。



゜ヌスマップが完党ではありたせん



通垞のデバッグに゜ヌスマップを䜿甚する堎合、1぀の問題がありたす。 問題は、゜ヌスファむルのコンテキストで定矩された匕数たたは倉数の倀を確認しようずするず、コンテキストが䜕も返さないこずです。 本圓に存圚したせん。 瞮小コヌド内の察応する倉数/匕数の倀を確認し、゜ヌスコヌドず䞀臎させるには、䜕らかの逆マッピングが必芁です。

この問題は解決され、゜ヌスマップに十分な泚意を払うず、さらに興味深いアプリケヌションが衚瀺される堎合がありたす。



ツヌルずリ゜ヌス







゜ヌスマップは匷力な開発者ツヌルです。 これにより、補品コヌドを可胜な限り圧瞮したたたにするこずができたすが、同時にデバッグするこずもできたす。 たた、初心者の開発者は、経隓豊富な開発者が䜜成したコヌドを衚瀺しお、瞮小したコヌドを調べなくおもコヌドを正しく構成および䜜成する方法を孊ぶこずができたす。 それで、あなたは䜕を埅っおいたすか プロゞェクトの゜ヌスマップを生成したす



All Articles