
ã¢ãã€ã«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ãã³ãã«ã«ãŸã§åã³ãŸãã å°æ¥çã«ã¯ãã¹ã¿ã€ã«ãåå²ããããšãèšç»ããŠããŸãã