モバむルアむランドずは䜕ですか

みなさんこんにちは。 私の名前はMax Degterevですここにはアカりントがありたせんので、私のtwitterは@suprMaxずサむトmaxdegterev.nameです 。 私たちは最近、モバむルサむトの新しいクヌルなバヌゞョンを立ち䞊げたした。 今から圌に぀いおお話したす。

















䞻な根拠



新しいモバむルサむトで䜜業しおいる間、叀いサむトの開発経隓がありたした。 これらの手玙を曞いおいる時点では、ただhttp://ostrovok.ru/mで入手できるはずですが 、どのくらいの期間機胜するかはわかりたせん。 叀いサむトは非垞に簡単に機胜したした。 圌は䞀般的なOTAプロゞェクトに䜏んでおり、それに応じお、同じバック゚ンドDjango、暙準メディアゞェネレヌタヌ、シンプルなHTMLテンプレヌトサヌバヌ偎、アンダヌスコアのいく぀かのJavaSciptテンプレヌト、SCSS、および通垞のJavaSciptを䜿甚したす。 私たちは皆これを100回経隓したした、それはすべお非垞に退屈です。



新しいサむトを開発する前に、次のタスクを行いたした。



歎史的に、サむトは垞にモバむルアプリケヌションの蚭蚈で開発されおおり、この蚭蚈はその䞊に展開されおいたす。 そのような実隓のようです。 そしお、ここでのデザむンはたったく新しいフラットでしたiOS 7スタむル、ファッショナブル。 したがっお、色、そしお実際に倖芳が島の他の郚分ずわずかに異なるこずに驚かないでください。



前回のように、OTAに䟝存したくありたせんでした。 さらに、私はこのサむトで䞀人で䜜業したしたが、Djangoを教えるこずはたったく面癜くありたせんが、OTA開発者の1人を垞に気を散らすこずは決しお面癜くありたせん。 だから私は海賊のように考えるこずにしたした。 Ostrovokには、モバむルサむトに必芁なほずんどの機胜をカバヌするモバむルAPIが既にありたす。 デスクトップサむトからAPIのこの郚分を远加するず、かなり良い解決策が埗られたす。 これが私が遞んだアプロヌチです。



私はNodeJSを基瀎ずしお取りたした。 私はい぀もやっおみたかった。 フレヌムワヌクはExpressJSで、Sinatraに非垞によく䌌おいたすこんにちはRuby。 ナヌザヌセッションを実斜する必芁があるため、Redisは䞍可欠です。 通垞よりも少ないJavaScriptを印刷するにはCoffeeScriptを䜿甚したした。 テンプレヌトの堎合はJadeを、CSSの堎合はStylusを䜿甚したした。 ファッションサむトが必芁で、携垯電話では速床を倧幅に向䞊させるこずができるため、singlepageはすべおを行うこずにしたした。 最初はSpineJSを䜿甚するこずを考えたしたが、圌のコミュニティはそれほど倧きくないので、Backbone、Lo-Dash、Zeptoなどの叀兞的な束です。









アセットのアセンブリを少し工倫する必芁がありたした。 レヌルのように、すべおを自動的にクヌルにしたい。 アセットラックは非垞に優れた゜リュヌションであるこずが刀明し、JS、CSS、さらにはJadeテンプレヌトを組み立おる䜜業を完党に匕き受けたした。 もちろん、圌はテンプレヌトをプリコンパむルする方法を知っおおり、指定された名前空間に入れたすapp.templatesを遞択したした。 圌はたた、CoffeeScriptず芁件システムをプリコンパむルするずいう頭痛の皮を取り、2぀のオプションを提䟛したす。SnocketsSprocketsず、RequireJSを䜿甚した埓来のNodeJSバヌゞョンBrowserifyです。 ただし、NodeJSは新しいものなので、問題がありたした。



小蚈





ファッショナブルで若々しく、楜しくなるようにタスクを決めたした。



仕組み



プロゞェクト自䜓の線成方法に぀いお少し説明したす。 写真は千の蚀葉に倀する





BackboneずCoffeeScriptの開発の詳现には觊れたせん。 これに぀いお䜕千もの蚘事が曞かれおいたす。 モゞュヌルの構造に぀いお簡単に説明したす。䞀般的には、私がやったように、倢䞭にならないようにしたす。



明らかに、Backboneにはコレクション、モデル、ビュヌがありたす。 別のフォルダに入れたす。 モゞュヌルも必芁でした。 これらは、私がどのペヌゞにいおも、垞に必芁なものです。 これらはアプリケヌションの開始時にロヌドされ、たずえば、ビュヌが別のペヌゞに移動したずきにすぐに砎棄されたずきにアンロヌドされなくなりたす。 䞀郚のモデル/コレクションたずえば、[終了]ボタンをクリックしたずきの予玄のリストず同様。 私のモゞュヌルは、モヌダルりィンドり、サむドバヌ、電話の物理的な䜍眮に関する情報などです。



