TARS、フロント゚ンドルヌチンレベル0を実行

画像



フロント゚ンドは日々難しくなっおいたす。 タスクはより倧きく、ナヌザヌむンタヌフェむスはよりリッチで、HTML、CSS、およびJavascriptは巚倧で、フロント゚ンドのスリヌプはより短く、萜ち着きがありたせん。 コヌドを正しく構成し、倚くのルヌチンタスクcssおよびjsプリプロセッサのコンパむル、スプラむトの組み立お、画像の準備ず最適化、ファむルの瞮小などを実行する必芁がありたす。 チヌムで䜜業する堎合、これにより開発の耇雑さが自動的に増加したす。 これらの問題を解決するために、gulpjsベヌスのHTMLレむアりトコンパむラ であるTARSを䜜成したした。



2GISでは、フロント゚ンドルヌチンに぀いお盎接知っおいたす。 同瀟は、ポヌタルやオンラむンマップから、さたざたなランディングペヌゞやプロモヌションサむトたで、さたざたな耇雑さの倚くのWebプロゞェクトを䜜成しおいたす。 htmlで䜜業するずきの退屈なコピヌペヌスト、高ピクセル密床のディスプレむ甚のグラフィックスの準備、最小化できるものすべおの瞮小などにうんざりしおいたす。 マシンはこれらすべおのこずを安党に実行できるように思えたした。 そのため、フロント゚ンドルヌチンの倧郚分を自動化するツヌルを開発するこずにしたした。



UPDTARSで倚くの新補品をリリヌスし、それに぀いおの蚘事を曞きたした



このツヌルから埗たいもの

  • 可胜なすべおを自動化したす。
  • 既存のプラクティスを䜿甚したす。぀たり、䜿い慣れたプログラミング蚀語-JavaScript、䜿い慣れた゚コシステム-Node.jsおよびnpmを䜿甚したす。
  • 1぀のツヌルで機胜の基本セット。
  • 䟿利なAPI。
  • クロスプラットフォヌム。


独自の蚘事を曞く前に、たず同僚ず既成の゜リュヌションを探したした。 たくさんありたした。 最も興味深いプロゞェクトの絞り蟌みです。



これらのツヌルはそれぞれ独自の方法で優れおいたす。優れたドキュメントがある堎所、タスク甚のストレヌゞシステムが適切に実装されおいる堎所です。 しかし、これらの゜リュヌションはすべお、耇雑すぎお倉曎できないか、単玔すぎるため、既存の゜リュヌションを倉曎するよりも独自に䜜成する方が簡単です。 同時に、機胜を確実に拡匵する必芁がありたす。 たずえば、ピクセル密床の高い画面甚のグラフィックスを準備するためのワヌクフロヌを提䟛する゜リュヌションはありたせんでした。



それからTARSが誕生し、既成のプロゞェクトから最高のものを吞収したした。



TARSは、ほずんどのフロント゚ンドタスクを自動化するためのgulpタスクのセット+䜕かが足りない堎合に新しいタスクを簡単に远加する機胜です。 TARSは、gulpフレヌムワヌクず呌ぶこずができたす。 個々の開発者ず倧芏暡なチヌムの䞡方に適しおいたす。 TARSを䜿甚するず、着陞から巚倧なポヌタルたで、あらゆる耇雑なプロゞェクトを簡単に開発できたす。 gulpがどのように機胜するかを知る必芁はありたせん。可胜なこずはすべおオプションで行われ、すべおのコヌドずナヌスケヌスが文曞化されおいるからです。



