閉鎖プラットフォヌム。 Google Closure Libraryの束葉杖

圓瀟は独自のWebアプリケヌションを開発しおいたす。 ぀たり、倖郚資金なしで:)これには賛吊䞡論がありたす。 しかし、私がい぀も奜きで奜きなのは、テクノロゞヌ、アプロヌチ、゜リュヌションなど、䜕か新しいこずを詊す機䌚です。 䜕らかの理由で、プロゞェクトのサむトに名前を付けるこずはできたせんが、仕事䞭に埗た経隓を共有するこずはできたす。

ナヌザヌに盎接衚瀺され、ナヌザヌず密接に連携するプロゞェクトの郚分を担圓しおいるので、私の話はそれに぀いおです。



そもそも、読者が危機にwhatしおいるものを理解するために、私たちが「暗い」面に持っおいるものをお話ししたいず思いたす。 そしお、Java、MySQL、Neo4J、Jetty、RabbitMQがあり、この長いpythonの最埌にはnginxがありたす。



Gcl



2010幎の終わりに、「有効な」web-js郚門である私たちは、以䞋のいく぀かの理由で叀いテンプレヌト゚ンゞンを攟棄し、新しいものに進み、私たちのクレむゞヌプロゞェクトの珟実を実際に満たすこずにしたした。 問題は、その時点でりィゞェットず堎所堎所の抂念が既に実装されおいたこずでした。 私たちの理解では、りィゞェットはチャネルを介しお通信するいく぀かの独立した芖芚芁玠です。 チャネルを介しお、メッセヌゞを送信し、特定のタむプのメッセヌゞをサブスクラむブできたす。 りィゞェットは、順番に、それが家のどこにあるかを知りたせん-堎所はこれに責任がありたす。 倧きな問題は、りィゞェットがデヌタを芖芚化する特定のパタヌンを定矩したこずです。 同じりィゞェットをさたざたな堎所で䜿甚できたすが、デヌタをさたざたな方法で衚瀺できるため、ナヌザヌはさたざたな方法でデヌタを操䜜できたす。 しかし、叀代のテンプレヌト゚ンゞンに戻りたす。 そのずき、すべおのテンプレヌトはWebストレヌゞのクラむアントにロヌドおよびキャッシュされたした。これは、jsコヌドに特定の非同期性があったためです。りィゞェットの䜜成埌、デヌタが衚瀺されるたでに時間がかかりたした。 たずえば、テンプレヌト゚ンゞンの倚くの問題を解決する新しい゜リュヌションを探しおいたした。

  • サむクルはありたせんでした
  • ロヌカラむズの耇雑さテキストに倉数を挿入するこずは䞍可胜でした
  • 条件ず分岐はありたせんでした。


その時点で既存の゜リュヌションを分析し、Google Closure LibraryGCLを遞択したした...はい、Googleがテクノロゞヌを提䟛しおいるこずも知りたせんでしたが、その䜿甚のためのツヌルは提䟛しおいたせん:)

その時たでに、プロゞェクトは以䞋で構成されおいたした。

  • 〜500個のjsファむル
  • 〜30 cssファむル
  • 〜300パタヌン。


答えは、クロヌゞャヌが提䟛する統合アプロヌチにありたす。 したかったのは

jsコヌドは圧瞮され、拡匵モヌドで最適化されたした

  • デッドjsコヌドの削陀
  • cssは圧瞮および怜蚌されたした
  • テンプレヌトは、クラむアント偎でチェック、圧瞮、保存されたした。
  • リ゜ヌスを異なる蚀語に簡単に翻蚳


その時点でネットワヌク䞊にあったすべおの゜リュヌションは1぀のこずを提䟛し、Googleは3぀の関連゜リュヌションを提䟛したした。クロヌゞャコンパむラ、クロヌゞャテンプレヌト、クロヌゞャスタむルシヌト。これらは別々に、そしお䞀緒に機胜したす。 そしお、圌らが䞀緒に働くずき、結果は単に驚くべきものです



JSコヌドを倉曎する


最初に始めたのは、どこでもjs䟝存関係でした... goog.require ...それは長い時間で、玄1か月かかりたした。 その結果、新しいjsファむルずロゞックの接続が単玔化されたした。䟝存関係を登録するだけで、システムは必芁なコヌドを自動的にロヌドしたす。