最終的に、これは私のメむンapp.coffeeファむルの倖芳です

  #= require ../../data/app.config.js #= require ../helpers.js #= require app.utils.js #= require_tree modules #= require router.coffee #= require_tree models #= require_tree collections #= require_tree views app = _.extend(@app, Backbone.Events) # ... # Layout modules app.size = new app.modules.Size() # Data modules app.geo = new app.modules.Geo() app.user = new app.modules.User() app.analytics = new app.modules.Analytics() # Modals and extra views app.overlay = new app.modules.Overlay() app.modal = new app.modules.Modal() # Router relies heavily on stuff above app.router = new app.Router() # ... Backbone.history.start(pushState: true, hashChange: false)
      
      





これは、バック゚ンドでも䜿甚されるhelpers.jsです。 require_treeを介しおフォルダヌを接続するず、個々のファむルの接続に぀いお考えるこずはできたせんが、読み蟌み順序はそれを保蚌しないため、他のクラスたずえば、viewから継承する必芁がある堎合は远加のrequireを行う必芁がありたす。 そのようなタスクはありたせんでしたが、Backbone.history.startを呌び出すたでに、システムのすべおのモゞュヌルずコンポヌネントは既にメモリにあったため、ルヌタヌはその仕事、コヌルビュヌなどを実行できたした。



スタむラスに぀いお少し説明したす。 SASSに非垞に䌌おいたすが、倚くの远加機胜がありたす。 明らかに、識別ベヌスです。 これにより、クラス名の共通郚分に煩わされるこずがなくなりたす。 しかし、私たちは皆長い間これを芋おきたした、それは退屈です。 CSSルヌルの倀を倉数ずしお䜿甚できるのはどうですか



  .my-awesome-block width: 100px height: 100px margin: (@width / 2) auto line-height: @height
      
      





悪くない。 ベンダヌプレフィックスのサポヌトはどうですか 私たちはひどい競争の䞖界に䜏んでいたす。 幞い、次のようになりたす。



  .my-awesome-block box-sizing: border-box transition: all .2s ease
      
      





スタむラス自䜓は、自分が持っおいるミックスむンを調べ、同じ名前のプロパティを芋぀けるず、眮換を実行したす。 したがっお、境界線の半埄ちなみにtrueのように、ベンダヌプレフィックスを入力する必芁がなくなった堎合、1぀のミックスむンを削陀するだけで、残りのファむルを開くこずさえできたせん。 よくわかりたせんが、これで将来玄100倍の節玄ができるように思えたす。 さお、私のapp.stylがどのように芋えるかの小さな䟋



  @import 'config' @import 'includes/reset.css' @import 'includes/fonts.css' @import 'includes/mixins' @import 'plugins/iswipe' @import 'plugins/zepto.sidebarify' @import 'plugins/zepto.calendar.css' @import 'plugins/zepto.input.numselect.css' @import 'plugins/zepto.listselect.css' @import 'plugins/zepto.textarea_autogrow' @import 'partials/partial_date' @import 'partials/partial_spinner' // ...
      
      





混合むンポヌトも問題ではないこずがわかりたした。 珟時点での唯䞀の欠点は、mixinを呌び出すために匕数が必芁なこずです。 これがなければ、この呌び出しは機胜したせんでしたが、既に修正されおいたした。 私はこのように曞いおいたす



  html, body // lol! noselect plz body, select, input, button, textarea color: #4b5c66 font: normal 14px Helvetica, Arial, sans-serif line-height: 1.4em //...
      
      





スタむリングでは、垞にクラスのみを䜿甚しおシスの邪悪な特異性を打ち負かし、クラスが亀差しないこずを146保蚌するために、SMACSSアプロヌチを䜿甚したした。 たあ、たたはそうではないが、非垞に䌌おいたす。 ペヌゞの構造に関連し、トランゞション䞭に倉曎されないものはすべお、接頭蟞lレむアりトで行いたした。 たた、pペヌゞ、bブロックペヌゞ内のブロックなどもありたす。 芁玠が芁玠にネストされおいる堎合、そのクラスは芪の名前の䞀郚を継承したす。 継承されない堎合がありたすが、ルヌトクラスは垞に継承されたす。 スタむルの䟋を次に瀺したす。



  .p-awesomepage .pa-header // styles .pah-soopermenulink color: hotpink .pa-content // styles .pa-loading // styles .pa-title // styles
      
      





このマヌクアップの堎合

  .p-awesomepage header.pa-header wow, header! .pa-content .pa-title my awesome title .pa-loading .pa-title loading is being loaded
      
      





このアプロヌチずスタむラスのルヌルのネストを組み合わせる堎合䞻なこずはシフトしないこずです。そうしないず、出口で゜ヌセヌゞが出たす、亀差点はありたせん。



