デリヌ-短瞮、たたはモバむル2GISオンラむンの方法





モバむルWebは飛躍的に発展しおいたす。 2017幎の庭で。 モバむルトラフィックがデスクトップを超えたした 。珟圚、党ペヌゞの半分以䞊が電話たたはタブレットで開かれおいたす。 Google は 2015幎に、ランキングの発行時にモバむルフレンドリヌサむトを優先するこずを発衚し 、2016幎にはYandex がそれを行いたした。 ナヌザヌは、モバむルデバむスからむンタヌネット䞊で月に60〜70時間を費やし、非適応サむトを䟵害しお䜿甚する準備ができおいたせん。 たた、2GISも䟋倖ではありたせん。 2幎間で2GIS Onlineモバむルトラフィックの増加は74に達し、月間芖聎者は600䞇人を超えたした。







4月17日に、 m.2gis.ruで利甚可胜な1ペヌゞのアプリケヌションである新しいモバむルオンラむン「Monline」を開始したした。 このアプリケヌションは、りファずノボシビルスクの2぀の郜垂で開始され、近い将来、ロシア党䜓でのリリヌスが蚈画されおいたす。







モバむル開発では、次の3぀の問題に盎面するこずがわかっおいたした。







モバむルむンタヌネット

モバむルむンタヌネット2G、3G、4GたたはWi-Fiは䜎速で、ケヌブルほど安定しおいたせん。







モバむル機噚

携垯電話の問題は、プロセッサが匱いこずです。 これは、JSの解析、レンダリング、およびアニメヌションに圱響したす。







モバむルブラりザ

䞀郚の䞀般的なモバむルブラりザは、䞀郚のCSSプロパティたたはJS APIメ゜ッドをサポヌトしおいたせん。 IE8の開発の暗黒時代に戻ったず思うこずもありたした。 モバむルむンタヌネットずプロセッサは、ポリファむルの䜿甚を蚱可したせんでした。぀たり、自分で出なければなりたせんでした。







デスクトップオンラむンバヌゞョンの機胜を保持し、ペンザ近くの祖父の死んだ電話でもMonlineを動䜜させたした。 これに぀いおは以䞋で説明したす。







デリヌ-削枛



モバむルWebの䞖界では、JS開発者は1぀のモットヌ、Delhi-Cutに埓いたす。 モバむルアプリケヌションの最終的なバンドルは、少し重くお现かく分割する必芁がありたす。







フレヌムワヌクずラむブラリの遞択



メむンで唯䞀のフロント゚ンドフレヌムワヌクはPreactです。 これはタむプミスではありたせん。 Preactは、同じAPIを䜿甚し、仮想DOMで動䜜するReactの軜量の代替です。 このフレヌムワヌクの利点は、その軜量性3 kB gzip察45 kB for Reactず高いレンダリング速床です。 Reactの代わりにPreactを䜿甚するこずにより、ベンダヌのサむズが90削枛されたした。







PreactはReactずは異なりたす。 たずえば、propTypeがありたせんが、この問題は静的型付けを導入するこずで解決したした。これに぀いおはセクション3で説明したす。フレヌムワヌク間の違いの詳现は、公匏のgithubリポゞトリに蚘茉されおいたす。







さらに、私たちは自分で曞いお、サヌドパヌティの芪友ず重いラむブラリを接続しないようにしたす。 必芁なポリファむルはrequire.ensureを介しお非同期にロヌドされ、バンドルに分類されたせん。 各ポリフィルは、条件に応じおのみ接続されたす。 たずえば、Androidブラりザ甚のpolyfilの堎合、gzipで5 kBのコヌドを保存したした。







遅延読み蟌み



画像



JSが圢成されたす。 今、それを砎る時間です。 JSコヌドは3぀のグルヌプに分けられたす。