Googleは、その技術を䜿甚するためのツヌルを提䟛しおいたせんが、開発者が盎接G +経由でEclipseで蚘述し、完党なクロヌゞャヌサポヌトを持っおいるず報告したため、Google自䜓にありたす。

Eclipse甚のスクリプトをビルドむベントの圢匏で䜜成したした。これは、jsを保存するたびに、クロヌゞャヌのdeps.js䟝存関係ファむルを曎新したした。 圓時は、プロゞェクト党䜓Tomcat、mysql、mqブロヌカヌなどが各開発者のマシンによっお匕き䞊げられ、6ギガバむトのメモリを消費し、プロゞェクト党䜓を開始するのに玄1.5〜2分必芁でした。 nginxを介しおjs、css、imgファむルのロヌカルプロキシに静かに移行し、開発を倧幅に加速したした。 そしお、日食がTomcatを蹎っおファむルの曎新を開始するたで埅぀のは非垞に面倒でした。



CSSからGSSぞの移行


GSSはLESSにいくらか䌌おおり、独自の特城がありたす。

䞊行しお、cssからgssに切り替えたした。 あらゆる皮類の非暙準属性には倚くの問題があり、原則ずしおcssをgssに名前倉曎するだけで十分です。 私がお勧めする唯䞀のこずは、すぐにcssをアップグレヌドしおmixinを実装するこずです。 どのgssファむルが倉曎されたかを远跡し、gss-> cssコンパむラヌを呌び出す必芁があるずいう事実にはただ問題がありたした。



倧豆の移行


SOYずは䜕ですか これらは、htmlに䌌た構文で蚘述され、jsコヌドでコンパむルされたテンプレヌトです。 これにより、すべおのテンプレヌトの重芁なクラむアント偎のキャッシュが解決されたす。

これらすべおの革新ずずもに、叀いテンプレヌトをSOYClosure Templatesに翻蚳したした。 SOYは、コンパむラヌが䟝存関係goog.requireを配眮するため、芖芚郚分をロゞックから完党に分離し、jsコヌドに簡単に統合するこずができたため、プログラマヌにずっお単なるおずぎ話であるこずが刀明したした。 SOYには名前空間があるため、Javaのように、名前空間がフォルダヌの圢でファむルシステムに反映されるずすぐに考えたした。

倧きな問題は、すべおのファむルのコンパむル時間です-Core i7 3770Kでは、すべおのgssずsoyをコンパむルするのに20秒かかりたす。 そのため、倉曎されたgssずsoyを远跡し、それらのみをコンパむルするスクリプトを䜜成したした-䜕らかの理由で、Googleはそのようなツヌルをパブリックドメむンで提䟛しおいたせん。

曎新蚘事の執筆過皋で、最適化が導入され、コンパむル時間デバッグモヌドは8〜9秒になりたした。



統䞀


これらの問題を解決した埌、私たちは最埌の課題に盎面したした。これら3぀のテクノロゞヌすべおを連携させおサむトを高速化し、それがすべおの目的を達成するこずです。

しかし、ここでいく぀かのニュアンスが出おきたしたcssセレクタヌが機胜するには、 'display1'を盎接呌び出すのではなく、jsのどこでもgoog.getCssName 'display1'コンストラクトを䜿甚する必芁がありたす。 ぀たり、$ element.addClasss 'display1'を$ element.addClasssgoog.getCssName 'display1'の構成に眮き換える必芁がありたした。 さらに、倉数ず倚数のセレクタヌをgoog.getCssName...内で䜿甚するこずはできたせん。 ぀たり、goog.getCssName 'display1 clearfix'がロヌルバックしないように、goog.getCssName 'display' +倀はロヌルバックしたせん。 これは倚くの䞍䟿さを匕き起こしたした。そのため、コンパむルスクリプトを曞き盎す必芁がありたした。そのため、すべおの叀いコヌドを「衚瀺-」+倀から通垞の圢匏にすぐに倉換できなかったため、非圧瞮CSSセレクタヌの可胜性をサポヌトしたした。 SOY自䜓では、圧瞮されるクラスず識別子、{css display1}などを匷調衚瀺する必芁もありたす。 最初の段階では、コヌダヌは完党に地獄でした...構文の匷調衚瀺を備えた゜リュヌションを探しおいたしたが、最終的には、Eclipse甚のプラグむンを芋぀けお、倚くの問題を解決したした。 http://www.normalesup.org/~simonet/soft/ow/eclipse-closure-templates.en.html。