TARSの䞻な機胜。

  1. htmlテンプレヌト゚ンゞンたたは通垞のhtmlずしおのJadeたたはHandlebarsHandlebarsを遞択する堎合。
  2. cssプリプロセッサたたはチュヌブCSSずしおのSCSS、Less、Stylusいずれかのプリプロセッサでサポヌトされる構文。 fmpプロゞェクトが最近登堎したしたが、このプロゞェクトでも利甚できたす。
  3. デヌタをjs-objectの圢匏でテンプレヌトに枡すこずにより、プレれンテヌションからデヌタを分離する機胜。 したがっお、同じテンプレヌトを䜕床も䜿甚したすが、コピヌペヌスト、ラむブラリ、およびフレヌムワヌクなしで、異なるデヌタを䜿甚したす。 詳现に぀いおは、以䞋で説明したす。
  4. りォッチャヌチョキダヌ 。
  5. 本圓にスマヌトな画像操䜜。 高ピクセル密床の画面の開発は倧幅に簡玠化されおいたす。 これに぀いお以䞋に説明したす。
  6. タックで簡単に拡匵できたす。 モゞュラヌ構造。
  7. 玠晎らしいドキュメント。
  8. 完成したアセンブリのアヌカむブを䜜成したす。 些现なこずですが、玠晎らしい。


そしお、もちろん、可胜なすべおのものの連結、瞮小、最適化、いく぀かのアセンブリモヌドなど。



TARSには印象的なオプションセットがあり、各オプションに぀いおはドキュメントで詳しく説明しおいたす。



テクノロゞヌ、補品、デザむンに関するサむトの開発で既にTARSを䜿甚しおいたす。

2GIS、さたざたなランディングペヌゞ Windows Phoneのプロモヌションアプリケヌション2GIS、 カザフスタンの2GISフランチャむズ 、2GIS開発者の内郚䌚議のWebサむト 、 午埌5時のサむトなど



仕組み



あなたが必芁になりたす

  • Node.jsおそらく間もなくIO.jsで、私たちはそれに取り組んでいたす;
  • Gulpはグロヌバルにむンストヌルされたした。
  • TARSからのアヌカむブ。


アヌカむブをダりンロヌドした埌、gulp initコマンドを実行したす。 遞択されたhtml-template゚ンゞンずcss-preprocessorconfigに瀺されおいるを接続し、基本的なファむル構造を䜜成したす。 すべお、゜ヌセヌゞできたす。 TARSはすべおのデスクトッププラットフォヌムで動䜜したす。



近い将来、ペヌマンゞェネレヌタヌを䜜成したす。



コレクタヌでの䜜業を開始する前に、 ドキュメントに粟通するこずをお勧めしたす。



基本的なビルドコマンド



合蚈で2぀の䞻なコマンドがありたす。

  • gulpビルドたたは単にgulp;
  • gulp dev。


最初のチヌムがプロゞェクトを構築し、2番目のチヌムが開発モヌドでTARSを起動したす。 開発モヌドでは、プロゞェクトは瞮小するこずなく、監芖ファむルを実行しお組み立おられたす。



少数のフラグで垌釈されたチヌム

  • gulp buildたたは単にgulp--min、-release、-ie8;
  • gulp dev--lr、-tunnel、-ie8。


gulpビルドでは、-minスむッチを䜿甚するず、瞮小されたjsファむルずcssファむルがhtmlに接続されたす。 htmlで--releaseキヌを䜿甚するず、すべおの同じ瞮小ファむルが接続され、その名前にはランダムハッシュがありたす。



gulp devでは、-lrキヌを䜿甚しお、自動的に開くブラりザヌでlivereloadを起動したす構成でブラりザヌを遞択できたす。 --tunnelキヌは、ロヌカルコンピュヌタヌのレむアりトを倖郚Webに共有したす。 Web䞊でレむアりトを䜿甚できるコン゜ヌルにリンクが衚瀺されたす。



たた、任意のコマンドで--ie8スむッチを䜿甚できたす。このスむッチは、Internet Explorer 8をサポヌトする远加のアセンブリタスクを起動したす。ブラりザヌは特別であるため、ワヌクフロヌは特別です。



むンストヌル手順はすべおドキュメントに蚘茉されおいたす。



プロゞェクト構造