ベンダヌはPreactを遞択するこずで最小化され、必芁に応じお非同期で倚フィルを接続したす。 最埌のヒヌロヌが残った。 gzipでgzip圧瞮された143キロバむトのアプリバンドル。 モバむル開発には莅沢です。 そのため、ナヌザヌが組織のカヌドにログむンしおいる堎合、メトロカヌドたたはアトラクションのレンダリングを担圓するコヌドを即座に読み蟌むこずは意味がありたせん。 アプリバンドルのサむズを瞮小し、できるだけ少ないコヌドをクラむアントに配信するために、遅延ダりンロヌドを行いたした。







Montlineのコヌド番号1の芁件には、「コヌドはできるだけ単玔で、知らないこずややりすぎないこずが必芁です。」 UI構造は、このルヌルに基づいおいたす。 プロゞェクトには11個のコンテナず85個の「ダム」コンポヌネントがありたす。 愚かなコンポヌネントはお互いを知りたせん。 コンテナはコンポヌネントを構造に結合し、小道具を介しおデヌタを送信したす。 組織たたは倱効カヌド、建物の発行-コンテナの䟋。 11個のコンテナのうち6個は盞互に接続されおいないため、アプリバンドルを...陰謀... 6個の远加チャンクに分割できたす。 リカバリ䞭に、ブラりザはアプリバンドルず目的のチャンクをロヌドし、その埌、非アクティブなコンテナヌを担圓する残りのJSファむルが非同期にロヌドされたす。 これはアプリケヌションをブロックしたせん。 遅延読み蟌みのリリヌス埌、アプリバンドルの重量は38枛少したした。







クラむアントでのデヌタの保存ず正芏化



モバむルりェブでは、ペヌゞをすばやく衚瀺するこずが重芁です。 99.9SPAのように、Montlineでは、コンテナ内の情報の䞀郚が亀差しおいたす。 䌁業の発行ず別の組織のカヌドを受け取りたす。 問題には、芋出し、䜏所、スケゞュヌルなどが衚瀺されたす。同じ情報が䌚瀟のカヌドに衚瀺されたす。 ナヌザヌがアプリケヌションを䜿甚しおいる間、そのような情報は倉わりたせん。 ナヌザヌが過去にこの情報を既に衚瀺しおいる堎合、サヌバヌからの応答を埅぀こずは意味がありたせん。これは、クラむアントに1぀のコピヌで保存し、ここでデヌタを衚瀺できるためです。







クラむアント䞊のデヌタの正芏化ずは、コンテナ内で再利甚されるスタック内の䞀意のデヌタの保存です。 クラむアントにデヌタを保存するず、コンテンツの衚瀺速床が向䞊し、正芏化により重耇が削陀され、静的デヌタず状況䟝存デヌタが分離されたす。







正芏化は状態をクリヌンに保ちたす。 静的デヌタが衚瀺される堎合、それは別のテヌブルの蚘事に保存されたす。 たずえば、ナヌザヌが1぀の䌚瀟を耇数回開いた堎合、ストヌリヌ内ではIDによるアクセス暩を持぀1぀のむンスタンスに栌玍されたす。 この䌚瀟に関する情報は、組織のカヌド、問題、レビュヌ、写真など、あらゆるニヌズに䜿甚されたす。コンテナセレクタヌは、デヌタのフォヌマットを担圓したす。







もう1぀の䟋を瀺したす。 怜玢ク゚リを介しお䌚瀟のカヌドにアクセスするか、セクションをクリックするか、単にそのIDのリンクから回埩するこずができたす。 怜玢ク゚リたたはカテゎリIDは、回埩䞭にルヌタヌが解析するURLに远加されたす。 URLに䌚瀟のID以倖のものがある堎合、州は、その情報ず、怜玢ク゚リたたはカテゎリに䞀臎する最初の10瀟のデヌタを保存したす。 䌚瀟のカヌドから発行に切り替えるず、ナヌザヌはすぐに組織のリストを受け取り、各䌚瀟のペヌゞをすばやく開くこずができたす。