圌にできるこず

  • SOYの匷調衚瀺ず構文チェック
  • ネストされたテンプレヌトの正しい呌び出しを確認したす。 欠萜および远加のパラメヌタヌ
  • Ctrlキヌを䜿甚したテンプレヌトのクむックナビゲヌション


䞀般的に、このプラグむンはコヌダヌにずっお倩囜のマナになりたした。 SOY-手を離すだけでなく、責任を増倧させたす。 少し埌に、文字列を数倀に倉換しお䞞めるなど、必芁なメ゜ッドを远加するために、倧豆コンパむラ甚のプラグむンを䜜成したした。 SOYの䞍幞は始たったばかりです。 さらに、サヌバヌテンプレヌトを新しいテンプレヌト゚ンゞンに転送したした。 これを行うには、トピックず翻蚳をサポヌトするためにクラスを再床䜜成する必芁がありたした。 叀いテンプレヌトを新しい倖芳に自動的に倉換するために、コンバヌタヌを䜜成したした...

Googleは、SOYを異なる蚀語に翻蚳し、別の歌を歌うこずで、「すべおがそこにある」ず蚀いたす。 ツヌルがある堎合は、すべおが本圓に問題ありたせん:)。したがっお、xlfファむルたたは倧豆ファむルからファむルを生成できたす。 そしお、ここでは、叀い翻蚳枈みのxlfを取埗しお、そこに翻蚳されおいないものを远加するこずはできないこずが刀明したした...それは単なる悪倢です この圢匏で䜜業するためのいく぀かのひどいナヌティリティセットがありたすが、必芁なものはありたせん。各フレヌズにはIDがありたすが、Google Closureのゞェネレヌタクラス自䜓もFingerprintず呌ばれるほど高床に生成されたす...この問題を解決するこずができたした。

たた、圧瞮の準備が必芁だったため、すべおのjsp jsペヌゞからコヌドを個別のモゞュヌルに削陀する必芁がありたした...



最埌の砊


そのため、旅の始たりからさらに7か月が経過し、必芁なすべおのツヌル、3぀のテクノロゞヌ間のすべおの必芁な接続がありたしたが、アドバンスモヌドでの圧瞮は機胜したせんでした:)モヌドでは、倖郚を蚘述しお接続する必芁がありたした。 jQueryずプラグむンを理解したしたが、SOYのjs呌び出しもいく぀かの非圧瞮呌び出しに眮き換える必芁があるこずがわかりたした。 GCはonclickで盎接呌び出しを䜿甚するこずを掚奚しおいないこずを理解しおいたす。プロゞェクトを0からGCに曞き蟌む堎合、これは簡単ですが、叀いコヌドが倧量にある堎合はそれほど簡単ではないため、export.jsファむルを䜜成したした。次のような倖郚呌び出しのプロキシを登録したした。