ゞェむドに぀いおは䜕も蚀うこずはありたせん。 これは非垞にテンプレヌト゚ンゞンです。 スリムを䜿甚した人は同じです。 サポヌトにはむンクルヌドずパヌシャルが含たれたす。 䞀般的なhelpers.jsファむルを介しおヘルパヌを投げたした。 独自に登録するこずもできたすが。 たずえば、すでに持っおいるマヌクダりン。



展開に぀いお少し



開発の開発方法に関するすべおがすぐに理解できる堎合は、ここで少し考えなければならない展開を展開する方法を瀺したす。 レヌルに぀いおは、capistranoのような9999999゜リュヌションがすでに発明されおいたすが、これたでのずころ、ノヌドで機胜するものを芋぀けるこずができたせんでした。

私は、次のこずを行う「cake deploy」ずいうケヌキの指瀺を最倧限に掻甚するために、テストVPSを決定したした。



  task 'update', '[VPS]: Update current state with new from repo', -> console.log('[Cake]: Pulling updates from repo') exec('git pull', (error, stdout, stderr) -> unless error console.log('[Cake]: Installing npm packages') exec('npm install', (error, stdout, stderr) -> unless error console.log('[Cake]: Restarting forever') # exec('forever restartall') exec('killall forever') exec('killall nodejs') console.log('[Cake]: Cleaning up old assets') exec('find ./public/assets -regextype posix-egrep -regex ".*\.(js|css|gz|gzip)$" -delete') exec('cake forever') sendMail() else console.warn("[Cake]: Installation failed with error: #{error}") ) else console.warn("[Cake]: Update failed with error: #{error}") ) task 'deploy', '[DEV]: Deploy current repo state to dev VPS', -> console.log('[Cake]: Connecting to VPS mobota@mobota-dev.ostrovok.ru && running update') exec('ssh mobota@mobota-dev.ostrovok.ru \'cd /var/www/mobota && cake update\'', (error, stdout, stderr) -> if error console.warn("[Cake]: Deploy failed with error: #{error}") else console.log('[Cake]: Deployed!') )
      
      





実皌働環境にロヌルアりトするために、Denis Orlihinはdebianパッケヌゞをセットアップしたした。 teamcityの頭蓋骚は機胜し、アセンブリの前にテストを実行したす。 ずおもかっこいい。 詳现はお䌝えしたせんが、おそらく圌が䜕らかの圢で䌝えるでしょう。



テストずいえば。 ハハフロント゚ンドであり、原則ずしお非垞に怠laなので、私は通垞テストを曞きたせん。 しかし、サヌドパヌティのAPIに䟝存する必芁があるため、ここでは統合テストが本圓に必芁でした。 mocha + chaiJSのテストを䜜成したした。 非垞にシンプルで䟿利、そしお最も重芁なのは優れたレポヌタヌです



私は公園に座っおいるので、むンタヌネットは超高速ではなく、テストは萜ちたした



これはすべお非垞に興味深いですが、モバむル開発に぀いおはどこにありたすか。



そしお確かに、それは最も重芁なこずのための時間でしょう。 本栌的なブラりザず比范しお、モバむルデバむス甚に開発する際に気づいた違いは䜕ですか。 䞀床に耇数のプラットフォヌムで䜜業する必芁があり、各プラットフォヌムには独自の問題があるこずを考えるず、それほど単玔ではないこずがわかりたす。 昚幎から状況はそれほど倉わっおいないず蚀える。 䞻な問題は、2番目のバヌゞョンのAndroid携垯電話ず4代前半です。 iOSでは、奇跡もありたすが、すべおがはるかに簡単です。



たず、問題に関する詳现。 䞀郚は非垞に明癜ですが、繰り返したす。 いく぀かは私にずっお初めおのこずでした。぀たり、他の誰かに圹立぀可胜性がありたす。





䞀般に、開発アプロヌチは、非垞に匱いマシン䞊の倧芏暡サむトでの䜜業に䌌おいたす。 バッテリヌずプロセッサ/メモリのリ゜ヌスが非垞に限られおいるこずを忘れおはならず、実際のデバむスのパフォヌマンスを垞に確認しおください。 もちろん、これはテストに䜿甚できたデバむスに基づいた私の個人的な経隓です。 私はいく぀かの点で間違っおいるかもしれたせん。



デスクトップのブラりザずは異なり、モバむルの開発ボヌナス





おわりに



私たちは開発者になるために玠晎らしい時間を過ごしおいたす。 アむデアが頭に浮かび、それを簡単に実装できたす。 残りの人々は、圌らにずっお実珟できないアむデアで生きおいたす。 したがっお、コヌドを蚘述しおNodeJSを䜿甚しおください。迅速、䟿利、非同期、そしお若者です。 そしお、文字を入力するのではなく、アむデアを思い぀くのにもっず時間がかかりたす。



GitHubのサむトから䜕かを投皿するず思いたす。自分でそれを芋お䜿甚するこずができたす。 皆さん、頑匵っおください。



All Articles