人々は、コンテンツのダりンロヌドだけでなく、フォヌムを介しおデヌタを送信する際の応答も埅ちたくない。 クラむアントにデヌタを保存するず、情報を保存する際の埅ち時間が短瞮されたす。 ストヌリヌ内の情報は、楜芳的なむンタヌフェむスを自由に䜜成できたす。 楜芳的なUIデザむンは、アプリケヌションが実際に操䜜を完了するたたは開始する前の最終状態を瀺したす。 デヌタを送信するず、ナヌザヌ情報はクラスに保存され、バックグラりンドでサヌバヌに送信されるため、ナヌザヌはストレヌゞに関する情報を即座に受信したす。 サヌバヌから゚ラヌ応答を受信した堎合にのみ、アプリケヌションは察応するメッセヌゞでナヌザヌに通知したす。それ以倖の堎合、サヌバヌの応答は衚瀺されたせん。







自分で簡単に



34人の開発者がMontlineの䜜成に参加したした。 2,000件のコミットがマスタヌにマヌゞされ、77,000行のコヌドが曞き蟌たれ、1,425個のファむルが䜜成されたした。 このプロゞェクトには他のチヌムの人々が参加し、圌らはむンタヌンシップに参加したした。 コヌドを理解しやすく文曞化するために、開発プロセスをスピヌドアップしたかったのです。 そのため、JavaScriptでの動的型付けを攟棄するこずにしたした。







静的型付け



アプリケヌションのクラむアント郚分は、TypeScriptで蚘述されおいたす。 静的型付けは、JSに察するTypeScriptの䞻な利点です。 コンパむル゚ラヌが発生した堎合に手を振っお、内郚からコヌドを文曞化し、リファクタリングずデバッグを容易にしたす。







プロゞェクトはReduxを䜿甚しお、アプリケヌションの状態を制埡したす。 ReduxはTypeScriptず組み合わせたす。 開発者は、ペむロヌドたたはメタに転送されるものず、それに応じおリデュヌサヌに送られるものを知っおいたす。 䟋







export const setScrollTop = (payload: number) => ({ type: APPCONTEXT_CHANGE_SCROLL_TOP, payload }); export const setErrorToFrame = (errorCode: ErrorCodeType) => ({ type: APPCONTEXT_SET_ERROR_TO_FRAME, payload: { errorCode } });
      
      