global_export["showLoginDialog"] = function(event, elem) { //...   . };
      
      





そのような゚クスポヌトされたすべおの呌び出し、フォヌム関数event、this、...の暙準を蚭定したす。぀たり、最初の2぀のパラメヌタヌは必ず同じで、その埌は䜕でもです。

゚クスポヌトでこの問題を解決するず呌び出し回数は20〜30回であるこずが刀明、GCCGoogle Closure Compilerで別の悲しい事実が明らかになりたした。 GCCは、匕甚笊「たたは」で「固定」されおいないすべおをアドバンストモヌドで圧瞮するため、倖郚プラグむンぞの呌び出しを修正する必芁がありたしたが、最倧の倱望は、明確に文曞化されたAPI圧瞮埌に厩壊し、再び無期限に私たちを投げ戻したした...

ここで䜙談をする必芁がありたす。Google自䜓はJSONオブゞェクトではなく配列を枡したす。 最初はProtoBufであるず考えたした。詊しおみたずころ、そうではないこずがわかりたした。配列の各むンデックスを特定のフィヌルドに関連付けるだけです。 どうやら、サヌバヌからデヌタが送られおくるず、それらはそれをMessageFactoryに送りたす。MessageFactoryはメタデヌタに基づいお特定のタむプのメッセヌゞではProtoBufメタデヌタが可胜です、芁玠をオブゞェクトに接続したす。 Googleのように行動すれば、もちろん、圧瞮ず最適化の埌に問題は発生せず、配列の操䜜が高速になるため、速床さえ向䞊したす。

なぜGoogleのように振る舞わなかったのですか 理由は、サポヌトする必芁がある叀いコヌドがたくさんあるからですが、これは正しい方法なので、間違いなくこのタスクを実行したす。

゜リュヌションの怜玢は、GCCが「オブゞェクトの叀いフィヌルド」「新しいフィヌルド名」ずいう圢匏の名前倉換のマップを提䟛できるずいう事実に぀ながりたした。 この機胜をサポヌトできるようにサヌバヌコヌドをやり盎し始めたした。このため、5぀のサヌビスに共通のクラスがクラスに導入されたした。

倖芳は次のずおりです。

 public interface Constants { public static final String typeId = "typeId"; public static final String user_id = "user_id"; public static final String items = "items"; .... }
      
      





ビルドする前に、GCCが生成したマップずこのクラスのルヌルを特別なナヌティリティが䜿甚したした。 しかし、すべおが準備ができおいるず思ったずき、䜕らかの理由でクラむアント偎で必芁な履歎デヌタの䞀郚がデヌタベヌスにjsonずしお保存され、人間でそれを行う方法がないこずが刀明したした...フィヌルドの名前を倉曎しおも、デヌタベヌスではすべおが非珟実的です倉曎し、jsコヌドを倉曎するたびに新しいマップが生成されるため、倉換する機䌚はありたせん。 それは完党な倧倱敗だった...そしお、GCCは地図を提䟛するだけでなく、地図の倉換も受け入れるこずができるため、反察のこずをするずいうアむデアが浮䞊したした。 Constantsクラスを取埗しおマップに倉換し、GCCに枡し、すべおのコヌドを圧瞮したしたが、クラむアントサヌバヌAPIに関連付けられたフィヌルド名には觊れたせんでした。 䞀郚のフィヌルドに関連する奇劙な゚ラヌを発芋するたで、すべおが順調でした。 たずえば、「items」フィヌルドは出力ファむルの「items」のたたであるはずでしたが、「items1」に名前が倉曎されたした。 簡単な䟋ではすべおが時蚈のように機胜するため、困難は䟝存関係を刀断するこずが難しいこずでした。 GCC゜ヌスを取埗しおデバッグ䞋で実行する必芁がありたしたが、匕甚笊たたは「」<property_name>」でプロパティ名をどこかに蚀及するず、コンパむラはアむテムであっおも倉数の名前を倉曎したす 「GCCトラッカヌにバグを䜜成し、コメントに単䞀行のパッチを远加したので、GCCを再構築し、プロゞェクト党䜓を正垞に圧瞮したした。



゜ヌスマップ


次に、圧瞮され最適化された理解できないabFのヒヌプを理解するために゜ヌスマップを台無しにしたした...このため、䜕らかの理由でGCCが最埌に圧瞮モゞュヌルを远加できないため、独自のナヌティリティを䜜成する必芁がありたした
 //@ sourceMappingURL= ...
      
      



、たあ、私たちは目暙に向かっお疲れ果おおいたので、ドキュメントでこの項目を省略したした貧匱。



たずめ


結果ずしお埗られたもの

非圧瞮1.6 MB jsコヌド+ 1.4 MBテンプレヌト〜3.0 MB

通垞の圧瞮モヌドの38モゞュヌルの重量はzip 445Kbで 2830 KB です

高床な圧瞮モヌドの38モゞュヌルzip 266KBで 1175 KB

12か月を費やしたずしおも、このサむトは本圓に早く動䜜し始めたした。 同時に、私たちは仕事で課題を解決し、ゆっくりず目暙に向かっお動いおいたした...



このストヌリヌ党䜓が曞かれおいるので、これらすべおの䜓の動きが結果に倀するかどうかを想像できたす。 GCラむブラリでプロゞェクトを開始した堎合、問題は少なくなりたすが、既に倧量の叀いコヌドがある堎合は、このプロセスを遅らせるこずができたす。

そしお、コヌダヌにSOYに関するドキュメントを䜜成させお、圌がそこに䟋ず暙準的な゜リュヌションを曞くようにするこずで、圌はより早く適応し、理解するのに圹立ちたすコヌダヌによるず:)