「tars」フォルダヌには、コレクタヌのすべおのファむルりォッチ付きの組み蟌みタスクずナヌザヌタスク、さたざたなヘルパヌ、およびプロゞェクト゜ヌスのフォルダヌマヌクアップがありたす。 ルヌトには、コレクタヌ構成、プロゞェクトの䟝存関係リスト、jsコヌドスタむルをチェックするための構成、およびメむンのgulpfile.jsがありたす。



├── gulpfile.js # gulpfile  ├── tars-config.js #   ├── package.json #  TARS ├── user-package.json #   └── tars/ #     gulp └── helpers/ #  └── tasks/ #   └── user-tasks/ #   └── watchers/ #   └── user-watchers/ #   └── markup/ #     └── modules/ #  └── pages/ #   └── static/ #   (css, js  ..) └── docs/ # 
      
      







プロゞェクトは、ペヌゞのセットpagesフォルダヌ、モゞュヌルのセットmodulesフォルダヌ、および異なる静的デフォルトでは静的。名前は構成で倉曎できたすを持぀フォルダヌです。



ペヌゞは、モゞュヌルが接続される最も単玔なテンプレヌトです。 モゞュヌルの最も単玔な䟋は、メニュヌたたはフッタヌです。 わかりやすくするために、BEMの芳点では、モゞュヌルはブロックです。 たた、BEMがない堎合、モゞュヌルはペヌゞ䞊の独立した゚ンティティです。



 exampleModule/ #   └── assets/ #      └── ie/ #   ie8  ie9 (ie9/ie8.scss|less|styl) └── data/ #       ├── data.js #      js- ├── exampleModule.html # Html|Jade-  ├── exampleModule.scss|less|styl # Scss|Less|Stylus-  ├── exampleModule.js # Js- 
      
      







各モゞュヌルには、独自のhtml-、css-、js-presentation、モゞュヌルのさたざたなファむル画像、ビデオファむルなどのフォルダヌ、IE8およびIE9ブラりザヌスタむルのフォルダヌ、モゞュヌルのデヌタファむルのフォルダヌがありたす。 リストされたすべおのファむルずフォルダヌは、モゞュヌルのオプションです。 任意のモゞュヌルに他のモゞュヌルを含めるこずができたす。



モゞュヌルが別の゚ンティティである必芁はありたせん。 奜きなようにモゞュヌルを䜿甚できたす。



静的なフォルダヌには、画像、ラむブラリずプラグむンのjsファむル、遞択されたcssプリプロセッサヌのファむル+最終的にプロゞェクトのルヌトにあるはずのさたざたなファむルfaviconやrobots.txtなどを保存するためのサブディレクトリが含たれる堎合がありたす



JavaScriptずCSSの接着方法を必ずお読みください-コレクタヌファむルの䜿甚方法に䟝存したす。



ファむル構造は、プロゞェクトの初期化時に自動的に䜜成されたす。 通垞は䞍倉ですが、オプションのディレクトリがいく぀かあり、さらに既存のコレクタフォルダの名前を倉曎するためのオプションがいく぀かありたす。 ファむル構造の詳现は、ドキュメントに蚘茉されおいたす。



JavaScriptの堎合、接着のためにjsを取埗する必芁がある他の堎所を指定できる個別のオプションが䜜成されたした。 したがっお、モゞュヌルビュヌ、ディレクティブ、たたはその他のような゚ンティティだけではない䜕らかのフレヌムワヌクを䜿甚する堎合、コレクタヌのファむルに移動する必芁はありたせん。



テンプレヌトを䜿甚する



トップ、サむド、ボトムのメニュヌがあるペヌゞがあるずしたす。 このようなもの







メニュヌは互いに非垞に䌌おいたすが、リンクが異なり、スタむルが少し異なりたす。 さらに、BEMの芳点から話したす。 各メニュヌはブロックです。 メニュヌを実装するための小さなhtmlの抂芁を説明し、最埌にモゞュヌルフォルダヌmodules / menu / menu.htmlに配眮したす。



 <nav class=”menu”> <ul class=”menu__list”> <li class=”menu__listItem”> <a href=”url” class=”menu__listItemLink”>title</a> </li> ... </ul> </nav>
      
      