TypeScriptを䜿甚するず、reducer状態の新しいバヌゞョンを蚈算しお返す玔粋な関数を簡単に操䜜できたす。 たずえば、蚘事内の珟圚のアプリケヌションコンテキストに関する情報を曎新するレデュヌサヌは、69個のアクションを凊理したす。 出力では、新しい状態を返す100行のコヌドのスむッチを持぀メ゜ッドを取埗したす。 このような倧きなキャンバスでは、必芁なアクションのみを凊理するこずが重芁です。







 export default function (state: AppContext = defaultState, action: AppAction): AppContext { switch (action.type) { case APPCONTEXT_ADD_FRAME: return appAddFrame(state, action.payload); case APPCONTEXT_REMOVE_ACTIVE_FRAME: return appRemoveActiveFrame(state); .... case APPCONTEXT_HIDE_MENU: return { ...state, isSideMenuShown: false }; default: return state;
      
      





Discriminated Unionsは、reducerの䞀連のアクションずペむロヌドたたはメタのデヌタずの混乱を避けるのに圹立ちたす。 䞊蚘のコヌドは、アクション匕数が次のようなAppActionタむプで蚘述されおいるこずを瀺しおいたす。







 export type AppAction = AppAddFrameAction | AppRemoveActiveFrame | AppChangeFramePos | AppChangeMode | AppChangeLandscape

      
      





AppActionは60個のむンタヌフェヌスappAddFrameAction、AppRemoveActiveFrameなどを組み合わせたす。 各むンタヌフェヌスはアクションを蚘述したす。 アクションのタむプ-文字列リテラル-は刀別匏です。 ペむロヌドやメタなど、オブゞェクトの内郚の存圚ず内容を決定したす。







 export interface AppAddFrameAction { type: 'APPCONTEXT_ADD_FRAME'; payload: Frame; } export interface AppRemoveActiveFrame { type: 'APPCONTEXT_REMOVE_ACTIVE_FRAME'; } export interface AppChangeFramePos { type: 'APPCONTEXT_CHANGE_FRAME_POS'; payload: FramePos; }
      
      





したがっお、TypeScriptは、刀別匏 'APPCONTEXT_ADD_FRAME'を䜿甚したアクションの堎合、ペむロヌドをフレヌムむンタヌフェむスで転送する必芁があり、 'APPCONTEXT_REMOVE_ACTIVE_FRAME'の堎合、䜕も送信する必芁がないこずを理解しおいたす。







たた、PreactはTypeScriptず組み合わせたす。 Preactには、コンポヌネントのタむプチェックの問題を解決するリアクションpropTypeがありたせん。 しかし、TypeScriptはその損倱を補いたす。 たずえば、開発者は、小道具を介しおコンポヌネントに送信されるものず、スタックに保存されるものを知っおいたす。







 export interface IconProps { icon: SVGIcon; width?: number; height?: number; color?: string; className?: string; } export class Icon extends React.PureComponent<IconProps, {}> { constructor(props: IconProps) { super(props); } public render() { const { color, icon } = this.props; const iconStyle = color ? { color: this.props.color } : undefined; return ( <svg width={this.props.width || icon.width} height={this.props.height || icon.height} style={iconStyle} className={this.props.className}> <use xlinkHref={icon.id} /> </svg> ); } }
      
      





TypeScriptは文曞化されおおり、サンドボックスがありたす。 もちろん、蚀語は党胜ではありたせん、2017幎7月の時点で、2,200の問題が開かれたした。 マむクロ゜フト補品は、ES6の革新の䞀郚をサポヌトしおいたせん。 しかし、これらの問題は新しいリリヌスごずにゆっくりず確実に解決されたす。







レむアりトの䜜成ずテスト



モバむルオンラむン-85の「愚かな」コンポヌネント。 「愚かな」コンポヌネントは、受信したデヌタの衚瀺を担圓する芖芚的な゚ンティティです。 たず、アプリケヌション内でこれらのコンポヌネントのレむアりトず統合を分離したかったのです。 これにより、開発者リ゜ヌスによるコヌドのレビュヌずテストが高速化されたす。 これらの目暙を達成するために、メむクアップが䜿甚されたす。



構成-レむアりトの迅速か぀快適な手動回垰テストのためのグラフィカルむンタヌフェむス。 このツヌルの詳现に぀いおはこちらをご芧になり、 こちらをタップしおください 。







Makeupを䜿甚するず、コンポヌネントのレむアりトは、アプリケヌションに関連付けられるこずなく、ロックされたデヌタを持぀別のホストで実行されたす。 これにより、開発レベルでコンポヌネントの芖芚化をテストし、ピクセルパヌフェクトにレむアりトをカスタマむズし、埌で統合するこずができたす。







そのため、Makeupでは、デザむナヌが描いたものず開発者がしたこずの間に違いがありたす。







画像



そしお、 「11幎生」をチェックしお、䜕も行かないこずを確認したす。







画像



おわりに



たずめるず。 バンドルを枛らし、ペヌゞの読み蟌み速床を䞊げるずいう玠晎らしい仕事をしたした。 デヌタはクラむアントに保存されたす。 ベンダヌの重量は、圓初よりも90少なくなりたした。 バンドルには䞍必芁なラむブラリヌずポリフィルが含たれおおらず、必芁なものは必芁に応じお断片的に提䟛されたす。 TypeScriptを䜿甚するず、アプリケヌションをより现かく制埡できたす。たた、Makeupは、Monlineのビゞュアルコンポヌネントでの䜜業を簡玠化したす。







蚈画は、コンテキストに応じお「倪字」モゞュヌルを分割したずえば、䌚瀟たたは地理オブゞェクトカヌドを個別のチャンクに分割する、レデュヌサヌを分割しようずしたす。







この蚘事はJSコヌドに関するものです。 しかし、Delhi-Reduceの開発信条はCSSバンドルにたで及びたす。 将来的には、スタむルを分割するこずも蚈画しおいたす。








All Articles