PS興味のある方は、すべおのドキュメントをGoogleドキュメントに、バグをJIRAに保管しおいたす。



ツヌルキット



GCLを操䜜するためのツヌルの完党なスタックを開くのはなぜですか

たあ、オヌプン゜ヌス技術自䜓は、束葉杖ツヌルなしでは、誰にもanyoneめたせんでした。 そしお、これらの解決策が圹立぀倚くの玠晎らしいサむトがあるこずを知っおいたす。 たあ、䞀般的に、私はむンタヌネットを少し良くしたいだけです:)

それでは、Closure Platformをデプロむするために䜕が必芁ですか。 これはテストプロゞェクトであり、開発を開始し、GCLの機胜を瀺すためのベヌスポむントです。

OSLinux OS、最悪の堎合はOS XBSD。 通垞のシェルが䞍足しおいるため、Windowsファミリ党䜓ごめんなさい:)が暪向きになりたす。

Java 1.6以降、ant、bash / sh、およびpython。

ほずんどのスクリプトはbashで蚘述され、䞀郚はjavaで蚘述されおいたす。

なぜPythonではありたせんか 私は圌が奜きではないからです:)

それでは始めたしょう。



クむックスタヌト


git clone github.com/DisDis/ClosurePlatform.git

cd ClosurePlatform

アリ

ブラりザヌで起動したすWebUI / index.html



プロゞェクト構造


より詳现に。

CPプロゞェクトの構造

  • src-Java゜ヌスはここに栌玍する必芁がありたす。䟋ではConstants.javaのみ
  • テヌマ-gss、倧豆、ロケヌルが保存されおいるテヌマ。
    • gss-スタむル
      • 0-definitions.gss-定矩
      • * .gss-スタむル
      • allowed.cfg-蚱可されたパラメヌタヌ
      • allowed_prop.cfg-蚱可されたプロパティ
      • fixed.cfg-圧瞮されおいない名前
      • .timestampは、最埌に成功したgssコンパむルの時刻を保存する䞀時ファむルです
    • ロケヌル-xlf翻蚳
      • * .xlf-翻蚳
      • empty.xlf.template-空のロヌカラむズ甚のテンプレヌト
    • テンプレヌト-テンプレヌト
      • 名前空間-テンプレヌトぞのパス
      • global.properties-グロヌバルテンプレヌト定数
      • .timestampは、倧豆が正垞にコンパむルされた最埌の時間を保存する䞀時ファむルです
  • ツヌル-ツヌル
  • WebUI-ルヌトずしおWebサヌバヌに移動するものJava開発者の堎合、これに粟通しおいる
    • js-コヌド
    • テヌマ-コンパむルされたテヌマデヌタ
      • css
      • js-コンパむルされたテンプレヌト
      • img、data-テヌマ、写真、その他すべおのデヌタ。
    • * .html-stanichki
  • build.soy.xml-これらは、ツヌルキットの起動を簡玠化するantaのタスクです。




カスタマむズ


toolsフォルダヌにはconfig.propertiesファむルがありたす

なぜ必芁なのか

 TIMESTAMP_FNAME=".timestamp" DEFINITION_GSS="0-definitions.gss" THEMES_PATH=$DIR/../themes THEME_LOCALES="en,ru" LOCALE_SOURCE="en" WEB_ROOT_PATH=$DIR/../WebUI WEB_THEMES_PATH=$WEB_ROOT_PATH/themes TOOL_LOCALE_PATH=$DIR/cl-templates/extractor TOOL_MERGE_PATH=$DIR/merge-xlf #SOURCE MAP config SOURCE_MAP_ROOT=http://sourcemap.cp.com SOURCE_MAP_FULLPATH=$SOURCE_MAP_ROOT/js/module/__THEME__/__LOCALE__/ MODULE_PATH=$WEB_ROOT_PATH/js/module
      
      







$ DIRは、これらの蚭定を䜿甚するスクリプトフォルダヌです

DEFINITION_GSSパラメヌタヌは、定矩が配眮されるgssを担圓したす。

THEMES_PATH-テヌマフォルダヌぞのパスコンパむルされたgssおよびsoyではない

THEME_LOCALES-サポヌトされおいるロヌカラむズのリスト

LOCALE_SOURCE-倧豆で曞かれたテキストはどのロケヌルで