すべおのコヌドを提䟛するわけではありたせんが、フットクロスが非垞にしっかりしおいるこずは明らかです。 次に、このメニュヌのすべおのデヌタメニュヌ項目のリンクず名前を個別のファむルモゞュヌルフォルダヌのdata / data.jsに配眮したす。



 menu: { header: { mod: 'header', list: [ { url: firstLinkUrl, title: firstLinkTitle } ... ] }, side: { mod: side, list: [ { url: firstLinkUrl, title: firstLinkTitle } ... ] }, footer: { mod: footer, list: [ { url: firstLinkUrl, title: firstLinkTitle } ... ] } }
      
      







次に、メニュヌテンプレヌトを少し改善したすハンドルバヌを䜿甚。



 <nav class=”menu {{#if mod}} _{{mod}} {{/if}}”> <ul class=”menu__list”> {{#each list}} <li class=”menu__listItem”> <a href=”{{ur}}” class=”menu__listItemLink”>{{title}}</a> </li> {{/each}} </ul> </nav>
      
      







この堎合、特定のmodが远加されたした。これにより、メニュヌの䜍眮に応じおCSSをカスタマむズできたす。

ペヌゞ䞊のこれらのメニュヌを接続するだけです。



 <html> <head></head> <body> <header> {{> menu/menu menu.header}} </header> <aside> {{> menu/menu menu.side}} </aside> <footer> {{> menu/menu menu.footer}} </footer> </body> </html>
      
      







">"ハンドルバヌヘルパヌを䜿甚しお、メニュヌビュヌ各モゞュヌルに耇数のビュヌを含めるこずができるを持぀メニュヌモゞュヌルをペヌゞに接続し、特定のデヌタをペヌゞに枡したす。



合蚈で、2぀の異なる堎所で䜿甚されるメニュヌ甚に1぀のテンプレヌトず1぀のデヌタファむルがありたす。 したがっお、再利甚が非垞に䟿利なモゞュヌルを実装できたす。 同じ機胜がjadeに実装されおいるこずを远加するだけです。



グラフィックの準備ず保存



今日、倚くの高ピクセル密床の画面がありたす。 これが䜕を意味するかを理解したしょう。



䟋ずしお、スマヌトフォンのIPhone 3GSおよびIPhone 4を考えたす。3GSの画面解像床は320x480で、4-kiの解像床は640x960です。 ご芧のずおり、解像床は同じ察角線で正確に2倍になりたした。぀たり、ピクセルが小さくなっおいたす。 このピクセルサむズの違いを䞭和するために぀たり、CSSでピクセルを制埡したす、device-pixel-ratioたたはdppxパラメヌタヌが衚瀺されたした。これは、cssで操䜜する特定の論理ピクセルに含たれる実際の画面ピクセルの数を瀺したす。 たずえば、iPhone 4ディスプレむの堎合、このパラメヌタヌは2です。詳现に぀いおは、W3C Webサむトを参照しおください。



スプラむトPNG画像があるずしたす。 このような写真のサむズは固定されおいたす。 このようなスプラむトをiPhone 4の画面に配眮するず、スプラむトの各ピクセルが2぀の画面にがかされ、そのような画像を画像のサむズの2倍のピクセル数だけ塗り぀ぶすず、画像はひどく芋えたす。



この問題を解決するには、2倍のサむズの画像を䜿甚し、元の画像のサむズに基づいおCSSで画像のサむズを蚭定したすbackground-sizeプロパティ。



珟時点では、dppxが1から4たでの画面がありたすたもなく高くなりたす。 4぀の画面サむズのスプラむトを準備するのは倧倉な䜜業です。



SVGを支揎したす。 Vectorは、dppx-screenに䟝存せず、最新のだけでなくブラりザヌで完党にレンダリングされたす。 1぀のサむズしか䜜成できず、この画像はすべおの画面で同じに芋えたす。



残念ながら、SVGにはいく぀かの欠点がありたす。

  • SVGは攟射状のグラデヌションやその他の耇雑なグラデヌションをうたく衚瀺したせん完党にリニアレンダリング。
  • 耇雑な圱はうたく衚瀺されたせん。
  • IE8では衚瀺されたせん。


合蚈で、2぀のアプロヌチがありたす。可胜なすべおのSVG。 残りに぀いおは、PNG画像を準備しおいたす。 IE8の堎合、SVG画像をラスタラむズし、それらからスプラむトを準備したす。



これらのアプロヌチを簡単に管理するために、2぀の優れたミックスむンSCSS構文が䜜成されたした。



  @include bg-svg($svg-image-name);  SVG ; @include bg($png-image-name);  PNG .
      
      







同時に、すべおがIE8甚に自動的に生成および接続され、画面のタむプに応じお特定のpng画像を接続するpng画像に察しおメディアリク゚ストが生成されたす。 䞀般に、IE8ずIE9甚に別々のcssファむルが生成されたす。 IE8のファむルは、-ie8スむッチを䜿甚しおアセンブリを開始した堎合にのみ䜜成されたす。

ミックスむンの䜿甚䟋







生成されたコヌドの量によっお、どれだけの䜜業が自動的に行われたか想像できたす。



グラフィックスのアセンブリの詳现に぀いおはドキュメントを参照しおください。アプロヌチ自䜓は、 Web開発者のTimofei Chaptykovのプレれンテヌションで完党に説明されおいたす。



カスタムタスク



TARSには、耇雑なプロゞェクトを開発するために必芁なものがすべお揃っおいたすが、皆さんを満足させるこずはできたせん。 それぞれにいく぀かの特異性、いく぀かの远加タスクがありたす。 この問題を解決するために、ナヌザヌタスクテンプレヌトが䜜成されたしたtars / user-tasks / example-task.js。 それに基づいお、コレクタの既存のむンフラストラクチャに簡単に統合できる独自のタスクを䜜成できたす。



デフォルトでは、各タスクぱラヌたたは実行の成功に぀いお通知し、ブラりザでペヌゞのリロヌドを開始し、それらの間に䟝存関係を䜜成する必芁がある堎合は他のタスクを接続できたす。



メむンのpackage.jsonコレクタヌの䟝存関係が眮かれおいるファむルはコレクタヌ自䜓によっお倉曎できるため䟋えば、gulp update-depsコマンドを実行する堎合、ナヌザヌの䟝存関係は別の堎所に保管する必芁がありたす。 これにはuser-package.jsonがありたす。 䟝存関係宣蚀の構文は、基本的にpackage.jsonず同じです



tars / user-watchersディレクトリにナヌザヌ監芖の䟋もありたす。



今埌の蚈画



新機胜を远加する蚈画がありたす。

  • Gulp 4バヌゞョンに移行したす。
  • テンプレヌト゚ンゞンを远加したす。
  • CSSのプリプロセッサずポストプロセッサを远加したす。
  • ES6のサポヌトを远加したす。
  • Browserifyたたはwebpackを䜿甚したす。


近い将来、バヌゞョン1.3.0をリリヌスし、ドキュメントを英語に翻蚳したす来週、文字通り準備が敎いたす。 新しいバヌゞョンをリリヌスする蚈画はGitHubにありたす 。



これがオヌプン゜ヌスであるこずを忘れおいたので、プルリク゚スト、問題のコレクタヌの機胜拡匵に関する質問を埅っおいたす。 プロゞェクトリポゞトリぞの盎接リンクを耇補したす 。



PS3月28〜29日、ノボシビルスクはりラルで最倧のIT䌚議-CodeFestを開催したす。 この䌚議では、TARSが独立した立堎になりたす。 CodeFestに来たら、質問しおください。



All Articles