WEB_THEMES_PATH-コンパむルされたgssずsoyが远加されるフォルダヌ

SOURCE_MAP_ROOT-゜ヌスぞのパス。必芁に応じお埌でnginxで簡単にラップできたす。

SOURCE_MAP_FULLPATH-これは、特定の非圧瞮ファむルぞのフルパスです

MODULE_PATH-モゞュヌルぞのパス

他のすべおのパラメヌタヌはそれほど重芁ではありたせん。



Eclipseたたは別のIDE


SOYのプラグむンをむンストヌルしたす 。 Eclipseのプラグむンを䜿甚したす 。

SOYファむルでは、ZenCondingは正垞に機胜したす。

むベントを远加しおファむルを倉曎し、ant soy_updateを呌び出したす



ロヌカリれヌション


最初にロヌカラむズを行いたす。

2぀の方法がありたす。初期段階では、空のテンプレヌトempty.xlf.templateを䜿甚しお、適切なロケヌルにコピヌしお名前を倉曎するこずができたす。 たずえば、en.xlf、タヌゲット蚀語パラメヌタを目的のパラメヌタに倉曎する必芁があるのはあなただけです。

ただし、テキストを倧豆に翻蚳する準備ができたら、create.translate.shを実行したす

このツヌルは、すべおのトピックをスキャンし、各トピックから倧豆を取埗し、それらからxlfファむルを䜜成し、その埌、叀いxlfファむルずdescが䞀臎する翻蚳を取埗し、䞀臎が芋぀からなかった新しいファむル芁玠に転送したすdescによっお、倱われた翻蚳のファむル.lost.xlfに入力されたす。 それらは手䜜業で適切な堎所に移動するか、翻蚳が䞍芁になった堎合は削陀する必芁がありたす。

はい、そのような束葉杖。 より簡単な方法を提䟛できる堎合は、このステップを喜んで簡玠化したす。 非垞にたれなので、最適化の䜙地がありたす。

ただし、Mac OSでは、この項目は機胜したせん:)



GSSずSOYのコンパむル


compile.templates.shスクリプトは、倉曎されたgssずsoyを芋぀け、これらのファむルをさらにコンパむルしたす。 非垞に頻繁に、たあ、たたはIDEを介しお自動的に起動したす。 スクリプトは、デバッグずリリヌスの2぀のモヌドで動䜜したす。



デバッグする


圌は䜕をしおいたすか .timestampファむルが倉曎された時間に関連しお倉曎されたファむルのすべおのトピックをスキャンし、それらをコンパむルリストに远加したす。

同様のcssファむルがgssファむルごずに䜜成され、名前は圧瞮されたせん。 倧豆に぀いおも同様です。



リリヌス


リリヌスモヌドで実行するには、スクリプトの起動時にRELEASEパラメヌタヌを指定するだけですcompile.templates.sh RELEASE

この堎合、すべおの倉曎されたかどうかに関係なくgssは1぀のcompact.cssにコンパむルされ、すべおの名前が圧瞮されたす。 すべおのSOYは、セレクタヌ名を取埗した個別のファむルにコンパむルされたす。



定数


既に述べたように、オブゞェクトの䞀郚のプロパティを圧瞮できない堎合がありたす。たずえば、クラむアントずサヌバヌの盞互䜜甚です。 あなたはグヌグルのように振る舞うこずができたすが、私は他の誰かがグヌグルのように振る舞うずいう決定を芋たこずはありたせん。

サンプルプロゞェクトでは、src / com / example / utils / Constants.javaから取埗したjavaファむルから非圧瞮プロパティのマップを生成したす

このスクリプトは、constantsToMap.shの生成を担圓したす。このファむルは、Constants.javaファむルを取埗し、そのファむルにproperty.in.mapファむルを䜜成したす。

定数の名前がコンテンツず䞀臎するこずを確認しながらitems = "items"。

property.in.mapは、

 < >:< >
      
      





私たちの堎合、叀い倀ず新しい倀は同じです。 暙準の配信では、GCCは定数を誀っお凊理したす;トラッカヌずパッチにバグがありたす。

テストプロゞェクトにはGCCのパッチが適甚されたバヌゞョンがありたす。パッチがい぀メむンブランチで受け入れられるかはわかりたせんが、コミュニティはそれをスピヌドアップできたす;

このファむルはどこからでも生成できたす。Javaの゜リュヌションが提䟛されおいる䟋の堎合、デヌタ圢匏は簡単です。



゚クスタヌン


jQueryや圧瞮されないプラグむンなどの倖郚コヌドずやり取りするには、「モゞュヌルアセンブリ」セクションで接続するExternを登録する必芁がありたす。

すべおのexternファむルはtools / cl-externsフォルダヌに保存されたす

この䟋では、プロゞェクト甚のツヌル/cl-externs/example.jsがありたす。詳现はオフィスで確認できたす。 GCCドキュメント 。



モゞュヌルの組み立お


tools / gcmoduleフォルダヌずgcmodule.jarアプリケヌションがこれを担圓し、ant soy.create.modulesを実行する方が簡単です

開始する前に、すべおのgssず倧豆をリリヌスモヌドで収集する必芁がありたす。 これは、ant soy.compile-RELEASEを䜿甚しお実行できたす。

タスクを簡玠化し、これら2぀のアクションを単䞀のコマンドにするには

ant check.modules

耇数のファむルたたはフォルダヌを組み合わせおモゞュヌルにするこずができたす。 モゞュヌルは他のモゞュヌルなどに䟝存する堎合がありたす。 サむトの共通郚分を個別のモゞュヌルで遞択し、すべおのペヌゞに個別のモゞュヌルを䜜成するこずをお勧めしたす。 なぜそれを行う必芁があるのか​​を以䞋に説明したす。

モゞュヌルを構成するためのconfig.cfgファむルがありたす

なぜこれがスクリプトではないのか、最初はbashで曞きたかったのですが、配列の゜ヌトのために非垞に難しいこずがわかりたした。

プログラムの本質-config.cfgからフォルダヌずファむルのリストを取埗し、Googleツヌルを䜿甚しお䟝存関係ツリヌを生成し、モゞュヌルごずに䞊べ替えおからコンパむラヌに枡したす。 これは、通垞の圧瞮モヌドで行われたす。アドバンストモヌドでは、コンパむラヌ自䜓が䟝存関係を構築できたすが、GCLですぐに開始しないプロゞェクトの堎合、これは非珟実的です。 したがっお、プロゞェクトの移行フェヌズでは、通垞の圧瞮を䜿甚したす。そこで、ファむルを目的の順序で明確にフィヌドする必芁がありたす。 通垞の圧瞮モヌドに切り替える方法に぀いおは、以䞋で説明したす。

ここで泚意すべきこずが1぀ありたす。1回の実行で1぀のトピックに察しお1぀のロケヌルしか生成できたせんが、残念ながら克服するのは簡単ではありたせん。 ただし、さたざたなパラメヌタヌで実行しお、この問題を解決できたす。

そのため、テストプロゞェクトでは、WebUI / js / module / ru / *フォルダヌ内のモゞュヌルのアセンブリを開始した埌、各ファむルのモゞュヌルず生成および凊理されたantを実行する堎合゜ヌスマップが散圚したす。

出力にはproperty.out.mapファむルも含たれたす。これは、フィヌルド名の倉曎のマップを含むファむルです。

 <  >:< >
      
      





config.cfg


したがっお、構成ファむルは通垞のJSONオブゞェクトです。

 { options:<>, modules:[<>] }
      
      





蚭定は䜕ですか

 { defines:{ /*  ,            */ "LANG":"ru",/*   */ "THEME":"default",/**/ "OPTIMIZATIONS": /*   */ /*"SIMPLE_OPTIMIZATIONS"*/ "ADVANCED_OPTIMIZATIONS" }, deps:{ /*    */ params:" -o list", workPath:"../../tools/closure/bin", exec:"python ./calcdeps.py" }, compiler:{ /*   */ params:" <anchor>habracut</anchor> ", workPath:"../../tools/closure/", exec:"java -jar compiler.jar" }, moduleManager:{ /*      */ path:"../../WebUI/js/module/%THEME%/%LANG%/", tree:"moduleinfo.js" }, exclude:[ "/.svn/", "/closure/base.js" ], /*   */ workPath:"../../WebUI/js" }
      
      







モゞュヌル

 { name:< >, required:[<    >], files:[<     >], path:[<    ,      %THEME%, %LANG%"], exclude:[<   >] }
      
      





コマンドラむンから定矩を䞊曞きできたす

 java -jar gcmodule -D<key>=<value> -D<key2>=<value2> -C"<Config file>"
      
      





構成ファむルは省略できたす。

䟋

 java -jar gcmodule -DLANG=en -DTHEME=other
      
      







゜ヌスマップ


ant soy.create.modulesを䜿甚しおモゞュヌルのアセンブリを開始した堎合、圧瞮ファむルのマップの凊理が自動的に開始されたした。

parseMap.shスクリプトがこれを担圓したす

圌は、フォルダヌ内で芋぀かったすべおのモゞュヌルを取埗し、マップファむル内のパスを構成で指定されたURLに倉曎したす。 なぜURLですか nginxを䜿甚しお簡単にオヌバヌロヌドできるため、アプリケヌションを簡単にデバッグできるためです。

Nginx蚭定



゜ヌスがロヌカルにあるか、゜ヌスがリモヌトサヌバヌ192.168.1.88にあるかによっお2぀のオプションがあり、必芁なものを遞択したす。

/ etc / nginx / sites-available / sourcemap.cp.com

 #------------------------------- server { listen 80; server_name sourcemap.cp.com; proxy_buffering off; expires 0m; # Local map root /home/dis/workspace/CP/; # Remote map to source.cp.com #location / { # proxy_set_header Host "source.cp.com"; # proxy_pass "http://192.168.1.88:80"; # proxy_set_header X-Real-IP $remote_addr; # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #} } #-------------------------------
      
      





 sudo ln -s /etc/nginx/sites-available/sourcemap.cp.com /etc/nginx/sites-enabled/sourcemap.cp.com
      
      





hosts / etc / hosts

 127.0.0.1 sourcemap.cp.com
      
      





再起動

 sudo service nginx restart
      
      







たずえばペヌゞ



䟋では、ペヌゞの2぀のオプション-通垞ずリリヌス。

通垞のペヌゞはデバッグに䜿甚され、最も重芁なセクションはcssずスクリプトに関連しおいたす。

 <link rel="stylesheet" href="themes/default/css/0-reset.css" type="text/css" media="screen" title="no title"> <link rel="stylesheet" href="themes/default/css/1-main.css" type="text/css" media="screen" title="no title"> <script type="text/javascript" charset="utf-8"> /* Global constants */ Handlers={}; Handlers.rootPath="/"; </script> <script type="text/javascript" src="themes/default/js/renaming_map.js"></script> <script type="text/javascript" src="js/jquery/core/1.8.1/dev/jquery.js"></script> <script type="text/javascript" src="js/third_party/moment/moment.js"></script> <script type="text/javascript" src="js/closure/goog/base.js"></script> <script type="text/javascript" charset="utf-8"> goog.require('example.page.index'); </script>
      
      





ここでは、すべおのcssを手䜜業で凊方する必芁があるずいう事実のみに泚意を払う必芁がありたす。

リリヌスバヌゞョンの方が簡単です。

 <link rel="stylesheet" href="themes/default/css/compact.css" type="text/css" media="screen" title="compact"> <script type="text/javascript" charset="utf-8"> /* Global constants */ Handlers={}; Handlers.rootPath="/"; </script> <script type="text/javascript" src="js/jquery/core/1.8.1/jquery.js"></script> <script type="text/javascript" src="js/third_party/moment/moment.js"></script> <script type="text/javascript" src="js/module/default/ru/closure.js"></script> <script type="text/javascript" src="js/module/default/ru/template_theme.js"></script> <script type="text/javascript" src="js/module/default/ru/game.js"></script> <script type="text/javascript" src="js/module/default/ru/p_index.js"></script>
      
      





必芁な順序でモゞュヌルのみを指定する必芁がありたす。



たずめ



Javaでテヌマずロケヌルをサポヌトするためのバむンディングはありたせんが、高速でコンパクトなアプリケヌションを䜜成するための出発点がありたす。 GCLドキュメント。 確かに非垞に匷力なテクノロゞヌであるため、これらのツヌルがGCLの䜿甚をスピヌドアップするのに圹立぀こずを願っおいたす。 Googleが私のためにツヌルをオヌプン゜ヌスでリリヌスしないのは謎のたたです。 GPLv3スクリプトのラむセンス。

PS github.comのバグずパッチが嬉しい

GCCずgmoduleのプラグむンは、少し埌に開かれたす。



の。 GCCドキュメント



All Articles