ããã«ã¡ã¯ãã¡ãã¬ãŒã®ãšã³ãžãã¢ã®å±±ç°ã§ããçŸåšãå»çä»è·æ±äººãµã€ãããžã§ãã¡ãã¬ãŒãã®ããŒã ã§éçºãæ
åœããŠããŸãã ä»åããžã§ãã¡ãã¬ãŒã®ç€Ÿå
ã¹ã¿ãããå©çšãã瀟å
ã·ã¹ãã ããªãã¥ãŒã¢ã«ããäºäŸãã玹ä»ããŸãã ãªãã¥ãŒã¢ã«å¯Ÿè±¡ã¯ããã¯ãšã³ãé åãå«ãŸããŸãããæ¬èšäºã§ã¯ããã³ããšã³ãã®è©±ãäžå¿ã«ã玹ä»ããŸãã ãŸããåŒç€Ÿãã¶ã€ããŒé
äºã以åæçš¿ãã ãã¶ã€ããŒããã¶ã€ã³ããŒã«ã䜿ããã«ãReact ã䜿ã£ãŠãã¶ã€ã³ãã話 ãé¢é£ããŠããã®ã§ããããããã°ããããŠã芧ãã ããã ãªãã¥ãŒã¢ã«ã®èæ¯ ç€Ÿå
ã·ã¹ãã ã§ã¯ãæ±äººãµã€ãããžã§ãã¡ãã¬ãŒããå©çšããæ±è·è
ã«é¢ããæ
å ±ãæ±è·è
ã®å¿åç¶æ³ã管çããŠããŸãã ååã®ãªãã¥ãŒã¢ã«ããæéãçµã¡ãè€éæ§ãé«ããªã£ãŠããŸããããã®è€éæ§ã«æ¯äŸããŠãæ°æ©èœã®è¿œå ãæ¹ä¿®ããããã®ã³ã¹ããé«ããªã£ãŠããŸããã ããã§äžèšã®èª²é¡ã解決ãããããç¶æ
管çãããããããã¹ãã³ãŒããæžãããããã¡ã³ãããã«ãªã¢ãŒããã¯ãã£ã«ãã¹ããªãã¥ãŒã¢ã«ã宿œããããšã«ããŸããã æ€èšŒæéãçµãŠãä»åã®ãªãã¥ãŒã¢ã«ã«ããããŠæ°èŠã«äœæãã API ã¯ãGraphQL ã«ãã£ãŠå®è£
ããããšã決ããŸããã åã·ã¹ãã ãæã€ããç»é¢ã«å¿
èŠãªããŒã¿ãæè»ã«éäžè¶³ãªãååŸã§ãããæåã§ããã¥ã¡ã³ãã«èœãšã蟌ãŸãªããŠãã¹ããŒããå®çŸ©ãããŠããã° API ã®ä»æ§ãç°¡åã«ææ¡ã§ãããçãã¡ãªãããšããŠæããããŸããã ç¹ã«ãGraphQL ãæã€åã·ã¹ãã ããTypeScriptãApolloãGraphQL Code Generator ã®ã©ã€ãã©ãªãçµã¿åãããããšã§ãAPI ã«æž¡ããã©ã¡ãŒã¿ããã¬ã¹ãã³ã¹ã«ãåãé©çšãããGraphQL ã¹ããŒãã®å€æŽã«ã¯ã©ã€ã¢ã³ãã®å®è£
ãæ¯èŒç容æã«è¿œåŸã§ããããšãã倧ããªãã€ã³ãã§ããã ããã³ããšã³ãã®æè¡çãªãªãã¥ãŒã¢ã«å
容 ä»åã¯ç¹ã«ããªãã¥ãŒã¢ã«ã«çšãããããã¬ãŒã ã¯ãŒã¯ãã©ã€ãã©ãªãApollo Client ãçšããç¶æ
管çããã¹ãã³ãŒãå®è£
ã«ããã Tips çãããããéšåçã«ã玹ä»ããŸãã æ¡çšãããã¬ãŒã ã¯ãŒã¯ãšäž»èŠã©ã€ãã©ãª æ¡çšã©ã€ãã©ãª 説æ Next.js React çšã®ãã¬ãŒã ã¯ãŒã¯ïŒãã€ã©ãŒãã¬ãŒãïŒ TypeScript JavaScript ã®ã¹ãŒããŒã»ããã§ãéçåä»ãèšèª React UI ãæ§ç¯ããããã®ã©ã€ãã©ãªïŒããŒãžã§ã³ 16.8.0 ã§ãªãªãŒã¹ããã hooks ãå
šé¢çã«äœ¿çšïŒ Apollo Client GraphQL API ã®ã¯ã©ã€ã¢ã³ãã§ãã¢ããªã±ãŒã·ã§ã³å
šäœã®ç¶æ
管çã宿œ GraphQL Code Generator GraphQL ã¹ããŒãããå®çŸ©ãã¡ã€ã«ïŒåãã«ã¹ã¿ã hooks çïŒãçæ emotion + Styled System CSS in JS ãšããŠå©çš formik + yup ãã©ãŒã ã®ãã«ã㌠+ ããªããŒã¿ãŒ Jest + React Testing Library ãã¹ãã³ãŒãå®è£
çšã®ããŒã«çŸ€ ESLint + Prettier ã«ãŒã«ã«åºã¥ããã³ãŒãã®éçè§£æ + ã¹ã¿ã€ãªã³ã° TypeScript ä»åã®ãªãã¥ãŒã¢ã«ã§æ±ããããããšã®äžã€ãšããŠããããªãæ¹åã»æ°èŠæ©èœè¿œå ãªã©ãããŠããäžã§ããœãããŠã§ã¢å質ãæ
ä¿ããããã®ãã¢ããªã±ãŒã·ã§ã³ã®å
ç¢ãããããŸããã ããã§ãããã³ããšã³ãåŽã®éçºèšèªãšããŠã¯ãããã°ã©ã ã³ãŒãå
ã§å®£èšãããåã«ãã£ãŠããšã©ãŒãæªç¶ã«é²ãã€ã€ãVSCode ãã¯ãããšãããšãã£ã¿ã®ã³ãŒãè£å®ã®æ©æµãåããããã¡ãªããçãèæ
®ã㊠TypeScript ã®æ¡çšã決ããŸããããŸããä»ã®ãããžã§ã¯ãã§ãæ¢ã« TypeScript ã¯éšåçã«å©çšãå§ããŠããäºæ
ããããéã« TypeScript ãæ¡çšããªãããšããéžæè¢ã¯ããŸãèããããŸããã§ããã React UI ãæ§ç¯ããããã®ã©ã€ãã©ãª/ãã¬ãŒã ã¯ãŒã¯ã¯ React ãæ¡çšããŸããããã¡ãããåŒç€Ÿã§ã¯å¥ãããžã§ã¯ãã§ React ãæ¢ã«å©çšãå§ããŠããããšããããåŠç¿ã³ã¹ãã®èгç¹ãããæ°ãã«ä»ã®ãã¬ãŒã ã¯ãŒã¯ãéžæããã¡ãªããã¯ã»ãŒç¡ãã£ãããã§ãããããããã®äºãå·®ãåŒãããšããŠã TypeScript ãš GraphQL ãšã®çžæ§ã®è¯ãã§ãReact ãåªå¢ã§ããã ç¹ã«ãReact ã®å Žåã¯ãGraphQL ã¹ããŒããããŒã¹ã«ãGraphQL Code Generator ã«ãã£ãŠåå®çŸ©ãã¡ã€ã«ã ãã§ã¯ãªããGraphQL API ãšã®ããåãã«äœ¿ããã«ã¹ã¿ã hooks ãçæããŠå©çšã§ãããšããç¹ãã倧ããªå©ç¹ãšããŠèããããŸããã Next.js ããã³ããšã³ãéçºç°å¢ãçŽ æ©ãæ§ç¯ããããããã€ã©ãŒãã¬ãŒããšã㊠Next.js ãæ¡çšããŸããã Next.js ã®å
·äœçãªæ¡çšãã€ã³ããšããŠã¯ãäž»ã«æ¬¡ã®ïŒç¹ã§ãã webpack ã«ãããããã³ãã«ãã³ã³ãã€ã«ãããããªããŒãçã®èšå®ã«æéãè²»ããããšãªããããžãã¹ããžãã¯ã®å®è£
ã«éäžã§ãã å¿
èŠãããã°ãnext.config.js ã§èšå®ãæ¡åŒµã§ãã CRAïŒCreate React AppïŒãšã¯ç°ãªããæ¡åŒµæ§ã«åªããŠãã pages é
äžã«çœ®ã React Component ã®ãã£ã¬ã¯ããªæ§æããèªåçã«ã«ãŒãã£ã³ã°ãšããŠå®çŸ©ããã ã«ãŒãã£ã³ã°ã«é¢ããèšèšäœæ¥ãäžèŠã«ãªã èªåã³ãŒãåå²çã«ããããã©ãŒãã³ã¹æé©åããããªã«è¡ã£ãŠããã React Component ã®åé¡ component ã¯å€§ããïŒã€ã«åé¡ãã src/components/app/ ãš src/components/ui/ ããããã®ãã£ã¬ã¯ããªã« component ã眮ããŠããŸããåé¡ã¯ä»¥äžã®åºæºã§è¡ãªããŸããã app : æ¬ã¢ããªã±ãŒã·ã§ã³åºæã§äœ¿çšãããæ³å®ã®ãã®ã§ãåå©çšæ§ãäœããå
·äœç㪠component ui : æ¬ã¢ããªã±ãŒã·ã§ã³å€ã§ã䜿çšå¯èœãªãåå©çšæ§ãé«ããæœè±¡ç㪠component 瀟å
åãã·ã¹ãã ã§ã¯ãããã®ã®ãMaterial-UI ã Ant Design çãã¯ãããšãããå€éšã® UI ã©ã€ãã©ãªã¯äœ¿çšãããã«ã¹ã¿ãã€ãºãããããããã«ãå
šãŠèªåã§äœæããŸããã app é
äžãš ui é
äžãã©ã¡ãã® component ãåºæ¬çã«ã¯ ã³ãã±ãŒã·ã§ã³ ã®èãæ¹ã§ãã¡ã€ã«ãæ§æããŠããŸãã äžè¬çã«ã¯ãããäžç·ã«å€æŽãããã¡ã€ã«ãè¿ãã«çœ®ããŠããã®ã¯è¯ãã¢ã€ãã£ã¢ã§ãã ãã®ååã¯ããã³ãã±ãŒã·ã§ã³ããšåŒã°ããŸãã ãã®èãæ¹ã§ãã¡ã€ã«ãæ§æããããšã§ãé¢é£ãããã¡ã€ã«ããŸãšãŸã£ãŠããŠãäœæ¥ããããããªããŸãã src/ components/ app/ partials/ ${ component å} / apollo.cache.ts apollo.query.graphql index.tsx index.test.tsx ... screens/ ${ component å} / apollo.cache.ts apollo.query.graphql index.tsx index.test.tsx ${å component å} / apollo.cache.ts apollo.query.graphql index.tsx index.test.tsx validation.ts src/components/app ãã£ã¬ã¯ããªé
äžã§ããã«ã partials ãš screens ã®ãã£ã¬ã¯ããªã§ component ãåããŠããŸãã screens ã«ã¯ãNext.js ã§ route ãšããŠæ±ããã src/pages é
äžã® component ãã import ããã component ãé
眮ãããŠããŸãã ç»é¢ã®ããªãšãŒã·ã§ã³ãå¢ãã床ã«ããã® screens ã«ãã¡ã€ã«ã远å ãããŠãããŸãã partials ã«ã¯ãapp é
äžã§è€æ°ã® component ããå©çšããã componentïŒç»é¢ããŸããã§å
±æããããã®çïŒãé
眮ããŠããŸãã screens ãš partials ããããçŽäžã® component ã§ãå¿
èŠã§ããã°é©å®ãcomponent ãåå²ããŠå component ãæã€æ§æã«ããŠããŸãã apollo.cache.ts ãš apollo.query.graphql ã«ã€ããŠã¯åŸè¿°ã®ç¶æ
管çã®è©±ã§ã玹ä»ããŸãã ç¶æ
管ç ã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
管çã«ã€ããŠã¯ãã°ããŒãã«ã«ã¢ã¯ã»ã¹ã§ããç¶æ
ã®ç®¡çã«ã¯ Apollo Client ã® InMemoryCache ã«ãã cache æ©æ§ã§è¡ããç¹å®ã® component å
ã«éããŠãã屿çãªç¶æ
ã®ç®¡çã«ã¯ useState çã® React Hooks ã䜿ã£ãŠè¡ã£ãŠããŸãã ç¶æ
管çã®å¿
èŠæ§ãçããéãã¢ããªã±ãŒã·ã§ã³ã®è€éæ§ãäžããªãããã«ããªãã¹ã useState çã® hooks ãçšãã local state ã ãã§æžãŸããããªããã©ãããæ€èšããŸãã äŸãã°ãã¯ãªãã¯ãããšããããããŠã³ãªã¹ãã衚瀺ãããã»ã¬ã¯ãããã¯ã¹ã® component ã§ãããããããŠã³ãªã¹ãã®è¡šç€ºç¶æ
ããã® component å
ã ãã§æ±ãããã®ã§ããã° useState ãçšãã local state ã§ååã§ãããšèããããŸãã 芪åé¢ä¿ã§ã¯ãªã component å士ã§ã®ãããšããå¿
èŠã«ãªã£ãæãããµãŒãã®ããŒã¿ãšé¢é£ããå Žåçã§ãããŒã«ã«ã®ããŒã¿ãäžå
管çããŠãããæ¹ãè¯ããããªã±ãŒã¹ã§ã¯ãApollo Client ã® cache ãå©çšããŸãã Apollo Client Apollo ã«é¢é£ãããã¡ã€ã«ã®æ§æã«ã€ããŠã¯ä»¥äžã®éãã§ãã src/ apollo/ cache.ts client.ts types.ts withApollo.ts cache.ts : Apollo ã«ããã local state ã® initialState ãš resolver ãå
šç»é¢åãã®ãã¡ã€ã«ã§ãŸãšããŠãæçµçã« Next.js ã® src/pages/_app.tsx ã«æž¡ãããã«ãã component åºæã® local state ã«é¢ãã initialState ããã³ state ã® updater ãšãªã resolver 㯠component æ¯ã® apollo.cache.ts ã«ãŠãå¥éå®çŸ© client.ts : Apollo Client ã®ã€ã³ã¹ã¿ã³ã¹ãçæãããã¡ã€ã« types.ts : Apollo é¢é£ã®åå®çŸ©ãã¡ã€ã« withApollo.ts : Apllo Client ã® <ApolloProvider /> ã§ã©ããããŠè¿ã Higher-Order Compoents(HOC) å®è£
ã«ã€ããŠã¯å²æããŸãããclient.ts ãš withApollo.ts ã«é¢ããŠã¯ãNext.js ã® exampleïŒ with-apollo ïŒçãåèã«ããŸããã ç»é¢åºæã® Apollo ã®ç¶æ
管çã«é¢ãããã¡ã€ã«ã¯ src/components/**/${component å}/ é
äžã«çœ®ããŠããŸãã ãã¡ããã³ãã±ãŒã·ã§ã³ã®èãæ¹ã§ãcomponent ã«é¢ããç¶æ
管çã¯è©²åœã® component ãšåãå Žæã«çœ®ãããšãæèããŠããŸãã src/ components/ app/ ${ component å} / apollo.cache.ts apollo.query.graphql apollo.schema.graphql apollo.cache.ts : component åºæã® Apollo ã«ããã local state ã® initialState ããã³ resolver ãå®çŸ©ãããã¡ã€ã« apollo.query.graphql : ã¯ãšãªãå®çŸ©ãããã¡ã€ã« apollo.schema.graphql : local state ã® GraphQL ã¹ããŒããå®çŸ©ãã¡ã€ã« ãã¡ã€ã«ã®åœåã«ã€ããŠã ãã£ã¬ã¯ããªéå±€ãã§ããã ãæ·±ãããããªã ã®ã§ã apollo çã«ãããã£ã¬ã¯ããªã¯èšããŠããŸããããApollo é¢é£ã®ãã¡ã€ã«çŸ€ãšããŠèªèã§ããããããã¡ã€ã«åã« apollo. ã®ãã¬ãã£ãã¯ã¹ãã€ããŠåœåããŠããŸãã Query ãš Mutation ã®å®è¡ã«ã€ã㊠GraphQL Code Generator ã®ãã©ã°ã€ã³ TypeScript React Apollo ãã€ã³ã¹ããŒã«ããŠãhooks ãçæããèšå®ã«ããäžã§ãcomponent æ¯ã«ãããã GraphQL ã®ã¹ããŒããšã¯ãšãªãèšè¿°ããã .graphql ãã¡ã€ã«ãããšã«ãGraphQL Code Generator ãçæããã«ã¹ã¿ã hooks ãå©çšããŸãã ãã¡ãã®ã«ã¹ã¿ã hooks ã React Component ã§å©çšããããšã§ãApollo Client çµç±ã§ GraphQL API ãšããŒã«ã«ã® Apollo cache ã«æ¥ç¶ããŠãããŒã¿ã®ããåããè¡ãããšãã§ããŸãã Query Query ã® hooks ã¯ïŒçš®é¡ãããå®è¡ããã¿ã€ãã³ã°ã«ãã£ãŠããããé©åãªæ¹ãéžãã§å®è¡ããŠããŸãã API å®è¡ã¿ã€ãã³ã° useQuery Component ã render ããããã¯ãšãªå®è¡ useLazyQuery ä»»æã®ã€ãã³ããããªã¬ãŒã«ããŠã¯ãšãªå®è¡ use***Query éåžžã§ããã° useQuery ã§ã¯ãšãªã®çµæã render ããŸãããGraphQL Code Generator ãå©çšããå Žåã¯ãããããã®ã¯ãšãªãã©ããããã«ã¹ã¿ã hooks ãçæãããã®ã§ã useQuery , useLazyQuery ããã®ãŸãŸäœ¿ãããšã¯ãããŸããã query AllPosts { allPosts { id title rating } } â ã®ãããªã¯ãšãªãçšæãããš src/__generated__/graphql.tsx ã«å¯ŸããŠã次ã®ãããªã«ã¹ã¿ã hooks ãåãšäžç·ã«çæãããèšå®ã«ããŠããŸãã // Apollo Client: 2.6.9ãGraphQL Code Generator: 1.15.0 ã®å Žåã®äŸ export function useAllPostsQuery ( baseOptions ?: ApolloReactHooks . QueryHookOptions & lt ; AllPostsQuery , AllPostsQueryVariables >) { return ApolloReactHooks . useQuery & lt ; AllPostsQuery , AllPostsQueryVariables >( AllPostsDocument , baseOptions ); } export function useAllPostsLazyQuery ( baseOptions ?: ApolloReactHooks . LazyQueryHookOptions & lt ; AllPostsQuery , AllPostsQueryVariables >) { return ApolloReactHooks . useLazyQuery & lt ; AllPostsQuery , AllPostsQueryVariables >( AllPostsDocument , baseOptions ); } React Component ã§ã¯çæãããã«ã¹ã¿ã hooks ãæ¬¡ã®ããã«åŒã³åºããŠãµãŒããŒããè¿ã£ãŠããçµæãåãåã£ãŠãããŒã¿åºåãããŒãã£ã³ã°ç¶æ
ã®ãã§ãã¯ããšã©ãŒãã³ããªã³ã°çãè¡ããŸãã const { data , loading , error } = useAllPostsQuery (); Mutation ããŒã¿ã®æžã蟌ã¿ã¯ useMutation ã§è¡ããŸãã Query åæ§ã GraphQL Code Generator ã«ãã£ãŠçæãããã«ã¹ã¿ã hooks use***Mutation ã䜿ã£ãŠããŸãã cache ã®æŽæ° Mutation ãè€æ°ãšã³ãã£ãã£ã®æŽæ°ããšã³ãã£ãã£ã®æ°èŠäœæãŸãã¯åé€ã®å ŽåãApollo Client ã® cache ã¯èªåæŽæ°ããããMutation ã®çµæãèªåçã« render ãããŸããã ãã®ãããªå Žåã§ãã useMutation ã® update option ã䜿ãã°ã cache ãªããžã§ã¯ããåŒæ°ã«åãã颿°ãèšå®ã§ããã®ã§ããã®é¢æ°å
ã§çŽæ¥ cache ãæŽæ°ã§ããŸãã ãŸãã update ã®ä»£ããã« refetchQueries ã® option ã䜿ã£ãŠãä»»æã® Query ãå®è¡ããŠãã·ã³ãã«ã« cache ãæŽæ°ããããšãã§ããŸãã äœãããã®æ¹æ³ã ãš Network éä¿¡ã«ãããªãŒããŒããããçºçããŸãã ãã®ãªãŒããŒããããç ç²ã«ããŠã§ãããµãŒããŒããããŒã¿ååŸããã Query ããããããªå Žåã«ã¯ããã® refetchQueries ãæå¹ã§ãã local state ã®ç®¡ç ããããã¯ç¹å®ã® component ã®ç¶æ
管çã local state ã䜿ã£ãŠã©ã®ããã«ç®¡çããŠãããããã説æããŠãããŸãã @client ã䜿ã£ã Query Next.js ã®ãããžã§ã¯ãã§ãlocal state ã®ç®¡çã Apollo Client ã§è¡ãå Žåã®äŸãšããŠã¯ã次ã®éãã§ãã ã¹ããŒãïŒ # src / components / app / Home / apollo . schema . graphql type Home { currentPostId: Int! } extend type Query { home: Home } ã¯ãšãªïŒ # src / components / app / Home / apollo . query . graphql query HomeCurrentPostId { home @ client { currentPostId } } ãã£ãã·ã¥ã®åæå€ïŒ // src/components/app/Home/apollo.cache.ts export const cache = { __typename: 'Home' , currentPostId: 0 , ..., }; // src/apollo/cache.ts const caches = { ..., home: home . cache , }; export { ..., caches , }; // src/pages/_app.tsx export const cache = new InMemoryCache (); ... const client = new ApolloClient ({ link , cache: cache . restore ( initialState || {}), resolvers , connectToDevTools: true , }); cache . writeData ({ data: caches }); GraphQL ã¯ãšãªãšã¹ããŒããå®çŸ©ãããŠããã° GraphQL Code Generator ã use***Query ã®ã³ãŒããçæããèšå®ã«ããŠããŸãã ããŒã«ã«ããŒã¿ã®å Žåãã¯ãšãªã§ @client ãã£ã¬ã¯ãã£ããã€ããŠããŒã«ã«ããŒã¿ã§ããããšãæç€ºããŸãã @client ã䜿ã£ã Mutation local state ã®æŽæ°ã GraphQL ã® Mutation ãšããŠè¡ãå Žåã®äŸãšããŠã¯ã次ã®éãã§ãã ã¹ããŒãïŒ # src / components / app / Home / apollo . schema . graphql type UpdateCurrentPostId { currentPostId: Int! } extend type Mutation { updateCurrentPostId(id: Int!): UpdateCurrentPostId } ã¯ãšãªïŒ # src / components / app / Home / apollo . query . graphql mutation UpdateCurrentPostId ( $id : Int !) { updateCurrentPostId ( id : $id ) @ client { currentPostId @ client } } resolverïŒ // src/components/app/Home/apollo.cache.ts const updateCurrentPostId : MutationResolvers [ "updateCurrentPostId" ] = ( _ , args , { cache } ) => { cache . writeData ({ data: { home: { __typename: "Home" , currentPostId: args . id , }, }, }); return null ; }; export const Mutation = { updateCurrentPostId , }; Query åæ§ã« @client ãã£ã¬ã¯ãã£ããã€ããŠããŒã«ã«ããŒã¿ã§ããããšãæç€ºããŸãã å®éã® Mutation ã®åŠçèªäœã¯ resolver ã®äžã« cache.writeData() ã䜿ã£ãŠèšè¿°ããŸãã Mutation ã®åœåã¯ã åè©+åè©ã®åœ¢åŒã§å¯èœãªéãæå³ã®ããå
·äœçãªååãã€ãã ããšãæèããŠããŸãã Apollo ã䜿ã£ãéçºã䟿å©ã«ããŠãããããŒã« Apollo Client ã䜿ã£ãŠéçºããéã¯ãããŒã«ã«ã® Apollo cache ã®ç¶æ
ããã¯ãšãªã詊ãã«å®è¡ããããã®ããŒã«ãšããŠãGoogle Chrome ã®æ¡åŒµæ©èœ Apollo Client Developer Tools ãéåžžã«äŸ¿å©ã§ãã ãã¡ãã®æ¡åŒµæ©èœã Chrome ã«ã€ã³ã¹ããŒã«ãããšãApollo Client ã䜿ã£ãŠ GraphQL API ã«ã¢ã¯ã»ã¹ãããµã€ãã«é·ç§»ããç¶æ
ã§ Chrome Dev Tools ãéããš Apollo ã®ã¿ãã衚瀺ãããŸããããã§ã¯ãšãªã®å®è¡ããAPI 仿§ã®ç¢ºèªãããŒã«ã«ã® Apollo cache ã®ç¢ºèªçãè¡ãããšãã§ããŸãã GraphQL é¢é£ã®ãã¹ãã³ãŒãã«ã€ã㊠Apollo Client ã䜿ã£ã React Component ã®éçºã§ãQuery ããã³ Mutation å®è¡ã®ãã¹ãã宿œããã«ã¯ããã¹ããã¬ãŒã ã¯ãŒã¯ã® Jestãreact-testing-library ãšããããŠãApollo å
¬åŒã§ã玹ä»ãããŠãã MockedProvider ãçšããæ¹æ³ãäžè¬çããšæããŸãã ã¯ãšãªãšã¯ãšãªã«å¯Ÿããã¬ã¹ãã³ã¹ãçµã¿åãããã¢ãã¯ããŒã¿ãçšæããŠãããApolloProvider ã®ä»£ããã« MockedProvider ã§ãã¹ã察象㮠component ãã©ããããããšã§ãAPI ãµãŒããŒã Network ç°å¢ã«äŸåãããã¢ãã¯ã§æå®ããã¯ãšãªããªã¯ãšã¹ãããããšãã¢ãã¯ã§ããã«å¯Ÿå¿ããããã«çšæããã¬ã¹ãã³ã¹ããŒã¿ã確å®ã«ååŸã§ããä»çµã¿ãäœããŸãã ãã®ä»çµã¿ãš react-testing-library ã䜿ã£ãŠãcomponent ã§ render ããã UI äžã®æäœãããªã¬ãŒã«ããŠå®è¡ããããã¯ãšãªã®ãã¹ããè¡ãããšãã§ããŸãã Query ã ãã§ã¯ãªã Mutation ãã¢ãã¯ããããšãã§ããŠã䟿å©ãªããŒã«ã§ã¯ãããŸããããã¹ãã±ãŒã¹æ¯ã«ã¢ãã¯ããŒã¿ã¯æåã§äœæããªããã°ãªããªãç¹ãããªããªã骚ãæããäœæ¥ã§ãã å®éã«ã¢ããªã±ãŒã·ã§ã³ãåãããŠããã¹ã察象㮠component ã render ããQuery ã«æž¡ããã variables ãã¬ã¹ãã³ã¹ã®å€ã Console ã«åºåãããã©ãŠã¶ã® Dev Tools äžã§äžåäžåãªããžã§ã¯ããã³ããŒããŠããšãã£ã¿ã«è²Œãä»ããããããäœæ¥ãçºçããŸãã AutoMockedProvider ã®äœæ ããã§ããããããã¹ãäœæãã¹ããŒã倿Žã®åºŠã«ãæåã§ã¢ãã¯ããŒã¿ãçšæããªããŠããGraphQL ã¹ããŒãã§å®çŸ©ãããŠããåãèŠãŠãèªåã§ã¯ãšãªã«å¯Ÿããã¬ã¹ãã³ã¹ãã¢ãã¯ããŠããã AutoMockedProvider ãã ãã¡ãã®èšäº ãåèã«ããŠäœæããŸããã MockedProvider ã®ä»£ããã«ãAutoMockedProvider ãçšããŠãã¹ã察象㮠Component ãã©ããããããšã§ãMockedProvider ã䜿ã£ãŠãã¹ãããŠããå
容ãšåããã¹ãã宿œã§ããŸãã MockedProvider ã䜿ã£ãŠæ¯åã¢ãã¯ããŒã¿ãçšæãããã¹ãã宿œããããšã«ç²ããŠããæ¹ã¯æ¯éãã詊ããã ããã ïŒç޹ä»å
ã®èšäºã§ã¯ã graphql-tools ã® makeExecutableSchema() ã«æž¡ã schemaSDL ã json ãã¡ã€ã«ã§å®çŸ©ãããŠããŸããã graphql-tag ã®ã©ã€ãã©ãªã䜵çšããã°ãgraphql ãã¡ã€ã«ã§ãåæ§ã« schemaSDL ãšããŠé©çšããããšãå¯èœã§ãïŒ ãªãã¥ãŒã¢ã«ãæ¯ãè¿ã£ãŠ ä»åã®ãªãã¥ãŒã¢ã«ã§ã¯ãGraphQLãTypeScriptãReact ãã»ããã§æ¡çšããããšã«ãããããã³ãåŽã§ã¯ GraphQL Code Generator ã䜿ã£ãŠããããããçšæããŠããã GraphQL ã¹ããŒããããTypeScript ã®åã ãã§ã¯ãªããReact ã® Hooks 颿°ãŸã§çæããŠå©çšã§ããããšããéçºå¹çã®åäžã«éåžžã«åœ±é¿ãäžãããšæããŸãã GraphQL API ã®ã¯ã©ã€ã¢ã³ãã§ãã¢ããªã±ãŒã·ã§ã³å
šäœã®ç¶æ
管çãè¡ã Apollo Client ã® cache æ©æ§ã®äœ¿ãæ¹çãäœåŸãããŸã§ã«ãåŠç¿ã³ã¹ãã¯æ±ºããŠãŒãã§ã¯ãããŸããã§ããããTypeScript ãš GraphQL ã®åã·ã¹ãã ã®æ©æµããã«ã«åããNext.js ã®ã¬ãŒã«ã«ã®ã£ãããåå®å
šãªéçºç°å¢ãæã«å
¥ããããšãã§ããŸããã æã
ãéçºè
ã®äœéšã ãã§ã¯ãªããä»åŸã®ãããã¯ãå
šäœãžã®çç£æ§ã«ãè¯ã圱é¿ãåãŒããŠããããšç¢ºä¿¡ããŠããŸãã ãããã« ã¡ãã¬ãŒã§ã¯ãšã³ãžãã¢ã»ãã¶ã€ããŒãç©æ¥µåéããŠããŸãã ããã¯ãããžãŒã掻çšããŠå»çãã«ã¹ã±ã¢ã®æªæ¥ãã€ããããšããããã·ã§ã³ã«å
±æãã課é¡è§£æ±ºãè¡ãããæ¹ã¯æ¯éããå¿åãã ããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ããã«ã¡ã¯ãã¡ãã¬ãŒã®ãšã³ãžãã¢ã®å±±ç°ã§ããçŸåšãå»çä»è·æ±äººãµã€ãããžã§ãã¡ãã¬ãŒãã®ããŒã ã§éçºãæ
åœããŠããŸãã ä»åããžã§ãã¡ãã¬ãŒã®ç€Ÿå
ã¹ã¿ãããå©çšãã瀟å
ã·ã¹ãã ããªãã¥ãŒã¢ã«ããäºäŸãã玹ä»ããŸãã ãªãã¥ãŒã¢ã«å¯Ÿè±¡ã¯ããã¯ãšã³ãé åãå«ãŸããŸãããæ¬èšäºã§ã¯ããã³ããšã³ãã®è©±ãäžå¿ã«ã玹ä»ããŸãã ãŸããåŒç€Ÿãã¶ã€ããŒé
äºã以åæçš¿ãã ãã¶ã€ããŒããã¶ã€ã³ããŒã«ã䜿ããã«ãReact ã䜿ã£ãŠãã¶ã€ã³ãã話 ãé¢é£ããŠããã®ã§ããããããã°ããããŠã芧ãã ããã ãªãã¥ãŒã¢ã«ã®èæ¯ ç€Ÿå
ã·ã¹ãã ã§ã¯ãæ±äººãµã€ãããžã§ãã¡ãã¬ãŒããå©çšããæ±è·è
ã«é¢ããæ
å ±ãæ±è·è
ã®å¿åç¶æ³ã管çããŠããŸãã ååã®ãªãã¥ãŒã¢ã«ããæéãçµã¡ãè€éæ§ãé«ããªã£ãŠããŸããããã®è€éæ§ã«æ¯äŸããŠãæ°æ©èœã®è¿œå ãæ¹ä¿®ããããã®ã³ã¹ããé«ããªã£ãŠããŸããã ããã§äžèšã®èª²é¡ã解決ãããããç¶æ
管çãããããããã¹ãã³ãŒããæžãããããã¡ã³ãããã«ãªã¢ãŒããã¯ãã£ã«ãã¹ããªãã¥ãŒã¢ã«ã宿œããããšã«ããŸããã æ€èšŒæéãçµãŠãä»åã®ãªãã¥ãŒã¢ã«ã«ããããŠæ°èŠã«äœæãã API ã¯ãGraphQL ã«ãã£ãŠå®è£
ããããšã決ããŸããã åã·ã¹ãã ãæã€ããç»é¢ã«å¿
èŠãªããŒã¿ãæè»ã«éäžè¶³ãªãååŸã§ãããæåã§ããã¥ã¡ã³ãã«èœãšã蟌ãŸãªããŠãã¹ããŒããå®çŸ©ãããŠããã° API ã®ä»æ§ãç°¡åã«ææ¡ã§ãããçãã¡ãªãããšããŠæããããŸããã ç¹ã«ãGraphQL ãæã€åã·ã¹ãã ããTypeScriptãApolloãGraphQL Code Generator ã®ã©ã€ãã©ãªãçµã¿åãããããšã§ãAPI ã«æž¡ããã©ã¡ãŒã¿ããã¬ã¹ãã³ã¹ã«ãåãé©çšãããGraphQL ã¹ããŒãã®å€æŽã«ã¯ã©ã€ã¢ã³ãã®å®è£
ãæ¯èŒç容æã«è¿œåŸã§ããããšãã倧ããªãã€ã³ãã§ããã ããã³ããšã³ãã®æè¡çãªãªãã¥ãŒã¢ã«å
容 ä»åã¯ç¹ã«ããªãã¥ãŒã¢ã«ã«çšãããããã¬ãŒã ã¯ãŒã¯ãã©ã€ãã©ãªãApollo Client ãçšããç¶æ
管çããã¹ãã³ãŒãå®è£
ã«ããã Tips çãããããéšåçã«ã玹ä»ããŸãã æ¡çšãããã¬ãŒã ã¯ãŒã¯ãšäž»èŠã©ã€ãã©ãª æ¡çšã©ã€ãã©ãª 説æ Next.js React çšã®ãã¬ãŒã ã¯ãŒã¯ïŒãã€ã©ãŒãã¬ãŒãïŒ TypeScript JavaScript ã®ã¹ãŒããŒã»ããã§ãéçåä»ãèšèª React UI ãæ§ç¯ããããã®ã©ã€ãã©ãªïŒããŒãžã§ã³ 16.8.0 ã§ãªãªãŒã¹ããã hooks ãå
šé¢çã«äœ¿çšïŒ Apollo Client GraphQL API ã®ã¯ã©ã€ã¢ã³ãã§ãã¢ããªã±ãŒã·ã§ã³å
šäœã®ç¶æ
管çã宿œ GraphQL Code Generator GraphQL ã¹ããŒãããå®çŸ©ãã¡ã€ã«ïŒåãã«ã¹ã¿ã hooks çïŒãçæ emotion + Styled System CSS in JS ãšããŠå©çš formik + yup ãã©ãŒã ã®ãã«ã㌠+ ããªããŒã¿ãŒ Jest + React Testing Library ãã¹ãã³ãŒãå®è£
çšã®ããŒã«çŸ€ ESLint + Prettier ã«ãŒã«ã«åºã¥ããã³ãŒãã®éçè§£æ + ã¹ã¿ã€ãªã³ã° TypeScript ä»åã®ãªãã¥ãŒã¢ã«ã§æ±ããããããšã®äžã€ãšããŠããããªãæ¹åã»æ°èŠæ©èœè¿œå ãªã©ãããŠããäžã§ããœãããŠã§ã¢å質ãæ
ä¿ããããã®ãã¢ããªã±ãŒã·ã§ã³ã®å
ç¢ãããããŸããã ããã§ãããã³ããšã³ãåŽã®éçºèšèªãšããŠã¯ãããã°ã©ã ã³ãŒãå
ã§å®£èšãããåã«ãã£ãŠããšã©ãŒãæªç¶ã«é²ãã€ã€ãVSCode ãã¯ãããšãããšãã£ã¿ã®ã³ãŒãè£å®ã®æ©æµãåããããã¡ãªããçãèæ
®ã㊠TypeScript ã®æ¡çšã決ããŸããããŸããä»ã®ãããžã§ã¯ãã§ãæ¢ã« TypeScript ã¯éšåçã«å©çšãå§ããŠããäºæ
ããããéã« TypeScript ãæ¡çšããªãããšããéžæè¢ã¯ããŸãèããããŸããã§ããã React UI ãæ§ç¯ããããã®ã©ã€ãã©ãª/ãã¬ãŒã ã¯ãŒã¯ã¯ React ãæ¡çšããŸããããã¡ãããåŒç€Ÿã§ã¯å¥ãããžã§ã¯ãã§ React ãæ¢ã«å©çšãå§ããŠããããšããããåŠç¿ã³ã¹ãã®èгç¹ãããæ°ãã«ä»ã®ãã¬ãŒã ã¯ãŒã¯ãéžæããã¡ãªããã¯ã»ãŒç¡ãã£ãããã§ãããããããã®äºãå·®ãåŒãããšããŠã TypeScript ãš GraphQL ãšã®çžæ§ã®è¯ãã§ãReact ãåªå¢ã§ããã ç¹ã«ãReact ã®å Žåã¯ãGraphQL ã¹ããŒããããŒã¹ã«ãGraphQL Code Generator ã«ãã£ãŠåå®çŸ©ãã¡ã€ã«ã ãã§ã¯ãªããGraphQL API ãšã®ããåãã«äœ¿ããã«ã¹ã¿ã hooks ãçæããŠå©çšã§ãããšããç¹ãã倧ããªå©ç¹ãšããŠèããããŸããã Next.js ããã³ããšã³ãéçºç°å¢ãçŽ æ©ãæ§ç¯ããããããã€ã©ãŒãã¬ãŒããšã㊠Next.js ãæ¡çšããŸããã Next.js ã®å
·äœçãªæ¡çšãã€ã³ããšããŠã¯ãäž»ã«æ¬¡ã®ïŒç¹ã§ãã webpack ã«ãããããã³ãã«ãã³ã³ãã€ã«ãããããªããŒãçã®èšå®ã«æéãè²»ããããšãªããããžãã¹ããžãã¯ã®å®è£
ã«éäžã§ãã å¿
èŠãããã°ãnext.config.js ã§èšå®ãæ¡åŒµã§ãã CRAïŒCreate React AppïŒãšã¯ç°ãªããæ¡åŒµæ§ã«åªããŠãã pages é
äžã«çœ®ã React Component ã®ãã£ã¬ã¯ããªæ§æããèªåçã«ã«ãŒãã£ã³ã°ãšããŠå®çŸ©ããã ã«ãŒãã£ã³ã°ã«é¢ããèšèšäœæ¥ãäžèŠã«ãªã èªåã³ãŒãåå²çã«ããããã©ãŒãã³ã¹æé©åããããªã«è¡ã£ãŠããã React Component ã®åé¡ component ã¯å€§ããïŒã€ã«åé¡ãã src/components/app/ ãš src/components/ui/ ããããã®ãã£ã¬ã¯ããªã« component ã眮ããŠããŸããåé¡ã¯ä»¥äžã®åºæºã§è¡ãªããŸããã app : æ¬ã¢ããªã±ãŒã·ã§ã³åºæã§äœ¿çšãããæ³å®ã®ãã®ã§ãåå©çšæ§ãäœããå
·äœç㪠component ui : æ¬ã¢ããªã±ãŒã·ã§ã³å€ã§ã䜿çšå¯èœãªãåå©çšæ§ãé«ããæœè±¡ç㪠component 瀟å
åãã·ã¹ãã ã§ã¯ãããã®ã®ãMaterial-UI ã Ant Design çãã¯ãããšãããå€éšã® UI ã©ã€ãã©ãªã¯äœ¿çšãããã«ã¹ã¿ãã€ãºãããããããã«ãå
šãŠèªåã§äœæããŸããã app é
äžãš ui é
äžãã©ã¡ãã® component ãåºæ¬çã«ã¯ ã³ãã±ãŒã·ã§ã³ ã®èãæ¹ã§ãã¡ã€ã«ãæ§æããŠããŸãã äžè¬çã«ã¯ãããäžç·ã«å€æŽãããã¡ã€ã«ãè¿ãã«çœ®ããŠããã®ã¯è¯ãã¢ã€ãã£ã¢ã§ãã ãã®ååã¯ããã³ãã±ãŒã·ã§ã³ããšåŒã°ããŸãã ãã®èãæ¹ã§ãã¡ã€ã«ãæ§æããããšã§ãé¢é£ãããã¡ã€ã«ããŸãšãŸã£ãŠããŠãäœæ¥ããããããªããŸãã src/ components/ app/ partials/ ${ component å} / apollo.cache.ts apollo.query.graphql index.tsx index.test.tsx ... screens/ ${ component å} / apollo.cache.ts apollo.query.graphql index.tsx index.test.tsx ${å component å} / apollo.cache.ts apollo.query.graphql index.tsx index.test.tsx validation.ts src/components/app ãã£ã¬ã¯ããªé
äžã§ããã«ã partials ãš screens ã®ãã£ã¬ã¯ããªã§ component ãåããŠããŸãã screens ã«ã¯ãNext.js ã§ route ãšããŠæ±ããã src/pages é
äžã® component ãã import ããã component ãé
眮ãããŠããŸãã ç»é¢ã®ããªãšãŒã·ã§ã³ãå¢ãã床ã«ããã® screens ã«ãã¡ã€ã«ã远å ãããŠãããŸãã partials ã«ã¯ãapp é
äžã§è€æ°ã® component ããå©çšããã componentïŒç»é¢ããŸããã§å
±æããããã®çïŒãé
眮ããŠããŸãã screens ãš partials ããããçŽäžã® component ã§ãå¿
èŠã§ããã°é©å®ãcomponent ãåå²ããŠå component ãæã€æ§æã«ããŠããŸãã apollo.cache.ts ãš apollo.query.graphql ã«ã€ããŠã¯åŸè¿°ã®ç¶æ
管çã®è©±ã§ã玹ä»ããŸãã ç¶æ
管ç ã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
管çã«ã€ããŠã¯ãã°ããŒãã«ã«ã¢ã¯ã»ã¹ã§ããç¶æ
ã®ç®¡çã«ã¯ Apollo Client ã® InMemoryCache ã«ãã cache æ©æ§ã§è¡ããç¹å®ã® component å
ã«éããŠãã屿çãªç¶æ
ã®ç®¡çã«ã¯ useState çã® React Hooks ã䜿ã£ãŠè¡ã£ãŠããŸãã ç¶æ
管çã®å¿
èŠæ§ãçããéãã¢ããªã±ãŒã·ã§ã³ã®è€éæ§ãäžããªãããã«ããªãã¹ã useState çã® hooks ãçšãã local state ã ãã§æžãŸããããªããã©ãããæ€èšããŸãã äŸãã°ãã¯ãªãã¯ãããšããããããŠã³ãªã¹ãã衚瀺ãããã»ã¬ã¯ãããã¯ã¹ã® component ã§ãããããããŠã³ãªã¹ãã®è¡šç€ºç¶æ
ããã® component å
ã ãã§æ±ãããã®ã§ããã° useState ãçšãã local state ã§ååã§ãããšèããããŸãã 芪åé¢ä¿ã§ã¯ãªã component å士ã§ã®ãããšããå¿
èŠã«ãªã£ãæãããµãŒãã®ããŒã¿ãšé¢é£ããå Žåçã§ãããŒã«ã«ã®ããŒã¿ãäžå
管çããŠãããæ¹ãè¯ããããªã±ãŒã¹ã§ã¯ãApollo Client ã® cache ãå©çšããŸãã Apollo Client Apollo ã«é¢é£ãããã¡ã€ã«ã®æ§æã«ã€ããŠã¯ä»¥äžã®éãã§ãã src/ apollo/ cache.ts client.ts types.ts withApollo.ts cache.ts : Apollo ã«ããã local state ã® initialState ãš resolver ãå
šç»é¢åãã®ãã¡ã€ã«ã§ãŸãšããŠãæçµçã« Next.js ã® src/pages/_app.tsx ã«æž¡ãããã«ãã component åºæã® local state ã«é¢ãã initialState ããã³ state ã® updater ãšãªã resolver 㯠component æ¯ã® apollo.cache.ts ã«ãŠãå¥éå®çŸ© client.ts : Apollo Client ã®ã€ã³ã¹ã¿ã³ã¹ãçæãããã¡ã€ã« types.ts : Apollo é¢é£ã®åå®çŸ©ãã¡ã€ã« withApollo.ts : Apllo Client ã® <ApolloProvider /> ã§ã©ããããŠè¿ã Higher-Order Compoents(HOC) å®è£
ã«ã€ããŠã¯å²æããŸãããclient.ts ãš withApollo.ts ã«é¢ããŠã¯ãNext.js ã® exampleïŒ with-apollo ïŒçãåèã«ããŸããã ç»é¢åºæã® Apollo ã®ç¶æ
管çã«é¢ãããã¡ã€ã«ã¯ src/components/**/${component å}/ é
äžã«çœ®ããŠããŸãã ãã¡ããã³ãã±ãŒã·ã§ã³ã®èãæ¹ã§ãcomponent ã«é¢ããç¶æ
管çã¯è©²åœã® component ãšåãå Žæã«çœ®ãããšãæèããŠããŸãã src/ components/ app/ ${ component å} / apollo.cache.ts apollo.query.graphql apollo.schema.graphql apollo.cache.ts : component åºæã® Apollo ã«ããã local state ã® initialState ããã³ resolver ãå®çŸ©ãããã¡ã€ã« apollo.query.graphql : ã¯ãšãªãå®çŸ©ãããã¡ã€ã« apollo.schema.graphql : local state ã® GraphQL ã¹ããŒããå®çŸ©ãã¡ã€ã« ãã¡ã€ã«ã®åœåã«ã€ããŠã ãã£ã¬ã¯ããªéå±€ãã§ããã ãæ·±ãããããªã ã®ã§ã apollo çã«ãããã£ã¬ã¯ããªã¯èšããŠããŸããããApollo é¢é£ã®ãã¡ã€ã«çŸ€ãšããŠèªèã§ããããããã¡ã€ã«åã« apollo. ã®ãã¬ãã£ãã¯ã¹ãã€ããŠåœåããŠããŸãã Query ãš Mutation ã®å®è¡ã«ã€ã㊠GraphQL Code Generator ã®ãã©ã°ã€ã³ TypeScript React Apollo ãã€ã³ã¹ããŒã«ããŠãhooks ãçæããèšå®ã«ããäžã§ãcomponent æ¯ã«ãããã GraphQL ã®ã¹ããŒããšã¯ãšãªãèšè¿°ããã .graphql ãã¡ã€ã«ãããšã«ãGraphQL Code Generator ãçæããã«ã¹ã¿ã hooks ãå©çšããŸãã ãã¡ãã®ã«ã¹ã¿ã hooks ã React Component ã§å©çšããããšã§ãApollo Client çµç±ã§ GraphQL API ãšããŒã«ã«ã® Apollo cache ã«æ¥ç¶ããŠãããŒã¿ã®ããåããè¡ãããšãã§ããŸãã Query Query ã® hooks ã¯ïŒçš®é¡ãããå®è¡ããã¿ã€ãã³ã°ã«ãã£ãŠããããé©åãªæ¹ãéžãã§å®è¡ããŠããŸãã API å®è¡ã¿ã€ãã³ã° useQuery Component ã render ããããã¯ãšãªå®è¡ useLazyQuery ä»»æã®ã€ãã³ããããªã¬ãŒã«ããŠã¯ãšãªå®è¡ use***Query éåžžã§ããã° useQuery ã§ã¯ãšãªã®çµæã render ããŸãããGraphQL Code Generator ãå©çšããå Žåã¯ãããããã®ã¯ãšãªãã©ããããã«ã¹ã¿ã hooks ãçæãããã®ã§ã useQuery , useLazyQuery ããã®ãŸãŸäœ¿ãããšã¯ãããŸããã query AllPosts { allPosts { id title rating } } â ã®ãããªã¯ãšãªãçšæãããš src/__generated__/graphql.tsx ã«å¯ŸããŠã次ã®ãããªã«ã¹ã¿ã hooks ãåãšäžç·ã«çæãããèšå®ã«ããŠããŸãã // Apollo Client: 2.6.9ãGraphQL Code Generator: 1.15.0 ã®å Žåã®äŸ export function useAllPostsQuery ( baseOptions ?: ApolloReactHooks . QueryHookOptions & lt ; AllPostsQuery , AllPostsQueryVariables >) { return ApolloReactHooks . useQuery & lt ; AllPostsQuery , AllPostsQueryVariables >( AllPostsDocument , baseOptions ); } export function useAllPostsLazyQuery ( baseOptions ?: ApolloReactHooks . LazyQueryHookOptions & lt ; AllPostsQuery , AllPostsQueryVariables >) { return ApolloReactHooks . useLazyQuery & lt ; AllPostsQuery , AllPostsQueryVariables >( AllPostsDocument , baseOptions ); } React Component ã§ã¯çæãããã«ã¹ã¿ã hooks ãæ¬¡ã®ããã«åŒã³åºããŠãµãŒããŒããè¿ã£ãŠããçµæãåãåã£ãŠãããŒã¿åºåãããŒãã£ã³ã°ç¶æ
ã®ãã§ãã¯ããšã©ãŒãã³ããªã³ã°çãè¡ããŸãã const { data , loading , error } = useAllPostsQuery (); Mutation ããŒã¿ã®æžã蟌ã¿ã¯ useMutation ã§è¡ããŸãã Query åæ§ã GraphQL Code Generator ã«ãã£ãŠçæãããã«ã¹ã¿ã hooks use***Mutation ã䜿ã£ãŠããŸãã cache ã®æŽæ° Mutation ãè€æ°ãšã³ãã£ãã£ã®æŽæ°ããšã³ãã£ãã£ã®æ°èŠäœæãŸãã¯åé€ã®å ŽåãApollo Client ã® cache ã¯èªåæŽæ°ããããMutation ã®çµæãèªåçã« render ãããŸããã ãã®ãããªå Žåã§ãã useMutation ã® update option ã䜿ãã°ã cache ãªããžã§ã¯ããåŒæ°ã«åãã颿°ãèšå®ã§ããã®ã§ããã®é¢æ°å
ã§çŽæ¥ cache ãæŽæ°ã§ããŸãã ãŸãã update ã®ä»£ããã« refetchQueries ã® option ã䜿ã£ãŠãä»»æã® Query ãå®è¡ããŠãã·ã³ãã«ã« cache ãæŽæ°ããããšãã§ããŸãã äœãããã®æ¹æ³ã ãš Network éä¿¡ã«ãããªãŒããŒããããçºçããŸãã ãã®ãªãŒããŒããããç ç²ã«ããŠã§ãããµãŒããŒããããŒã¿ååŸããã Query ããããããªå Žåã«ã¯ããã® refetchQueries ãæå¹ã§ãã local state ã®ç®¡ç ããããã¯ç¹å®ã® component ã®ç¶æ
管çã local state ã䜿ã£ãŠã©ã®ããã«ç®¡çããŠãããããã説æããŠãããŸãã @client ã䜿ã£ã Query Next.js ã®ãããžã§ã¯ãã§ãlocal state ã®ç®¡çã Apollo Client ã§è¡ãå Žåã®äŸãšããŠã¯ã次ã®éãã§ãã ã¹ããŒãïŒ # src / components / app / Home / apollo . schema . graphql type Home { currentPostId: Int! } extend type Query { home: Home } ã¯ãšãªïŒ # src / components / app / Home / apollo . query . graphql query HomeCurrentPostId { home @ client { currentPostId } } ãã£ãã·ã¥ã®åæå€ïŒ // src/components/app/Home/apollo.cache.ts export const cache = { __typename: 'Home' , currentPostId: 0 , ..., }; // src/apollo/cache.ts const caches = { ..., home: home . cache , }; export { ..., caches , }; // src/pages/_app.tsx export const cache = new InMemoryCache (); ... const client = new ApolloClient ({ link , cache: cache . restore ( initialState || {}), resolvers , connectToDevTools: true , }); cache . writeData ({ data: caches }); GraphQL ã¯ãšãªãšã¹ããŒããå®çŸ©ãããŠããã° GraphQL Code Generator ã use***Query ã®ã³ãŒããçæããèšå®ã«ããŠããŸãã ããŒã«ã«ããŒã¿ã®å Žåãã¯ãšãªã§ @client ãã£ã¬ã¯ãã£ããã€ããŠããŒã«ã«ããŒã¿ã§ããããšãæç€ºããŸãã @client ã䜿ã£ã Mutation local state ã®æŽæ°ã GraphQL ã® Mutation ãšããŠè¡ãå Žåã®äŸãšããŠã¯ã次ã®éãã§ãã ã¹ããŒãïŒ # src / components / app / Home / apollo . schema . graphql type UpdateCurrentPostId { currentPostId: Int! } extend type Mutation { updateCurrentPostId(id: Int!): UpdateCurrentPostId } ã¯ãšãªïŒ # src / components / app / Home / apollo . query . graphql mutation UpdateCurrentPostId ( $id : Int !) { updateCurrentPostId ( id : $id ) @ client { currentPostId @ client } } resolverïŒ // src/components/app/Home/apollo.cache.ts const updateCurrentPostId : MutationResolvers [ "updateCurrentPostId" ] = ( _ , args , { cache } ) => { cache . writeData ({ data: { home: { __typename: "Home" , currentPostId: args . id , }, }, }); return null ; }; export const Mutation = { updateCurrentPostId , }; Query åæ§ã« @client ãã£ã¬ã¯ãã£ããã€ããŠããŒã«ã«ããŒã¿ã§ããããšãæç€ºããŸãã å®éã® Mutation ã®åŠçèªäœã¯ resolver ã®äžã« cache.writeData() ã䜿ã£ãŠèšè¿°ããŸãã Mutation ã®åœåã¯ã åè©+åè©ã®åœ¢åŒã§å¯èœãªéãæå³ã®ããå
·äœçãªååãã€ãã ããšãæèããŠããŸãã Apollo ã䜿ã£ãéçºã䟿å©ã«ããŠãããããŒã« Apollo Client ã䜿ã£ãŠéçºããéã¯ãããŒã«ã«ã® Apollo cache ã®ç¶æ
ããã¯ãšãªã詊ãã«å®è¡ããããã®ããŒã«ãšããŠãGoogle Chrome ã®æ¡åŒµæ©èœ Apollo Client Developer Tools ãéåžžã«äŸ¿å©ã§ãã ãã¡ãã®æ¡åŒµæ©èœã Chrome ã«ã€ã³ã¹ããŒã«ãããšãApollo Client ã䜿ã£ãŠ GraphQL API ã«ã¢ã¯ã»ã¹ãããµã€ãã«é·ç§»ããç¶æ
ã§ Chrome Dev Tools ãéããš Apollo ã®ã¿ãã衚瀺ãããŸããããã§ã¯ãšãªã®å®è¡ããAPI 仿§ã®ç¢ºèªãããŒã«ã«ã® Apollo cache ã®ç¢ºèªçãè¡ãããšãã§ããŸãã GraphQL é¢é£ã®ãã¹ãã³ãŒãã«ã€ã㊠Apollo Client ã䜿ã£ã React Component ã®éçºã§ãQuery ããã³ Mutation å®è¡ã®ãã¹ãã宿œããã«ã¯ããã¹ããã¬ãŒã ã¯ãŒã¯ã® Jestãreact-testing-library ãšããããŠãApollo å
¬åŒã§ã玹ä»ãããŠãã MockedProvider ãçšããæ¹æ³ãäžè¬çããšæããŸãã ã¯ãšãªãšã¯ãšãªã«å¯Ÿããã¬ã¹ãã³ã¹ãçµã¿åãããã¢ãã¯ããŒã¿ãçšæããŠãããApolloProvider ã®ä»£ããã« MockedProvider ã§ãã¹ã察象㮠component ãã©ããããããšã§ãAPI ãµãŒããŒã Network ç°å¢ã«äŸåãããã¢ãã¯ã§æå®ããã¯ãšãªããªã¯ãšã¹ãããããšãã¢ãã¯ã§ããã«å¯Ÿå¿ããããã«çšæããã¬ã¹ãã³ã¹ããŒã¿ã確å®ã«ååŸã§ããä»çµã¿ãäœããŸãã ãã®ä»çµã¿ãš react-testing-library ã䜿ã£ãŠãcomponent ã§ render ããã UI äžã®æäœãããªã¬ãŒã«ããŠå®è¡ããããã¯ãšãªã®ãã¹ããè¡ãããšãã§ããŸãã Query ã ãã§ã¯ãªã Mutation ãã¢ãã¯ããããšãã§ããŠã䟿å©ãªããŒã«ã§ã¯ãããŸããããã¹ãã±ãŒã¹æ¯ã«ã¢ãã¯ããŒã¿ã¯æåã§äœæããªããã°ãªããªãç¹ãããªããªã骚ãæããäœæ¥ã§ãã å®éã«ã¢ããªã±ãŒã·ã§ã³ãåãããŠããã¹ã察象㮠component ã render ããQuery ã«æž¡ããã variables ãã¬ã¹ãã³ã¹ã®å€ã Console ã«åºåãããã©ãŠã¶ã® Dev Tools äžã§äžåäžåãªããžã§ã¯ããã³ããŒããŠããšãã£ã¿ã«è²Œãä»ããããããäœæ¥ãçºçããŸãã AutoMockedProvider ã®äœæ ããã§ããããããã¹ãäœæãã¹ããŒã倿Žã®åºŠã«ãæåã§ã¢ãã¯ããŒã¿ãçšæããªããŠããGraphQL ã¹ããŒãã§å®çŸ©ãããŠããåãèŠãŠãèªåã§ã¯ãšãªã«å¯Ÿããã¬ã¹ãã³ã¹ãã¢ãã¯ããŠããã AutoMockedProvider ãã ãã¡ãã®èšäº ãåèã«ããŠäœæããŸããã MockedProvider ã®ä»£ããã«ãAutoMockedProvider ãçšããŠãã¹ã察象㮠Component ãã©ããããããšã§ãMockedProvider ã䜿ã£ãŠãã¹ãããŠããå
容ãšåããã¹ãã宿œã§ããŸãã MockedProvider ã䜿ã£ãŠæ¯åã¢ãã¯ããŒã¿ãçšæãããã¹ãã宿œããããšã«ç²ããŠããæ¹ã¯æ¯éãã詊ããã ããã ïŒç޹ä»å
ã®èšäºã§ã¯ã graphql-tools ã® makeExecutableSchema() ã«æž¡ã schemaSDL ã json ãã¡ã€ã«ã§å®çŸ©ãããŠããŸããã graphql-tag ã®ã©ã€ãã©ãªã䜵çšããã°ãgraphql ãã¡ã€ã«ã§ãåæ§ã« schemaSDL ãšããŠé©çšããããšãå¯èœã§ãïŒ ãªãã¥ãŒã¢ã«ãæ¯ãè¿ã£ãŠ ä»åã®ãªãã¥ãŒã¢ã«ã§ã¯ãGraphQLãTypeScriptãReact ãã»ããã§æ¡çšããããšã«ãããããã³ãåŽã§ã¯ GraphQL Code Generator ã䜿ã£ãŠããããããçšæããŠããã GraphQL ã¹ããŒããããTypeScript ã®åã ãã§ã¯ãªããReact ã® Hooks 颿°ãŸã§çæããŠå©çšã§ããããšããéçºå¹çã®åäžã«éåžžã«åœ±é¿ãäžãããšæããŸãã GraphQL API ã®ã¯ã©ã€ã¢ã³ãã§ãã¢ããªã±ãŒã·ã§ã³å
šäœã®ç¶æ
管çãè¡ã Apollo Client ã® cache æ©æ§ã®äœ¿ãæ¹çãäœåŸãããŸã§ã«ãåŠç¿ã³ã¹ãã¯æ±ºããŠãŒãã§ã¯ãããŸããã§ããããTypeScript ãš GraphQL ã®åã·ã¹ãã ã®æ©æµããã«ã«åããNext.js ã®ã¬ãŒã«ã«ã®ã£ãããåå®å
šãªéçºç°å¢ãæã«å
¥ããããšãã§ããŸããã æã
ãéçºè
ã®äœéšã ãã§ã¯ãªããä»åŸã®ãããã¯ãå
šäœãžã®çç£æ§ã«ãè¯ã圱é¿ãåãŒããŠããããšç¢ºä¿¡ããŠããŸãã ãããã« ã¡ãã¬ãŒã§ã¯ãšã³ãžãã¢ã»ãã¶ã€ããŒãç©æ¥µåéããŠããŸãã ããã¯ãããžãŒã掻çšããŠå»çãã«ã¹ã±ã¢ã®æªæ¥ãã€ããããšããããã·ã§ã³ã«å
±æãã課é¡è§£æ±ºãè¡ãããæ¹ã¯æ¯éããå¿åãã ããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ããã«ã¡ã¯ãã¡ãã¬ãŒã®ãšã³ãžãã¢ã®å±±ç°ã§ããçŸåšãå»çä»è·æ±äººãµã€ãããžã§ãã¡ãã¬ãŒãã®ããŒã ã§éçºãæ
åœããŠããŸãã ä»åããžã§ãã¡ãã¬ãŒã®ç€Ÿå
ã¹ã¿ãããå©çšãã瀟å
ã·ã¹ãã ããªãã¥ãŒã¢ã«ããäºäŸãã玹ä»ããŸãã ãªãã¥ãŒã¢ã«å¯Ÿè±¡ã¯ããã¯ãšã³ãé åãå«ãŸããŸãããæ¬èšäºã§ã¯ããã³ããšã³ãã®è©±ãäžå¿ã«ã玹ä»ããŸãã ãŸããåŒç€Ÿãã¶ã€ããŒé
äºã以åæçš¿ãã ãã¶ã€ããŒããã¶ã€ã³ããŒã«ã䜿ããã«ãReact ã䜿ã£ãŠãã¶ã€ã³ãã話 ãé¢é£ããŠããã®ã§ããããããã°ããããŠã芧ãã ããã ãªãã¥ãŒã¢ã«ã®èæ¯ ç€Ÿå
ã·ã¹ãã ã§ã¯ãæ±äººãµã€ãããžã§ãã¡ãã¬ãŒããå©çšããæ±è·è
ã«é¢ããæ
å ±ãæ±è·è
ã®å¿åç¶æ³ã管çããŠããŸãã ååã®ãªãã¥ãŒã¢ã«ããæéãçµã¡ãè€éæ§ãé«ããªã£ãŠããŸããããã®è€éæ§ã«æ¯äŸããŠãæ°æ©èœã®è¿œå ãæ¹ä¿®ããããã®ã³ã¹ããé«ããªã£ãŠããŸããã ããã§äžèšã®èª²é¡ã解決ãããããç¶æ
管çãããããããã¹ãã³ãŒããæžãããããã¡ã³ãããã«ãªã¢ãŒããã¯ãã£ã«ãã¹ããªãã¥ãŒã¢ã«ã宿œããããšã«ããŸããã æ€èšŒæéãçµãŠãä»åã®ãªãã¥ãŒã¢ã«ã«ããããŠæ°èŠã«äœæãã API ã¯ãGraphQL ã«ãã£ãŠå®è£
ããããšã決ããŸããã åã·ã¹ãã ãæã€ããç»é¢ã«å¿
èŠãªããŒã¿ãæè»ã«éäžè¶³ãªãååŸã§ãããæåã§ããã¥ã¡ã³ãã«èœãšã蟌ãŸãªããŠãã¹ããŒããå®çŸ©ãããŠããã° API ã®ä»æ§ãç°¡åã«ææ¡ã§ãããçãã¡ãªãããšããŠæããããŸããã ç¹ã«ãGraphQL ãæã€åã·ã¹ãã ããTypeScriptãApolloãGraphQL Code Generator ã®ã©ã€ãã©ãªãçµã¿åãããããšã§ãAPI ã«æž¡ããã©ã¡ãŒã¿ããã¬ã¹ãã³ã¹ã«ãåãé©çšãããGraphQL ã¹ããŒãã®å€æŽã«ã¯ã©ã€ã¢ã³ãã®å®è£
ãæ¯èŒç容æã«è¿œåŸã§ããããšãã倧ããªãã€ã³ãã§ããã ããã³ããšã³ãã®æè¡çãªãªãã¥ãŒã¢ã«å
容 ä»åã¯ç¹ã«ããªãã¥ãŒã¢ã«ã«çšãããããã¬ãŒã ã¯ãŒã¯ãã©ã€ãã©ãªãApollo Client ãçšããç¶æ
管çããã¹ãã³ãŒãå®è£
ã«ããã Tips çãããããéšåçã«ã玹ä»ããŸãã æ¡çšãããã¬ãŒã ã¯ãŒã¯ãšäž»èŠã©ã€ãã©ãª æ¡çšã©ã€ãã©ãª 説æ Next.js React çšã®ãã¬ãŒã ã¯ãŒã¯ïŒãã€ã©ãŒãã¬ãŒãïŒ TypeScript JavaScript ã®ã¹ãŒããŒã»ããã§ãéçåä»ãèšèª React UI ãæ§ç¯ããããã®ã©ã€ãã©ãªïŒããŒãžã§ã³ 16.8.0 ã§ãªãªãŒã¹ããã hooks ãå
šé¢çã«äœ¿çšïŒ Apollo Client GraphQL API ã®ã¯ã©ã€ã¢ã³ãã§ãã¢ããªã±ãŒã·ã§ã³å
šäœã®ç¶æ
管çã宿œ GraphQL Code Generator GraphQL ã¹ããŒãããå®çŸ©ãã¡ã€ã«ïŒåãã«ã¹ã¿ã hooks çïŒãçæ emotion + Styled System CSS in JS ãšããŠå©çš formik + yup ãã©ãŒã ã®ãã«ã㌠+ ããªããŒã¿ãŒ Jest + React Testing Library ãã¹ãã³ãŒãå®è£
çšã®ããŒã«çŸ€ ESLint + Prettier ã«ãŒã«ã«åºã¥ããã³ãŒãã®éçè§£æ + ã¹ã¿ã€ãªã³ã° TypeScript ä»åã®ãªãã¥ãŒã¢ã«ã§æ±ããããããšã®äžã€ãšããŠããããªãæ¹åã»æ°èŠæ©èœè¿œå ãªã©ãããŠããäžã§ããœãããŠã§ã¢å質ãæ
ä¿ããããã®ãã¢ããªã±ãŒã·ã§ã³ã®å
ç¢ãããããŸããã ããã§ãããã³ããšã³ãåŽã®éçºèšèªãšããŠã¯ãããã°ã©ã ã³ãŒãå
ã§å®£èšãããåã«ãã£ãŠããšã©ãŒãæªç¶ã«é²ãã€ã€ãVSCode ãã¯ãããšãããšãã£ã¿ã®ã³ãŒãè£å®ã®æ©æµãåããããã¡ãªããçãèæ
®ã㊠TypeScript ã®æ¡çšã決ããŸããããŸããä»ã®ãããžã§ã¯ãã§ãæ¢ã« TypeScript ã¯éšåçã«å©çšãå§ããŠããäºæ
ããããéã« TypeScript ãæ¡çšããªãããšããéžæè¢ã¯ããŸãèããããŸããã§ããã React UI ãæ§ç¯ããããã®ã©ã€ãã©ãª/ãã¬ãŒã ã¯ãŒã¯ã¯ React ãæ¡çšããŸããããã¡ãããåŒç€Ÿã§ã¯å¥ãããžã§ã¯ãã§ React ãæ¢ã«å©çšãå§ããŠããããšããããåŠç¿ã³ã¹ãã®èгç¹ãããæ°ãã«ä»ã®ãã¬ãŒã ã¯ãŒã¯ãéžæããã¡ãªããã¯ã»ãŒç¡ãã£ãããã§ãããããããã®äºãå·®ãåŒãããšããŠã TypeScript ãš GraphQL ãšã®çžæ§ã®è¯ãã§ãReact ãåªå¢ã§ããã ç¹ã«ãReact ã®å Žåã¯ãGraphQL ã¹ããŒããããŒã¹ã«ãGraphQL Code Generator ã«ãã£ãŠåå®çŸ©ãã¡ã€ã«ã ãã§ã¯ãªããGraphQL API ãšã®ããåãã«äœ¿ããã«ã¹ã¿ã hooks ãçæããŠå©çšã§ãããšããç¹ãã倧ããªå©ç¹ãšããŠèããããŸããã Next.js ããã³ããšã³ãéçºç°å¢ãçŽ æ©ãæ§ç¯ããããããã€ã©ãŒãã¬ãŒããšã㊠Next.js ãæ¡çšããŸããã Next.js ã®å
·äœçãªæ¡çšãã€ã³ããšããŠã¯ãäž»ã«æ¬¡ã®ïŒç¹ã§ãã webpack ã«ãããããã³ãã«ãã³ã³ãã€ã«ãããããªããŒãçã®èšå®ã«æéãè²»ããããšãªããããžãã¹ããžãã¯ã®å®è£
ã«éäžã§ãã å¿
èŠãããã°ãnext.config.js ã§èšå®ãæ¡åŒµã§ãã CRAïŒCreate React AppïŒãšã¯ç°ãªããæ¡åŒµæ§ã«åªããŠãã pages é
äžã«çœ®ã React Component ã®ãã£ã¬ã¯ããªæ§æããèªåçã«ã«ãŒãã£ã³ã°ãšããŠå®çŸ©ããã ã«ãŒãã£ã³ã°ã«é¢ããèšèšäœæ¥ãäžèŠã«ãªã èªåã³ãŒãåå²çã«ããããã©ãŒãã³ã¹æé©åããããªã«è¡ã£ãŠããã React Component ã®åé¡ component ã¯å€§ããïŒã€ã«åé¡ãã src/components/app/ ãš src/components/ui/ ããããã®ãã£ã¬ã¯ããªã« component ã眮ããŠããŸããåé¡ã¯ä»¥äžã®åºæºã§è¡ãªããŸããã app : æ¬ã¢ããªã±ãŒã·ã§ã³åºæã§äœ¿çšãããæ³å®ã®ãã®ã§ãåå©çšæ§ãäœããå
·äœç㪠component ui : æ¬ã¢ããªã±ãŒã·ã§ã³å€ã§ã䜿çšå¯èœãªãåå©çšæ§ãé«ããæœè±¡ç㪠component 瀟å
åãã·ã¹ãã ã§ã¯ãããã®ã®ãMaterial-UI ã Ant Design çãã¯ãããšãããå€éšã® UI ã©ã€ãã©ãªã¯äœ¿çšãããã«ã¹ã¿ãã€ãºãããããããã«ãå
šãŠèªåã§äœæããŸããã app é
äžãš ui é
äžãã©ã¡ãã® component ãåºæ¬çã«ã¯ ã³ãã±ãŒã·ã§ã³ ã®èãæ¹ã§ãã¡ã€ã«ãæ§æããŠããŸãã äžè¬çã«ã¯ãããäžç·ã«å€æŽãããã¡ã€ã«ãè¿ãã«çœ®ããŠããã®ã¯è¯ãã¢ã€ãã£ã¢ã§ãã ãã®ååã¯ããã³ãã±ãŒã·ã§ã³ããšåŒã°ããŸãã ãã®èãæ¹ã§ãã¡ã€ã«ãæ§æããããšã§ãé¢é£ãããã¡ã€ã«ããŸãšãŸã£ãŠããŠãäœæ¥ããããããªããŸãã src/ components/ app/ partials/ ${ component å} / apollo.cache.ts apollo.query.graphql index.tsx index.test.tsx ... screens/ ${ component å} / apollo.cache.ts apollo.query.graphql index.tsx index.test.tsx ${å component å} / apollo.cache.ts apollo.query.graphql index.tsx index.test.tsx validation.ts src/components/app ãã£ã¬ã¯ããªé
äžã§ããã«ã partials ãš screens ã®ãã£ã¬ã¯ããªã§ component ãåããŠããŸãã screens ã«ã¯ãNext.js ã§ route ãšããŠæ±ããã src/pages é
äžã® component ãã import ããã component ãé
眮ãããŠããŸãã ç»é¢ã®ããªãšãŒã·ã§ã³ãå¢ãã床ã«ããã® screens ã«ãã¡ã€ã«ã远å ãããŠãããŸãã partials ã«ã¯ãapp é
äžã§è€æ°ã® component ããå©çšããã componentïŒç»é¢ããŸããã§å
±æããããã®çïŒãé
眮ããŠããŸãã screens ãš partials ããããçŽäžã® component ã§ãå¿
èŠã§ããã°é©å®ãcomponent ãåå²ããŠå component ãæã€æ§æã«ããŠããŸãã apollo.cache.ts ãš apollo.query.graphql ã«ã€ããŠã¯åŸè¿°ã®ç¶æ
管çã®è©±ã§ã玹ä»ããŸãã ç¶æ
管ç ã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
管çã«ã€ããŠã¯ãã°ããŒãã«ã«ã¢ã¯ã»ã¹ã§ããç¶æ
ã®ç®¡çã«ã¯ Apollo Client ã® InMemoryCache ã«ãã cache æ©æ§ã§è¡ããç¹å®ã® component å
ã«éããŠãã屿çãªç¶æ
ã®ç®¡çã«ã¯ useState çã® React Hooks ã䜿ã£ãŠè¡ã£ãŠããŸãã ç¶æ
管çã®å¿
èŠæ§ãçããéãã¢ããªã±ãŒã·ã§ã³ã®è€éæ§ãäžããªãããã«ããªãã¹ã useState çã® hooks ãçšãã local state ã ãã§æžãŸããããªããã©ãããæ€èšããŸãã äŸãã°ãã¯ãªãã¯ãããšããããããŠã³ãªã¹ãã衚瀺ãããã»ã¬ã¯ãããã¯ã¹ã® component ã§ãããããããŠã³ãªã¹ãã®è¡šç€ºç¶æ
ããã® component å
ã ãã§æ±ãããã®ã§ããã° useState ãçšãã local state ã§ååã§ãããšèããããŸãã 芪åé¢ä¿ã§ã¯ãªã component å士ã§ã®ãããšããå¿
èŠã«ãªã£ãæãããµãŒãã®ããŒã¿ãšé¢é£ããå Žåçã§ãããŒã«ã«ã®ããŒã¿ãäžå
管çããŠãããæ¹ãè¯ããããªã±ãŒã¹ã§ã¯ãApollo Client ã® cache ãå©çšããŸãã Apollo Client Apollo ã«é¢é£ãããã¡ã€ã«ã®æ§æã«ã€ããŠã¯ä»¥äžã®éãã§ãã src/ apollo/ cache.ts client.ts types.ts withApollo.ts cache.ts : Apollo ã«ããã local state ã® initialState ãš resolver ãå
šç»é¢åãã®ãã¡ã€ã«ã§ãŸãšããŠãæçµçã« Next.js ã® src/pages/_app.tsx ã«æž¡ãããã«ãã component åºæã® local state ã«é¢ãã initialState ããã³ state ã® updater ãšãªã resolver 㯠component æ¯ã® apollo.cache.ts ã«ãŠãå¥éå®çŸ© client.ts : Apollo Client ã®ã€ã³ã¹ã¿ã³ã¹ãçæãããã¡ã€ã« types.ts : Apollo é¢é£ã®åå®çŸ©ãã¡ã€ã« withApollo.ts : Apllo Client ã® <ApolloProvider /> ã§ã©ããããŠè¿ã Higher-Order Compoents(HOC) å®è£
ã«ã€ããŠã¯å²æããŸãããclient.ts ãš withApollo.ts ã«é¢ããŠã¯ãNext.js ã® exampleïŒ with-apollo ïŒçãåèã«ããŸããã ç»é¢åºæã® Apollo ã®ç¶æ
管çã«é¢ãããã¡ã€ã«ã¯ src/components/**/${component å}/ é
äžã«çœ®ããŠããŸãã ãã¡ããã³ãã±ãŒã·ã§ã³ã®èãæ¹ã§ãcomponent ã«é¢ããç¶æ
管çã¯è©²åœã® component ãšåãå Žæã«çœ®ãããšãæèããŠããŸãã src/ components/ app/ ${ component å} / apollo.cache.ts apollo.query.graphql apollo.schema.graphql apollo.cache.ts : component åºæã® Apollo ã«ããã local state ã® initialState ããã³ resolver ãå®çŸ©ãããã¡ã€ã« apollo.query.graphql : ã¯ãšãªãå®çŸ©ãããã¡ã€ã« apollo.schema.graphql : local state ã® GraphQL ã¹ããŒããå®çŸ©ãã¡ã€ã« ãã¡ã€ã«ã®åœåã«ã€ããŠã ãã£ã¬ã¯ããªéå±€ãã§ããã ãæ·±ãããããªã ã®ã§ã apollo çã«ãããã£ã¬ã¯ããªã¯èšããŠããŸããããApollo é¢é£ã®ãã¡ã€ã«çŸ€ãšããŠèªèã§ããããããã¡ã€ã«åã« apollo. ã®ãã¬ãã£ãã¯ã¹ãã€ããŠåœåããŠããŸãã Query ãš Mutation ã®å®è¡ã«ã€ã㊠GraphQL Code Generator ã®ãã©ã°ã€ã³ TypeScript React Apollo ãã€ã³ã¹ããŒã«ããŠãhooks ãçæããèšå®ã«ããäžã§ãcomponent æ¯ã«ãããã GraphQL ã®ã¹ããŒããšã¯ãšãªãèšè¿°ããã .graphql ãã¡ã€ã«ãããšã«ãGraphQL Code Generator ãçæããã«ã¹ã¿ã hooks ãå©çšããŸãã ãã¡ãã®ã«ã¹ã¿ã hooks ã React Component ã§å©çšããããšã§ãApollo Client çµç±ã§ GraphQL API ãšããŒã«ã«ã® Apollo cache ã«æ¥ç¶ããŠãããŒã¿ã®ããåããè¡ãããšãã§ããŸãã Query Query ã® hooks ã¯ïŒçš®é¡ãããå®è¡ããã¿ã€ãã³ã°ã«ãã£ãŠããããé©åãªæ¹ãéžãã§å®è¡ããŠããŸãã API å®è¡ã¿ã€ãã³ã° useQuery Component ã render ããããã¯ãšãªå®è¡ useLazyQuery ä»»æã®ã€ãã³ããããªã¬ãŒã«ããŠã¯ãšãªå®è¡ use***Query éåžžã§ããã° useQuery ã§ã¯ãšãªã®çµæã render ããŸãããGraphQL Code Generator ãå©çšããå Žåã¯ãããããã®ã¯ãšãªãã©ããããã«ã¹ã¿ã hooks ãçæãããã®ã§ã useQuery , useLazyQuery ããã®ãŸãŸäœ¿ãããšã¯ãããŸããã query AllPosts { allPosts { id title rating } } â ã®ãããªã¯ãšãªãçšæãããš src/__generated__/graphql.tsx ã«å¯ŸããŠã次ã®ãããªã«ã¹ã¿ã hooks ãåãšäžç·ã«çæãããèšå®ã«ããŠããŸãã // Apollo Client: 2.6.9ãGraphQL Code Generator: 1.15.0 ã®å Žåã®äŸ export function useAllPostsQuery ( baseOptions ?: ApolloReactHooks . QueryHookOptions & lt ; AllPostsQuery , AllPostsQueryVariables >) { return ApolloReactHooks . useQuery & lt ; AllPostsQuery , AllPostsQueryVariables >( AllPostsDocument , baseOptions ); } export function useAllPostsLazyQuery ( baseOptions ?: ApolloReactHooks . LazyQueryHookOptions & lt ; AllPostsQuery , AllPostsQueryVariables >) { return ApolloReactHooks . useLazyQuery & lt ; AllPostsQuery , AllPostsQueryVariables >( AllPostsDocument , baseOptions ); } React Component ã§ã¯çæãããã«ã¹ã¿ã hooks ãæ¬¡ã®ããã«åŒã³åºããŠãµãŒããŒããè¿ã£ãŠããçµæãåãåã£ãŠãããŒã¿åºåãããŒãã£ã³ã°ç¶æ
ã®ãã§ãã¯ããšã©ãŒãã³ããªã³ã°çãè¡ããŸãã const { data , loading , error } = useAllPostsQuery (); Mutation ããŒã¿ã®æžã蟌ã¿ã¯ useMutation ã§è¡ããŸãã Query åæ§ã GraphQL Code Generator ã«ãã£ãŠçæãããã«ã¹ã¿ã hooks use***Mutation ã䜿ã£ãŠããŸãã cache ã®æŽæ° Mutation ãè€æ°ãšã³ãã£ãã£ã®æŽæ°ããšã³ãã£ãã£ã®æ°èŠäœæãŸãã¯åé€ã®å ŽåãApollo Client ã® cache ã¯èªåæŽæ°ããããMutation ã®çµæãèªåçã« render ãããŸããã ãã®ãããªå Žåã§ãã useMutation ã® update option ã䜿ãã°ã cache ãªããžã§ã¯ããåŒæ°ã«åãã颿°ãèšå®ã§ããã®ã§ããã®é¢æ°å
ã§çŽæ¥ cache ãæŽæ°ã§ããŸãã ãŸãã update ã®ä»£ããã« refetchQueries ã® option ã䜿ã£ãŠãä»»æã® Query ãå®è¡ããŠãã·ã³ãã«ã« cache ãæŽæ°ããããšãã§ããŸãã äœãããã®æ¹æ³ã ãš Network éä¿¡ã«ãããªãŒããŒããããçºçããŸãã ãã®ãªãŒããŒããããç ç²ã«ããŠã§ãããµãŒããŒããããŒã¿ååŸããã Query ããããããªå Žåã«ã¯ããã® refetchQueries ãæå¹ã§ãã local state ã®ç®¡ç ããããã¯ç¹å®ã® component ã®ç¶æ
管çã local state ã䜿ã£ãŠã©ã®ããã«ç®¡çããŠãããããã説æããŠãããŸãã @client ã䜿ã£ã Query Next.js ã®ãããžã§ã¯ãã§ãlocal state ã®ç®¡çã Apollo Client ã§è¡ãå Žåã®äŸãšããŠã¯ã次ã®éãã§ãã ã¹ããŒãïŒ # src / components / app / Home / apollo . schema . graphql type Home { currentPostId: Int! } extend type Query { home: Home } ã¯ãšãªïŒ # src / components / app / Home / apollo . query . graphql query HomeCurrentPostId { home @ client { currentPostId } } ãã£ãã·ã¥ã®åæå€ïŒ // src/components/app/Home/apollo.cache.ts export const cache = { __typename: 'Home' , currentPostId: 0 , ..., }; // src/apollo/cache.ts const caches = { ..., home: home . cache , }; export { ..., caches , }; // src/pages/_app.tsx export const cache = new InMemoryCache (); ... const client = new ApolloClient ({ link , cache: cache . restore ( initialState || {}), resolvers , connectToDevTools: true , }); cache . writeData ({ data: caches }); GraphQL ã¯ãšãªãšã¹ããŒããå®çŸ©ãããŠããã° GraphQL Code Generator ã use***Query ã®ã³ãŒããçæããèšå®ã«ããŠããŸãã ããŒã«ã«ããŒã¿ã®å Žåãã¯ãšãªã§ @client ãã£ã¬ã¯ãã£ããã€ããŠããŒã«ã«ããŒã¿ã§ããããšãæç€ºããŸãã @client ã䜿ã£ã Mutation local state ã®æŽæ°ã GraphQL ã® Mutation ãšããŠè¡ãå Žåã®äŸãšããŠã¯ã次ã®éãã§ãã ã¹ããŒãïŒ # src / components / app / Home / apollo . schema . graphql type UpdateCurrentPostId { currentPostId: Int! } extend type Mutation { updateCurrentPostId(id: Int!): UpdateCurrentPostId } ã¯ãšãªïŒ # src / components / app / Home / apollo . query . graphql mutation UpdateCurrentPostId ( $id : Int !) { updateCurrentPostId ( id : $id ) @ client { currentPostId @ client } } resolverïŒ // src/components/app/Home/apollo.cache.ts const updateCurrentPostId : MutationResolvers [ "updateCurrentPostId" ] = ( _ , args , { cache } ) => { cache . writeData ({ data: { home: { __typename: "Home" , currentPostId: args . id , }, }, }); return null ; }; export const Mutation = { updateCurrentPostId , }; Query åæ§ã« @client ãã£ã¬ã¯ãã£ããã€ããŠããŒã«ã«ããŒã¿ã§ããããšãæç€ºããŸãã å®éã® Mutation ã®åŠçèªäœã¯ resolver ã®äžã« cache.writeData() ã䜿ã£ãŠèšè¿°ããŸãã Mutation ã®åœåã¯ã åè©+åè©ã®åœ¢åŒã§å¯èœãªéãæå³ã®ããå
·äœçãªååãã€ãã ããšãæèããŠããŸãã Apollo ã䜿ã£ãéçºã䟿å©ã«ããŠãããããŒã« Apollo Client ã䜿ã£ãŠéçºããéã¯ãããŒã«ã«ã® Apollo cache ã®ç¶æ
ããã¯ãšãªã詊ãã«å®è¡ããããã®ããŒã«ãšããŠãGoogle Chrome ã®æ¡åŒµæ©èœ Apollo Client Developer Tools ãéåžžã«äŸ¿å©ã§ãã ãã¡ãã®æ¡åŒµæ©èœã Chrome ã«ã€ã³ã¹ããŒã«ãããšãApollo Client ã䜿ã£ãŠ GraphQL API ã«ã¢ã¯ã»ã¹ãããµã€ãã«é·ç§»ããç¶æ
ã§ Chrome Dev Tools ãéããš Apollo ã®ã¿ãã衚瀺ãããŸããããã§ã¯ãšãªã®å®è¡ããAPI 仿§ã®ç¢ºèªãããŒã«ã«ã® Apollo cache ã®ç¢ºèªçãè¡ãããšãã§ããŸãã GraphQL é¢é£ã®ãã¹ãã³ãŒãã«ã€ã㊠Apollo Client ã䜿ã£ã React Component ã®éçºã§ãQuery ããã³ Mutation å®è¡ã®ãã¹ãã宿œããã«ã¯ããã¹ããã¬ãŒã ã¯ãŒã¯ã® Jestãreact-testing-library ãšããããŠãApollo å
¬åŒã§ã玹ä»ãããŠãã MockedProvider ãçšããæ¹æ³ãäžè¬çããšæããŸãã ã¯ãšãªãšã¯ãšãªã«å¯Ÿããã¬ã¹ãã³ã¹ãçµã¿åãããã¢ãã¯ããŒã¿ãçšæããŠãããApolloProvider ã®ä»£ããã« MockedProvider ã§ãã¹ã察象㮠component ãã©ããããããšã§ãAPI ãµãŒããŒã Network ç°å¢ã«äŸåãããã¢ãã¯ã§æå®ããã¯ãšãªããªã¯ãšã¹ãããããšãã¢ãã¯ã§ããã«å¯Ÿå¿ããããã«çšæããã¬ã¹ãã³ã¹ããŒã¿ã確å®ã«ååŸã§ããä»çµã¿ãäœããŸãã ãã®ä»çµã¿ãš react-testing-library ã䜿ã£ãŠãcomponent ã§ render ããã UI äžã®æäœãããªã¬ãŒã«ããŠå®è¡ããããã¯ãšãªã®ãã¹ããè¡ãããšãã§ããŸãã Query ã ãã§ã¯ãªã Mutation ãã¢ãã¯ããããšãã§ããŠã䟿å©ãªããŒã«ã§ã¯ãããŸããããã¹ãã±ãŒã¹æ¯ã«ã¢ãã¯ããŒã¿ã¯æåã§äœæããªããã°ãªããªãç¹ãããªããªã骚ãæããäœæ¥ã§ãã å®éã«ã¢ããªã±ãŒã·ã§ã³ãåãããŠããã¹ã察象㮠component ã render ããQuery ã«æž¡ããã variables ãã¬ã¹ãã³ã¹ã®å€ã Console ã«åºåãããã©ãŠã¶ã® Dev Tools äžã§äžåäžåãªããžã§ã¯ããã³ããŒããŠããšãã£ã¿ã«è²Œãä»ããããããäœæ¥ãçºçããŸãã AutoMockedProvider ã®äœæ ããã§ããããããã¹ãäœæãã¹ããŒã倿Žã®åºŠã«ãæåã§ã¢ãã¯ããŒã¿ãçšæããªããŠããGraphQL ã¹ããŒãã§å®çŸ©ãããŠããåãèŠãŠãèªåã§ã¯ãšãªã«å¯Ÿããã¬ã¹ãã³ã¹ãã¢ãã¯ããŠããã AutoMockedProvider ãã ãã¡ãã®èšäº ãåèã«ããŠäœæããŸããã MockedProvider ã®ä»£ããã«ãAutoMockedProvider ãçšããŠãã¹ã察象㮠Component ãã©ããããããšã§ãMockedProvider ã䜿ã£ãŠãã¹ãããŠããå
容ãšåããã¹ãã宿œã§ããŸãã MockedProvider ã䜿ã£ãŠæ¯åã¢ãã¯ããŒã¿ãçšæãããã¹ãã宿œããããšã«ç²ããŠããæ¹ã¯æ¯éãã詊ããã ããã ïŒç޹ä»å
ã®èšäºã§ã¯ã graphql-tools ã® makeExecutableSchema() ã«æž¡ã schemaSDL ã json ãã¡ã€ã«ã§å®çŸ©ãããŠããŸããã graphql-tag ã®ã©ã€ãã©ãªã䜵çšããã°ãgraphql ãã¡ã€ã«ã§ãåæ§ã« schemaSDL ãšããŠé©çšããããšãå¯èœã§ãïŒ ãªãã¥ãŒã¢ã«ãæ¯ãè¿ã£ãŠ ä»åã®ãªãã¥ãŒã¢ã«ã§ã¯ãGraphQLãTypeScriptãReact ãã»ããã§æ¡çšããããšã«ãããããã³ãåŽã§ã¯ GraphQL Code Generator ã䜿ã£ãŠããããããçšæããŠããã GraphQL ã¹ããŒããããTypeScript ã®åã ãã§ã¯ãªããReact ã® Hooks 颿°ãŸã§çæããŠå©çšã§ããããšããéçºå¹çã®åäžã«éåžžã«åœ±é¿ãäžãããšæããŸãã GraphQL API ã®ã¯ã©ã€ã¢ã³ãã§ãã¢ããªã±ãŒã·ã§ã³å
šäœã®ç¶æ
管çãè¡ã Apollo Client ã® cache æ©æ§ã®äœ¿ãæ¹çãäœåŸãããŸã§ã«ãåŠç¿ã³ã¹ãã¯æ±ºããŠãŒãã§ã¯ãããŸããã§ããããTypeScript ãš GraphQL ã®åã·ã¹ãã ã®æ©æµããã«ã«åããNext.js ã®ã¬ãŒã«ã«ã®ã£ãããåå®å
šãªéçºç°å¢ãæã«å
¥ããããšãã§ããŸããã æã
ãéçºè
ã®äœéšã ãã§ã¯ãªããä»åŸã®ãããã¯ãå
šäœãžã®çç£æ§ã«ãè¯ã圱é¿ãåãŒããŠããããšç¢ºä¿¡ããŠããŸãã ãããã« ã¡ãã¬ãŒã§ã¯ãšã³ãžãã¢ã»ãã¶ã€ããŒãç©æ¥µåéããŠããŸãã ããã¯ãããžãŒã掻çšããŠå»çãã«ã¹ã±ã¢ã®æªæ¥ãã€ããããšããããã·ã§ã³ã«å
±æãã課é¡è§£æ±ºãè¡ãããæ¹ã¯æ¯éããå¿åãã ããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ããã«ã¡ã¯ãã¡ãã¬ãŒã®ãšã³ãžãã¢ã®å±±ç°ã§ããçŸåšãå»çä»è·æ±äººãµã€ãããžã§ãã¡ãã¬ãŒãã®ããŒã ã§éçºãæ
åœããŠããŸãã ä»åããžã§ãã¡ãã¬ãŒã®ç€Ÿå
ã¹ã¿ãããå©çšãã瀟å
ã·ã¹ãã ããªãã¥ãŒã¢ã«ããäºäŸãã玹ä»ããŸãã ãªãã¥ãŒã¢ã«å¯Ÿè±¡ã¯ããã¯ãšã³ãé åãå«ãŸããŸãããæ¬èšäºã§ã¯ããã³ããšã³ãã®è©±ãäžå¿ã«ã玹ä»ããŸãã ãŸããåŒç€Ÿãã¶ã€ããŒé
äºã以åæçš¿ãã ãã¶ã€ããŒããã¶ã€ã³ããŒã«ã䜿ããã«ãReact ã䜿ã£ãŠãã¶ã€ã³ãã話 ãé¢é£ããŠããã®ã§ããããããã°ããããŠã芧ãã ããã ãªãã¥ãŒã¢ã«ã®èæ¯ ç€Ÿå
ã·ã¹ãã ã§ã¯ãæ±äººãµã€ãããžã§ãã¡ãã¬ãŒããå©çšããæ±è·è
ã«é¢ããæ
å ±ãæ±è·è
ã®å¿åç¶æ³ã管çããŠããŸãã ååã®ãªãã¥ãŒã¢ã«ããæéãçµã¡ãè€éæ§ãé«ããªã£ãŠããŸããããã®è€éæ§ã«æ¯äŸããŠãæ°æ©èœã®è¿œå ãæ¹ä¿®ããããã®ã³ã¹ããé«ããªã£ãŠããŸããã ããã§äžèšã®èª²é¡ã解決ãããããç¶æ
管çãããããããã¹ãã³ãŒããæžãããããã¡ã³ãããã«ãªã¢ãŒããã¯ãã£ã«ãã¹ããªãã¥ãŒã¢ã«ã宿œããããšã«ããŸããã æ€èšŒæéãçµãŠãä»åã®ãªãã¥ãŒã¢ã«ã«ããããŠæ°èŠã«äœæãã API ã¯ãGraphQL ã«ãã£ãŠå®è£
ããããšã決ããŸããã åã·ã¹ãã ãæã€ããç»é¢ã«å¿
èŠãªããŒã¿ãæè»ã«éäžè¶³ãªãååŸã§ãããæåã§ããã¥ã¡ã³ãã«èœãšã蟌ãŸãªããŠãã¹ããŒããå®çŸ©ãããŠããã° API ã®ä»æ§ãç°¡åã«ææ¡ã§ãããçãã¡ãªãããšããŠæããããŸããã ç¹ã«ãGraphQL ãæã€åã·ã¹ãã ããTypeScriptãApolloãGraphQL Code Generator ã®ã©ã€ãã©ãªãçµã¿åãããããšã§ãAPI ã«æž¡ããã©ã¡ãŒã¿ããã¬ã¹ãã³ã¹ã«ãåãé©çšãããGraphQL ã¹ããŒãã®å€æŽã«ã¯ã©ã€ã¢ã³ãã®å®è£
ãæ¯èŒç容æã«è¿œåŸã§ããããšãã倧ããªãã€ã³ãã§ããã ããã³ããšã³ãã®æè¡çãªãªãã¥ãŒã¢ã«å
容 ä»åã¯ç¹ã«ããªãã¥ãŒã¢ã«ã«çšãããããã¬ãŒã ã¯ãŒã¯ãã©ã€ãã©ãªãApollo Client ãçšããç¶æ
管çããã¹ãã³ãŒãå®è£
ã«ããã Tips çãããããéšåçã«ã玹ä»ããŸãã æ¡çšãããã¬ãŒã ã¯ãŒã¯ãšäž»èŠã©ã€ãã©ãª æ¡çšã©ã€ãã©ãª 説æ Next.js React çšã®ãã¬ãŒã ã¯ãŒã¯ïŒãã€ã©ãŒãã¬ãŒãïŒ TypeScript JavaScript ã®ã¹ãŒããŒã»ããã§ãéçåä»ãèšèª React UI ãæ§ç¯ããããã®ã©ã€ãã©ãªïŒããŒãžã§ã³ 16.8.0 ã§ãªãªãŒã¹ããã hooks ãå
šé¢çã«äœ¿çšïŒ Apollo Client GraphQL API ã®ã¯ã©ã€ã¢ã³ãã§ãã¢ããªã±ãŒã·ã§ã³å
šäœã®ç¶æ
管çã宿œ GraphQL Code Generator GraphQL ã¹ããŒãããå®çŸ©ãã¡ã€ã«ïŒåãã«ã¹ã¿ã hooks çïŒãçæ emotion + Styled System CSS in JS ãšããŠå©çš formik + yup ãã©ãŒã ã®ãã«ã㌠+ ããªããŒã¿ãŒ Jest + React Testing Library ãã¹ãã³ãŒãå®è£
çšã®ããŒã«çŸ€ ESLint + Prettier ã«ãŒã«ã«åºã¥ããã³ãŒãã®éçè§£æ + ã¹ã¿ã€ãªã³ã° TypeScript ä»åã®ãªãã¥ãŒã¢ã«ã§æ±ããããããšã®äžã€ãšããŠããããªãæ¹åã»æ°èŠæ©èœè¿œå ãªã©ãããŠããäžã§ããœãããŠã§ã¢å質ãæ
ä¿ããããã®ãã¢ããªã±ãŒã·ã§ã³ã®å
ç¢ãããããŸããã ããã§ãããã³ããšã³ãåŽã®éçºèšèªãšããŠã¯ãããã°ã©ã ã³ãŒãå
ã§å®£èšãããåã«ãã£ãŠããšã©ãŒãæªç¶ã«é²ãã€ã€ãVSCode ãã¯ãããšãããšãã£ã¿ã®ã³ãŒãè£å®ã®æ©æµãåããããã¡ãªããçãèæ
®ã㊠TypeScript ã®æ¡çšã決ããŸããããŸããä»ã®ãããžã§ã¯ãã§ãæ¢ã« TypeScript ã¯éšåçã«å©çšãå§ããŠããäºæ
ããããéã« TypeScript ãæ¡çšããªãããšããéžæè¢ã¯ããŸãèããããŸããã§ããã React UI ãæ§ç¯ããããã®ã©ã€ãã©ãª/ãã¬ãŒã ã¯ãŒã¯ã¯ React ãæ¡çšããŸããããã¡ãããåŒç€Ÿã§ã¯å¥ãããžã§ã¯ãã§ React ãæ¢ã«å©çšãå§ããŠããããšããããåŠç¿ã³ã¹ãã®èгç¹ãããæ°ãã«ä»ã®ãã¬ãŒã ã¯ãŒã¯ãéžæããã¡ãªããã¯ã»ãŒç¡ãã£ãããã§ãããããããã®äºãå·®ãåŒãããšããŠã TypeScript ãš GraphQL ãšã®çžæ§ã®è¯ãã§ãReact ãåªå¢ã§ããã ç¹ã«ãReact ã®å Žåã¯ãGraphQL ã¹ããŒããããŒã¹ã«ãGraphQL Code Generator ã«ãã£ãŠåå®çŸ©ãã¡ã€ã«ã ãã§ã¯ãªããGraphQL API ãšã®ããåãã«äœ¿ããã«ã¹ã¿ã hooks ãçæããŠå©çšã§ãããšããç¹ãã倧ããªå©ç¹ãšããŠèããããŸããã Next.js ããã³ããšã³ãéçºç°å¢ãçŽ æ©ãæ§ç¯ããããããã€ã©ãŒãã¬ãŒããšã㊠Next.js ãæ¡çšããŸããã Next.js ã®å
·äœçãªæ¡çšãã€ã³ããšããŠã¯ãäž»ã«æ¬¡ã®ïŒç¹ã§ãã webpack ã«ãããããã³ãã«ãã³ã³ãã€ã«ãããããªããŒãçã®èšå®ã«æéãè²»ããããšãªããããžãã¹ããžãã¯ã®å®è£
ã«éäžã§ãã å¿
èŠãããã°ãnext.config.js ã§èšå®ãæ¡åŒµã§ãã CRAïŒCreate React AppïŒãšã¯ç°ãªããæ¡åŒµæ§ã«åªããŠãã pages é
äžã«çœ®ã React Component ã®ãã£ã¬ã¯ããªæ§æããèªåçã«ã«ãŒãã£ã³ã°ãšããŠå®çŸ©ããã ã«ãŒãã£ã³ã°ã«é¢ããèšèšäœæ¥ãäžèŠã«ãªã èªåã³ãŒãåå²çã«ããããã©ãŒãã³ã¹æé©åããããªã«è¡ã£ãŠããã React Component ã®åé¡ component ã¯å€§ããïŒã€ã«åé¡ãã src/components/app/ ãš src/components/ui/ ããããã®ãã£ã¬ã¯ããªã« component ã眮ããŠããŸããåé¡ã¯ä»¥äžã®åºæºã§è¡ãªããŸããã app : æ¬ã¢ããªã±ãŒã·ã§ã³åºæã§äœ¿çšãããæ³å®ã®ãã®ã§ãåå©çšæ§ãäœããå
·äœç㪠component ui : æ¬ã¢ããªã±ãŒã·ã§ã³å€ã§ã䜿çšå¯èœãªãåå©çšæ§ãé«ããæœè±¡ç㪠component 瀟å
åãã·ã¹ãã ã§ã¯ãããã®ã®ãMaterial-UI ã Ant Design çãã¯ãããšãããå€éšã® UI ã©ã€ãã©ãªã¯äœ¿çšãããã«ã¹ã¿ãã€ãºãããããããã«ãå
šãŠèªåã§äœæããŸããã app é
äžãš ui é
äžãã©ã¡ãã® component ãåºæ¬çã«ã¯ ã³ãã±ãŒã·ã§ã³ ã®èãæ¹ã§ãã¡ã€ã«ãæ§æããŠããŸãã äžè¬çã«ã¯ãããäžç·ã«å€æŽãããã¡ã€ã«ãè¿ãã«çœ®ããŠããã®ã¯è¯ãã¢ã€ãã£ã¢ã§ãã ãã®ååã¯ããã³ãã±ãŒã·ã§ã³ããšåŒã°ããŸãã ãã®èãæ¹ã§ãã¡ã€ã«ãæ§æããããšã§ãé¢é£ãããã¡ã€ã«ããŸãšãŸã£ãŠããŠãäœæ¥ããããããªããŸãã src/ components/ app/ partials/ ${ component å} / apollo.cache.ts apollo.query.graphql index.tsx index.test.tsx ... screens/ ${ component å} / apollo.cache.ts apollo.query.graphql index.tsx index.test.tsx ${å component å} / apollo.cache.ts apollo.query.graphql index.tsx index.test.tsx validation.ts src/components/app ãã£ã¬ã¯ããªé
äžã§ããã«ã partials ãš screens ã®ãã£ã¬ã¯ããªã§ component ãåããŠããŸãã screens ã«ã¯ãNext.js ã§ route ãšããŠæ±ããã src/pages é
äžã® component ãã import ããã component ãé
眮ãããŠããŸãã ç»é¢ã®ããªãšãŒã·ã§ã³ãå¢ãã床ã«ããã® screens ã«ãã¡ã€ã«ã远å ãããŠãããŸãã partials ã«ã¯ãapp é
äžã§è€æ°ã® component ããå©çšããã componentïŒç»é¢ããŸããã§å
±æããããã®çïŒãé
眮ããŠããŸãã screens ãš partials ããããçŽäžã® component ã§ãå¿
èŠã§ããã°é©å®ãcomponent ãåå²ããŠå component ãæã€æ§æã«ããŠããŸãã apollo.cache.ts ãš apollo.query.graphql ã«ã€ããŠã¯åŸè¿°ã®ç¶æ
管çã®è©±ã§ã玹ä»ããŸãã ç¶æ
管ç ã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
管çã«ã€ããŠã¯ãã°ããŒãã«ã«ã¢ã¯ã»ã¹ã§ããç¶æ
ã®ç®¡çã«ã¯ Apollo Client ã® InMemoryCache ã«ãã cache æ©æ§ã§è¡ããç¹å®ã® component å
ã«éããŠãã屿çãªç¶æ
ã®ç®¡çã«ã¯ useState çã® React Hooks ã䜿ã£ãŠè¡ã£ãŠããŸãã ç¶æ
管çã®å¿
èŠæ§ãçããéãã¢ããªã±ãŒã·ã§ã³ã®è€éæ§ãäžããªãããã«ããªãã¹ã useState çã® hooks ãçšãã local state ã ãã§æžãŸããããªããã©ãããæ€èšããŸãã äŸãã°ãã¯ãªãã¯ãããšããããããŠã³ãªã¹ãã衚瀺ãããã»ã¬ã¯ãããã¯ã¹ã® component ã§ãããããããŠã³ãªã¹ãã®è¡šç€ºç¶æ
ããã® component å
ã ãã§æ±ãããã®ã§ããã° useState ãçšãã local state ã§ååã§ãããšèããããŸãã 芪åé¢ä¿ã§ã¯ãªã component å士ã§ã®ãããšããå¿
èŠã«ãªã£ãæãããµãŒãã®ããŒã¿ãšé¢é£ããå Žåçã§ãããŒã«ã«ã®ããŒã¿ãäžå
管çããŠãããæ¹ãè¯ããããªã±ãŒã¹ã§ã¯ãApollo Client ã® cache ãå©çšããŸãã Apollo Client Apollo ã«é¢é£ãããã¡ã€ã«ã®æ§æã«ã€ããŠã¯ä»¥äžã®éãã§ãã src/ apollo/ cache.ts client.ts types.ts withApollo.ts cache.ts : Apollo ã«ããã local state ã® initialState ãš resolver ãå
šç»é¢åãã®ãã¡ã€ã«ã§ãŸãšããŠãæçµçã« Next.js ã® src/pages/_app.tsx ã«æž¡ãããã«ãã component åºæã® local state ã«é¢ãã initialState ããã³ state ã® updater ãšãªã resolver 㯠component æ¯ã® apollo.cache.ts ã«ãŠãå¥éå®çŸ© client.ts : Apollo Client ã®ã€ã³ã¹ã¿ã³ã¹ãçæãããã¡ã€ã« types.ts : Apollo é¢é£ã®åå®çŸ©ãã¡ã€ã« withApollo.ts : Apllo Client ã® <ApolloProvider /> ã§ã©ããããŠè¿ã Higher-Order Compoents(HOC) å®è£
ã«ã€ããŠã¯å²æããŸãããclient.ts ãš withApollo.ts ã«é¢ããŠã¯ãNext.js ã® exampleïŒ with-apollo ïŒçãåèã«ããŸããã ç»é¢åºæã® Apollo ã®ç¶æ
管çã«é¢ãããã¡ã€ã«ã¯ src/components/**/${component å}/ é
äžã«çœ®ããŠããŸãã ãã¡ããã³ãã±ãŒã·ã§ã³ã®èãæ¹ã§ãcomponent ã«é¢ããç¶æ
管çã¯è©²åœã® component ãšåãå Žæã«çœ®ãããšãæèããŠããŸãã src/ components/ app/ ${ component å} / apollo.cache.ts apollo.query.graphql apollo.schema.graphql apollo.cache.ts : component åºæã® Apollo ã«ããã local state ã® initialState ããã³ resolver ãå®çŸ©ãããã¡ã€ã« apollo.query.graphql : ã¯ãšãªãå®çŸ©ãããã¡ã€ã« apollo.schema.graphql : local state ã® GraphQL ã¹ããŒããå®çŸ©ãã¡ã€ã« ãã¡ã€ã«ã®åœåã«ã€ããŠã ãã£ã¬ã¯ããªéå±€ãã§ããã ãæ·±ãããããªã ã®ã§ã apollo çã«ãããã£ã¬ã¯ããªã¯èšããŠããŸããããApollo é¢é£ã®ãã¡ã€ã«çŸ€ãšããŠèªèã§ããããããã¡ã€ã«åã« apollo. ã®ãã¬ãã£ãã¯ã¹ãã€ããŠåœåããŠããŸãã Query ãš Mutation ã®å®è¡ã«ã€ã㊠GraphQL Code Generator ã®ãã©ã°ã€ã³ TypeScript React Apollo ãã€ã³ã¹ããŒã«ããŠãhooks ãçæããèšå®ã«ããäžã§ãcomponent æ¯ã«ãããã GraphQL ã®ã¹ããŒããšã¯ãšãªãèšè¿°ããã .graphql ãã¡ã€ã«ãããšã«ãGraphQL Code Generator ãçæããã«ã¹ã¿ã hooks ãå©çšããŸãã ãã¡ãã®ã«ã¹ã¿ã hooks ã React Component ã§å©çšããããšã§ãApollo Client çµç±ã§ GraphQL API ãšããŒã«ã«ã® Apollo cache ã«æ¥ç¶ããŠãããŒã¿ã®ããåããè¡ãããšãã§ããŸãã Query Query ã® hooks ã¯ïŒçš®é¡ãããå®è¡ããã¿ã€ãã³ã°ã«ãã£ãŠããããé©åãªæ¹ãéžãã§å®è¡ããŠããŸãã API å®è¡ã¿ã€ãã³ã° useQuery Component ã render ããããã¯ãšãªå®è¡ useLazyQuery ä»»æã®ã€ãã³ããããªã¬ãŒã«ããŠã¯ãšãªå®è¡ use***Query éåžžã§ããã° useQuery ã§ã¯ãšãªã®çµæã render ããŸãããGraphQL Code Generator ãå©çšããå Žåã¯ãããããã®ã¯ãšãªãã©ããããã«ã¹ã¿ã hooks ãçæãããã®ã§ã useQuery , useLazyQuery ããã®ãŸãŸäœ¿ãããšã¯ãããŸããã query AllPosts { allPosts { id title rating } } â ã®ãããªã¯ãšãªãçšæãããš src/__generated__/graphql.tsx ã«å¯ŸããŠã次ã®ãããªã«ã¹ã¿ã hooks ãåãšäžç·ã«çæãããèšå®ã«ããŠããŸãã // Apollo Client: 2.6.9ãGraphQL Code Generator: 1.15.0 ã®å Žåã®äŸ export function useAllPostsQuery ( baseOptions ?: ApolloReactHooks . QueryHookOptions & lt ; AllPostsQuery , AllPostsQueryVariables >) { return ApolloReactHooks . useQuery & lt ; AllPostsQuery , AllPostsQueryVariables >( AllPostsDocument , baseOptions ); } export function useAllPostsLazyQuery ( baseOptions ?: ApolloReactHooks . LazyQueryHookOptions & lt ; AllPostsQuery , AllPostsQueryVariables >) { return ApolloReactHooks . useLazyQuery & lt ; AllPostsQuery , AllPostsQueryVariables >( AllPostsDocument , baseOptions ); } React Component ã§ã¯çæãããã«ã¹ã¿ã hooks ãæ¬¡ã®ããã«åŒã³åºããŠãµãŒããŒããè¿ã£ãŠããçµæãåãåã£ãŠãããŒã¿åºåãããŒãã£ã³ã°ç¶æ
ã®ãã§ãã¯ããšã©ãŒãã³ããªã³ã°çãè¡ããŸãã const { data , loading , error } = useAllPostsQuery (); Mutation ããŒã¿ã®æžã蟌ã¿ã¯ useMutation ã§è¡ããŸãã Query åæ§ã GraphQL Code Generator ã«ãã£ãŠçæãããã«ã¹ã¿ã hooks use***Mutation ã䜿ã£ãŠããŸãã cache ã®æŽæ° Mutation ãè€æ°ãšã³ãã£ãã£ã®æŽæ°ããšã³ãã£ãã£ã®æ°èŠäœæãŸãã¯åé€ã®å ŽåãApollo Client ã® cache ã¯èªåæŽæ°ããããMutation ã®çµæãèªåçã« render ãããŸããã ãã®ãããªå Žåã§ãã useMutation ã® update option ã䜿ãã°ã cache ãªããžã§ã¯ããåŒæ°ã«åãã颿°ãèšå®ã§ããã®ã§ããã®é¢æ°å
ã§çŽæ¥ cache ãæŽæ°ã§ããŸãã ãŸãã update ã®ä»£ããã« refetchQueries ã® option ã䜿ã£ãŠãä»»æã® Query ãå®è¡ããŠãã·ã³ãã«ã« cache ãæŽæ°ããããšãã§ããŸãã äœãããã®æ¹æ³ã ãš Network éä¿¡ã«ãããªãŒããŒããããçºçããŸãã ãã®ãªãŒããŒããããç ç²ã«ããŠã§ãããµãŒããŒããããŒã¿ååŸããã Query ããããããªå Žåã«ã¯ããã® refetchQueries ãæå¹ã§ãã local state ã®ç®¡ç ããããã¯ç¹å®ã® component ã®ç¶æ
管çã local state ã䜿ã£ãŠã©ã®ããã«ç®¡çããŠãããããã説æããŠãããŸãã @client ã䜿ã£ã Query Next.js ã®ãããžã§ã¯ãã§ãlocal state ã®ç®¡çã Apollo Client ã§è¡ãå Žåã®äŸãšããŠã¯ã次ã®éãã§ãã ã¹ããŒãïŒ # src / components / app / Home / apollo . schema . graphql type Home { currentPostId: Int! } extend type Query { home: Home } ã¯ãšãªïŒ # src / components / app / Home / apollo . query . graphql query HomeCurrentPostId { home @ client { currentPostId } } ãã£ãã·ã¥ã®åæå€ïŒ // src/components/app/Home/apollo.cache.ts export const cache = { __typename: 'Home' , currentPostId: 0 , ..., }; // src/apollo/cache.ts const caches = { ..., home: home . cache , }; export { ..., caches , }; // src/pages/_app.tsx export const cache = new InMemoryCache (); ... const client = new ApolloClient ({ link , cache: cache . restore ( initialState || {}), resolvers , connectToDevTools: true , }); cache . writeData ({ data: caches }); GraphQL ã¯ãšãªãšã¹ããŒããå®çŸ©ãããŠããã° GraphQL Code Generator ã use***Query ã®ã³ãŒããçæããèšå®ã«ããŠããŸãã ããŒã«ã«ããŒã¿ã®å Žåãã¯ãšãªã§ @client ãã£ã¬ã¯ãã£ããã€ããŠããŒã«ã«ããŒã¿ã§ããããšãæç€ºããŸãã @client ã䜿ã£ã Mutation local state ã®æŽæ°ã GraphQL ã® Mutation ãšããŠè¡ãå Žåã®äŸãšããŠã¯ã次ã®éãã§ãã ã¹ããŒãïŒ # src / components / app / Home / apollo . schema . graphql type UpdateCurrentPostId { currentPostId: Int! } extend type Mutation { updateCurrentPostId(id: Int!): UpdateCurrentPostId } ã¯ãšãªïŒ # src / components / app / Home / apollo . query . graphql mutation UpdateCurrentPostId ( $id : Int !) { updateCurrentPostId ( id : $id ) @ client { currentPostId @ client } } resolverïŒ // src/components/app/Home/apollo.cache.ts const updateCurrentPostId : MutationResolvers [ "updateCurrentPostId" ] = ( _ , args , { cache } ) => { cache . writeData ({ data: { home: { __typename: "Home" , currentPostId: args . id , }, }, }); return null ; }; export const Mutation = { updateCurrentPostId , }; Query åæ§ã« @client ãã£ã¬ã¯ãã£ããã€ããŠããŒã«ã«ããŒã¿ã§ããããšãæç€ºããŸãã å®éã® Mutation ã®åŠçèªäœã¯ resolver ã®äžã« cache.writeData() ã䜿ã£ãŠèšè¿°ããŸãã Mutation ã®åœåã¯ã åè©+åè©ã®åœ¢åŒã§å¯èœãªéãæå³ã®ããå
·äœçãªååãã€ãã ããšãæèããŠããŸãã Apollo ã䜿ã£ãéçºã䟿å©ã«ããŠãããããŒã« Apollo Client ã䜿ã£ãŠéçºããéã¯ãããŒã«ã«ã® Apollo cache ã®ç¶æ
ããã¯ãšãªã詊ãã«å®è¡ããããã®ããŒã«ãšããŠãGoogle Chrome ã®æ¡åŒµæ©èœ Apollo Client Developer Tools ãéåžžã«äŸ¿å©ã§ãã ãã¡ãã®æ¡åŒµæ©èœã Chrome ã«ã€ã³ã¹ããŒã«ãããšãApollo Client ã䜿ã£ãŠ GraphQL API ã«ã¢ã¯ã»ã¹ãããµã€ãã«é·ç§»ããç¶æ
ã§ Chrome Dev Tools ãéããš Apollo ã®ã¿ãã衚瀺ãããŸããããã§ã¯ãšãªã®å®è¡ããAPI 仿§ã®ç¢ºèªãããŒã«ã«ã® Apollo cache ã®ç¢ºèªçãè¡ãããšãã§ããŸãã GraphQL é¢é£ã®ãã¹ãã³ãŒãã«ã€ã㊠Apollo Client ã䜿ã£ã React Component ã®éçºã§ãQuery ããã³ Mutation å®è¡ã®ãã¹ãã宿œããã«ã¯ããã¹ããã¬ãŒã ã¯ãŒã¯ã® Jestãreact-testing-library ãšããããŠãApollo å
¬åŒã§ã玹ä»ãããŠãã MockedProvider ãçšããæ¹æ³ãäžè¬çããšæããŸãã ã¯ãšãªãšã¯ãšãªã«å¯Ÿããã¬ã¹ãã³ã¹ãçµã¿åãããã¢ãã¯ããŒã¿ãçšæããŠãããApolloProvider ã®ä»£ããã« MockedProvider ã§ãã¹ã察象㮠component ãã©ããããããšã§ãAPI ãµãŒããŒã Network ç°å¢ã«äŸåãããã¢ãã¯ã§æå®ããã¯ãšãªããªã¯ãšã¹ãããããšãã¢ãã¯ã§ããã«å¯Ÿå¿ããããã«çšæããã¬ã¹ãã³ã¹ããŒã¿ã確å®ã«ååŸã§ããä»çµã¿ãäœããŸãã ãã®ä»çµã¿ãš react-testing-library ã䜿ã£ãŠãcomponent ã§ render ããã UI äžã®æäœãããªã¬ãŒã«ããŠå®è¡ããããã¯ãšãªã®ãã¹ããè¡ãããšãã§ããŸãã Query ã ãã§ã¯ãªã Mutation ãã¢ãã¯ããããšãã§ããŠã䟿å©ãªããŒã«ã§ã¯ãããŸããããã¹ãã±ãŒã¹æ¯ã«ã¢ãã¯ããŒã¿ã¯æåã§äœæããªããã°ãªããªãç¹ãããªããªã骚ãæããäœæ¥ã§ãã å®éã«ã¢ããªã±ãŒã·ã§ã³ãåãããŠããã¹ã察象㮠component ã render ããQuery ã«æž¡ããã variables ãã¬ã¹ãã³ã¹ã®å€ã Console ã«åºåãããã©ãŠã¶ã® Dev Tools äžã§äžåäžåãªããžã§ã¯ããã³ããŒããŠããšãã£ã¿ã«è²Œãä»ããããããäœæ¥ãçºçããŸãã AutoMockedProvider ã®äœæ ããã§ããããããã¹ãäœæãã¹ããŒã倿Žã®åºŠã«ãæåã§ã¢ãã¯ããŒã¿ãçšæããªããŠããGraphQL ã¹ããŒãã§å®çŸ©ãããŠããåãèŠãŠãèªåã§ã¯ãšãªã«å¯Ÿããã¬ã¹ãã³ã¹ãã¢ãã¯ããŠããã AutoMockedProvider ãã ãã¡ãã®èšäº ãåèã«ããŠäœæããŸããã MockedProvider ã®ä»£ããã«ãAutoMockedProvider ãçšããŠãã¹ã察象㮠Component ãã©ããããããšã§ãMockedProvider ã䜿ã£ãŠãã¹ãããŠããå
容ãšåããã¹ãã宿œã§ããŸãã MockedProvider ã䜿ã£ãŠæ¯åã¢ãã¯ããŒã¿ãçšæãããã¹ãã宿œããããšã«ç²ããŠããæ¹ã¯æ¯éãã詊ããã ããã ïŒç޹ä»å
ã®èšäºã§ã¯ã graphql-tools ã® makeExecutableSchema() ã«æž¡ã schemaSDL ã json ãã¡ã€ã«ã§å®çŸ©ãããŠããŸããã graphql-tag ã®ã©ã€ãã©ãªã䜵çšããã°ãgraphql ãã¡ã€ã«ã§ãåæ§ã« schemaSDL ãšããŠé©çšããããšãå¯èœã§ãïŒ ãªãã¥ãŒã¢ã«ãæ¯ãè¿ã£ãŠ ä»åã®ãªãã¥ãŒã¢ã«ã§ã¯ãGraphQLãTypeScriptãReact ãã»ããã§æ¡çšããããšã«ãããããã³ãåŽã§ã¯ GraphQL Code Generator ã䜿ã£ãŠããããããçšæããŠããã GraphQL ã¹ããŒããããTypeScript ã®åã ãã§ã¯ãªããReact ã® Hooks 颿°ãŸã§çæããŠå©çšã§ããããšããéçºå¹çã®åäžã«éåžžã«åœ±é¿ãäžãããšæããŸãã GraphQL API ã®ã¯ã©ã€ã¢ã³ãã§ãã¢ããªã±ãŒã·ã§ã³å
šäœã®ç¶æ
管çãè¡ã Apollo Client ã® cache æ©æ§ã®äœ¿ãæ¹çãäœåŸãããŸã§ã«ãåŠç¿ã³ã¹ãã¯æ±ºããŠãŒãã§ã¯ãããŸããã§ããããTypeScript ãš GraphQL ã®åã·ã¹ãã ã®æ©æµããã«ã«åããNext.js ã®ã¬ãŒã«ã«ã®ã£ãããåå®å
šãªéçºç°å¢ãæã«å
¥ããããšãã§ããŸããã æã
ãéçºè
ã®äœéšã ãã§ã¯ãªããä»åŸã®ãããã¯ãå
šäœãžã®çç£æ§ã«ãè¯ã圱é¿ãåãŒããŠããããšç¢ºä¿¡ããŠããŸãã ãããã« ã¡ãã¬ãŒã§ã¯ãšã³ãžãã¢ã»ãã¶ã€ããŒãç©æ¥µåéããŠããŸãã ããã¯ãããžãŒã掻çšããŠå»çãã«ã¹ã±ã¢ã®æªæ¥ãã€ããããšããããã·ã§ã³ã«å
±æãã課é¡è§£æ±ºãè¡ãããæ¹ã¯æ¯éããå¿åãã ããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ããã«ã¡ã¯ãã¡ãã¬ãŒã®ãšã³ãžãã¢ã®å±±ç°ã§ããçŸåšãå»çä»è·æ±äººãµã€ãããžã§ãã¡ãã¬ãŒãã®ããŒã ã§éçºãæ
åœããŠããŸãã ä»åããžã§ãã¡ãã¬ãŒã®ç€Ÿå
ã¹ã¿ãããå©çšãã瀟å
ã·ã¹ãã ããªãã¥ãŒã¢ã«ããäºäŸãã玹ä»ããŸãã ãªãã¥ãŒã¢ã«å¯Ÿè±¡ã¯ããã¯ãšã³ãé åãå«ãŸããŸãããæ¬èšäºã§ã¯ããã³ããšã³ãã®è©±ãäžå¿ã«ã玹ä»ããŸãã ãŸããåŒç€Ÿãã¶ã€ããŒé
äºã以åæçš¿ãã ãã¶ã€ããŒããã¶ã€ã³ããŒã«ã䜿ããã«ãReact ã䜿ã£ãŠãã¶ã€ã³ãã話 ãé¢é£ããŠããã®ã§ããããããã°ããããŠã芧ãã ããã ãªãã¥ãŒã¢ã«ã®èæ¯ ç€Ÿå
ã·ã¹ãã ã§ã¯ãæ±äººãµã€ãããžã§ãã¡ãã¬ãŒããå©çšããæ±è·è
ã«é¢ããæ
å ±ãæ±è·è
ã®å¿åç¶æ³ã管çããŠããŸãã ååã®ãªãã¥ãŒã¢ã«ããæéãçµã¡ãè€éæ§ãé«ããªã£ãŠããŸããããã®è€éæ§ã«æ¯äŸããŠãæ°æ©èœã®è¿œå ãæ¹ä¿®ããããã®ã³ã¹ããé«ããªã£ãŠããŸããã ããã§äžèšã®èª²é¡ã解決ãããããç¶æ
管çãããããããã¹ãã³ãŒããæžãããããã¡ã³ãããã«ãªã¢ãŒããã¯ãã£ã«ãã¹ããªãã¥ãŒã¢ã«ã宿œããããšã«ããŸããã æ€èšŒæéãçµãŠãä»åã®ãªãã¥ãŒã¢ã«ã«ããããŠæ°èŠã«äœæãã API ã¯ãGraphQL ã«ãã£ãŠå®è£
ããããšã決ããŸããã åã·ã¹ãã ãæã€ããç»é¢ã«å¿
èŠãªããŒã¿ãæè»ã«éäžè¶³ãªãååŸã§ãããæåã§ããã¥ã¡ã³ãã«èœãšã蟌ãŸãªããŠãã¹ããŒããå®çŸ©ãããŠããã° API ã®ä»æ§ãç°¡åã«ææ¡ã§ãããçãã¡ãªãããšããŠæããããŸããã ç¹ã«ãGraphQL ãæã€åã·ã¹ãã ããTypeScriptãApolloãGraphQL Code Generator ã®ã©ã€ãã©ãªãçµã¿åãããããšã§ãAPI ã«æž¡ããã©ã¡ãŒã¿ããã¬ã¹ãã³ã¹ã«ãåãé©çšãããGraphQL ã¹ããŒãã®å€æŽã«ã¯ã©ã€ã¢ã³ãã®å®è£
ãæ¯èŒç容æã«è¿œåŸã§ããããšãã倧ããªãã€ã³ãã§ããã ããã³ããšã³ãã®æè¡çãªãªãã¥ãŒã¢ã«å
容 ä»åã¯ç¹ã«ããªãã¥ãŒã¢ã«ã«çšãããããã¬ãŒã ã¯ãŒã¯ãã©ã€ãã©ãªãApollo Client ãçšããç¶æ
管çããã¹ãã³ãŒãå®è£
ã«ããã Tips çãããããéšåçã«ã玹ä»ããŸãã æ¡çšãããã¬ãŒã ã¯ãŒã¯ãšäž»èŠã©ã€ãã©ãª æ¡çšã©ã€ãã©ãª 説æ Next.js React çšã®ãã¬ãŒã ã¯ãŒã¯ïŒãã€ã©ãŒãã¬ãŒãïŒ TypeScript JavaScript ã®ã¹ãŒããŒã»ããã§ãéçåä»ãèšèª React UI ãæ§ç¯ããããã®ã©ã€ãã©ãªïŒããŒãžã§ã³ 16.8.0 ã§ãªãªãŒã¹ããã hooks ãå
šé¢çã«äœ¿çšïŒ Apollo Client GraphQL API ã®ã¯ã©ã€ã¢ã³ãã§ãã¢ããªã±ãŒã·ã§ã³å
šäœã®ç¶æ
管çã宿œ GraphQL Code Generator GraphQL ã¹ããŒãããå®çŸ©ãã¡ã€ã«ïŒåãã«ã¹ã¿ã hooks çïŒãçæ emotion + Styled System CSS in JS ãšããŠå©çš formik + yup ãã©ãŒã ã®ãã«ã㌠+ ããªããŒã¿ãŒ Jest + React Testing Library ãã¹ãã³ãŒãå®è£
çšã®ããŒã«çŸ€ ESLint + Prettier ã«ãŒã«ã«åºã¥ããã³ãŒãã®éçè§£æ + ã¹ã¿ã€ãªã³ã° TypeScript ä»åã®ãªãã¥ãŒã¢ã«ã§æ±ããããããšã®äžã€ãšããŠããããªãæ¹åã»æ°èŠæ©èœè¿œå ãªã©ãããŠããäžã§ããœãããŠã§ã¢å質ãæ
ä¿ããããã®ãã¢ããªã±ãŒã·ã§ã³ã®å
ç¢ãããããŸããã ããã§ãããã³ããšã³ãåŽã®éçºèšèªãšããŠã¯ãããã°ã©ã ã³ãŒãå
ã§å®£èšãããåã«ãã£ãŠããšã©ãŒãæªç¶ã«é²ãã€ã€ãVSCode ãã¯ãããšãããšãã£ã¿ã®ã³ãŒãè£å®ã®æ©æµãåããããã¡ãªããçãèæ
®ã㊠TypeScript ã®æ¡çšã決ããŸããããŸããä»ã®ãããžã§ã¯ãã§ãæ¢ã« TypeScript ã¯éšåçã«å©çšãå§ããŠããäºæ
ããããéã« TypeScript ãæ¡çšããªãããšããéžæè¢ã¯ããŸãèããããŸããã§ããã React UI ãæ§ç¯ããããã®ã©ã€ãã©ãª/ãã¬ãŒã ã¯ãŒã¯ã¯ React ãæ¡çšããŸããããã¡ãããåŒç€Ÿã§ã¯å¥ãããžã§ã¯ãã§ React ãæ¢ã«å©çšãå§ããŠããããšããããåŠç¿ã³ã¹ãã®èгç¹ãããæ°ãã«ä»ã®ãã¬ãŒã ã¯ãŒã¯ãéžæããã¡ãªããã¯ã»ãŒç¡ãã£ãããã§ãããããããã®äºãå·®ãåŒãããšããŠã TypeScript ãš GraphQL ãšã®çžæ§ã®è¯ãã§ãReact ãåªå¢ã§ããã ç¹ã«ãReact ã®å Žåã¯ãGraphQL ã¹ããŒããããŒã¹ã«ãGraphQL Code Generator ã«ãã£ãŠåå®çŸ©ãã¡ã€ã«ã ãã§ã¯ãªããGraphQL API ãšã®ããåãã«äœ¿ããã«ã¹ã¿ã hooks ãçæããŠå©çšã§ãããšããç¹ãã倧ããªå©ç¹ãšããŠèããããŸããã Next.js ããã³ããšã³ãéçºç°å¢ãçŽ æ©ãæ§ç¯ããããããã€ã©ãŒãã¬ãŒããšã㊠Next.js ãæ¡çšããŸããã Next.js ã®å
·äœçãªæ¡çšãã€ã³ããšããŠã¯ãäž»ã«æ¬¡ã®ïŒç¹ã§ãã webpack ã«ãããããã³ãã«ãã³ã³ãã€ã«ãããããªããŒãçã®èšå®ã«æéãè²»ããããšãªããããžãã¹ããžãã¯ã®å®è£
ã«éäžã§ãã å¿
èŠãããã°ãnext.config.js ã§èšå®ãæ¡åŒµã§ãã CRAïŒCreate React AppïŒãšã¯ç°ãªããæ¡åŒµæ§ã«åªããŠãã pages é
äžã«çœ®ã React Component ã®ãã£ã¬ã¯ããªæ§æããèªåçã«ã«ãŒãã£ã³ã°ãšããŠå®çŸ©ããã ã«ãŒãã£ã³ã°ã«é¢ããèšèšäœæ¥ãäžèŠã«ãªã èªåã³ãŒãåå²çã«ããããã©ãŒãã³ã¹æé©åããããªã«è¡ã£ãŠããã React Component ã®åé¡ component ã¯å€§ããïŒã€ã«åé¡ãã src/components/app/ ãš src/components/ui/ ããããã®ãã£ã¬ã¯ããªã« component ã眮ããŠããŸããåé¡ã¯ä»¥äžã®åºæºã§è¡ãªããŸããã app : æ¬ã¢ããªã±ãŒã·ã§ã³åºæã§äœ¿çšãããæ³å®ã®ãã®ã§ãåå©çšæ§ãäœããå
·äœç㪠component ui : æ¬ã¢ããªã±ãŒã·ã§ã³å€ã§ã䜿çšå¯èœãªãåå©çšæ§ãé«ããæœè±¡ç㪠component 瀟å
åãã·ã¹ãã ã§ã¯ãããã®ã®ãMaterial-UI ã Ant Design çãã¯ãããšãããå€éšã® UI ã©ã€ãã©ãªã¯äœ¿çšãããã«ã¹ã¿ãã€ãºãããããããã«ãå
šãŠèªåã§äœæããŸããã app é
äžãš ui é
äžãã©ã¡ãã® component ãåºæ¬çã«ã¯ ã³ãã±ãŒã·ã§ã³ ã®èãæ¹ã§ãã¡ã€ã«ãæ§æããŠããŸãã äžè¬çã«ã¯ãããäžç·ã«å€æŽãããã¡ã€ã«ãè¿ãã«çœ®ããŠããã®ã¯è¯ãã¢ã€ãã£ã¢ã§ãã ãã®ååã¯ããã³ãã±ãŒã·ã§ã³ããšåŒã°ããŸãã ãã®èãæ¹ã§ãã¡ã€ã«ãæ§æããããšã§ãé¢é£ãããã¡ã€ã«ããŸãšãŸã£ãŠããŠãäœæ¥ããããããªããŸãã src/ components/ app/ partials/ ${ component å} / apollo.cache.ts apollo.query.graphql index.tsx index.test.tsx ... screens/ ${ component å} / apollo.cache.ts apollo.query.graphql index.tsx index.test.tsx ${å component å} / apollo.cache.ts apollo.query.graphql index.tsx index.test.tsx validation.ts src/components/app ãã£ã¬ã¯ããªé
äžã§ããã«ã partials ãš screens ã®ãã£ã¬ã¯ããªã§ component ãåããŠããŸãã screens ã«ã¯ãNext.js ã§ route ãšããŠæ±ããã src/pages é
äžã® component ãã import ããã component ãé
眮ãããŠããŸãã ç»é¢ã®ããªãšãŒã·ã§ã³ãå¢ãã床ã«ããã® screens ã«ãã¡ã€ã«ã远å ãããŠãããŸãã partials ã«ã¯ãapp é
äžã§è€æ°ã® component ããå©çšããã componentïŒç»é¢ããŸããã§å
±æããããã®çïŒãé
眮ããŠããŸãã screens ãš partials ããããçŽäžã® component ã§ãå¿
èŠã§ããã°é©å®ãcomponent ãåå²ããŠå component ãæã€æ§æã«ããŠããŸãã apollo.cache.ts ãš apollo.query.graphql ã«ã€ããŠã¯åŸè¿°ã®ç¶æ
管çã®è©±ã§ã玹ä»ããŸãã ç¶æ
管ç ã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
管çã«ã€ããŠã¯ãã°ããŒãã«ã«ã¢ã¯ã»ã¹ã§ããç¶æ
ã®ç®¡çã«ã¯ Apollo Client ã® InMemoryCache ã«ãã cache æ©æ§ã§è¡ããç¹å®ã® component å
ã«éããŠãã屿çãªç¶æ
ã®ç®¡çã«ã¯ useState çã® React Hooks ã䜿ã£ãŠè¡ã£ãŠããŸãã ç¶æ
管çã®å¿
èŠæ§ãçããéãã¢ããªã±ãŒã·ã§ã³ã®è€éæ§ãäžããªãããã«ããªãã¹ã useState çã® hooks ãçšãã local state ã ãã§æžãŸããããªããã©ãããæ€èšããŸãã äŸãã°ãã¯ãªãã¯ãããšããããããŠã³ãªã¹ãã衚瀺ãããã»ã¬ã¯ãããã¯ã¹ã® component ã§ãããããããŠã³ãªã¹ãã®è¡šç€ºç¶æ
ããã® component å
ã ãã§æ±ãããã®ã§ããã° useState ãçšãã local state ã§ååã§ãããšèããããŸãã 芪åé¢ä¿ã§ã¯ãªã component å士ã§ã®ãããšããå¿
èŠã«ãªã£ãæãããµãŒãã®ããŒã¿ãšé¢é£ããå Žåçã§ãããŒã«ã«ã®ããŒã¿ãäžå
管çããŠãããæ¹ãè¯ããããªã±ãŒã¹ã§ã¯ãApollo Client ã® cache ãå©çšããŸãã Apollo Client Apollo ã«é¢é£ãããã¡ã€ã«ã®æ§æã«ã€ããŠã¯ä»¥äžã®éãã§ãã src/ apollo/ cache.ts client.ts types.ts withApollo.ts cache.ts : Apollo ã«ããã local state ã® initialState ãš resolver ãå
šç»é¢åãã®ãã¡ã€ã«ã§ãŸãšããŠãæçµçã« Next.js ã® src/pages/_app.tsx ã«æž¡ãããã«ãã component åºæã® local state ã«é¢ãã initialState ããã³ state ã® updater ãšãªã resolver 㯠component æ¯ã® apollo.cache.ts ã«ãŠãå¥éå®çŸ© client.ts : Apollo Client ã®ã€ã³ã¹ã¿ã³ã¹ãçæãããã¡ã€ã« types.ts : Apollo é¢é£ã®åå®çŸ©ãã¡ã€ã« withApollo.ts : Apllo Client ã® <ApolloProvider /> ã§ã©ããããŠè¿ã Higher-Order Compoents(HOC) å®è£
ã«ã€ããŠã¯å²æããŸãããclient.ts ãš withApollo.ts ã«é¢ããŠã¯ãNext.js ã® exampleïŒ with-apollo ïŒçãåèã«ããŸããã ç»é¢åºæã® Apollo ã®ç¶æ
管çã«é¢ãããã¡ã€ã«ã¯ src/components/**/${component å}/ é
äžã«çœ®ããŠããŸãã ãã¡ããã³ãã±ãŒã·ã§ã³ã®èãæ¹ã§ãcomponent ã«é¢ããç¶æ
管çã¯è©²åœã® component ãšåãå Žæã«çœ®ãããšãæèããŠããŸãã src/ components/ app/ ${ component å} / apollo.cache.ts apollo.query.graphql apollo.schema.graphql apollo.cache.ts : component åºæã® Apollo ã«ããã local state ã® initialState ããã³ resolver ãå®çŸ©ãããã¡ã€ã« apollo.query.graphql : ã¯ãšãªãå®çŸ©ãããã¡ã€ã« apollo.schema.graphql : local state ã® GraphQL ã¹ããŒããå®çŸ©ãã¡ã€ã« ãã¡ã€ã«ã®åœåã«ã€ããŠã ãã£ã¬ã¯ããªéå±€ãã§ããã ãæ·±ãããããªã ã®ã§ã apollo çã«ãããã£ã¬ã¯ããªã¯èšããŠããŸããããApollo é¢é£ã®ãã¡ã€ã«çŸ€ãšããŠèªèã§ããããããã¡ã€ã«åã« apollo. ã®ãã¬ãã£ãã¯ã¹ãã€ããŠåœåããŠããŸãã Query ãš Mutation ã®å®è¡ã«ã€ã㊠GraphQL Code Generator ã®ãã©ã°ã€ã³ TypeScript React Apollo ãã€ã³ã¹ããŒã«ããŠãhooks ãçæããèšå®ã«ããäžã§ãcomponent æ¯ã«ãããã GraphQL ã®ã¹ããŒããšã¯ãšãªãèšè¿°ããã .graphql ãã¡ã€ã«ãããšã«ãGraphQL Code Generator ãçæããã«ã¹ã¿ã hooks ãå©çšããŸãã ãã¡ãã®ã«ã¹ã¿ã hooks ã React Component ã§å©çšããããšã§ãApollo Client çµç±ã§ GraphQL API ãšããŒã«ã«ã® Apollo cache ã«æ¥ç¶ããŠãããŒã¿ã®ããåããè¡ãããšãã§ããŸãã Query Query ã® hooks ã¯ïŒçš®é¡ãããå®è¡ããã¿ã€ãã³ã°ã«ãã£ãŠããããé©åãªæ¹ãéžãã§å®è¡ããŠããŸãã API å®è¡ã¿ã€ãã³ã° useQuery Component ã render ããããã¯ãšãªå®è¡ useLazyQuery ä»»æã®ã€ãã³ããããªã¬ãŒã«ããŠã¯ãšãªå®è¡ use***Query éåžžã§ããã° useQuery ã§ã¯ãšãªã®çµæã render ããŸãããGraphQL Code Generator ãå©çšããå Žåã¯ãããããã®ã¯ãšãªãã©ããããã«ã¹ã¿ã hooks ãçæãããã®ã§ã useQuery , useLazyQuery ããã®ãŸãŸäœ¿ãããšã¯ãããŸããã query AllPosts { allPosts { id title rating } } â ã®ãããªã¯ãšãªãçšæãããš src/__generated__/graphql.tsx ã«å¯ŸããŠã次ã®ãããªã«ã¹ã¿ã hooks ãåãšäžç·ã«çæãããèšå®ã«ããŠããŸãã // Apollo Client: 2.6.9ãGraphQL Code Generator: 1.15.0 ã®å Žåã®äŸ export function useAllPostsQuery ( baseOptions ?: ApolloReactHooks . QueryHookOptions & lt ; AllPostsQuery , AllPostsQueryVariables >) { return ApolloReactHooks . useQuery & lt ; AllPostsQuery , AllPostsQueryVariables >( AllPostsDocument , baseOptions ); } export function useAllPostsLazyQuery ( baseOptions ?: ApolloReactHooks . LazyQueryHookOptions & lt ; AllPostsQuery , AllPostsQueryVariables >) { return ApolloReactHooks . useLazyQuery & lt ; AllPostsQuery , AllPostsQueryVariables >( AllPostsDocument , baseOptions ); } React Component ã§ã¯çæãããã«ã¹ã¿ã hooks ãæ¬¡ã®ããã«åŒã³åºããŠãµãŒããŒããè¿ã£ãŠããçµæãåãåã£ãŠãããŒã¿åºåãããŒãã£ã³ã°ç¶æ
ã®ãã§ãã¯ããšã©ãŒãã³ããªã³ã°çãè¡ããŸãã const { data , loading , error } = useAllPostsQuery (); Mutation ããŒã¿ã®æžã蟌ã¿ã¯ useMutation ã§è¡ããŸãã Query åæ§ã GraphQL Code Generator ã«ãã£ãŠçæãããã«ã¹ã¿ã hooks use***Mutation ã䜿ã£ãŠããŸãã cache ã®æŽæ° Mutation ãè€æ°ãšã³ãã£ãã£ã®æŽæ°ããšã³ãã£ãã£ã®æ°èŠäœæãŸãã¯åé€ã®å ŽåãApollo Client ã® cache ã¯èªåæŽæ°ããããMutation ã®çµæãèªåçã« render ãããŸããã ãã®ãããªå Žåã§ãã useMutation ã® update option ã䜿ãã°ã cache ãªããžã§ã¯ããåŒæ°ã«åãã颿°ãèšå®ã§ããã®ã§ããã®é¢æ°å
ã§çŽæ¥ cache ãæŽæ°ã§ããŸãã ãŸãã update ã®ä»£ããã« refetchQueries ã® option ã䜿ã£ãŠãä»»æã® Query ãå®è¡ããŠãã·ã³ãã«ã« cache ãæŽæ°ããããšãã§ããŸãã äœãããã®æ¹æ³ã ãš Network éä¿¡ã«ãããªãŒããŒããããçºçããŸãã ãã®ãªãŒããŒããããç ç²ã«ããŠã§ãããµãŒããŒããããŒã¿ååŸããã Query ããããããªå Žåã«ã¯ããã® refetchQueries ãæå¹ã§ãã local state ã®ç®¡ç ããããã¯ç¹å®ã® component ã®ç¶æ
管çã local state ã䜿ã£ãŠã©ã®ããã«ç®¡çããŠãããããã説æããŠãããŸãã @client ã䜿ã£ã Query Next.js ã®ãããžã§ã¯ãã§ãlocal state ã®ç®¡çã Apollo Client ã§è¡ãå Žåã®äŸãšããŠã¯ã次ã®éãã§ãã ã¹ããŒãïŒ # src / components / app / Home / apollo . schema . graphql type Home { currentPostId: Int! } extend type Query { home: Home } ã¯ãšãªïŒ # src / components / app / Home / apollo . query . graphql query HomeCurrentPostId { home @ client { currentPostId } } ãã£ãã·ã¥ã®åæå€ïŒ // src/components/app/Home/apollo.cache.ts export const cache = { __typename: 'Home' , currentPostId: 0 , ..., }; // src/apollo/cache.ts const caches = { ..., home: home . cache , }; export { ..., caches , }; // src/pages/_app.tsx export const cache = new InMemoryCache (); ... const client = new ApolloClient ({ link , cache: cache . restore ( initialState || {}), resolvers , connectToDevTools: true , }); cache . writeData ({ data: caches }); GraphQL ã¯ãšãªãšã¹ããŒããå®çŸ©ãããŠããã° GraphQL Code Generator ã use***Query ã®ã³ãŒããçæããèšå®ã«ããŠããŸãã ããŒã«ã«ããŒã¿ã®å Žåãã¯ãšãªã§ @client ãã£ã¬ã¯ãã£ããã€ããŠããŒã«ã«ããŒã¿ã§ããããšãæç€ºããŸãã @client ã䜿ã£ã Mutation local state ã®æŽæ°ã GraphQL ã® Mutation ãšããŠè¡ãå Žåã®äŸãšããŠã¯ã次ã®éãã§ãã ã¹ããŒãïŒ # src / components / app / Home / apollo . schema . graphql type UpdateCurrentPostId { currentPostId: Int! } extend type Mutation { updateCurrentPostId(id: Int!): UpdateCurrentPostId } ã¯ãšãªïŒ # src / components / app / Home / apollo . query . graphql mutation UpdateCurrentPostId ( $id : Int !) { updateCurrentPostId ( id : $id ) @ client { currentPostId @ client } } resolverïŒ // src/components/app/Home/apollo.cache.ts const updateCurrentPostId : MutationResolvers [ "updateCurrentPostId" ] = ( _ , args , { cache } ) => { cache . writeData ({ data: { home: { __typename: "Home" , currentPostId: args . id , }, }, }); return null ; }; export const Mutation = { updateCurrentPostId , }; Query åæ§ã« @client ãã£ã¬ã¯ãã£ããã€ããŠããŒã«ã«ããŒã¿ã§ããããšãæç€ºããŸãã å®éã® Mutation ã®åŠçèªäœã¯ resolver ã®äžã« cache.writeData() ã䜿ã£ãŠèšè¿°ããŸãã Mutation ã®åœåã¯ã åè©+åè©ã®åœ¢åŒã§å¯èœãªéãæå³ã®ããå
·äœçãªååãã€ãã ããšãæèããŠããŸãã Apollo ã䜿ã£ãéçºã䟿å©ã«ããŠãããããŒã« Apollo Client ã䜿ã£ãŠéçºããéã¯ãããŒã«ã«ã® Apollo cache ã®ç¶æ
ããã¯ãšãªã詊ãã«å®è¡ããããã®ããŒã«ãšããŠãGoogle Chrome ã®æ¡åŒµæ©èœ Apollo Client Developer Tools ãéåžžã«äŸ¿å©ã§ãã ãã¡ãã®æ¡åŒµæ©èœã Chrome ã«ã€ã³ã¹ããŒã«ãããšãApollo Client ã䜿ã£ãŠ GraphQL API ã«ã¢ã¯ã»ã¹ãããµã€ãã«é·ç§»ããç¶æ
ã§ Chrome Dev Tools ãéããš Apollo ã®ã¿ãã衚瀺ãããŸããããã§ã¯ãšãªã®å®è¡ããAPI 仿§ã®ç¢ºèªãããŒã«ã«ã® Apollo cache ã®ç¢ºèªçãè¡ãããšãã§ããŸãã GraphQL é¢é£ã®ãã¹ãã³ãŒãã«ã€ã㊠Apollo Client ã䜿ã£ã React Component ã®éçºã§ãQuery ããã³ Mutation å®è¡ã®ãã¹ãã宿œããã«ã¯ããã¹ããã¬ãŒã ã¯ãŒã¯ã® Jestãreact-testing-library ãšããããŠãApollo å
¬åŒã§ã玹ä»ãããŠãã MockedProvider ãçšããæ¹æ³ãäžè¬çããšæããŸãã ã¯ãšãªãšã¯ãšãªã«å¯Ÿããã¬ã¹ãã³ã¹ãçµã¿åãããã¢ãã¯ããŒã¿ãçšæããŠãããApolloProvider ã®ä»£ããã« MockedProvider ã§ãã¹ã察象㮠component ãã©ããããããšã§ãAPI ãµãŒããŒã Network ç°å¢ã«äŸåãããã¢ãã¯ã§æå®ããã¯ãšãªããªã¯ãšã¹ãããããšãã¢ãã¯ã§ããã«å¯Ÿå¿ããããã«çšæããã¬ã¹ãã³ã¹ããŒã¿ã確å®ã«ååŸã§ããä»çµã¿ãäœããŸãã ãã®ä»çµã¿ãš react-testing-library ã䜿ã£ãŠãcomponent ã§ render ããã UI äžã®æäœãããªã¬ãŒã«ããŠå®è¡ããããã¯ãšãªã®ãã¹ããè¡ãããšãã§ããŸãã Query ã ãã§ã¯ãªã Mutation ãã¢ãã¯ããããšãã§ããŠã䟿å©ãªããŒã«ã§ã¯ãããŸããããã¹ãã±ãŒã¹æ¯ã«ã¢ãã¯ããŒã¿ã¯æåã§äœæããªããã°ãªããªãç¹ãããªããªã骚ãæããäœæ¥ã§ãã å®éã«ã¢ããªã±ãŒã·ã§ã³ãåãããŠããã¹ã察象㮠component ã render ããQuery ã«æž¡ããã variables ãã¬ã¹ãã³ã¹ã®å€ã Console ã«åºåãããã©ãŠã¶ã® Dev Tools äžã§äžåäžåãªããžã§ã¯ããã³ããŒããŠããšãã£ã¿ã«è²Œãä»ããããããäœæ¥ãçºçããŸãã AutoMockedProvider ã®äœæ ããã§ããããããã¹ãäœæãã¹ããŒã倿Žã®åºŠã«ãæåã§ã¢ãã¯ããŒã¿ãçšæããªããŠããGraphQL ã¹ããŒãã§å®çŸ©ãããŠããåãèŠãŠãèªåã§ã¯ãšãªã«å¯Ÿããã¬ã¹ãã³ã¹ãã¢ãã¯ããŠããã AutoMockedProvider ãã ãã¡ãã®èšäº ãåèã«ããŠäœæããŸããã MockedProvider ã®ä»£ããã«ãAutoMockedProvider ãçšããŠãã¹ã察象㮠Component ãã©ããããããšã§ãMockedProvider ã䜿ã£ãŠãã¹ãããŠããå
容ãšåããã¹ãã宿œã§ããŸãã MockedProvider ã䜿ã£ãŠæ¯åã¢ãã¯ããŒã¿ãçšæãããã¹ãã宿œããããšã«ç²ããŠããæ¹ã¯æ¯éãã詊ããã ããã ïŒç޹ä»å
ã®èšäºã§ã¯ã graphql-tools ã® makeExecutableSchema() ã«æž¡ã schemaSDL ã json ãã¡ã€ã«ã§å®çŸ©ãããŠããŸããã graphql-tag ã®ã©ã€ãã©ãªã䜵çšããã°ãgraphql ãã¡ã€ã«ã§ãåæ§ã« schemaSDL ãšããŠé©çšããããšãå¯èœã§ãïŒ ãªãã¥ãŒã¢ã«ãæ¯ãè¿ã£ãŠ ä»åã®ãªãã¥ãŒã¢ã«ã§ã¯ãGraphQLãTypeScriptãReact ãã»ããã§æ¡çšããããšã«ãããããã³ãåŽã§ã¯ GraphQL Code Generator ã䜿ã£ãŠããããããçšæããŠããã GraphQL ã¹ããŒããããTypeScript ã®åã ãã§ã¯ãªããReact ã® Hooks 颿°ãŸã§çæããŠå©çšã§ããããšããéçºå¹çã®åäžã«éåžžã«åœ±é¿ãäžãããšæããŸãã GraphQL API ã®ã¯ã©ã€ã¢ã³ãã§ãã¢ããªã±ãŒã·ã§ã³å
šäœã®ç¶æ
管çãè¡ã Apollo Client ã® cache æ©æ§ã®äœ¿ãæ¹çãäœåŸãããŸã§ã«ãåŠç¿ã³ã¹ãã¯æ±ºããŠãŒãã§ã¯ãããŸããã§ããããTypeScript ãš GraphQL ã®åã·ã¹ãã ã®æ©æµããã«ã«åããNext.js ã®ã¬ãŒã«ã«ã®ã£ãããåå®å
šãªéçºç°å¢ãæã«å
¥ããããšãã§ããŸããã æã
ãéçºè
ã®äœéšã ãã§ã¯ãªããä»åŸã®ãããã¯ãå
šäœãžã®çç£æ§ã«ãè¯ã圱é¿ãåãŒããŠããããšç¢ºä¿¡ããŠããŸãã ãããã« ã¡ãã¬ãŒã§ã¯ãšã³ãžãã¢ã»ãã¶ã€ããŒãç©æ¥µåéããŠããŸãã ããã¯ãããžãŒã掻çšããŠå»çãã«ã¹ã±ã¢ã®æªæ¥ãã€ããããšããããã·ã§ã³ã«å
±æãã課é¡è§£æ±ºãè¡ãããæ¹ã¯æ¯éããå¿åãã ããã https://www.medley.jp/jobs/
åããŸããŠãCLINICS ã®éçºãæ
åœããŠãããšã³ãžãã¢ã®å¹³å±±ã§ãã ïŒåå§ã§ãã CTO ã§ã¯ããããŸããïŒ CLINICS ã®éçºã¯ãã¹ã¢ãŒã«ããŒã å¶ãããšã£ãŠãããŸããŠãçŸåšãã®ãã¡ã®ïŒã€ãããŒã ãªãŒãããŠããŸãã åè·ã¯é·ãã SIer ã«å€ããŠããŸãããå»å¹Žã® 12 æã«ã¡ãã¬ãŒã« JOIN ããŠãéãç¡ãïŒå¹ŽçµãšããšããŠãããããšæããšããã£ãšããéã ã£ããªããšããå°è±¡ã§ãã ããŠãæ¬æ¥ã¯ã¡ãã¬ãŒã§éé±éå¬ããŠãã瀟å
å匷äŒïŒTechLunchïŒã«ãããŠçºè¡šããå
容ã«ã€ããŠã玹ä»ãããŠé ããã°ãšæããŸãã ã¯ããã« ãæè¡ã䜿ãããã®æè¡ããšããããŒããšãªããŸããããããã¯ãéçºãããŠããäžã§ã¯æ¬ ãããªãçŽ é€ãšèããŠããŸããã¡ãã¬ãŒã«æå±ããŠãããšã³ãžãã¢ã®ïŒäººãšããŠãã©ã®ããã«æ¥ã
課é¡ãšåãåã£ãŠããã®ããåœããŒããéããŠãäŒãã§ããã°ãšæããŸãã ãŸãããã®èãæ¹èªäœã¯ãå»çãšããããŒããããäºæ¥ã®èæ¯ïŒãã³ãã£ãŒã» SIerïŒããåããå¿
èŠãšãããå Žé¢ããããããããŸãããïŒèªèº«ãåè·ã§ã¯æ§ã
ãªå Žé¢ã§ãäžè©±ã«ãªããŸããâŠïŒ å³å¹æ§ã®ãããã®ã§ã¯ãããŸããããããããå¹ããŠããå
容ã§ã¯ãªãããšæããŸãããããããã°ãä»ãåããã ããã æ¬é¡ ãæè¡ã䜿ãããã®æè¡ã ã¿ãªããã¯ãã®èšèãããäœãæãæµ®ãã¹ãã§ãããããçè
ã詊ãã« Google ã§æ€çŽ¢ããéäžäœã«ãããããã®ã¯ AI ãšã³ãžã㢠IoT ãšãã£ãçµæã§ããããªãã»ã©ãå°ãéã«è§£éãããšãæè¡ïŒã¢ã«ãŽãªãºã çïŒã䜿ãããã®æè¡ïŒæ©æ¢°åŠç¿ãå®¶é»çïŒããšãã£ãæããªã®ã§ãããããïŒãã®çµæãæŸã£ãŠãããšããã®ããããæå³ã§ Google ããããªã£ãŠæããŸããïŒ çè
ãä»åã®ããŒããšããŠæããŠããã®ã¯ãäžèšãšãªããŸãã ããžã«ã«ã·ã³ãã³ã° æšè« ãããã® æèãæŽçãããææ®µã ãšãšã³ãžãã¢ã®æŠåšã§ãã æè¡ãšãããææ®µã ãããåãããããšã§ã倧ããªããŒãã§ãããå»çãã«åãåã£ãŠããŸãã ææ®µãç®çã«ããŠã¯ãªããªã å
ã«æãããšãããæèã®æŽçãããæè¡ãã ãææ®µã ã«éããŸãããããããçšããŠãé©åãªäžæãæããŠããçºã«ã¯ãç®çãã«å¯Ÿããè§£å床ãé«ãæãå¿
èŠããããŸãã çè
ã®çºè¡šããæç²ãããæè¡ã䜿ãããã®æè¡ãã®èŠçŽ ãã€ã¡ãŒãžããå³ æŽçå ç®çãéæããçºã«å¿
èŠãªãæ
å ±ããåæšéžæããããã®èŠçŽ ã SaaS âïž toB ã®äžçã«ãããŠã¯ããããã¯ãã解決ãã¹ã課é¡ãåŠããæ¥åã®æ¬è³ªãèžãŸããŠåæšéžæããããšèšãæãããããããããŸããã æ¥åç¥è ç®çã®ãè§£å床ããé«ããããã®èŠçŽ ã CLINICS ã«ãããŠã¯ãå»çæ
å ±ãæ±ãäžã§ã®èŠå¶ïŒ3 ç 2 ã¬ã€ãã©ã€ã³ïŒããå»çæ©é¢ïŒå»åž«ã»å»äºã»èšºçç§ã®ç¹æ§ïŒã®æ¥åã蚺çå ±é
¬ã«ã€ããŠã®ç¥èãæ³æ¹æ£ãã¬ã»ã³ã³ïŒORCAïŒâŠ ãšæ§ã
ãããŸãã æè¡ç¥è ç®çãéæããçºã«å¿
èŠãªãæãæããéžæããããã®èŠçŽ ã ïŒãšã³ãžãã¢ã«ãšã£ãŠã¯èª¬æãããŸã§ããªãå
容ã§ãããšæããŸããïŒ ãããæ¬ ããŠããŸããšçµµã«æããé€
ã§çµãã£ãŠããŸããŸããã¡ãã¬ãŒã®ãšã³ãžãã¢ã«ãããŠãæ¥ã
ç éœãããããã¯ãã«å¯ŸããŠã³ããããç¶ããŠããŸãã è¡åå ç®çãéæããããã®ãæšé²åããé«ããããã®èŠçŽ ã åçš®ç¥èãšæŽçããæ
å ±ãæšé²åã«å€ããŠããçºã«ã¯ããã®æã®ç¶æ³ã«å¿ããåããããå¿
èŠããããŸããã¹ããŒã¯ãã«ããŒãšã®èª¿æŽã¯åœç¶ã§ãããçµç¹å
飿ºãšãã£ããæšªã®åãããå¿
èŠã§ãã æ³åå ãããŸã§æããããããã®ææ®µãé©åã«å©çšããŠããããã®èŠçŽ ãšããŠã®åå°ããæ³ååãã§ãããšèããŠããŸãã 課é¡ïŒIssueïŒãžã®åãçµã¿äŸ çªå· æŠèŠ â Issue ã«åãçµãéã«ãæ¬åœã«è§£æ±ºãã¹ãããšãã«ã€ããŠã®æ³åãåãããŸããIssue ã«èšèŒãããŠããããšã æ¬åœã«ãããã¯ããšããŠè§£æ±ºãã¹ãããšãªã®ã ãå«ããŠèããŸãããããŸã§ã®éçšãå¿
ãããæ£ããããã§ã¯ãªãããšããç¹ããã€ã³ãã§ãã â¡ â ã«ã€ããŠãæ³åã®ãŸãŸãã§çµããããŠã¯ãããªãã®ã§ãæ¥åç¥èãšç
§ããåãããŠç¢ºåºŠãé«ããŠãããŸããåžžå€å»åž«ãã«ã¹ã¿ããŒãµããŒãã«ãã¢ãªã³ã°ããªããã å»çæ¥åãšããŠã®ããã¹ã圢ã®è§£å床ãäžããŠãã ããã»ã¹ã§ãã ⢠â åã³ â¡ ã§é«ããè§£å床ã¯èšèã®å»¶é·ç·äžãªã®ã§ãé¢ä¿è
éã®èªèã®ã®ã£ãããçºçããããã§ãããããã¿ã€ããäœæããŠãèŠèŠã»è§Šæã¬ãã«ã§ã®ã£ãããåããŠããããšã§ãããã¹ã圢ã«åããŠæŽç·ŽãããŠãããŸãã ⣠â ã ⢠ã®ã¿ã€ãã³ã°ãåãããå¿
èŠã«å¿ããŠé¢ä¿è
ãšçžè«ããªããé²ããŠãããŸãããšã³ãžãã¢ãç«ãŠã仮説ããã¶ã€ããŒã®ç®ç·ã§è©äŸ¡ã» UI/UX æé©åãããŠé ãããã倧ããã®æ©èœã«ã€ããŠã¯ãå»çæ©é¢ã«ãã€ãããéçšã®ãååãä»°ãã ãããããšããããŸãã â åã³ â¡ ã®é
ã«äœæ¥ã®ãŠã§ã€ããåã£ãŠããããã«èŠããããšæããŸããå®éã課é¡ã解決ããçºã®åå以äžãããã«å²ããŠããŸãã çç±ã¯ãïŒåºŠäœã£ãŠå
¬éããæ©èœãã¯ããã®åŸïŒäººæ©ããããŠäœæè
ã®æå³ããªãæ¹åã§å©çšããããããšãããããã§ãã ãããŠãå©çšè
ããã®éçšãå®çãããŠããŸã㚠誀ã£ãæ©èœã«ãããŠããåãèœãšãããšãå°é£ã ã§ããããã¯ã䜿ãããŠããªãæ©èœããããçŽæ¥çãªè² åµãšãã£ã圢ã§ããã£ãããŒã®ããã«å¹ããŠããŸãã ãã©ã®ãããªäœ¿ããæ¹ãããããã«ã€ããŠæ³åããããš ãã®äœ¿ããæ¹ãããããã¯ãã®ç®æãäžçãšåã£ãŠããããš ãšã³ãžãã¢ã¯æè¡ã圢ã«ããäžã§ãåžžã«æ³ååãåãããŠåãçµãå¿
èŠãããã ãšããã®ãçè
ã®æè«ã§ãã ãããã« å·çã®ç· ãã«ããã£ãŠ CTO ããã°ãèŠè¿ããŠã¿ããšã倧äºãªããšã¯ããã«è©°ãŸã£ãŠããŸãããçè
ã¯åè·ã® SIer æä»£ã«èªãã ã®ã§ããããã®èšäºã«ãããå
±æããã®ãèŠããŠããŸãã toppa.medley.jp toppa.medley.jp ã¡ãã¬ãŒã§ã¯ å»çãã«ã¹ã±ã¢ã®æªæ¥ãäœã ãšãã倧ããªç®æšããããŠãã®æªæ¥ãäœãçºã«è§£æ±ºãã¹ã課é¡ã«åãã£ãŠãä»åã玹ä»ããããã»ã¹ãèãæ¹ãå«ã詊è¡é¯èª€ããªãããäºæ¥éšäžäžžã§ãããã¯ãéçºãæšé²ããŠããŸãã ãšã³ãžãã¢ã®ç·ååãçºæ®ããŠå»çãã«ã¹ã±ã¢ã®æªæ¥ãäžç·ã«äœãäžããŠããããïŒãšããæ¹ã«ãäŒãåºæ¥ãããšã楜ãã¿ã«ããŠãããŸãã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
åããŸããŠãCLINICS ã®éçºãæ
åœããŠãããšã³ãžãã¢ã®å¹³å±±ã§ãã ïŒåå§ã§ãã CTO ã§ã¯ããããŸããïŒ CLINICS ã®éçºã¯ãã¹ã¢ãŒã«ããŒã å¶ãããšã£ãŠãããŸããŠãçŸåšãã®ãã¡ã®ïŒã€ãããŒã ãªãŒãããŠããŸãã åè·ã¯é·ãã SIer ã«å€ããŠããŸãããå»å¹Žã® 12 æã«ã¡ãã¬ãŒã« JOIN ããŠãéãç¡ãïŒå¹ŽçµãšããšããŠãããããšæããšããã£ãšããéã ã£ããªããšããå°è±¡ã§ãã ããŠãæ¬æ¥ã¯ã¡ãã¬ãŒã§éé±éå¬ããŠãã瀟å
å匷äŒïŒTechLunchïŒã«ãããŠçºè¡šããå
容ã«ã€ããŠã玹ä»ãããŠé ããã°ãšæããŸãã ã¯ããã« ãæè¡ã䜿ãããã®æè¡ããšããããŒããšãªããŸããããããã¯ãéçºãããŠããäžã§ã¯æ¬ ãããªãçŽ é€ãšèããŠããŸããã¡ãã¬ãŒã«æå±ããŠãããšã³ãžãã¢ã®ïŒäººãšããŠãã©ã®ããã«æ¥ã
課é¡ãšåãåã£ãŠããã®ããåœããŒããéããŠãäŒãã§ããã°ãšæããŸãã ãŸãããã®èãæ¹èªäœã¯ãå»çãšããããŒããããäºæ¥ã®èæ¯ïŒãã³ãã£ãŒã» SIerïŒããåããå¿
èŠãšãããå Žé¢ããããããããŸãããïŒèªèº«ãåè·ã§ã¯æ§ã
ãªå Žé¢ã§ãäžè©±ã«ãªããŸããâŠïŒ å³å¹æ§ã®ãããã®ã§ã¯ãããŸããããããããå¹ããŠããå
容ã§ã¯ãªãããšæããŸãããããããã°ãä»ãåããã ããã æ¬é¡ ãæè¡ã䜿ãããã®æè¡ã ã¿ãªããã¯ãã®èšèãããäœãæãæµ®ãã¹ãã§ãããããçè
ã詊ãã« Google ã§æ€çŽ¢ããéäžäœã«ãããããã®ã¯ AI ãšã³ãžã㢠IoT ãšãã£ãçµæã§ããããªãã»ã©ãå°ãéã«è§£éãããšãæè¡ïŒã¢ã«ãŽãªãºã çïŒã䜿ãããã®æè¡ïŒæ©æ¢°åŠç¿ãå®¶é»çïŒããšãã£ãæããªã®ã§ãããããïŒãã®çµæãæŸã£ãŠãããšããã®ããããæå³ã§ Google ããããªã£ãŠæããŸããïŒ çè
ãä»åã®ããŒããšããŠæããŠããã®ã¯ãäžèšãšãªããŸãã ããžã«ã«ã·ã³ãã³ã° æšè« ãããã® æèãæŽçãããææ®µã ãšãšã³ãžãã¢ã®æŠåšã§ãã æè¡ãšãããææ®µã ãããåãããããšã§ã倧ããªããŒãã§ãããå»çãã«åãåã£ãŠããŸãã ææ®µãç®çã«ããŠã¯ãªããªã å
ã«æãããšãããæèã®æŽçãããæè¡ãã ãææ®µã ã«éããŸãããããããçšããŠãé©åãªäžæãæããŠããçºã«ã¯ãç®çãã«å¯Ÿããè§£å床ãé«ãæãå¿
èŠããããŸãã çè
ã®çºè¡šããæç²ãããæè¡ã䜿ãããã®æè¡ãã®èŠçŽ ãã€ã¡ãŒãžããå³ æŽçå ç®çãéæããçºã«å¿
èŠãªãæ
å ±ããåæšéžæããããã®èŠçŽ ã SaaS âïž toB ã®äžçã«ãããŠã¯ããããã¯ãã解決ãã¹ã課é¡ãåŠããæ¥åã®æ¬è³ªãèžãŸããŠåæšéžæããããšèšãæãããããããããŸããã æ¥åç¥è ç®çã®ãè§£å床ããé«ããããã®èŠçŽ ã CLINICS ã«ãããŠã¯ãå»çæ
å ±ãæ±ãäžã§ã®èŠå¶ïŒ3 ç 2 ã¬ã€ãã©ã€ã³ïŒããå»çæ©é¢ïŒå»åž«ã»å»äºã»èšºçç§ã®ç¹æ§ïŒã®æ¥åã蚺çå ±é
¬ã«ã€ããŠã®ç¥èãæ³æ¹æ£ãã¬ã»ã³ã³ïŒORCAïŒâŠ ãšæ§ã
ãããŸãã æè¡ç¥è ç®çãéæããçºã«å¿
èŠãªãæãæããéžæããããã®èŠçŽ ã ïŒãšã³ãžãã¢ã«ãšã£ãŠã¯èª¬æãããŸã§ããªãå
容ã§ãããšæããŸããïŒ ãããæ¬ ããŠããŸããšçµµã«æããé€
ã§çµãã£ãŠããŸããŸããã¡ãã¬ãŒã®ãšã³ãžãã¢ã«ãããŠãæ¥ã
ç éœãããããã¯ãã«å¯ŸããŠã³ããããç¶ããŠããŸãã è¡åå ç®çãéæããããã®ãæšé²åããé«ããããã®èŠçŽ ã åçš®ç¥èãšæŽçããæ
å ±ãæšé²åã«å€ããŠããçºã«ã¯ããã®æã®ç¶æ³ã«å¿ããåããããå¿
èŠããããŸããã¹ããŒã¯ãã«ããŒãšã®èª¿æŽã¯åœç¶ã§ãããçµç¹å
飿ºãšãã£ããæšªã®åãããå¿
èŠã§ãã æ³åå ãããŸã§æããããããã®ææ®µãé©åã«å©çšããŠããããã®èŠçŽ ãšããŠã®åå°ããæ³ååãã§ãããšèããŠããŸãã 課é¡ïŒIssueïŒãžã®åãçµã¿äŸ çªå· æŠèŠ â Issue ã«åãçµãéã«ãæ¬åœã«è§£æ±ºãã¹ãããšãã«ã€ããŠã®æ³åãåãããŸããIssue ã«èšèŒãããŠããããšã æ¬åœã«ãããã¯ããšããŠè§£æ±ºãã¹ãããšãªã®ã ãå«ããŠèããŸãããããŸã§ã®éçšãå¿
ãããæ£ããããã§ã¯ãªãããšããç¹ããã€ã³ãã§ãã â¡ â ã«ã€ããŠãæ³åã®ãŸãŸãã§çµããããŠã¯ãããªãã®ã§ãæ¥åç¥èãšç
§ããåãããŠç¢ºåºŠãé«ããŠãããŸããåžžå€å»åž«ãã«ã¹ã¿ããŒãµããŒãã«ãã¢ãªã³ã°ããªããã å»çæ¥åãšããŠã®ããã¹ã圢ã®è§£å床ãäžããŠãã ããã»ã¹ã§ãã ⢠â åã³ â¡ ã§é«ããè§£å床ã¯èšèã®å»¶é·ç·äžãªã®ã§ãé¢ä¿è
éã®èªèã®ã®ã£ãããçºçããããã§ãããããã¿ã€ããäœæããŠãèŠèŠã»è§Šæã¬ãã«ã§ã®ã£ãããåããŠããããšã§ãããã¹ã圢ã«åããŠæŽç·ŽãããŠãããŸãã ⣠â ã ⢠ã®ã¿ã€ãã³ã°ãåãããå¿
èŠã«å¿ããŠé¢ä¿è
ãšçžè«ããªããé²ããŠãããŸãããšã³ãžãã¢ãç«ãŠã仮説ããã¶ã€ããŒã®ç®ç·ã§è©äŸ¡ã» UI/UX æé©åãããŠé ãããã倧ããã®æ©èœã«ã€ããŠã¯ãå»çæ©é¢ã«ãã€ãããéçšã®ãååãä»°ãã ãããããšããããŸãã â åã³ â¡ ã®é
ã«äœæ¥ã®ãŠã§ã€ããåã£ãŠããããã«èŠããããšæããŸããå®éã課é¡ã解決ããçºã®åå以äžãããã«å²ããŠããŸãã çç±ã¯ãïŒåºŠäœã£ãŠå
¬éããæ©èœãã¯ããã®åŸïŒäººæ©ããããŠäœæè
ã®æå³ããªãæ¹åã§å©çšããããããšãããããã§ãã ãããŠãå©çšè
ããã®éçšãå®çãããŠããŸã㚠誀ã£ãæ©èœã«ãããŠããåãèœãšãããšãå°é£ã ã§ããããã¯ã䜿ãããŠããªãæ©èœããããçŽæ¥çãªè² åµãšãã£ã圢ã§ããã£ãããŒã®ããã«å¹ããŠããŸãã ãã©ã®ãããªäœ¿ããæ¹ãããããã«ã€ããŠæ³åããããš ãã®äœ¿ããæ¹ãããããã¯ãã®ç®æãäžçãšåã£ãŠããããš ãšã³ãžãã¢ã¯æè¡ã圢ã«ããäžã§ãåžžã«æ³ååãåãããŠåãçµãå¿
èŠãããã ãšããã®ãçè
ã®æè«ã§ãã ãããã« å·çã®ç· ãã«ããã£ãŠ CTO ããã°ãèŠè¿ããŠã¿ããšã倧äºãªããšã¯ããã«è©°ãŸã£ãŠããŸãããçè
ã¯åè·ã® SIer æä»£ã«èªãã ã®ã§ããããã®èšäºã«ãããå
±æããã®ãèŠããŠããŸãã toppa.medley.jp toppa.medley.jp ã¡ãã¬ãŒã§ã¯ å»çãã«ã¹ã±ã¢ã®æªæ¥ãäœã ãšãã倧ããªç®æšããããŠãã®æªæ¥ãäœãçºã«è§£æ±ºãã¹ã課é¡ã«åãã£ãŠãä»åã玹ä»ããããã»ã¹ãèãæ¹ãå«ã詊è¡é¯èª€ããªãããäºæ¥éšäžäžžã§ãããã¯ãéçºãæšé²ããŠããŸãã ãšã³ãžãã¢ã®ç·ååãçºæ®ããŠå»çãã«ã¹ã±ã¢ã®æªæ¥ãäžç·ã«äœãäžããŠããããïŒãšããæ¹ã«ãäŒãåºæ¥ãããšã楜ãã¿ã«ããŠãããŸãã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
åããŸããŠãCLINICS ã®éçºãæ
åœããŠãããšã³ãžãã¢ã®å¹³å±±ã§ãã ïŒåå§ã§ãã CTO ã§ã¯ããããŸããïŒ CLINICS ã®éçºã¯ãã¹ã¢ãŒã«ããŒã å¶ãããšã£ãŠãããŸããŠãçŸåšãã®ãã¡ã®ïŒã€ãããŒã ãªãŒãããŠããŸãã åè·ã¯é·ãã SIer ã«å€ããŠããŸãããå»å¹Žã® 12 æã«ã¡ãã¬ãŒã« JOIN ããŠãéãç¡ãïŒå¹ŽçµãšããšããŠãããããšæããšããã£ãšããéã ã£ããªããšããå°è±¡ã§ãã ããŠãæ¬æ¥ã¯ã¡ãã¬ãŒã§éé±éå¬ããŠãã瀟å
å匷äŒïŒTechLunchïŒã«ãããŠçºè¡šããå
容ã«ã€ããŠã玹ä»ãããŠé ããã°ãšæããŸãã ã¯ããã« ãæè¡ã䜿ãããã®æè¡ããšããããŒããšãªããŸããããããã¯ãéçºãããŠããäžã§ã¯æ¬ ãããªãçŽ é€ãšèããŠããŸããã¡ãã¬ãŒã«æå±ããŠãããšã³ãžãã¢ã®ïŒäººãšããŠãã©ã®ããã«æ¥ã
課é¡ãšåãåã£ãŠããã®ããåœããŒããéããŠãäŒãã§ããã°ãšæããŸãã ãŸãããã®èãæ¹èªäœã¯ãå»çãšããããŒããããäºæ¥ã®èæ¯ïŒãã³ãã£ãŒã» SIerïŒããåããå¿
èŠãšãããå Žé¢ããããããããŸãããïŒèªèº«ãåè·ã§ã¯æ§ã
ãªå Žé¢ã§ãäžè©±ã«ãªããŸããâŠïŒ å³å¹æ§ã®ãããã®ã§ã¯ãããŸããããããããå¹ããŠããå
容ã§ã¯ãªãããšæããŸãããããããã°ãä»ãåããã ããã æ¬é¡ ãæè¡ã䜿ãããã®æè¡ã ã¿ãªããã¯ãã®èšèãããäœãæãæµ®ãã¹ãã§ãããããçè
ã詊ãã« Google ã§æ€çŽ¢ããéäžäœã«ãããããã®ã¯ AI ãšã³ãžã㢠IoT ãšãã£ãçµæã§ããããªãã»ã©ãå°ãéã«è§£éãããšãæè¡ïŒã¢ã«ãŽãªãºã çïŒã䜿ãããã®æè¡ïŒæ©æ¢°åŠç¿ãå®¶é»çïŒããšãã£ãæããªã®ã§ãããããïŒãã®çµæãæŸã£ãŠãããšããã®ããããæå³ã§ Google ããããªã£ãŠæããŸããïŒ çè
ãä»åã®ããŒããšããŠæããŠããã®ã¯ãäžèšãšãªããŸãã ããžã«ã«ã·ã³ãã³ã° æšè« ãããã® æèãæŽçãããææ®µã ãšãšã³ãžãã¢ã®æŠåšã§ãã æè¡ãšãããææ®µã ãããåãããããšã§ã倧ããªããŒãã§ãããå»çãã«åãåã£ãŠããŸãã ææ®µãç®çã«ããŠã¯ãªããªã å
ã«æãããšãããæèã®æŽçãããæè¡ãã ãææ®µã ã«éããŸãããããããçšããŠãé©åãªäžæãæããŠããçºã«ã¯ãç®çãã«å¯Ÿããè§£å床ãé«ãæãå¿
èŠããããŸãã çè
ã®çºè¡šããæç²ãããæè¡ã䜿ãããã®æè¡ãã®èŠçŽ ãã€ã¡ãŒãžããå³ æŽçå ç®çãéæããçºã«å¿
èŠãªãæ
å ±ããåæšéžæããããã®èŠçŽ ã SaaS âïž toB ã®äžçã«ãããŠã¯ããããã¯ãã解決ãã¹ã課é¡ãåŠããæ¥åã®æ¬è³ªãèžãŸããŠåæšéžæããããšèšãæãããããããããŸããã æ¥åç¥è ç®çã®ãè§£å床ããé«ããããã®èŠçŽ ã CLINICS ã«ãããŠã¯ãå»çæ
å ±ãæ±ãäžã§ã®èŠå¶ïŒ3 ç 2 ã¬ã€ãã©ã€ã³ïŒããå»çæ©é¢ïŒå»åž«ã»å»äºã»èšºçç§ã®ç¹æ§ïŒã®æ¥åã蚺çå ±é
¬ã«ã€ããŠã®ç¥èãæ³æ¹æ£ãã¬ã»ã³ã³ïŒORCAïŒâŠ ãšæ§ã
ãããŸãã æè¡ç¥è ç®çãéæããçºã«å¿
èŠãªãæãæããéžæããããã®èŠçŽ ã ïŒãšã³ãžãã¢ã«ãšã£ãŠã¯èª¬æãããŸã§ããªãå
容ã§ãããšæããŸããïŒ ãããæ¬ ããŠããŸããšçµµã«æããé€
ã§çµãã£ãŠããŸããŸããã¡ãã¬ãŒã®ãšã³ãžãã¢ã«ãããŠãæ¥ã
ç éœãããããã¯ãã«å¯ŸããŠã³ããããç¶ããŠããŸãã è¡åå ç®çãéæããããã®ãæšé²åããé«ããããã®èŠçŽ ã åçš®ç¥èãšæŽçããæ
å ±ãæšé²åã«å€ããŠããçºã«ã¯ããã®æã®ç¶æ³ã«å¿ããåããããå¿
èŠããããŸããã¹ããŒã¯ãã«ããŒãšã®èª¿æŽã¯åœç¶ã§ãããçµç¹å
飿ºãšãã£ããæšªã®åãããå¿
èŠã§ãã æ³åå ãããŸã§æããããããã®ææ®µãé©åã«å©çšããŠããããã®èŠçŽ ãšããŠã®åå°ããæ³ååãã§ãããšèããŠããŸãã 課é¡ïŒIssueïŒãžã®åãçµã¿äŸ çªå· æŠèŠ â Issue ã«åãçµãéã«ãæ¬åœã«è§£æ±ºãã¹ãããšãã«ã€ããŠã®æ³åãåãããŸããIssue ã«èšèŒãããŠããããšã æ¬åœã«ãããã¯ããšããŠè§£æ±ºãã¹ãããšãªã®ã ãå«ããŠèããŸãããããŸã§ã®éçšãå¿
ãããæ£ããããã§ã¯ãªãããšããç¹ããã€ã³ãã§ãã â¡ â ã«ã€ããŠãæ³åã®ãŸãŸãã§çµããããŠã¯ãããªãã®ã§ãæ¥åç¥èãšç
§ããåãããŠç¢ºåºŠãé«ããŠãããŸããåžžå€å»åž«ãã«ã¹ã¿ããŒãµããŒãã«ãã¢ãªã³ã°ããªããã å»çæ¥åãšããŠã®ããã¹ã圢ã®è§£å床ãäžããŠãã ããã»ã¹ã§ãã ⢠â åã³ â¡ ã§é«ããè§£å床ã¯èšèã®å»¶é·ç·äžãªã®ã§ãé¢ä¿è
éã®èªèã®ã®ã£ãããçºçããããã§ãããããã¿ã€ããäœæããŠãèŠèŠã»è§Šæã¬ãã«ã§ã®ã£ãããåããŠããããšã§ãããã¹ã圢ã«åããŠæŽç·ŽãããŠãããŸãã ⣠â ã ⢠ã®ã¿ã€ãã³ã°ãåãããå¿
èŠã«å¿ããŠé¢ä¿è
ãšçžè«ããªããé²ããŠãããŸãããšã³ãžãã¢ãç«ãŠã仮説ããã¶ã€ããŒã®ç®ç·ã§è©äŸ¡ã» UI/UX æé©åãããŠé ãããã倧ããã®æ©èœã«ã€ããŠã¯ãå»çæ©é¢ã«ãã€ãããéçšã®ãååãä»°ãã ãããããšããããŸãã â åã³ â¡ ã®é
ã«äœæ¥ã®ãŠã§ã€ããåã£ãŠããããã«èŠããããšæããŸããå®éã課é¡ã解決ããçºã®åå以äžãããã«å²ããŠããŸãã çç±ã¯ãïŒåºŠäœã£ãŠå
¬éããæ©èœãã¯ããã®åŸïŒäººæ©ããããŠäœæè
ã®æå³ããªãæ¹åã§å©çšããããããšãããããã§ãã ãããŠãå©çšè
ããã®éçšãå®çãããŠããŸã㚠誀ã£ãæ©èœã«ãããŠããåãèœãšãããšãå°é£ã ã§ããããã¯ã䜿ãããŠããªãæ©èœããããçŽæ¥çãªè² åµãšãã£ã圢ã§ããã£ãããŒã®ããã«å¹ããŠããŸãã ãã©ã®ãããªäœ¿ããæ¹ãããããã«ã€ããŠæ³åããããš ãã®äœ¿ããæ¹ãããããã¯ãã®ç®æãäžçãšåã£ãŠããããš ãšã³ãžãã¢ã¯æè¡ã圢ã«ããäžã§ãåžžã«æ³ååãåãããŠåãçµãå¿
èŠãããã ãšããã®ãçè
ã®æè«ã§ãã ãããã« å·çã®ç· ãã«ããã£ãŠ CTO ããã°ãèŠè¿ããŠã¿ããšã倧äºãªããšã¯ããã«è©°ãŸã£ãŠããŸãããçè
ã¯åè·ã® SIer æä»£ã«èªãã ã®ã§ããããã®èšäºã«ãããå
±æããã®ãèŠããŠããŸãã toppa.medley.jp toppa.medley.jp ã¡ãã¬ãŒã§ã¯ å»çãã«ã¹ã±ã¢ã®æªæ¥ãäœã ãšãã倧ããªç®æšããããŠãã®æªæ¥ãäœãçºã«è§£æ±ºãã¹ã課é¡ã«åãã£ãŠãä»åã玹ä»ããããã»ã¹ãèãæ¹ãå«ã詊è¡é¯èª€ããªãããäºæ¥éšäžäžžã§ãããã¯ãéçºãæšé²ããŠããŸãã ãšã³ãžãã¢ã®ç·ååãçºæ®ããŠå»çãã«ã¹ã±ã¢ã®æªæ¥ãäžç·ã«äœãäžããŠããããïŒãšããæ¹ã«ãäŒãåºæ¥ãããšã楜ãã¿ã«ããŠãããŸãã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
åããŸããŠãCLINICS ã®éçºãæ
åœããŠãããšã³ãžãã¢ã®å¹³å±±ã§ãã ïŒåå§ã§ãã CTO ã§ã¯ããããŸããïŒ CLINICS ã®éçºã¯ãã¹ã¢ãŒã«ããŒã å¶ãããšã£ãŠãããŸããŠãçŸåšãã®ãã¡ã®ïŒã€ãããŒã ãªãŒãããŠããŸãã åè·ã¯é·ãã SIer ã«å€ããŠããŸãããå»å¹Žã® 12 æã«ã¡ãã¬ãŒã« JOIN ããŠãéãç¡ãïŒå¹ŽçµãšããšããŠãããããšæããšããã£ãšããéã ã£ããªããšããå°è±¡ã§ãã ããŠãæ¬æ¥ã¯ã¡ãã¬ãŒã§éé±éå¬ããŠãã瀟å
å匷äŒïŒTechLunchïŒã«ãããŠçºè¡šããå
容ã«ã€ããŠã玹ä»ãããŠé ããã°ãšæããŸãã ã¯ããã« ãæè¡ã䜿ãããã®æè¡ããšããããŒããšãªããŸããããããã¯ãéçºãããŠããäžã§ã¯æ¬ ãããªãçŽ é€ãšèããŠããŸããã¡ãã¬ãŒã«æå±ããŠãããšã³ãžãã¢ã®ïŒäººãšããŠãã©ã®ããã«æ¥ã
課é¡ãšåãåã£ãŠããã®ããåœããŒããéããŠãäŒãã§ããã°ãšæããŸãã ãŸãããã®èãæ¹èªäœã¯ãå»çãšããããŒããããäºæ¥ã®èæ¯ïŒãã³ãã£ãŒã» SIerïŒããåããå¿
èŠãšãããå Žé¢ããããããããŸãããïŒèªèº«ãåè·ã§ã¯æ§ã
ãªå Žé¢ã§ãäžè©±ã«ãªããŸããâŠïŒ å³å¹æ§ã®ãããã®ã§ã¯ãããŸããããããããå¹ããŠããå
容ã§ã¯ãªãããšæããŸãããããããã°ãä»ãåããã ããã æ¬é¡ ãæè¡ã䜿ãããã®æè¡ã ã¿ãªããã¯ãã®èšèãããäœãæãæµ®ãã¹ãã§ãããããçè
ã詊ãã« Google ã§æ€çŽ¢ããéäžäœã«ãããããã®ã¯ AI ãšã³ãžã㢠IoT ãšãã£ãçµæã§ããããªãã»ã©ãå°ãéã«è§£éãããšãæè¡ïŒã¢ã«ãŽãªãºã çïŒã䜿ãããã®æè¡ïŒæ©æ¢°åŠç¿ãå®¶é»çïŒããšãã£ãæããªã®ã§ãããããïŒãã®çµæãæŸã£ãŠãããšããã®ããããæå³ã§ Google ããããªã£ãŠæããŸããïŒ çè
ãä»åã®ããŒããšããŠæããŠããã®ã¯ãäžèšãšãªããŸãã ããžã«ã«ã·ã³ãã³ã° æšè« ãããã® æèãæŽçãããææ®µã ãšãšã³ãžãã¢ã®æŠåšã§ãã æè¡ãšãããææ®µã ãããåãããããšã§ã倧ããªããŒãã§ãããå»çãã«åãåã£ãŠããŸãã ææ®µãç®çã«ããŠã¯ãªããªã å
ã«æãããšãããæèã®æŽçãããæè¡ãã ãææ®µã ã«éããŸãããããããçšããŠãé©åãªäžæãæããŠããçºã«ã¯ãç®çãã«å¯Ÿããè§£å床ãé«ãæãå¿
èŠããããŸãã çè
ã®çºè¡šããæç²ãããæè¡ã䜿ãããã®æè¡ãã®èŠçŽ ãã€ã¡ãŒãžããå³ æŽçå ç®çãéæããçºã«å¿
èŠãªãæ
å ±ããåæšéžæããããã®èŠçŽ ã SaaS âïž toB ã®äžçã«ãããŠã¯ããããã¯ãã解決ãã¹ã課é¡ãåŠããæ¥åã®æ¬è³ªãèžãŸããŠåæšéžæããããšèšãæãããããããããŸããã æ¥åç¥è ç®çã®ãè§£å床ããé«ããããã®èŠçŽ ã CLINICS ã«ãããŠã¯ãå»çæ
å ±ãæ±ãäžã§ã®èŠå¶ïŒ3 ç 2 ã¬ã€ãã©ã€ã³ïŒããå»çæ©é¢ïŒå»åž«ã»å»äºã»èšºçç§ã®ç¹æ§ïŒã®æ¥åã蚺çå ±é
¬ã«ã€ããŠã®ç¥èãæ³æ¹æ£ãã¬ã»ã³ã³ïŒORCAïŒâŠ ãšæ§ã
ãããŸãã æè¡ç¥è ç®çãéæããçºã«å¿
èŠãªãæãæããéžæããããã®èŠçŽ ã ïŒãšã³ãžãã¢ã«ãšã£ãŠã¯èª¬æãããŸã§ããªãå
容ã§ãããšæããŸããïŒ ãããæ¬ ããŠããŸããšçµµã«æããé€
ã§çµãã£ãŠããŸããŸããã¡ãã¬ãŒã®ãšã³ãžãã¢ã«ãããŠãæ¥ã
ç éœãããããã¯ãã«å¯ŸããŠã³ããããç¶ããŠããŸãã è¡åå ç®çãéæããããã®ãæšé²åããé«ããããã®èŠçŽ ã åçš®ç¥èãšæŽçããæ
å ±ãæšé²åã«å€ããŠããçºã«ã¯ããã®æã®ç¶æ³ã«å¿ããåããããå¿
èŠããããŸããã¹ããŒã¯ãã«ããŒãšã®èª¿æŽã¯åœç¶ã§ãããçµç¹å
飿ºãšãã£ããæšªã®åãããå¿
èŠã§ãã æ³åå ãããŸã§æããããããã®ææ®µãé©åã«å©çšããŠããããã®èŠçŽ ãšããŠã®åå°ããæ³ååãã§ãããšèããŠããŸãã 課é¡ïŒIssueïŒãžã®åãçµã¿äŸ çªå· æŠèŠ â Issue ã«åãçµãéã«ãæ¬åœã«è§£æ±ºãã¹ãããšãã«ã€ããŠã®æ³åãåãããŸããIssue ã«èšèŒãããŠããããšã æ¬åœã«ãããã¯ããšããŠè§£æ±ºãã¹ãããšãªã®ã ãå«ããŠèããŸãããããŸã§ã®éçšãå¿
ãããæ£ããããã§ã¯ãªãããšããç¹ããã€ã³ãã§ãã â¡ â ã«ã€ããŠãæ³åã®ãŸãŸãã§çµããããŠã¯ãããªãã®ã§ãæ¥åç¥èãšç
§ããåãããŠç¢ºåºŠãé«ããŠãããŸããåžžå€å»åž«ãã«ã¹ã¿ããŒãµããŒãã«ãã¢ãªã³ã°ããªããã å»çæ¥åãšããŠã®ããã¹ã圢ã®è§£å床ãäžããŠãã ããã»ã¹ã§ãã ⢠â åã³ â¡ ã§é«ããè§£å床ã¯èšèã®å»¶é·ç·äžãªã®ã§ãé¢ä¿è
éã®èªèã®ã®ã£ãããçºçããããã§ãããããã¿ã€ããäœæããŠãèŠèŠã»è§Šæã¬ãã«ã§ã®ã£ãããåããŠããããšã§ãããã¹ã圢ã«åããŠæŽç·ŽãããŠãããŸãã ⣠â ã ⢠ã®ã¿ã€ãã³ã°ãåãããå¿
èŠã«å¿ããŠé¢ä¿è
ãšçžè«ããªããé²ããŠãããŸãããšã³ãžãã¢ãç«ãŠã仮説ããã¶ã€ããŒã®ç®ç·ã§è©äŸ¡ã» UI/UX æé©åãããŠé ãããã倧ããã®æ©èœã«ã€ããŠã¯ãå»çæ©é¢ã«ãã€ãããéçšã®ãååãä»°ãã ãããããšããããŸãã â åã³ â¡ ã®é
ã«äœæ¥ã®ãŠã§ã€ããåã£ãŠããããã«èŠããããšæããŸããå®éã課é¡ã解決ããçºã®åå以äžãããã«å²ããŠããŸãã çç±ã¯ãïŒåºŠäœã£ãŠå
¬éããæ©èœãã¯ããã®åŸïŒäººæ©ããããŠäœæè
ã®æå³ããªãæ¹åã§å©çšããããããšãããããã§ãã ãããŠãå©çšè
ããã®éçšãå®çãããŠããŸã㚠誀ã£ãæ©èœã«ãããŠããåãèœãšãããšãå°é£ã ã§ããããã¯ã䜿ãããŠããªãæ©èœããããçŽæ¥çãªè² åµãšãã£ã圢ã§ããã£ãããŒã®ããã«å¹ããŠããŸãã ãã©ã®ãããªäœ¿ããæ¹ãããããã«ã€ããŠæ³åããããš ãã®äœ¿ããæ¹ãããããã¯ãã®ç®æãäžçãšåã£ãŠããããš ãšã³ãžãã¢ã¯æè¡ã圢ã«ããäžã§ãåžžã«æ³ååãåãããŠåãçµãå¿
èŠãããã ãšããã®ãçè
ã®æè«ã§ãã ãããã« å·çã®ç· ãã«ããã£ãŠ CTO ããã°ãèŠè¿ããŠã¿ããšã倧äºãªããšã¯ããã«è©°ãŸã£ãŠããŸãããçè
ã¯åè·ã® SIer æä»£ã«èªãã ã®ã§ããããã®èšäºã«ãããå
±æããã®ãèŠããŠããŸãã toppa.medley.jp toppa.medley.jp ã¡ãã¬ãŒã§ã¯ å»çãã«ã¹ã±ã¢ã®æªæ¥ãäœã ãšãã倧ããªç®æšããããŠãã®æªæ¥ãäœãçºã«è§£æ±ºãã¹ã課é¡ã«åãã£ãŠãä»åã玹ä»ããããã»ã¹ãèãæ¹ãå«ã詊è¡é¯èª€ããªãããäºæ¥éšäžäžžã§ãããã¯ãéçºãæšé²ããŠããŸãã ãšã³ãžãã¢ã®ç·ååãçºæ®ããŠå»çãã«ã¹ã±ã¢ã®æªæ¥ãäžç·ã«äœãäžããŠããããïŒãšããæ¹ã«ãäŒãåºæ¥ãããšã楜ãã¿ã«ããŠãããŸãã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
åããŸããŠãCLINICS ã®éçºãæ
åœããŠãããšã³ãžãã¢ã®å¹³å±±ã§ãã ïŒåå§ã§ãã CTO ã§ã¯ããããŸããïŒ CLINICS ã®éçºã¯ãã¹ã¢ãŒã«ããŒã å¶ãããšã£ãŠãããŸããŠãçŸåšãã®ãã¡ã®ïŒã€ãããŒã ãªãŒãããŠããŸãã åè·ã¯é·ãã SIer ã«å€ããŠããŸãããå»å¹Žã® 12 æã«ã¡ãã¬ãŒã« JOIN ããŠãéãç¡ãïŒå¹ŽçµãšããšããŠãããããšæããšããã£ãšããéã ã£ããªããšããå°è±¡ã§ãã ããŠãæ¬æ¥ã¯ã¡ãã¬ãŒã§éé±éå¬ããŠãã瀟å
å匷äŒïŒTechLunchïŒã«ãããŠçºè¡šããå
容ã«ã€ããŠã玹ä»ãããŠé ããã°ãšæããŸãã ã¯ããã« ãæè¡ã䜿ãããã®æè¡ããšããããŒããšãªããŸããããããã¯ãéçºãããŠããäžã§ã¯æ¬ ãããªãçŽ é€ãšèããŠããŸããã¡ãã¬ãŒã«æå±ããŠãããšã³ãžãã¢ã®ïŒäººãšããŠãã©ã®ããã«æ¥ã
課é¡ãšåãåã£ãŠããã®ããåœããŒããéããŠãäŒãã§ããã°ãšæããŸãã ãŸãããã®èãæ¹èªäœã¯ãå»çãšããããŒããããäºæ¥ã®èæ¯ïŒãã³ãã£ãŒã» SIerïŒããåããå¿
èŠãšãããå Žé¢ããããããããŸãããïŒèªèº«ãåè·ã§ã¯æ§ã
ãªå Žé¢ã§ãäžè©±ã«ãªããŸããâŠïŒ å³å¹æ§ã®ãããã®ã§ã¯ãããŸããããããããå¹ããŠããå
容ã§ã¯ãªãããšæããŸãããããããã°ãä»ãåããã ããã æ¬é¡ ãæè¡ã䜿ãããã®æè¡ã ã¿ãªããã¯ãã®èšèãããäœãæãæµ®ãã¹ãã§ãããããçè
ã詊ãã« Google ã§æ€çŽ¢ããéäžäœã«ãããããã®ã¯ AI ãšã³ãžã㢠IoT ãšãã£ãçµæã§ããããªãã»ã©ãå°ãéã«è§£éãããšãæè¡ïŒã¢ã«ãŽãªãºã çïŒã䜿ãããã®æè¡ïŒæ©æ¢°åŠç¿ãå®¶é»çïŒããšãã£ãæããªã®ã§ãããããïŒãã®çµæãæŸã£ãŠãããšããã®ããããæå³ã§ Google ããããªã£ãŠæããŸããïŒ çè
ãä»åã®ããŒããšããŠæããŠããã®ã¯ãäžèšãšãªããŸãã ããžã«ã«ã·ã³ãã³ã° æšè« ãããã® æèãæŽçãããææ®µã ãšãšã³ãžãã¢ã®æŠåšã§ãã æè¡ãšãããææ®µã ãããåãããããšã§ã倧ããªããŒãã§ãããå»çãã«åãåã£ãŠããŸãã ææ®µãç®çã«ããŠã¯ãªããªã å
ã«æãããšãããæèã®æŽçãããæè¡ãã ãææ®µã ã«éããŸãããããããçšããŠãé©åãªäžæãæããŠããçºã«ã¯ãç®çãã«å¯Ÿããè§£å床ãé«ãæãå¿
èŠããããŸãã çè
ã®çºè¡šããæç²ãããæè¡ã䜿ãããã®æè¡ãã®èŠçŽ ãã€ã¡ãŒãžããå³ æŽçå ç®çãéæããçºã«å¿
èŠãªãæ
å ±ããåæšéžæããããã®èŠçŽ ã SaaS âïž toB ã®äžçã«ãããŠã¯ããããã¯ãã解決ãã¹ã課é¡ãåŠããæ¥åã®æ¬è³ªãèžãŸããŠåæšéžæããããšèšãæãããããããããŸããã æ¥åç¥è ç®çã®ãè§£å床ããé«ããããã®èŠçŽ ã CLINICS ã«ãããŠã¯ãå»çæ
å ±ãæ±ãäžã§ã®èŠå¶ïŒ3 ç 2 ã¬ã€ãã©ã€ã³ïŒããå»çæ©é¢ïŒå»åž«ã»å»äºã»èšºçç§ã®ç¹æ§ïŒã®æ¥åã蚺çå ±é
¬ã«ã€ããŠã®ç¥èãæ³æ¹æ£ãã¬ã»ã³ã³ïŒORCAïŒâŠ ãšæ§ã
ãããŸãã æè¡ç¥è ç®çãéæããçºã«å¿
èŠãªãæãæããéžæããããã®èŠçŽ ã ïŒãšã³ãžãã¢ã«ãšã£ãŠã¯èª¬æãããŸã§ããªãå
容ã§ãããšæããŸããïŒ ãããæ¬ ããŠããŸããšçµµã«æããé€
ã§çµãã£ãŠããŸããŸããã¡ãã¬ãŒã®ãšã³ãžãã¢ã«ãããŠãæ¥ã
ç éœãããããã¯ãã«å¯ŸããŠã³ããããç¶ããŠããŸãã è¡åå ç®çãéæããããã®ãæšé²åããé«ããããã®èŠçŽ ã åçš®ç¥èãšæŽçããæ
å ±ãæšé²åã«å€ããŠããçºã«ã¯ããã®æã®ç¶æ³ã«å¿ããåããããå¿
èŠããããŸããã¹ããŒã¯ãã«ããŒãšã®èª¿æŽã¯åœç¶ã§ãããçµç¹å
飿ºãšãã£ããæšªã®åãããå¿
èŠã§ãã æ³åå ãããŸã§æããããããã®ææ®µãé©åã«å©çšããŠããããã®èŠçŽ ãšããŠã®åå°ããæ³ååãã§ãããšèããŠããŸãã 課é¡ïŒIssueïŒãžã®åãçµã¿äŸ çªå· æŠèŠ â Issue ã«åãçµãéã«ãæ¬åœã«è§£æ±ºãã¹ãããšãã«ã€ããŠã®æ³åãåãããŸããIssue ã«èšèŒãããŠããããšã æ¬åœã«ãããã¯ããšããŠè§£æ±ºãã¹ãããšãªã®ã ãå«ããŠèããŸãããããŸã§ã®éçšãå¿
ãããæ£ããããã§ã¯ãªãããšããç¹ããã€ã³ãã§ãã â¡ â ã«ã€ããŠãæ³åã®ãŸãŸãã§çµããããŠã¯ãããªãã®ã§ãæ¥åç¥èãšç
§ããåãããŠç¢ºåºŠãé«ããŠãããŸããåžžå€å»åž«ãã«ã¹ã¿ããŒãµããŒãã«ãã¢ãªã³ã°ããªããã å»çæ¥åãšããŠã®ããã¹ã圢ã®è§£å床ãäžããŠãã ããã»ã¹ã§ãã ⢠â åã³ â¡ ã§é«ããè§£å床ã¯èšèã®å»¶é·ç·äžãªã®ã§ãé¢ä¿è
éã®èªèã®ã®ã£ãããçºçããããã§ãããããã¿ã€ããäœæããŠãèŠèŠã»è§Šæã¬ãã«ã§ã®ã£ãããåããŠããããšã§ãããã¹ã圢ã«åããŠæŽç·ŽãããŠãããŸãã ⣠â ã ⢠ã®ã¿ã€ãã³ã°ãåãããå¿
èŠã«å¿ããŠé¢ä¿è
ãšçžè«ããªããé²ããŠãããŸãããšã³ãžãã¢ãç«ãŠã仮説ããã¶ã€ããŒã®ç®ç·ã§è©äŸ¡ã» UI/UX æé©åãããŠé ãããã倧ããã®æ©èœã«ã€ããŠã¯ãå»çæ©é¢ã«ãã€ãããéçšã®ãååãä»°ãã ãããããšããããŸãã â åã³ â¡ ã®é
ã«äœæ¥ã®ãŠã§ã€ããåã£ãŠããããã«èŠããããšæããŸããå®éã課é¡ã解決ããçºã®åå以äžãããã«å²ããŠããŸãã çç±ã¯ãïŒåºŠäœã£ãŠå
¬éããæ©èœãã¯ããã®åŸïŒäººæ©ããããŠäœæè
ã®æå³ããªãæ¹åã§å©çšããããããšãããããã§ãã ãããŠãå©çšè
ããã®éçšãå®çãããŠããŸã㚠誀ã£ãæ©èœã«ãããŠããåãèœãšãããšãå°é£ã ã§ããããã¯ã䜿ãããŠããªãæ©èœããããçŽæ¥çãªè² åµãšãã£ã圢ã§ããã£ãããŒã®ããã«å¹ããŠããŸãã ãã©ã®ãããªäœ¿ããæ¹ãããããã«ã€ããŠæ³åããããš ãã®äœ¿ããæ¹ãããããã¯ãã®ç®æãäžçãšåã£ãŠããããš ãšã³ãžãã¢ã¯æè¡ã圢ã«ããäžã§ãåžžã«æ³ååãåãããŠåãçµãå¿
èŠãããã ãšããã®ãçè
ã®æè«ã§ãã ãããã« å·çã®ç· ãã«ããã£ãŠ CTO ããã°ãèŠè¿ããŠã¿ããšã倧äºãªããšã¯ããã«è©°ãŸã£ãŠããŸãããçè
ã¯åè·ã® SIer æä»£ã«èªãã ã®ã§ããããã®èšäºã«ãããå
±æããã®ãèŠããŠããŸãã toppa.medley.jp toppa.medley.jp ã¡ãã¬ãŒã§ã¯ å»çãã«ã¹ã±ã¢ã®æªæ¥ãäœã ãšãã倧ããªç®æšããããŠãã®æªæ¥ãäœãçºã«è§£æ±ºãã¹ã課é¡ã«åãã£ãŠãä»åã玹ä»ããããã»ã¹ãèãæ¹ãå«ã詊è¡é¯èª€ããªãããäºæ¥éšäžäžžã§ãããã¯ãéçºãæšé²ããŠããŸãã ãšã³ãžãã¢ã®ç·ååãçºæ®ããŠå»çãã«ã¹ã±ã¢ã®æªæ¥ãäžç·ã«äœãäžããŠããããïŒãšããæ¹ã«ãäŒãåºæ¥ãããšã楜ãã¿ã«ããŠãããŸãã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
åããŸããŠãCLINICS ã®éçºãæ
åœããŠãããšã³ãžãã¢ã®å¹³å±±ã§ãã ïŒåå§ã§ãã CTO ã§ã¯ããããŸããïŒ CLINICS ã®éçºã¯ãã¹ã¢ãŒã«ããŒã å¶ãããšã£ãŠãããŸããŠãçŸåšãã®ãã¡ã®ïŒã€ãããŒã ãªãŒãããŠããŸãã åè·ã¯é·ãã SIer ã«å€ããŠããŸãããå»å¹Žã® 12 æã«ã¡ãã¬ãŒã« JOIN ããŠãéãç¡ãïŒå¹ŽçµãšããšããŠãããããšæããšããã£ãšããéã ã£ããªããšããå°è±¡ã§ãã ããŠãæ¬æ¥ã¯ã¡ãã¬ãŒã§éé±éå¬ããŠãã瀟å
å匷äŒïŒTechLunchïŒã«ãããŠçºè¡šããå
容ã«ã€ããŠã玹ä»ãããŠé ããã°ãšæããŸãã ã¯ããã« ãæè¡ã䜿ãããã®æè¡ããšããããŒããšãªããŸããããããã¯ãéçºãããŠããäžã§ã¯æ¬ ãããªãçŽ é€ãšèããŠããŸããã¡ãã¬ãŒã«æå±ããŠãããšã³ãžãã¢ã®ïŒäººãšããŠãã©ã®ããã«æ¥ã
課é¡ãšåãåã£ãŠããã®ããåœããŒããéããŠãäŒãã§ããã°ãšæããŸãã ãŸãããã®èãæ¹èªäœã¯ãå»çãšããããŒããããäºæ¥ã®èæ¯ïŒãã³ãã£ãŒã» SIerïŒããåããå¿
èŠãšãããå Žé¢ããããããããŸãããïŒèªèº«ãåè·ã§ã¯æ§ã
ãªå Žé¢ã§ãäžè©±ã«ãªããŸããâŠïŒ å³å¹æ§ã®ãããã®ã§ã¯ãããŸããããããããå¹ããŠããå
容ã§ã¯ãªãããšæããŸãããããããã°ãä»ãåããã ããã æ¬é¡ ãæè¡ã䜿ãããã®æè¡ã ã¿ãªããã¯ãã®èšèãããäœãæãæµ®ãã¹ãã§ãããããçè
ã詊ãã« Google ã§æ€çŽ¢ããéäžäœã«ãããããã®ã¯ AI ãšã³ãžã㢠IoT ãšãã£ãçµæã§ããããªãã»ã©ãå°ãéã«è§£éãããšãæè¡ïŒã¢ã«ãŽãªãºã çïŒã䜿ãããã®æè¡ïŒæ©æ¢°åŠç¿ãå®¶é»çïŒããšãã£ãæããªã®ã§ãããããïŒãã®çµæãæŸã£ãŠãããšããã®ããããæå³ã§ Google ããããªã£ãŠæããŸããïŒ çè
ãä»åã®ããŒããšããŠæããŠããã®ã¯ãäžèšãšãªããŸãã ããžã«ã«ã·ã³ãã³ã° æšè« ãããã® æèãæŽçãããææ®µã ãšãšã³ãžãã¢ã®æŠåšã§ãã æè¡ãšãããææ®µã ãããåãããããšã§ã倧ããªããŒãã§ãããå»çãã«åãåã£ãŠããŸãã ææ®µãç®çã«ããŠã¯ãªããªã å
ã«æãããšãããæèã®æŽçãããæè¡ãã ãææ®µã ã«éããŸãããããããçšããŠãé©åãªäžæãæããŠããçºã«ã¯ãç®çãã«å¯Ÿããè§£å床ãé«ãæãå¿
èŠããããŸãã çè
ã®çºè¡šããæç²ãããæè¡ã䜿ãããã®æè¡ãã®èŠçŽ ãã€ã¡ãŒãžããå³ æŽçå ç®çãéæããçºã«å¿
èŠãªãæ
å ±ããåæšéžæããããã®èŠçŽ ã SaaS âïž toB ã®äžçã«ãããŠã¯ããããã¯ãã解決ãã¹ã課é¡ãåŠããæ¥åã®æ¬è³ªãèžãŸããŠåæšéžæããããšèšãæãããããããããŸããã æ¥åç¥è ç®çã®ãè§£å床ããé«ããããã®èŠçŽ ã CLINICS ã«ãããŠã¯ãå»çæ
å ±ãæ±ãäžã§ã®èŠå¶ïŒ3 ç 2 ã¬ã€ãã©ã€ã³ïŒããå»çæ©é¢ïŒå»åž«ã»å»äºã»èšºçç§ã®ç¹æ§ïŒã®æ¥åã蚺çå ±é
¬ã«ã€ããŠã®ç¥èãæ³æ¹æ£ãã¬ã»ã³ã³ïŒORCAïŒâŠ ãšæ§ã
ãããŸãã æè¡ç¥è ç®çãéæããçºã«å¿
èŠãªãæãæããéžæããããã®èŠçŽ ã ïŒãšã³ãžãã¢ã«ãšã£ãŠã¯èª¬æãããŸã§ããªãå
容ã§ãããšæããŸããïŒ ãããæ¬ ããŠããŸããšçµµã«æããé€
ã§çµãã£ãŠããŸããŸããã¡ãã¬ãŒã®ãšã³ãžãã¢ã«ãããŠãæ¥ã
ç éœãããããã¯ãã«å¯ŸããŠã³ããããç¶ããŠããŸãã è¡åå ç®çãéæããããã®ãæšé²åããé«ããããã®èŠçŽ ã åçš®ç¥èãšæŽçããæ
å ±ãæšé²åã«å€ããŠããçºã«ã¯ããã®æã®ç¶æ³ã«å¿ããåããããå¿
èŠããããŸããã¹ããŒã¯ãã«ããŒãšã®èª¿æŽã¯åœç¶ã§ãããçµç¹å
飿ºãšãã£ããæšªã®åãããå¿
èŠã§ãã æ³åå ãããŸã§æããããããã®ææ®µãé©åã«å©çšããŠããããã®èŠçŽ ãšããŠã®åå°ããæ³ååãã§ãããšèããŠããŸãã 課é¡ïŒIssueïŒãžã®åãçµã¿äŸ çªå· æŠèŠ â Issue ã«åãçµãéã«ãæ¬åœã«è§£æ±ºãã¹ãããšãã«ã€ããŠã®æ³åãåãããŸããIssue ã«èšèŒãããŠããããšã æ¬åœã«ãããã¯ããšããŠè§£æ±ºãã¹ãããšãªã®ã ãå«ããŠèããŸãããããŸã§ã®éçšãå¿
ãããæ£ããããã§ã¯ãªãããšããç¹ããã€ã³ãã§ãã â¡ â ã«ã€ããŠãæ³åã®ãŸãŸãã§çµããããŠã¯ãããªãã®ã§ãæ¥åç¥èãšç
§ããåãããŠç¢ºåºŠãé«ããŠãããŸããåžžå€å»åž«ãã«ã¹ã¿ããŒãµããŒãã«ãã¢ãªã³ã°ããªããã å»çæ¥åãšããŠã®ããã¹ã圢ã®è§£å床ãäžããŠãã ããã»ã¹ã§ãã ⢠â åã³ â¡ ã§é«ããè§£å床ã¯èšèã®å»¶é·ç·äžãªã®ã§ãé¢ä¿è
éã®èªèã®ã®ã£ãããçºçããããã§ãããããã¿ã€ããäœæããŠãèŠèŠã»è§Šæã¬ãã«ã§ã®ã£ãããåããŠããããšã§ãããã¹ã圢ã«åããŠæŽç·ŽãããŠãããŸãã ⣠â ã ⢠ã®ã¿ã€ãã³ã°ãåãããå¿
èŠã«å¿ããŠé¢ä¿è
ãšçžè«ããªããé²ããŠãããŸãããšã³ãžãã¢ãç«ãŠã仮説ããã¶ã€ããŒã®ç®ç·ã§è©äŸ¡ã» UI/UX æé©åãããŠé ãããã倧ããã®æ©èœã«ã€ããŠã¯ãå»çæ©é¢ã«ãã€ãããéçšã®ãååãä»°ãã ãããããšããããŸãã â åã³ â¡ ã®é
ã«äœæ¥ã®ãŠã§ã€ããåã£ãŠããããã«èŠããããšæããŸããå®éã課é¡ã解決ããçºã®åå以äžãããã«å²ããŠããŸãã çç±ã¯ãïŒåºŠäœã£ãŠå
¬éããæ©èœãã¯ããã®åŸïŒäººæ©ããããŠäœæè
ã®æå³ããªãæ¹åã§å©çšããããããšãããããã§ãã ãããŠãå©çšè
ããã®éçšãå®çãããŠããŸã㚠誀ã£ãæ©èœã«ãããŠããåãèœãšãããšãå°é£ã ã§ããããã¯ã䜿ãããŠããªãæ©èœããããçŽæ¥çãªè² åµãšãã£ã圢ã§ããã£ãããŒã®ããã«å¹ããŠããŸãã ãã©ã®ãããªäœ¿ããæ¹ãããããã«ã€ããŠæ³åããããš ãã®äœ¿ããæ¹ãããããã¯ãã®ç®æãäžçãšåã£ãŠããããš ãšã³ãžãã¢ã¯æè¡ã圢ã«ããäžã§ãåžžã«æ³ååãåãããŠåãçµãå¿
èŠãããã ãšããã®ãçè
ã®æè«ã§ãã ãããã« å·çã®ç· ãã«ããã£ãŠ CTO ããã°ãèŠè¿ããŠã¿ããšã倧äºãªããšã¯ããã«è©°ãŸã£ãŠããŸãããçè
ã¯åè·ã® SIer æä»£ã«èªãã ã®ã§ããããã®èšäºã«ãããå
±æããã®ãèŠããŠããŸãã toppa.medley.jp toppa.medley.jp ã¡ãã¬ãŒã§ã¯ å»çãã«ã¹ã±ã¢ã®æªæ¥ãäœã ãšãã倧ããªç®æšããããŠãã®æªæ¥ãäœãçºã«è§£æ±ºãã¹ã課é¡ã«åãã£ãŠãä»åã玹ä»ããããã»ã¹ãèãæ¹ãå«ã詊è¡é¯èª€ããªãããäºæ¥éšäžäžžã§ãããã¯ãéçºãæšé²ããŠããŸãã ãšã³ãžãã¢ã®ç·ååãçºæ®ããŠå»çãã«ã¹ã±ã¢ã®æªæ¥ãäžç·ã«äœãäžããŠããããïŒãšããæ¹ã«ãäŒãåºæ¥ãããšã楜ãã¿ã«ããŠãããŸãã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
åããŸããŠãCLINICS ã®éçºãæ
åœããŠãããšã³ãžãã¢ã®å¹³å±±ã§ãã ïŒåå§ã§ãã CTO ã§ã¯ããããŸããïŒ CLINICS ã®éçºã¯ãã¹ã¢ãŒã«ããŒã å¶ãããšã£ãŠãããŸããŠãçŸåšãã®ãã¡ã®ïŒã€ãããŒã ãªãŒãããŠããŸãã åè·ã¯é·ãã SIer ã«å€ããŠããŸãããå»å¹Žã® 12 æã«ã¡ãã¬ãŒã« JOIN ããŠãéãç¡ãïŒå¹ŽçµãšããšããŠãããããšæããšããã£ãšããéã ã£ããªããšããå°è±¡ã§ãã ããŠãæ¬æ¥ã¯ã¡ãã¬ãŒã§éé±éå¬ããŠãã瀟å
å匷äŒïŒTechLunchïŒã«ãããŠçºè¡šããå
容ã«ã€ããŠã玹ä»ãããŠé ããã°ãšæããŸãã ã¯ããã« ãæè¡ã䜿ãããã®æè¡ããšããããŒããšãªããŸããããããã¯ãéçºãããŠããäžã§ã¯æ¬ ãããªãçŽ é€ãšèããŠããŸããã¡ãã¬ãŒã«æå±ããŠãããšã³ãžãã¢ã®ïŒäººãšããŠãã©ã®ããã«æ¥ã
課é¡ãšåãåã£ãŠããã®ããåœããŒããéããŠãäŒãã§ããã°ãšæããŸãã ãŸãããã®èãæ¹èªäœã¯ãå»çãšããããŒããããäºæ¥ã®èæ¯ïŒãã³ãã£ãŒã» SIerïŒããåããå¿
èŠãšãããå Žé¢ããããããããŸãããïŒèªèº«ãåè·ã§ã¯æ§ã
ãªå Žé¢ã§ãäžè©±ã«ãªããŸããâŠïŒ å³å¹æ§ã®ãããã®ã§ã¯ãããŸããããããããå¹ããŠããå
容ã§ã¯ãªãããšæããŸãããããããã°ãä»ãåããã ããã æ¬é¡ ãæè¡ã䜿ãããã®æè¡ã ã¿ãªããã¯ãã®èšèãããäœãæãæµ®ãã¹ãã§ãããããçè
ã詊ãã« Google ã§æ€çŽ¢ããéäžäœã«ãããããã®ã¯ AI ãšã³ãžã㢠IoT ãšãã£ãçµæã§ããããªãã»ã©ãå°ãéã«è§£éãããšãæè¡ïŒã¢ã«ãŽãªãºã çïŒã䜿ãããã®æè¡ïŒæ©æ¢°åŠç¿ãå®¶é»çïŒããšãã£ãæããªã®ã§ãããããïŒãã®çµæãæŸã£ãŠãããšããã®ããããæå³ã§ Google ããããªã£ãŠæããŸããïŒ çè
ãä»åã®ããŒããšããŠæããŠããã®ã¯ãäžèšãšãªããŸãã ããžã«ã«ã·ã³ãã³ã° æšè« ãããã® æèãæŽçãããææ®µã ãšãšã³ãžãã¢ã®æŠåšã§ãã æè¡ãšãããææ®µã ãããåãããããšã§ã倧ããªããŒãã§ãããå»çãã«åãåã£ãŠããŸãã ææ®µãç®çã«ããŠã¯ãªããªã å
ã«æãããšãããæèã®æŽçãããæè¡ãã ãææ®µã ã«éããŸãããããããçšããŠãé©åãªäžæãæããŠããçºã«ã¯ãç®çãã«å¯Ÿããè§£å床ãé«ãæãå¿
èŠããããŸãã çè
ã®çºè¡šããæç²ãããæè¡ã䜿ãããã®æè¡ãã®èŠçŽ ãã€ã¡ãŒãžããå³ æŽçå ç®çãéæããçºã«å¿
èŠãªãæ
å ±ããåæšéžæããããã®èŠçŽ ã SaaS âïž toB ã®äžçã«ãããŠã¯ããããã¯ãã解決ãã¹ã課é¡ãåŠããæ¥åã®æ¬è³ªãèžãŸããŠåæšéžæããããšèšãæãããããããããŸããã æ¥åç¥è ç®çã®ãè§£å床ããé«ããããã®èŠçŽ ã CLINICS ã«ãããŠã¯ãå»çæ
å ±ãæ±ãäžã§ã®èŠå¶ïŒ3 ç 2 ã¬ã€ãã©ã€ã³ïŒããå»çæ©é¢ïŒå»åž«ã»å»äºã»èšºçç§ã®ç¹æ§ïŒã®æ¥åã蚺çå ±é
¬ã«ã€ããŠã®ç¥èãæ³æ¹æ£ãã¬ã»ã³ã³ïŒORCAïŒâŠ ãšæ§ã
ãããŸãã æè¡ç¥è ç®çãéæããçºã«å¿
èŠãªãæãæããéžæããããã®èŠçŽ ã ïŒãšã³ãžãã¢ã«ãšã£ãŠã¯èª¬æãããŸã§ããªãå
容ã§ãããšæããŸããïŒ ãããæ¬ ããŠããŸããšçµµã«æããé€
ã§çµãã£ãŠããŸããŸããã¡ãã¬ãŒã®ãšã³ãžãã¢ã«ãããŠãæ¥ã
ç éœãããããã¯ãã«å¯ŸããŠã³ããããç¶ããŠããŸãã è¡åå ç®çãéæããããã®ãæšé²åããé«ããããã®èŠçŽ ã åçš®ç¥èãšæŽçããæ
å ±ãæšé²åã«å€ããŠããçºã«ã¯ããã®æã®ç¶æ³ã«å¿ããåããããå¿
èŠããããŸããã¹ããŒã¯ãã«ããŒãšã®èª¿æŽã¯åœç¶ã§ãããçµç¹å
飿ºãšãã£ããæšªã®åãããå¿
èŠã§ãã æ³åå ãããŸã§æããããããã®ææ®µãé©åã«å©çšããŠããããã®èŠçŽ ãšããŠã®åå°ããæ³ååãã§ãããšèããŠããŸãã 課é¡ïŒIssueïŒãžã®åãçµã¿äŸ çªå· æŠèŠ â Issue ã«åãçµãéã«ãæ¬åœã«è§£æ±ºãã¹ãããšãã«ã€ããŠã®æ³åãåãããŸããIssue ã«èšèŒãããŠããããšã æ¬åœã«ãããã¯ããšããŠè§£æ±ºãã¹ãããšãªã®ã ãå«ããŠèããŸãããããŸã§ã®éçšãå¿
ãããæ£ããããã§ã¯ãªãããšããç¹ããã€ã³ãã§ãã â¡ â ã«ã€ããŠãæ³åã®ãŸãŸãã§çµããããŠã¯ãããªãã®ã§ãæ¥åç¥èãšç
§ããåãããŠç¢ºåºŠãé«ããŠãããŸããåžžå€å»åž«ãã«ã¹ã¿ããŒãµããŒãã«ãã¢ãªã³ã°ããªããã å»çæ¥åãšããŠã®ããã¹ã圢ã®è§£å床ãäžããŠãã ããã»ã¹ã§ãã ⢠â åã³ â¡ ã§é«ããè§£å床ã¯èšèã®å»¶é·ç·äžãªã®ã§ãé¢ä¿è
éã®èªèã®ã®ã£ãããçºçããããã§ãããããã¿ã€ããäœæããŠãèŠèŠã»è§Šæã¬ãã«ã§ã®ã£ãããåããŠããããšã§ãããã¹ã圢ã«åããŠæŽç·ŽãããŠãããŸãã ⣠â ã ⢠ã®ã¿ã€ãã³ã°ãåãããå¿
èŠã«å¿ããŠé¢ä¿è
ãšçžè«ããªããé²ããŠãããŸãããšã³ãžãã¢ãç«ãŠã仮説ããã¶ã€ããŒã®ç®ç·ã§è©äŸ¡ã» UI/UX æé©åãããŠé ãããã倧ããã®æ©èœã«ã€ããŠã¯ãå»çæ©é¢ã«ãã€ãããéçšã®ãååãä»°ãã ãããããšããããŸãã â åã³ â¡ ã®é
ã«äœæ¥ã®ãŠã§ã€ããåã£ãŠããããã«èŠããããšæããŸããå®éã課é¡ã解決ããçºã®åå以äžãããã«å²ããŠããŸãã çç±ã¯ãïŒåºŠäœã£ãŠå
¬éããæ©èœãã¯ããã®åŸïŒäººæ©ããããŠäœæè
ã®æå³ããªãæ¹åã§å©çšããããããšãããããã§ãã ãããŠãå©çšè
ããã®éçšãå®çãããŠããŸã㚠誀ã£ãæ©èœã«ãããŠããåãèœãšãããšãå°é£ã ã§ããããã¯ã䜿ãããŠããªãæ©èœããããçŽæ¥çãªè² åµãšãã£ã圢ã§ããã£ãããŒã®ããã«å¹ããŠããŸãã ãã©ã®ãããªäœ¿ããæ¹ãããããã«ã€ããŠæ³åããããš ãã®äœ¿ããæ¹ãããããã¯ãã®ç®æãäžçãšåã£ãŠããããš ãšã³ãžãã¢ã¯æè¡ã圢ã«ããäžã§ãåžžã«æ³ååãåãããŠåãçµãå¿
èŠãããã ãšããã®ãçè
ã®æè«ã§ãã ãããã« å·çã®ç· ãã«ããã£ãŠ CTO ããã°ãèŠè¿ããŠã¿ããšã倧äºãªããšã¯ããã«è©°ãŸã£ãŠããŸãããçè
ã¯åè·ã® SIer æä»£ã«èªãã ã®ã§ããããã®èšäºã«ãããå
±æããã®ãèŠããŠããŸãã toppa.medley.jp toppa.medley.jp ã¡ãã¬ãŒã§ã¯ å»çãã«ã¹ã±ã¢ã®æªæ¥ãäœã ãšãã倧ããªç®æšããããŠãã®æªæ¥ãäœãçºã«è§£æ±ºãã¹ã課é¡ã«åãã£ãŠãä»åã玹ä»ããããã»ã¹ãèãæ¹ãå«ã詊è¡é¯èª€ããªãããäºæ¥éšäžäžžã§ãããã¯ãéçºãæšé²ããŠããŸãã ãšã³ãžãã¢ã®ç·ååãçºæ®ããŠå»çãã«ã¹ã±ã¢ã®æªæ¥ãäžç·ã«äœãäžããŠããããïŒãšããæ¹ã«ãäŒãåºæ¥ãããšã楜ãã¿ã«ããŠãããŸãã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
åããŸããŠãCLINICS ã®éçºãæ
åœããŠãããšã³ãžãã¢ã®å¹³å±±ã§ãã ïŒåå§ã§ãã CTO ã§ã¯ããããŸããïŒ CLINICS ã®éçºã¯ãã¹ã¢ãŒã«ããŒã å¶ãããšã£ãŠãããŸããŠãçŸåšãã®ãã¡ã®ïŒã€ãããŒã ãªãŒãããŠããŸãã åè·ã¯é·ãã SIer ã«å€ããŠããŸãããå»å¹Žã® 12 æã«ã¡ãã¬ãŒã« JOIN ããŠãéãç¡ãïŒå¹ŽçµãšããšããŠãããããšæããšããã£ãšããéã ã£ããªããšããå°è±¡ã§ãã ããŠãæ¬æ¥ã¯ã¡ãã¬ãŒã§éé±éå¬ããŠãã瀟å
å匷äŒïŒTechLunchïŒã«ãããŠçºè¡šããå
容ã«ã€ããŠã玹ä»ãããŠé ããã°ãšæããŸãã ã¯ããã« ãæè¡ã䜿ãããã®æè¡ããšããããŒããšãªããŸããããããã¯ãéçºãããŠããäžã§ã¯æ¬ ãããªãçŽ é€ãšèããŠããŸããã¡ãã¬ãŒã«æå±ããŠãããšã³ãžãã¢ã®ïŒäººãšããŠãã©ã®ããã«æ¥ã
課é¡ãšåãåã£ãŠããã®ããåœããŒããéããŠãäŒãã§ããã°ãšæããŸãã ãŸãããã®èãæ¹èªäœã¯ãå»çãšããããŒããããäºæ¥ã®èæ¯ïŒãã³ãã£ãŒã» SIerïŒããåããå¿
èŠãšãããå Žé¢ããããããããŸãããïŒèªèº«ãåè·ã§ã¯æ§ã
ãªå Žé¢ã§ãäžè©±ã«ãªããŸããâŠïŒ å³å¹æ§ã®ãããã®ã§ã¯ãããŸããããããããå¹ããŠããå
容ã§ã¯ãªãããšæããŸãããããããã°ãä»ãåããã ããã æ¬é¡ ãæè¡ã䜿ãããã®æè¡ã ã¿ãªããã¯ãã®èšèãããäœãæãæµ®ãã¹ãã§ãããããçè
ã詊ãã« Google ã§æ€çŽ¢ããéäžäœã«ãããããã®ã¯ AI ãšã³ãžã㢠IoT ãšãã£ãçµæã§ããããªãã»ã©ãå°ãéã«è§£éãããšãæè¡ïŒã¢ã«ãŽãªãºã çïŒã䜿ãããã®æè¡ïŒæ©æ¢°åŠç¿ãå®¶é»çïŒããšãã£ãæããªã®ã§ãããããïŒãã®çµæãæŸã£ãŠãããšããã®ããããæå³ã§ Google ããããªã£ãŠæããŸããïŒ çè
ãä»åã®ããŒããšããŠæããŠããã®ã¯ãäžèšãšãªããŸãã ããžã«ã«ã·ã³ãã³ã° æšè« ãããã® æèãæŽçãããææ®µã ãšãšã³ãžãã¢ã®æŠåšã§ãã æè¡ãšãããææ®µã ãããåãããããšã§ã倧ããªããŒãã§ãããå»çãã«åãåã£ãŠããŸãã ææ®µãç®çã«ããŠã¯ãªããªã å
ã«æãããšãããæèã®æŽçãããæè¡ãã ãææ®µã ã«éããŸãããããããçšããŠãé©åãªäžæãæããŠããçºã«ã¯ãç®çãã«å¯Ÿããè§£å床ãé«ãæãå¿
èŠããããŸãã çè
ã®çºè¡šããæç²ãããæè¡ã䜿ãããã®æè¡ãã®èŠçŽ ãã€ã¡ãŒãžããå³ æŽçå ç®çãéæããçºã«å¿
èŠãªãæ
å ±ããåæšéžæããããã®èŠçŽ ã SaaS âïž toB ã®äžçã«ãããŠã¯ããããã¯ãã解決ãã¹ã課é¡ãåŠããæ¥åã®æ¬è³ªãèžãŸããŠåæšéžæããããšèšãæãããããããããŸããã æ¥åç¥è ç®çã®ãè§£å床ããé«ããããã®èŠçŽ ã CLINICS ã«ãããŠã¯ãå»çæ
å ±ãæ±ãäžã§ã®èŠå¶ïŒ3 ç 2 ã¬ã€ãã©ã€ã³ïŒããå»çæ©é¢ïŒå»åž«ã»å»äºã»èšºçç§ã®ç¹æ§ïŒã®æ¥åã蚺çå ±é
¬ã«ã€ããŠã®ç¥èãæ³æ¹æ£ãã¬ã»ã³ã³ïŒORCAïŒâŠ ãšæ§ã
ãããŸãã æè¡ç¥è ç®çãéæããçºã«å¿
èŠãªãæãæããéžæããããã®èŠçŽ ã ïŒãšã³ãžãã¢ã«ãšã£ãŠã¯èª¬æãããŸã§ããªãå
容ã§ãããšæããŸããïŒ ãããæ¬ ããŠããŸããšçµµã«æããé€
ã§çµãã£ãŠããŸããŸããã¡ãã¬ãŒã®ãšã³ãžãã¢ã«ãããŠãæ¥ã
ç éœãããããã¯ãã«å¯ŸããŠã³ããããç¶ããŠããŸãã è¡åå ç®çãéæããããã®ãæšé²åããé«ããããã®èŠçŽ ã åçš®ç¥èãšæŽçããæ
å ±ãæšé²åã«å€ããŠããçºã«ã¯ããã®æã®ç¶æ³ã«å¿ããåããããå¿
èŠããããŸããã¹ããŒã¯ãã«ããŒãšã®èª¿æŽã¯åœç¶ã§ãããçµç¹å
飿ºãšãã£ããæšªã®åãããå¿
èŠã§ãã æ³åå ãããŸã§æããããããã®ææ®µãé©åã«å©çšããŠããããã®èŠçŽ ãšããŠã®åå°ããæ³ååãã§ãããšèããŠããŸãã 課é¡ïŒIssueïŒãžã®åãçµã¿äŸ çªå· æŠèŠ â Issue ã«åãçµãéã«ãæ¬åœã«è§£æ±ºãã¹ãããšãã«ã€ããŠã®æ³åãåãããŸããIssue ã«èšèŒãããŠããããšã æ¬åœã«ãããã¯ããšããŠè§£æ±ºãã¹ãããšãªã®ã ãå«ããŠèããŸãããããŸã§ã®éçšãå¿
ãããæ£ããããã§ã¯ãªãããšããç¹ããã€ã³ãã§ãã â¡ â ã«ã€ããŠãæ³åã®ãŸãŸãã§çµããããŠã¯ãããªãã®ã§ãæ¥åç¥èãšç
§ããåãããŠç¢ºåºŠãé«ããŠãããŸããåžžå€å»åž«ãã«ã¹ã¿ããŒãµããŒãã«ãã¢ãªã³ã°ããªããã å»çæ¥åãšããŠã®ããã¹ã圢ã®è§£å床ãäžããŠãã ããã»ã¹ã§ãã ⢠â åã³ â¡ ã§é«ããè§£å床ã¯èšèã®å»¶é·ç·äžãªã®ã§ãé¢ä¿è
éã®èªèã®ã®ã£ãããçºçããããã§ãããããã¿ã€ããäœæããŠãèŠèŠã»è§Šæã¬ãã«ã§ã®ã£ãããåããŠããããšã§ãããã¹ã圢ã«åããŠæŽç·ŽãããŠãããŸãã ⣠â ã ⢠ã®ã¿ã€ãã³ã°ãåãããå¿
èŠã«å¿ããŠé¢ä¿è
ãšçžè«ããªããé²ããŠãããŸãããšã³ãžãã¢ãç«ãŠã仮説ããã¶ã€ããŒã®ç®ç·ã§è©äŸ¡ã» UI/UX æé©åãããŠé ãããã倧ããã®æ©èœã«ã€ããŠã¯ãå»çæ©é¢ã«ãã€ãããéçšã®ãååãä»°ãã ãããããšããããŸãã â åã³ â¡ ã®é
ã«äœæ¥ã®ãŠã§ã€ããåã£ãŠããããã«èŠããããšæããŸããå®éã課é¡ã解決ããçºã®åå以äžãããã«å²ããŠããŸãã çç±ã¯ãïŒåºŠäœã£ãŠå
¬éããæ©èœãã¯ããã®åŸïŒäººæ©ããããŠäœæè
ã®æå³ããªãæ¹åã§å©çšããããããšãããããã§ãã ãããŠãå©çšè
ããã®éçšãå®çãããŠããŸã㚠誀ã£ãæ©èœã«ãããŠããåãèœãšãããšãå°é£ã ã§ããããã¯ã䜿ãããŠããªãæ©èœããããçŽæ¥çãªè² åµãšãã£ã圢ã§ããã£ãããŒã®ããã«å¹ããŠããŸãã ãã©ã®ãããªäœ¿ããæ¹ãããããã«ã€ããŠæ³åããããš ãã®äœ¿ããæ¹ãããããã¯ãã®ç®æãäžçãšåã£ãŠããããš ãšã³ãžãã¢ã¯æè¡ã圢ã«ããäžã§ãåžžã«æ³ååãåãããŠåãçµãå¿
èŠãããã ãšããã®ãçè
ã®æè«ã§ãã ãããã« å·çã®ç· ãã«ããã£ãŠ CTO ããã°ãèŠè¿ããŠã¿ããšã倧äºãªããšã¯ããã«è©°ãŸã£ãŠããŸãããçè
ã¯åè·ã® SIer æä»£ã«èªãã ã®ã§ããããã®èšäºã«ãããå
±æããã®ãèŠããŠããŸãã https://toppa.medley.jp/02.html ã¡ãã¬ãŒã§ã¯ å»çãã«ã¹ã±ã¢ã®æªæ¥ãäœã ãšãã倧ããªç®æšããããŠãã®æªæ¥ãäœãçºã«è§£æ±ºãã¹ã課é¡ã«åãã£ãŠãä»åã玹ä»ããããã»ã¹ãèãæ¹ãå«ã詊è¡é¯èª€ããªãããäºæ¥éšäžäžžã§ãããã¯ãéçºãæšé²ããŠããŸãã ãšã³ãžãã¢ã®ç·ååãçºæ®ããŠå»çãã«ã¹ã±ã¢ã®æªæ¥ãäžç·ã«äœãäžããŠããããïŒãšããæ¹ã«ãäŒãåºæ¥ãããšã楜ãã¿ã«ããŠãããŸãã https://www.medley.jp/jobs/
ããã«ã¡ã¯ã第äºéçºã°ã«ãŒããšã³ãžãã¢ã®è¥¿æã§ãã䞻㫠CLINICS ã®éçºãæ
åœããŠããŸãã ã¯ããã« CLINICS ã¯é»åã«ã«ãããªã³ã©ã€ã³èšºçãäºçŽã·ã¹ãã ãæ£è
ã¢ããªãªã©ãå«ãçµ±åã¢ããªã§ããCLINICS ãããŒã³ãããŠããçŸåšã«è³ããŸã§åžžã«æ°æ©èœéçºãšå®åžžæ¹åãè¡ãããŠãããéçºç°å¢ã®ã¡ã³ããã³ã¹ã¯åŸæã«ãªããã¡ã§ãããä»åã¯ãããã£ãç¶æ³ãæ¹åãã¹ããéçºç°å¢ã®ã¡ã³ããã³ã¹ããªãã¡ã¯ã¿ãªã³ã°ãè¡ã£ãéçšããåŸããããã©ã¯ãã£ã¹ã«ã€ããŠç޹ä»ããŠããããšæããŸãã ã¢ãããŒã·ã§ã³ ãããã¯ãã®æ°èŠéçºæã«è¡ãããæè¡éžå®ã¯éåžžã«é£ãããæ¥åèŠä»¶ãããŒã ç¶æ³ãªã©ç·åçã«èæ
®ããŠãã®æç¹ã§ã®ãã¹ããªéžæãããå¿
èŠããããŸãã ããããéžæããæè¡ã§é·æéçšãããŠãããã¡ã«ãã¡ã³ããã³ã¹ãè¡ãå±ããªããªã£ãã³ãŒããã©ã€ãã©ãªãåºãŠããŸããŸãã CLINICS ããŒã³ãåœåã¯ãªã³ã©ã€ã³èšºçã®ã¿ãæäŸããŠããŸãããSPA ã§æ§æãããŠããŸããããïŒã€ã® package.json ã§å¹ççã«éçºã§ããŠããŸãããä»ã«ãçŸåšã»ã© TypeScript ãäž»æµã§ã¯ãªãã£ãã®ã§ JavaScript ã®ã³ãŒããã¡ã€ã³ã§å®è£
ãããŠãŸããã æ°ããªã¢ããªã±ãŒã·ã§ã³ïŒé»åã«ã«ããäºçŽã·ã¹ãã ãªã©ïŒãå°å
¥ããã¿ã€ãã³ã°ãããªãã¡ãããã¯ããå°èŠæš¡ããäžèŠæš¡ã«å€é·ããã¿ã€ãã³ã°ããããã³ããšã³ãã®ææµã«ãã£ãŠãéçºç°å¢ãæ¹åã§ããéšåããããŸãããããããŠããªãéšåãåºãŠããŸããã ãã®æ¹åããããŠããªãéšåãæ®ãç¶æ
ãç¶ããš Developer Experience(DX)ã®äœäžã«ç¹ãã£ãŠããŸããŸããã§ãã®ã§ãç§ãã¡ã¯æ¹åããããŠããªãéšåãåãé€ããŠãããããã¢ãã³ãšãããéçºç°å¢ãžãªãã¡ã¯ã¿ãªã³ã°ãããŠããããšèããŸããã DX ãåäžããŠããããšã§æè¡çãªãã€ãºã«æéãåãããªãããã«ãªããŸãããããŠæäŸããæ©èœãã®ãã®ã«ã€ããŠèããæéãå¢ããçµæçã« CLINICS ãããè¯ããããã¯ããžé²åãããŠããã®ãåœãªãã¡ã¯ã¿ãªã³ã°ã®ç®çã§ãã èª²é¡æŽç æ¹åããŠããããã«ã¯ãçŸç¶æŽçãèª²é¡æŽçãè¡ããªãããšã«ã¯äœãå§ãŸããŸãããããã³ããšã³ãéçºç°å¢ãã¡ã³ããã³ã¹ããã¿ã¹ã¯ã¯ããããã¯ãã®æ©èœïŒãŠãŒã¶ã«æäŸãããæ©èœïŒã«çŽæ¥ãã©ã¹ã®åœ±é¿ãããããã§ã¯ãããŸãããèªããšéåžžã®æ©èœéçºãå®åžžæ¹åã«æ¯ã¹åªå
床ã¯èœã¡ããããã¹ããæéã§æ¹åãããŠããããšã«ãªããŸããããããã¹ããæéãæå¹æŽ»çšããããã«ã¯ãã¿ã¹ã¯ã®é£æåºŠã®çè§£ãã¿ã¹ã¯ãé©åœã«åå²ããã§ãŒãžã³ã°ã®èšç»ãè¡ãããšã極ããŠå€§äºã§ãã ãã®ããã«èæ
®ãã課é¡ã®äžã§ãæ¬èšäºã§èšèŒããã®ã¯ä»¥äžã®ïŒã€ã§ãã ã©ã€ãã©ãªã宿çã«ã¢ããããŒãããéçšãåºãŸã£ãŠãªã éçšæ¹åŒãåºãŸã£ãŠããªãããšã§ãæŸçœ®ãããŠããŸããã¡ã§ããçå
ããŠã¢ããããŒãããã¡ã³ããŒããããšããŠããå±äººåã®èª²é¡ãæ®ã£ãŠããŸããŸã æŸçœ®ãããŠããŸã£ãããšã«ãããææ°çãšã®å·®åã倧ãããªãã¢ããããŒãããã³ã¹ãã倧ãããªã£ãŠããŸããŸã çµæçã«ãã©ã€ãã©ãªã®ã»ãã¥ãªãã£ãã£ãã¯ã¹å¯Ÿå¿ãæ°ããæäŸãããæ©èœãããã«é©å¿ã§ããªãç°å¢ã«ãªã£ãŠããŸããŸã è€æ°ã® SPA ã®äŸåãïŒã€ã® package.json ã§ç®¡çããŠãã é»åã«ã«ãã»ãªã³ã©ã€ã³èšºçã瀟å
管ç Web ã¢ããªãæ£è
Web ã¢ããªã¯ããããå¥ã® SPA ãšããŠäœãããŠããŸã ããããïŒã€ã® package.json ã§ç®¡çããŠããããããããã® SPA ãåãäŸåããã±ãŒãžã䜿ããªããŠã¯ãªããŸãããå°èŠæš¡ã®ãšãã¯ãã®ãããªæ§æã§ååã§ããããèŠæš¡ã倧ãããªãã«ã€ããŠæè»æ§ã倱ããããšå
±ã«ãã©ã€ãã©ãªã®ã¢ããããŒãããããã圱é¿ç¯å²ãåºãã£ãŠããŸãããã容æã«ã¢ããããŒãã§ããªããªã£ãŠããŸããŸã æ¬èšäºã§ã¯èšèŒããŸããããRedux ã®æžãæ¹ãæ··åšããŠããããããã³ããšã³ãã®ãã¹ããå°ãªãããç¶²çŸ
çã« TypeScript åã§ããŠããªã JavaScript ããŸã æ®ã£ãŠããããªã©ã®èª²é¡ãæããããŸããã ãããã課é¡ã¯ãã©ã®ãããã¯ãã«ãååšãããšæããŸããããã¯ããŒã³ãåœæã®æè¡æµè¡ã§ãã£ããããããã¯ãã®æåŸ
èŠæš¡ãå°æ°ã¡ã³ãã«é©ããèšèšãªã©èŠå ã¯æ§ã
ãããããã°ã©ã ã®ãªãã¡ã¯ã¿ãªã³ã°ãšåæ§ã« ãããã¯ãã®æé·ã«äŒŽã£ãŠãªãã¡ã¯ã¿ãªã³ã°ããŠããããšãæ£ ã ãšä¿¡ããŠããŸãã ã¢ãããŒã·ã§ã³ã«ãŠèšèŒããéãããããè€æ°ã®èª²é¡ã¯éçºç°å¢ã®ãã€ãºã§ãããé€å»ããããšã«ãã£ãŠãããè¯ã DX ãåŸããããšèããŠããŸããä»ã«ãã®ãããªãªãã¡ã¯ã¿ãªã³ã°ãè¡ãããšã«ãã£ãŠããããã¯ããããå
ç¢ã«ã§ãããšããåŽé¢ããããŸãã äžèšã®ïŒã€ã®èª²é¡ã«å¯ŸããŠãããããã©ã€ãã©ãªã宿çã«ã¢ããããŒãããéçšææ®µãèšããããpackage.json ã SPA åäœã«åå²ããã話ãããããããŠãããŸãã ããã³ããšã³ãéçºç°å¢ã®ãªãã¡ã¯ã¿ãªã³ã° ã©ã€ãã©ãªã®å®æçãªã¢ããããŒããããéçšæé ãèšãã æåã¢ããããŒã ã©ã€ãã©ãªãã¢ããããŒãããã«ã¯ã³ãã³ããå©ãã ãã ãšèããŠããŸããããäŸåããŠããå¥ã®ã©ã€ãã©ãªã«åœ±é¿ãæ¬åœã«ãªãããªã©èª¿æ»ããå¿
èŠããããšç¥ããã©ã€ãã©ãªã®ã¢ããããŒãæ¹æ³ã暡玢ãããšããããéå§ããŸããã ã©ã€ãã©ãªã§ã¯ãªãã§ãããNode.js ã®ã¢ããããŒããããããšãããšãnode-sass ã Firebase ã圱é¿ããŠãããããŠãèã¥ãåŒã§æ ¹ã£ãã«ããã©ã€ãã©ãªã®ã¢ããããŒããããå¿
èŠãåºãŠãããããã®ã§ãäžã€äžã€åé¡ããªãã調æ»ããã®ã倧å€ã§ããã äœãããã¢ããããŒã察象ã©ã€ãã©ãªã®ãªãªãŒã¹ããŒãã« Breaking Changes ãæžãããŠããªãã£ãããsemver ãå®ãããŠãããããããªãã£ãããšããããã¯ãã«åœ±é¿ããªãã調ã¹ãå¿
èŠããããåé¡ã®åãåãæ¹ãé£ããã£ãã®ã§ãã ããã§åŸãããã©ã€ãã©ãªã¢ããããŒãã®å®å
šæ§æ
ä¿ã®ãã©ã¯ãã£ã¹ãšã㊠webpack ã«ãããã«ãçµæãå€ãããªãã±ãŒã¹ ãšã QA ãã¹ãã«ãã£ãŠæ
ä¿ããã±ãŒã¹ ãããããšãããããŸãããåè
㯠webpack ã«ããææç©ãå€ãããªãã®ã§ããã°ä»åã®ã¢ããããŒããå®å
šã§ãããšãããåŸè
ã¯ãšã³ãžãã¢ãš QA ãšã³ãžãã¢ã«ãã£ãŠã©ã€ãã©ãªã®åœ±é¿ç¯å²ã«ãã¬ãŒã·ã§ã³ããªãããšã確ãããŠå®å
šã§ãããšããããšãããã®ã§ãã renovate ã®éçšéå§ æ°ã«æéã¯äžèšã®ããã«ã©ã€ãã©ãªã®ã¢ããããŒããæåã§è¡ã£ãŠããŸãããã確èªå·¥æ°ãå¢ããŠããŸããä»ã®ã¿ã¹ã¯ã®æéãå§è¿«ããŠããŸãã»ã©ã§ããã ããã§ãã¢ããããŒããèªååãã renovate  㚠dependabot ãèŠéã«å
¥ããŸãããrenovate ã¯ãdependabot ã«æ¯ã¹ãŠé«æ©èœã§ãã€ãç¡æã§ãããšããçç±ã§éžå®ããŸããã éçšåœåãrenovate ã Pull Request ãäœæããŠãããããdiff ã«ããã©ã€ãã©ãªã®å€æŽç¹ãèŠãããã£ãããšãæ©æµãæããŠããŸãããããããåŸã
ã«ãã¢ããããŒã察象ãå€ãããããããã©ãããã©ã€ãã©ãªã§ã圱é¿ç¯å²ãã©ããªã®ãããšããããšã®èª¿æ»ã«æéãåãããããã«ãªã£ãŠããŸããŸããã ããã§åŸãããèª¿æ»æéãççž®ãããã©ã¯ãã£ã¹ãšããŠ**ãæ¬çªåœ±é¿ã®ãããã®ããéçºåããããã«ãåšãããš renovate ããæ¥ã Pull Request ãæŽçãã**ããšã§ãããã®ãããªæŽçãè¡ãããšã§ãæ¬çªåœ±é¿ã®ãããã®ã«æ³šåããŠã¬ãã¥ãŒã§ããããã«ãªããèŠã«ãªããã«ã¢ããããŒããã§ããããã«ãªããŸããã çµæ ã©ã€ãã©ãªã¢ããããŒãã®éçšæé ãèšããããšã«ãã£ãŠãä»ãŸã§ä»¥äžã«å
ç¢ãªç°å¢ã«ãªããŸããããããããrenovate ã«ãã£ãŠèªåçã«éèŠãªïŒæ¬çªåœ±é¿ã®ããïŒã©ã€ãã©ãªã®ã¿ã«éäžããŠã¬ãã¥ãŒãè¡ãããšã«ãã£ãŠãå°ãªãå·¥æ°ã§ã¢ããããŒãããŠãããããã«ãªããŸããã package.json ã SPA åäœã«åå² èª²é¡æŽçã§èšèŒããéããé»åã«ã«ãã»ãªã³ã©ã€ã³èšºçã瀟å
管ç Web ã¢ããªãæ£è
Web ã¢ããªã¯ããããå¥ã® SPA ãšããŠäœãããŠããŸãããïŒã€ã® package.json ã§ç®¡çããŠããŸããã§ãã®ã§ããããã® SPA ãåãäŸåããã±ãŒãžã䜿ããªããã°ãªããŸããã åŒå®³ãšã㊠package.json ã«å¯ŸããŠïŒã€ã®å€æŽããã£ããšãã«ãã¹ãŠã® SPA ã«åœ±é¿ãåºãŠããŸããŸããã§ãã®ã§ããã®è¥å€§åãã package.json ãããããã® SPA ã«åå²ããããšããŸããã package.json ã SPA åäœã«åå²ããããšã¯ 責ååé¢ ãšããåŽé¢ããããã©ã€ãã©ãªã ãã§ãªããå
±éããŠãã宿°ãããžãã¯ãã³ã³ããŒãã³ããwebpack.config.jsãbabel.config.js ãš tsconfig.json ãªã©ãã¹ãŠãããããã® SPA ã«äŸåã®ãªã圢ã«éããããã«ããŸããããããã®åå²ããäœæ¥ã¯éåžžã«æ³¥èããã®ã§ãæ¬èšäºã«èšèŒããã»ã©ã®ãã®ã§ã¯ãããŸããããåŸãããçµæã«ã€ããŠèšèŒããŠããããšæããŸãã çµæ ãŸãã責ååé¢ãã§ããã®ã§ãïŒã€ã® SPA ã«å¯Ÿãã倿Žããã£ããšãã«ãä»ã®å
šãŠã® SPA ã«å¯Ÿãã圱é¿ãåºãªããªããŸããããã£ãŠãïŒã€ã® SPA ã«å¯ŸããŠæ°ã㪠Web ãã¬ãŒã ã¯ãŒã¯ãã©ã€ãã©ãªã詊ãããšã容æã«ãªããŸãããä»ã«ããïŒã€ã® webpack ã§ãã¹ãŠã® SPA ãã·ãŒã±ã³ã·ã£ã«ã«ãã«ãããŠããã®ã«å¯ŸããŠãçŸåšã¯ãã©ã¬ã«ã§ãã«ãã§ããããã«ãªããã«ãæéãççž®ããããããä»ãŸã§ä»¥äžã«ã³ããããããããã€ãŸã§ã®ã€ãã¬ãŒã·ã§ã³ãå°ãããªããŸããã ãããã®çµæããããã³ãéçºç°å¢ã®æ¹åããã³ DX åäžãæãããŸããã ä»åŸã®èª²é¡ æç¶çãªãªãã¡ã¯ã¿ãªã³ã°ãããä»çµã¿äœã ãã©ã€ãã©ãªã®å®æçãªã¢ããããŒããããéçšæé ãèšãããã¯ãŸãã«æç¶çã«ã©ã€ãã©ãªãã¢ããããŒãããããã®ææ®µã§ãããpackage.json ã SPA åäœã«åå²ããããããããã® SPA ãã¡ã³ããã³ã¹ããããç°å¢äœããšããŠã¯æ¬ ãããªãäœæ¥ã§ããã ãããããã®ãŸãŸãªãã¡ã¯ã¿ãªã³ã°ãäžæããã°ããããã¯ãã®èŠæš¡ã倧ãããªããšããããã³ããšã³ãã®ææµã«ãã£ãŠåã³ã¡ã³ããã³ã¹ãã¥ããç°å¢ã«ãªã£ãŠããŸããŸãã ãªã®ã§ãæç¶çãªãªãã¡ã¯ã¿ãªã³ã°ãããããã«ã¯ä»çµã¿äœããæ¬ ãããªããšèããŠããŸãããã®ããã«ã¯ãå±äººåã«ãããªãä»çµã¿ã¥ãããã¡ã³ããã³ã¹ããããç°å¢æ¹åããšã³ãžãã¢ããããã®ããã³ããšã³ãéçºç°å¢ã«å¯Ÿãããªãã©ã·ãé«ããåãçµã¿ãè¡ã£ãŠããå¿
èŠããããŸãããã®ãããçŸåš æšªè»žååŒ·äŒ ãªã©ã§ CLINICS ããã³ããšã³ãã®å®è£
èæ¯ãããªãã¡ã¯ã¿ãªã³ã°ããããæžãæ¹ãªã©ã®ãã¬ããžãå
±æããŠããŸãã ãŸãšã ããã³ããšã³ãéçºç°å¢ã®ã¡ã³ããã³ã¹ã»ãªãã¡ã¯ã¿ãªã³ã°èªäœã¯ãããŸã§ããŠãŒã¶ã«æ°ããæ©èœãæäŸããŠããããã§ã¯ãªããç²ã
ãšè¡ã£ãŠãããã®ã§ãããããã課é¡ãæŽãåºããåãåã£ãŠã解決ããŠãã£ãããšã«ãã£ãŠåŸããããã©ã¯ãã£ã¹ã¯å€ããããããã³ããšã³ãã®ãšã³ã·ã¹ãã ã«å¯Ÿããçè§£ãå€ãåŸãããŸããã ãããã®ãªãã¡ã¯ã¿ãªã³ã°ãè¡ãããšã«ãã£ãŠ DX ãåäžããŠãããæè¡çãªãã€ãºã«æ©ãæéãæžãããšã³ãžãã¢ã¯ãããããã¯ãã®æ©èœéçºã«å°å¿µã§ããããã«ãªã£ãŠãããšä¿¡ããŠããŸãã ä»åç§ãã¡ã課é¡ã解決ããããšã«ãã£ãŠãæç¶çã«ãªãã¡ã¯ã¿ãªã³ã°ãããããåå°äœãããããšããåŽé¢ããããšæããŸããä»åŸã®èª²é¡ãšããŠããã®åå°ãåºã«ããããã®ãšã³ãžãã¢ãæèãæã£ãŠã¡ã³ããã³ã¹ã§ãããããªä»çµã¿ã¥ãããè¡ã£ãŠãããããšæããŸãã æåŸãŸã§èªãã§ããã ãããããšãããããŸããã www.medley.jp
ããã«ã¡ã¯ã第äºéçºã°ã«ãŒããšã³ãžãã¢ã®è¥¿æã§ãã䞻㫠CLINICS ã®éçºãæ
åœããŠããŸãã ã¯ããã« CLINICS ã¯é»åã«ã«ãããªã³ã©ã€ã³èšºçãäºçŽã·ã¹ãã ãæ£è
ã¢ããªãªã©ãå«ãçµ±åã¢ããªã§ããCLINICS ãããŒã³ãããŠããçŸåšã«è³ããŸã§åžžã«æ°æ©èœéçºãšå®åžžæ¹åãè¡ãããŠãããéçºç°å¢ã®ã¡ã³ããã³ã¹ã¯åŸæã«ãªããã¡ã§ãããä»åã¯ãããã£ãç¶æ³ãæ¹åãã¹ããéçºç°å¢ã®ã¡ã³ããã³ã¹ããªãã¡ã¯ã¿ãªã³ã°ãè¡ã£ãéçšããåŸããããã©ã¯ãã£ã¹ã«ã€ããŠç޹ä»ããŠããããšæããŸãã ã¢ãããŒã·ã§ã³ ãããã¯ãã®æ°èŠéçºæã«è¡ãããæè¡éžå®ã¯éåžžã«é£ãããæ¥åèŠä»¶ãããŒã ç¶æ³ãªã©ç·åçã«èæ
®ããŠãã®æç¹ã§ã®ãã¹ããªéžæãããå¿
èŠããããŸãã ããããéžæããæè¡ã§é·æéçšãããŠãããã¡ã«ãã¡ã³ããã³ã¹ãè¡ãå±ããªããªã£ãã³ãŒããã©ã€ãã©ãªãåºãŠããŸããŸãã CLINICS ããŒã³ãåœåã¯ãªã³ã©ã€ã³èšºçã®ã¿ãæäŸããŠããŸãããSPA ã§æ§æãããŠããŸããããïŒã€ã® package.json ã§å¹ççã«éçºã§ããŠããŸãããä»ã«ãçŸåšã»ã© TypeScript ãäž»æµã§ã¯ãªãã£ãã®ã§ JavaScript ã®ã³ãŒããã¡ã€ã³ã§å®è£
ãããŠãŸããã æ°ããªã¢ããªã±ãŒã·ã§ã³ïŒé»åã«ã«ããäºçŽã·ã¹ãã ãªã©ïŒãå°å
¥ããã¿ã€ãã³ã°ãããªãã¡ãããã¯ããå°èŠæš¡ããäžèŠæš¡ã«å€é·ããã¿ã€ãã³ã°ããããã³ããšã³ãã®ææµã«ãã£ãŠãéçºç°å¢ãæ¹åã§ããéšåããããŸãããããããŠããªãéšåãåºãŠããŸããã ãã®æ¹åããããŠããªãéšåãæ®ãç¶æ
ãç¶ããš Developer Experience(DX)ã®äœäžã«ç¹ãã£ãŠããŸããŸããã§ãã®ã§ãç§ãã¡ã¯æ¹åããããŠããªãéšåãåãé€ããŠãããããã¢ãã³ãšãããéçºç°å¢ãžãªãã¡ã¯ã¿ãªã³ã°ãããŠããããšèããŸããã DX ãåäžããŠããããšã§æè¡çãªãã€ãºã«æéãåãããªãããã«ãªããŸãããããŠæäŸããæ©èœãã®ãã®ã«ã€ããŠèããæéãå¢ããçµæçã« CLINICS ãããè¯ããããã¯ããžé²åãããŠããã®ãåœãªãã¡ã¯ã¿ãªã³ã°ã®ç®çã§ãã èª²é¡æŽç æ¹åããŠããããã«ã¯ãçŸç¶æŽçãèª²é¡æŽçãè¡ããªãããšã«ã¯äœãå§ãŸããŸãããããã³ããšã³ãéçºç°å¢ãã¡ã³ããã³ã¹ããã¿ã¹ã¯ã¯ããããã¯ãã®æ©èœïŒãŠãŒã¶ã«æäŸãããæ©èœïŒã«çŽæ¥ãã©ã¹ã®åœ±é¿ãããããã§ã¯ãããŸãããèªããšéåžžã®æ©èœéçºãå®åžžæ¹åã«æ¯ã¹åªå
床ã¯èœã¡ããããã¹ããæéã§æ¹åãããŠããããšã«ãªããŸããããããã¹ããæéãæå¹æŽ»çšããããã«ã¯ãã¿ã¹ã¯ã®é£æåºŠã®çè§£ãã¿ã¹ã¯ãé©åœã«åå²ããã§ãŒãžã³ã°ã®èšç»ãè¡ãããšã極ããŠå€§äºã§ãã ãã®ããã«èæ
®ãã課é¡ã®äžã§ãæ¬èšäºã§èšèŒããã®ã¯ä»¥äžã®ïŒã€ã§ãã ã©ã€ãã©ãªã宿çã«ã¢ããããŒãããéçšãåºãŸã£ãŠãªã éçšæ¹åŒãåºãŸã£ãŠããªãããšã§ãæŸçœ®ãããŠããŸããã¡ã§ããçå
ããŠã¢ããããŒãããã¡ã³ããŒããããšããŠããå±äººåã®èª²é¡ãæ®ã£ãŠããŸããŸã æŸçœ®ãããŠããŸã£ãããšã«ãããææ°çãšã®å·®åã倧ãããªãã¢ããããŒãããã³ã¹ãã倧ãããªã£ãŠããŸããŸã çµæçã«ãã©ã€ãã©ãªã®ã»ãã¥ãªãã£ãã£ãã¯ã¹å¯Ÿå¿ãæ°ããæäŸãããæ©èœãããã«é©å¿ã§ããªãç°å¢ã«ãªã£ãŠããŸããŸã è€æ°ã® SPA ã®äŸåãïŒã€ã® package.json ã§ç®¡çããŠãã é»åã«ã«ãã»ãªã³ã©ã€ã³èšºçã瀟å
管ç Web ã¢ããªãæ£è
Web ã¢ããªã¯ããããå¥ã® SPA ãšããŠäœãããŠããŸã ããããïŒã€ã® package.json ã§ç®¡çããŠããããããããã® SPA ãåãäŸåããã±ãŒãžã䜿ããªããŠã¯ãªããŸãããå°èŠæš¡ã®ãšãã¯ãã®ãããªæ§æã§ååã§ããããèŠæš¡ã倧ãããªãã«ã€ããŠæè»æ§ã倱ããããšå
±ã«ãã©ã€ãã©ãªã®ã¢ããããŒãããããã圱é¿ç¯å²ãåºãã£ãŠããŸãããã容æã«ã¢ããããŒãã§ããªããªã£ãŠããŸããŸã æ¬èšäºã§ã¯èšèŒããŸããããRedux ã®æžãæ¹ãæ··åšããŠããããããã³ããšã³ãã®ãã¹ããå°ãªãããç¶²çŸ
çã« TypeScript åã§ããŠããªã JavaScript ããŸã æ®ã£ãŠããããªã©ã®èª²é¡ãæããããŸããã ãããã課é¡ã¯ãã©ã®ãããã¯ãã«ãååšãããšæããŸããããã¯ããŒã³ãåœæã®æè¡æµè¡ã§ãã£ããããããã¯ãã®æåŸ
èŠæš¡ãå°æ°ã¡ã³ãã«é©ããèšèšãªã©èŠå ã¯æ§ã
ãããããã°ã©ã ã®ãªãã¡ã¯ã¿ãªã³ã°ãšåæ§ã« ãããã¯ãã®æé·ã«äŒŽã£ãŠãªãã¡ã¯ã¿ãªã³ã°ããŠããããšãæ£ ã ãšä¿¡ããŠããŸãã ã¢ãããŒã·ã§ã³ã«ãŠèšèŒããéãããããè€æ°ã®èª²é¡ã¯éçºç°å¢ã®ãã€ãºã§ãããé€å»ããããšã«ãã£ãŠãããè¯ã DX ãåŸããããšèããŠããŸããä»ã«ãã®ãããªãªãã¡ã¯ã¿ãªã³ã°ãè¡ãããšã«ãã£ãŠããããã¯ããããå
ç¢ã«ã§ãããšããåŽé¢ããããŸãã äžèšã®ïŒã€ã®èª²é¡ã«å¯ŸããŠãããããã©ã€ãã©ãªã宿çã«ã¢ããããŒãããéçšææ®µãèšããããpackage.json ã SPA åäœã«åå²ããã話ãããããããŠãããŸãã ããã³ããšã³ãéçºç°å¢ã®ãªãã¡ã¯ã¿ãªã³ã° ã©ã€ãã©ãªã®å®æçãªã¢ããããŒããããéçšæé ãèšãã æåã¢ããããŒã ã©ã€ãã©ãªãã¢ããããŒãããã«ã¯ã³ãã³ããå©ãã ãã ãšèããŠããŸããããäŸåããŠããå¥ã®ã©ã€ãã©ãªã«åœ±é¿ãæ¬åœã«ãªãããªã©èª¿æ»ããå¿
èŠããããšç¥ããã©ã€ãã©ãªã®ã¢ããããŒãæ¹æ³ã暡玢ãããšããããéå§ããŸããã ã©ã€ãã©ãªã§ã¯ãªãã§ãããNode.js ã®ã¢ããããŒããããããšãããšãnode-sass ã Firebase ã圱é¿ããŠãããããŠãèã¥ãåŒã§æ ¹ã£ãã«ããã©ã€ãã©ãªã®ã¢ããããŒããããå¿
èŠãåºãŠãããããã®ã§ãäžã€äžã€åé¡ããªãã調æ»ããã®ã倧å€ã§ããã äœãããã¢ããããŒã察象ã©ã€ãã©ãªã®ãªãªãŒã¹ããŒãã« Breaking Changes ãæžãããŠããªãã£ãããsemver ãå®ãããŠãããããããªãã£ãããšããããã¯ãã«åœ±é¿ããªãã調ã¹ãå¿
èŠããããåé¡ã®åãåãæ¹ãé£ããã£ãã®ã§ãã ããã§åŸãããã©ã€ãã©ãªã¢ããããŒãã®å®å
šæ§æ
ä¿ã®ãã©ã¯ãã£ã¹ãšã㊠webpack ã«ãããã«ãçµæãå€ãããªãã±ãŒã¹ ãšã QA ãã¹ãã«ãã£ãŠæ
ä¿ããã±ãŒã¹ ãããããšãããããŸãããåè
㯠webpack ã«ããææç©ãå€ãããªãã®ã§ããã°ä»åã®ã¢ããããŒããå®å
šã§ãããšãããåŸè
ã¯ãšã³ãžãã¢ãš QA ãšã³ãžãã¢ã«ãã£ãŠã©ã€ãã©ãªã®åœ±é¿ç¯å²ã«ãã¬ãŒã·ã§ã³ããªãããšã確ãããŠå®å
šã§ãããšããããšãããã®ã§ãã renovate ã®éçšéå§ æ°ã«æéã¯äžèšã®ããã«ã©ã€ãã©ãªã®ã¢ããããŒããæåã§è¡ã£ãŠããŸãããã確èªå·¥æ°ãå¢ããŠããŸããä»ã®ã¿ã¹ã¯ã®æéãå§è¿«ããŠããŸãã»ã©ã§ããã ããã§ãã¢ããããŒããèªååãã renovate  㚠dependabot ãèŠéã«å
¥ããŸãããrenovate ã¯ãdependabot ã«æ¯ã¹ãŠé«æ©èœã§ãã€ãç¡æã§ãããšããçç±ã§éžå®ããŸããã éçšåœåãrenovate ã Pull Request ãäœæããŠãããããdiff ã«ããã©ã€ãã©ãªã®å€æŽç¹ãèŠãããã£ãããšãæ©æµãæããŠããŸãããããããåŸã
ã«ãã¢ããããŒã察象ãå€ãããããããã©ãããã©ã€ãã©ãªã§ã圱é¿ç¯å²ãã©ããªã®ãããšããããšã®èª¿æ»ã«æéãåãããããã«ãªã£ãŠããŸããŸããã ããã§åŸãããèª¿æ»æéãççž®ãããã©ã¯ãã£ã¹ãšããŠ**ãæ¬çªåœ±é¿ã®ãããã®ããéçºåããããã«ãåšãããš renovate ããæ¥ã Pull Request ãæŽçãã**ããšã§ãããã®ãããªæŽçãè¡ãããšã§ãæ¬çªåœ±é¿ã®ãããã®ã«æ³šåããŠã¬ãã¥ãŒã§ããããã«ãªããèŠã«ãªããã«ã¢ããããŒããã§ããããã«ãªããŸããã çµæ ã©ã€ãã©ãªã¢ããããŒãã®éçšæé ãèšããããšã«ãã£ãŠãä»ãŸã§ä»¥äžã«å
ç¢ãªç°å¢ã«ãªããŸããããããããrenovate ã«ãã£ãŠèªåçã«éèŠãªïŒæ¬çªåœ±é¿ã®ããïŒã©ã€ãã©ãªã®ã¿ã«éäžããŠã¬ãã¥ãŒãè¡ãããšã«ãã£ãŠãå°ãªãå·¥æ°ã§ã¢ããããŒãããŠãããããã«ãªããŸããã package.json ã SPA åäœã«åå² èª²é¡æŽçã§èšèŒããéããé»åã«ã«ãã»ãªã³ã©ã€ã³èšºçã瀟å
管ç Web ã¢ããªãæ£è
Web ã¢ããªã¯ããããå¥ã® SPA ãšããŠäœãããŠããŸãããïŒã€ã® package.json ã§ç®¡çããŠããŸããã§ãã®ã§ããããã® SPA ãåãäŸåããã±ãŒãžã䜿ããªããã°ãªããŸããã åŒå®³ãšã㊠package.json ã«å¯ŸããŠïŒã€ã®å€æŽããã£ããšãã«ãã¹ãŠã® SPA ã«åœ±é¿ãåºãŠããŸããŸããã§ãã®ã§ããã®è¥å€§åãã package.json ãããããã® SPA ã«åå²ããããšããŸããã package.json ã SPA åäœã«åå²ããããšã¯ 責ååé¢ ãšããåŽé¢ããããã©ã€ãã©ãªã ãã§ãªããå
±éããŠãã宿°ãããžãã¯ãã³ã³ããŒãã³ããwebpack.config.jsãbabel.config.js ãš tsconfig.json ãªã©ãã¹ãŠãããããã® SPA ã«äŸåã®ãªã圢ã«éããããã«ããŸããããããã®åå²ããäœæ¥ã¯éåžžã«æ³¥èããã®ã§ãæ¬èšäºã«èšèŒããã»ã©ã®ãã®ã§ã¯ãããŸããããåŸãããçµæã«ã€ããŠèšèŒããŠããããšæããŸãã çµæ ãŸãã責ååé¢ãã§ããã®ã§ãïŒã€ã® SPA ã«å¯Ÿãã倿Žããã£ããšãã«ãä»ã®å
šãŠã® SPA ã«å¯Ÿãã圱é¿ãåºãªããªããŸããããã£ãŠãïŒã€ã® SPA ã«å¯ŸããŠæ°ã㪠Web ãã¬ãŒã ã¯ãŒã¯ãã©ã€ãã©ãªã詊ãããšã容æã«ãªããŸãããä»ã«ããïŒã€ã® webpack ã§ãã¹ãŠã® SPA ãã·ãŒã±ã³ã·ã£ã«ã«ãã«ãããŠããã®ã«å¯ŸããŠãçŸåšã¯ãã©ã¬ã«ã§ãã«ãã§ããããã«ãªããã«ãæéãççž®ããããããä»ãŸã§ä»¥äžã«ã³ããããããããã€ãŸã§ã®ã€ãã¬ãŒã·ã§ã³ãå°ãããªããŸããã ãããã®çµæããããã³ãéçºç°å¢ã®æ¹åããã³ DX åäžãæãããŸããã ä»åŸã®èª²é¡ æç¶çãªãªãã¡ã¯ã¿ãªã³ã°ãããä»çµã¿äœã ãã©ã€ãã©ãªã®å®æçãªã¢ããããŒããããéçšæé ãèšãããã¯ãŸãã«æç¶çã«ã©ã€ãã©ãªãã¢ããããŒãããããã®ææ®µã§ãããpackage.json ã SPA åäœã«åå²ããããããããã® SPA ãã¡ã³ããã³ã¹ããããç°å¢äœããšããŠã¯æ¬ ãããªãäœæ¥ã§ããã ãããããã®ãŸãŸãªãã¡ã¯ã¿ãªã³ã°ãäžæããã°ããããã¯ãã®èŠæš¡ã倧ãããªããšããããã³ããšã³ãã®ææµã«ãã£ãŠåã³ã¡ã³ããã³ã¹ãã¥ããç°å¢ã«ãªã£ãŠããŸããŸãã ãªã®ã§ãæç¶çãªãªãã¡ã¯ã¿ãªã³ã°ãããããã«ã¯ä»çµã¿äœããæ¬ ãããªããšèããŠããŸãããã®ããã«ã¯ãå±äººåã«ãããªãä»çµã¿ã¥ãããã¡ã³ããã³ã¹ããããç°å¢æ¹åããšã³ãžãã¢ããããã®ããã³ããšã³ãéçºç°å¢ã«å¯Ÿãããªãã©ã·ãé«ããåãçµã¿ãè¡ã£ãŠããå¿
èŠããããŸãããã®ãããçŸåš æšªè»žååŒ·äŒ ãªã©ã§ CLINICS ããã³ããšã³ãã®å®è£
èæ¯ãããªãã¡ã¯ã¿ãªã³ã°ããããæžãæ¹ãªã©ã®ãã¬ããžãå
±æããŠããŸãã ãŸãšã ããã³ããšã³ãéçºç°å¢ã®ã¡ã³ããã³ã¹ã»ãªãã¡ã¯ã¿ãªã³ã°èªäœã¯ãããŸã§ããŠãŒã¶ã«æ°ããæ©èœãæäŸããŠããããã§ã¯ãªããç²ã
ãšè¡ã£ãŠãããã®ã§ãããããã課é¡ãæŽãåºããåãåã£ãŠã解決ããŠãã£ãããšã«ãã£ãŠåŸããããã©ã¯ãã£ã¹ã¯å€ããããããã³ããšã³ãã®ãšã³ã·ã¹ãã ã«å¯Ÿããçè§£ãå€ãåŸãããŸããã ãããã®ãªãã¡ã¯ã¿ãªã³ã°ãè¡ãããšã«ãã£ãŠ DX ãåäžããŠãããæè¡çãªãã€ãºã«æ©ãæéãæžãããšã³ãžãã¢ã¯ãããããã¯ãã®æ©èœéçºã«å°å¿µã§ããããã«ãªã£ãŠãããšä¿¡ããŠããŸãã ä»åç§ãã¡ã課é¡ã解決ããããšã«ãã£ãŠãæç¶çã«ãªãã¡ã¯ã¿ãªã³ã°ãããããåå°äœãããããšããåŽé¢ããããšæããŸããä»åŸã®èª²é¡ãšããŠããã®åå°ãåºã«ããããã®ãšã³ãžãã¢ãæèãæã£ãŠã¡ã³ããã³ã¹ã§ãããããªä»çµã¿ã¥ãããè¡ã£ãŠãããããšæããŸãã æåŸãŸã§èªãã§ããã ãããããšãããããŸããã www.medley.jp
ããã«ã¡ã¯ã第äºéçºã°ã«ãŒããšã³ãžãã¢ã®è¥¿æã§ãã䞻㫠CLINICS ã®éçºãæ
åœããŠããŸãã ã¯ããã« CLINICS ã¯é»åã«ã«ãããªã³ã©ã€ã³èšºçãäºçŽã·ã¹ãã ãæ£è
ã¢ããªãªã©ãå«ãçµ±åã¢ããªã§ããCLINICS ãããŒã³ãããŠããçŸåšã«è³ããŸã§åžžã«æ°æ©èœéçºãšå®åžžæ¹åãè¡ãããŠãããéçºç°å¢ã®ã¡ã³ããã³ã¹ã¯åŸæã«ãªããã¡ã§ãããä»åã¯ãããã£ãç¶æ³ãæ¹åãã¹ããéçºç°å¢ã®ã¡ã³ããã³ã¹ããªãã¡ã¯ã¿ãªã³ã°ãè¡ã£ãéçšããåŸããããã©ã¯ãã£ã¹ã«ã€ããŠç޹ä»ããŠããããšæããŸãã ã¢ãããŒã·ã§ã³ ãããã¯ãã®æ°èŠéçºæã«è¡ãããæè¡éžå®ã¯éåžžã«é£ãããæ¥åèŠä»¶ãããŒã ç¶æ³ãªã©ç·åçã«èæ
®ããŠãã®æç¹ã§ã®ãã¹ããªéžæãããå¿
èŠããããŸãã ããããéžæããæè¡ã§é·æéçšãããŠãããã¡ã«ãã¡ã³ããã³ã¹ãè¡ãå±ããªããªã£ãã³ãŒããã©ã€ãã©ãªãåºãŠããŸããŸãã CLINICS ããŒã³ãåœåã¯ãªã³ã©ã€ã³èšºçã®ã¿ãæäŸããŠããŸãããSPA ã§æ§æãããŠããŸããããïŒã€ã® package.json ã§å¹ççã«éçºã§ããŠããŸãããä»ã«ãçŸåšã»ã© TypeScript ãäž»æµã§ã¯ãªãã£ãã®ã§ JavaScript ã®ã³ãŒããã¡ã€ã³ã§å®è£
ãããŠãŸããã æ°ããªã¢ããªã±ãŒã·ã§ã³ïŒé»åã«ã«ããäºçŽã·ã¹ãã ãªã©ïŒãå°å
¥ããã¿ã€ãã³ã°ãããªãã¡ãããã¯ããå°èŠæš¡ããäžèŠæš¡ã«å€é·ããã¿ã€ãã³ã°ããããã³ããšã³ãã®ææµã«ãã£ãŠãéçºç°å¢ãæ¹åã§ããéšåããããŸãããããããŠããªãéšåãåºãŠããŸããã ãã®æ¹åããããŠããªãéšåãæ®ãç¶æ
ãç¶ããš Developer Experience(DX)ã®äœäžã«ç¹ãã£ãŠããŸããŸããã§ãã®ã§ãç§ãã¡ã¯æ¹åããããŠããªãéšåãåãé€ããŠãããããã¢ãã³ãšãããéçºç°å¢ãžãªãã¡ã¯ã¿ãªã³ã°ãããŠããããšèããŸããã DX ãåäžããŠããããšã§æè¡çãªãã€ãºã«æéãåãããªãããã«ãªããŸãããããŠæäŸããæ©èœãã®ãã®ã«ã€ããŠèããæéãå¢ããçµæçã« CLINICS ãããè¯ããããã¯ããžé²åãããŠããã®ãåœãªãã¡ã¯ã¿ãªã³ã°ã®ç®çã§ãã èª²é¡æŽç æ¹åããŠããããã«ã¯ãçŸç¶æŽçãèª²é¡æŽçãè¡ããªãããšã«ã¯äœãå§ãŸããŸãããããã³ããšã³ãéçºç°å¢ãã¡ã³ããã³ã¹ããã¿ã¹ã¯ã¯ããããã¯ãã®æ©èœïŒãŠãŒã¶ã«æäŸãããæ©èœïŒã«çŽæ¥ãã©ã¹ã®åœ±é¿ãããããã§ã¯ãããŸãããèªããšéåžžã®æ©èœéçºãå®åžžæ¹åã«æ¯ã¹åªå
床ã¯èœã¡ããããã¹ããæéã§æ¹åãããŠããããšã«ãªããŸããããããã¹ããæéãæå¹æŽ»çšããããã«ã¯ãã¿ã¹ã¯ã®é£æåºŠã®çè§£ãã¿ã¹ã¯ãé©åœã«åå²ããã§ãŒãžã³ã°ã®èšç»ãè¡ãããšã極ããŠå€§äºã§ãã ãã®ããã«èæ
®ãã課é¡ã®äžã§ãæ¬èšäºã§èšèŒããã®ã¯ä»¥äžã®ïŒã€ã§ãã ã©ã€ãã©ãªã宿çã«ã¢ããããŒãããéçšãåºãŸã£ãŠãªã éçšæ¹åŒãåºãŸã£ãŠããªãããšã§ãæŸçœ®ãããŠããŸããã¡ã§ããçå
ããŠã¢ããããŒãããã¡ã³ããŒããããšããŠããå±äººåã®èª²é¡ãæ®ã£ãŠããŸããŸã æŸçœ®ãããŠããŸã£ãããšã«ãããææ°çãšã®å·®åã倧ãããªãã¢ããããŒãããã³ã¹ãã倧ãããªã£ãŠããŸããŸã çµæçã«ãã©ã€ãã©ãªã®ã»ãã¥ãªãã£ãã£ãã¯ã¹å¯Ÿå¿ãæ°ããæäŸãããæ©èœãããã«é©å¿ã§ããªãç°å¢ã«ãªã£ãŠããŸããŸã è€æ°ã® SPA ã®äŸåãïŒã€ã® package.json ã§ç®¡çããŠãã é»åã«ã«ãã»ãªã³ã©ã€ã³èšºçã瀟å
管ç Web ã¢ããªãæ£è
Web ã¢ããªã¯ããããå¥ã® SPA ãšããŠäœãããŠããŸã ããããïŒã€ã® package.json ã§ç®¡çããŠããããããããã® SPA ãåãäŸåããã±ãŒãžã䜿ããªããŠã¯ãªããŸãããå°èŠæš¡ã®ãšãã¯ãã®ãããªæ§æã§ååã§ããããèŠæš¡ã倧ãããªãã«ã€ããŠæè»æ§ã倱ããããšå
±ã«ãã©ã€ãã©ãªã®ã¢ããããŒãããããã圱é¿ç¯å²ãåºãã£ãŠããŸãããã容æã«ã¢ããããŒãã§ããªããªã£ãŠããŸããŸã æ¬èšäºã§ã¯èšèŒããŸããããRedux ã®æžãæ¹ãæ··åšããŠããããããã³ããšã³ãã®ãã¹ããå°ãªãããç¶²çŸ
çã« TypeScript åã§ããŠããªã JavaScript ããŸã æ®ã£ãŠããããªã©ã®èª²é¡ãæããããŸããã ãããã課é¡ã¯ãã©ã®ãããã¯ãã«ãååšãããšæããŸããããã¯ããŒã³ãåœæã®æè¡æµè¡ã§ãã£ããããããã¯ãã®æåŸ
èŠæš¡ãå°æ°ã¡ã³ãã«é©ããèšèšãªã©èŠå ã¯æ§ã
ãããããã°ã©ã ã®ãªãã¡ã¯ã¿ãªã³ã°ãšåæ§ã« ãããã¯ãã®æé·ã«äŒŽã£ãŠãªãã¡ã¯ã¿ãªã³ã°ããŠããããšãæ£ ã ãšä¿¡ããŠããŸãã ã¢ãããŒã·ã§ã³ã«ãŠèšèŒããéãããããè€æ°ã®èª²é¡ã¯éçºç°å¢ã®ãã€ãºã§ãããé€å»ããããšã«ãã£ãŠãããè¯ã DX ãåŸããããšèããŠããŸããä»ã«ãã®ãããªãªãã¡ã¯ã¿ãªã³ã°ãè¡ãããšã«ãã£ãŠããããã¯ããããå
ç¢ã«ã§ãããšããåŽé¢ããããŸãã äžèšã®ïŒã€ã®èª²é¡ã«å¯ŸããŠãããããã©ã€ãã©ãªã宿çã«ã¢ããããŒãããéçšææ®µãèšããããpackage.json ã SPA åäœã«åå²ããã話ãããããããŠãããŸãã ããã³ããšã³ãéçºç°å¢ã®ãªãã¡ã¯ã¿ãªã³ã° ã©ã€ãã©ãªã®å®æçãªã¢ããããŒããããéçšæé ãèšãã æåã¢ããããŒã ã©ã€ãã©ãªãã¢ããããŒãããã«ã¯ã³ãã³ããå©ãã ãã ãšèããŠããŸããããäŸåããŠããå¥ã®ã©ã€ãã©ãªã«åœ±é¿ãæ¬åœã«ãªãããªã©èª¿æ»ããå¿
èŠããããšç¥ããã©ã€ãã©ãªã®ã¢ããããŒãæ¹æ³ã暡玢ãããšããããéå§ããŸããã ã©ã€ãã©ãªã§ã¯ãªãã§ãããNode.js ã®ã¢ããããŒããããããšãããšãnode-sass ã Firebase ã圱é¿ããŠãããããŠãèã¥ãåŒã§æ ¹ã£ãã«ããã©ã€ãã©ãªã®ã¢ããããŒããããå¿
èŠãåºãŠãããããã®ã§ãäžã€äžã€åé¡ããªãã調æ»ããã®ã倧å€ã§ããã äœãããã¢ããããŒã察象ã©ã€ãã©ãªã®ãªãªãŒã¹ããŒãã« Breaking Changes ãæžãããŠããªãã£ãããsemver ãå®ãããŠãããããããªãã£ãããšããããã¯ãã«åœ±é¿ããªãã調ã¹ãå¿
èŠããããåé¡ã®åãåãæ¹ãé£ããã£ãã®ã§ãã ããã§åŸãããã©ã€ãã©ãªã¢ããããŒãã®å®å
šæ§æ
ä¿ã®ãã©ã¯ãã£ã¹ãšã㊠webpack ã«ãããã«ãçµæãå€ãããªãã±ãŒã¹ ãšã QA ãã¹ãã«ãã£ãŠæ
ä¿ããã±ãŒã¹ ãããããšãããããŸãããåè
㯠webpack ã«ããææç©ãå€ãããªãã®ã§ããã°ä»åã®ã¢ããããŒããå®å
šã§ãããšãããåŸè
ã¯ãšã³ãžãã¢ãš QA ãšã³ãžãã¢ã«ãã£ãŠã©ã€ãã©ãªã®åœ±é¿ç¯å²ã«ãã¬ãŒã·ã§ã³ããªãããšã確ãããŠå®å
šã§ãããšããããšãããã®ã§ãã renovate ã®éçšéå§ æ°ã«æéã¯äžèšã®ããã«ã©ã€ãã©ãªã®ã¢ããããŒããæåã§è¡ã£ãŠããŸãããã確èªå·¥æ°ãå¢ããŠããŸããä»ã®ã¿ã¹ã¯ã®æéãå§è¿«ããŠããŸãã»ã©ã§ããã ããã§ãã¢ããããŒããèªååãã renovate  㚠dependabot ãèŠéã«å
¥ããŸãããrenovate ã¯ãdependabot ã«æ¯ã¹ãŠé«æ©èœã§ãã€ãç¡æã§ãããšããçç±ã§éžå®ããŸããã éçšåœåãrenovate ã Pull Request ãäœæããŠãããããdiff ã«ããã©ã€ãã©ãªã®å€æŽç¹ãèŠãããã£ãããšãæ©æµãæããŠããŸãããããããåŸã
ã«ãã¢ããããŒã察象ãå€ãããããããã©ãããã©ã€ãã©ãªã§ã圱é¿ç¯å²ãã©ããªã®ãããšããããšã®èª¿æ»ã«æéãåãããããã«ãªã£ãŠããŸããŸããã ããã§åŸãããèª¿æ»æéãççž®ãããã©ã¯ãã£ã¹ãšããŠ**ãæ¬çªåœ±é¿ã®ãããã®ããéçºåããããã«ãåšãããš renovate ããæ¥ã Pull Request ãæŽçãã**ããšã§ãããã®ãããªæŽçãè¡ãããšã§ãæ¬çªåœ±é¿ã®ãããã®ã«æ³šåããŠã¬ãã¥ãŒã§ããããã«ãªããèŠã«ãªããã«ã¢ããããŒããã§ããããã«ãªããŸããã çµæ ã©ã€ãã©ãªã¢ããããŒãã®éçšæé ãèšããããšã«ãã£ãŠãä»ãŸã§ä»¥äžã«å
ç¢ãªç°å¢ã«ãªããŸããããããããrenovate ã«ãã£ãŠèªåçã«éèŠãªïŒæ¬çªåœ±é¿ã®ããïŒã©ã€ãã©ãªã®ã¿ã«éäžããŠã¬ãã¥ãŒãè¡ãããšã«ãã£ãŠãå°ãªãå·¥æ°ã§ã¢ããããŒãããŠãããããã«ãªããŸããã package.json ã SPA åäœã«åå² èª²é¡æŽçã§èšèŒããéããé»åã«ã«ãã»ãªã³ã©ã€ã³èšºçã瀟å
管ç Web ã¢ããªãæ£è
Web ã¢ããªã¯ããããå¥ã® SPA ãšããŠäœãããŠããŸãããïŒã€ã® package.json ã§ç®¡çããŠããŸããã§ãã®ã§ããããã® SPA ãåãäŸåããã±ãŒãžã䜿ããªããã°ãªããŸããã åŒå®³ãšã㊠package.json ã«å¯ŸããŠïŒã€ã®å€æŽããã£ããšãã«ãã¹ãŠã® SPA ã«åœ±é¿ãåºãŠããŸããŸããã§ãã®ã§ããã®è¥å€§åãã package.json ãããããã® SPA ã«åå²ããããšããŸããã package.json ã SPA åäœã«åå²ããããšã¯ 責ååé¢ ãšããåŽé¢ããããã©ã€ãã©ãªã ãã§ãªããå
±éããŠãã宿°ãããžãã¯ãã³ã³ããŒãã³ããwebpack.config.jsãbabel.config.js ãš tsconfig.json ãªã©ãã¹ãŠãããããã® SPA ã«äŸåã®ãªã圢ã«éããããã«ããŸããããããã®åå²ããäœæ¥ã¯éåžžã«æ³¥èããã®ã§ãæ¬èšäºã«èšèŒããã»ã©ã®ãã®ã§ã¯ãããŸããããåŸãããçµæã«ã€ããŠèšèŒããŠããããšæããŸãã çµæ ãŸãã責ååé¢ãã§ããã®ã§ãïŒã€ã® SPA ã«å¯Ÿãã倿Žããã£ããšãã«ãä»ã®å
šãŠã® SPA ã«å¯Ÿãã圱é¿ãåºãªããªããŸããããã£ãŠãïŒã€ã® SPA ã«å¯ŸããŠæ°ã㪠Web ãã¬ãŒã ã¯ãŒã¯ãã©ã€ãã©ãªã詊ãããšã容æã«ãªããŸãããä»ã«ããïŒã€ã® webpack ã§ãã¹ãŠã® SPA ãã·ãŒã±ã³ã·ã£ã«ã«ãã«ãããŠããã®ã«å¯ŸããŠãçŸåšã¯ãã©ã¬ã«ã§ãã«ãã§ããããã«ãªããã«ãæéãççž®ããããããä»ãŸã§ä»¥äžã«ã³ããããããããã€ãŸã§ã®ã€ãã¬ãŒã·ã§ã³ãå°ãããªããŸããã ãããã®çµæããããã³ãéçºç°å¢ã®æ¹åããã³ DX åäžãæãããŸããã ä»åŸã®èª²é¡ æç¶çãªãªãã¡ã¯ã¿ãªã³ã°ãããä»çµã¿äœã ãã©ã€ãã©ãªã®å®æçãªã¢ããããŒããããéçšæé ãèšãããã¯ãŸãã«æç¶çã«ã©ã€ãã©ãªãã¢ããããŒãããããã®ææ®µã§ãããpackage.json ã SPA åäœã«åå²ããããããããã® SPA ãã¡ã³ããã³ã¹ããããç°å¢äœããšããŠã¯æ¬ ãããªãäœæ¥ã§ããã ãããããã®ãŸãŸãªãã¡ã¯ã¿ãªã³ã°ãäžæããã°ããããã¯ãã®èŠæš¡ã倧ãããªããšããããã³ããšã³ãã®ææµã«ãã£ãŠåã³ã¡ã³ããã³ã¹ãã¥ããç°å¢ã«ãªã£ãŠããŸããŸãã ãªã®ã§ãæç¶çãªãªãã¡ã¯ã¿ãªã³ã°ãããããã«ã¯ä»çµã¿äœããæ¬ ãããªããšèããŠããŸãããã®ããã«ã¯ãå±äººåã«ãããªãä»çµã¿ã¥ãããã¡ã³ããã³ã¹ããããç°å¢æ¹åããšã³ãžãã¢ããããã®ããã³ããšã³ãéçºç°å¢ã«å¯Ÿãããªãã©ã·ãé«ããåãçµã¿ãè¡ã£ãŠããå¿
èŠããããŸãããã®ãããçŸåš æšªè»žååŒ·äŒ ãªã©ã§ CLINICS ããã³ããšã³ãã®å®è£
èæ¯ãããªãã¡ã¯ã¿ãªã³ã°ããããæžãæ¹ãªã©ã®ãã¬ããžãå
±æããŠããŸãã ãŸãšã ããã³ããšã³ãéçºç°å¢ã®ã¡ã³ããã³ã¹ã»ãªãã¡ã¯ã¿ãªã³ã°èªäœã¯ãããŸã§ããŠãŒã¶ã«æ°ããæ©èœãæäŸããŠããããã§ã¯ãªããç²ã
ãšè¡ã£ãŠãããã®ã§ãããããã課é¡ãæŽãåºããåãåã£ãŠã解決ããŠãã£ãããšã«ãã£ãŠåŸããããã©ã¯ãã£ã¹ã¯å€ããããããã³ããšã³ãã®ãšã³ã·ã¹ãã ã«å¯Ÿããçè§£ãå€ãåŸãããŸããã ãããã®ãªãã¡ã¯ã¿ãªã³ã°ãè¡ãããšã«ãã£ãŠ DX ãåäžããŠãããæè¡çãªãã€ãºã«æ©ãæéãæžãããšã³ãžãã¢ã¯ãããããã¯ãã®æ©èœéçºã«å°å¿µã§ããããã«ãªã£ãŠãããšä¿¡ããŠããŸãã ä»åç§ãã¡ã課é¡ã解決ããããšã«ãã£ãŠãæç¶çã«ãªãã¡ã¯ã¿ãªã³ã°ãããããåå°äœãããããšããåŽé¢ããããšæããŸããä»åŸã®èª²é¡ãšããŠããã®åå°ãåºã«ããããã®ãšã³ãžãã¢ãæèãæã£ãŠã¡ã³ããã³ã¹ã§ãããããªä»çµã¿ã¥ãããè¡ã£ãŠãããããšæããŸãã æåŸãŸã§èªãã§ããã ãããããšãããããŸããã www.medley.jp
ããã«ã¡ã¯ã第äºéçºã°ã«ãŒããšã³ãžãã¢ã®è¥¿æã§ãã䞻㫠CLINICS ã®éçºãæ
åœããŠããŸãã ã¯ããã« CLINICS ã¯é»åã«ã«ãããªã³ã©ã€ã³èšºçãäºçŽã·ã¹ãã ãæ£è
ã¢ããªãªã©ãå«ãçµ±åã¢ããªã§ããCLINICS ãããŒã³ãããŠããçŸåšã«è³ããŸã§åžžã«æ°æ©èœéçºãšå®åžžæ¹åãè¡ãããŠãããéçºç°å¢ã®ã¡ã³ããã³ã¹ã¯åŸæã«ãªããã¡ã§ãããä»åã¯ãããã£ãç¶æ³ãæ¹åãã¹ããéçºç°å¢ã®ã¡ã³ããã³ã¹ããªãã¡ã¯ã¿ãªã³ã°ãè¡ã£ãéçšããåŸããããã©ã¯ãã£ã¹ã«ã€ããŠç޹ä»ããŠããããšæããŸãã ã¢ãããŒã·ã§ã³ ãããã¯ãã®æ°èŠéçºæã«è¡ãããæè¡éžå®ã¯éåžžã«é£ãããæ¥åèŠä»¶ãããŒã ç¶æ³ãªã©ç·åçã«èæ
®ããŠãã®æç¹ã§ã®ãã¹ããªéžæãããå¿
èŠããããŸãã ããããéžæããæè¡ã§é·æéçšãããŠãããã¡ã«ãã¡ã³ããã³ã¹ãè¡ãå±ããªããªã£ãã³ãŒããã©ã€ãã©ãªãåºãŠããŸããŸãã CLINICS ããŒã³ãåœåã¯ãªã³ã©ã€ã³èšºçã®ã¿ãæäŸããŠããŸãããSPA ã§æ§æãããŠããŸããããïŒã€ã® package.json ã§å¹ççã«éçºã§ããŠããŸãããä»ã«ãçŸåšã»ã© TypeScript ãäž»æµã§ã¯ãªãã£ãã®ã§ JavaScript ã®ã³ãŒããã¡ã€ã³ã§å®è£
ãããŠãŸããã æ°ããªã¢ããªã±ãŒã·ã§ã³ïŒé»åã«ã«ããäºçŽã·ã¹ãã ãªã©ïŒãå°å
¥ããã¿ã€ãã³ã°ãããªãã¡ãããã¯ããå°èŠæš¡ããäžèŠæš¡ã«å€é·ããã¿ã€ãã³ã°ããããã³ããšã³ãã®ææµã«ãã£ãŠãéçºç°å¢ãæ¹åã§ããéšåããããŸãããããããŠããªãéšåãåºãŠããŸããã ãã®æ¹åããããŠããªãéšåãæ®ãç¶æ
ãç¶ããš Developer Experience(DX)ã®äœäžã«ç¹ãã£ãŠããŸããŸããã§ãã®ã§ãç§ãã¡ã¯æ¹åããããŠããªãéšåãåãé€ããŠãããããã¢ãã³ãšãããéçºç°å¢ãžãªãã¡ã¯ã¿ãªã³ã°ãããŠããããšèããŸããã DX ãåäžããŠããããšã§æè¡çãªãã€ãºã«æéãåãããªãããã«ãªããŸãããããŠæäŸããæ©èœãã®ãã®ã«ã€ããŠèããæéãå¢ããçµæçã« CLINICS ãããè¯ããããã¯ããžé²åãããŠããã®ãåœãªãã¡ã¯ã¿ãªã³ã°ã®ç®çã§ãã èª²é¡æŽç æ¹åããŠããããã«ã¯ãçŸç¶æŽçãèª²é¡æŽçãè¡ããªãããšã«ã¯äœãå§ãŸããŸãããããã³ããšã³ãéçºç°å¢ãã¡ã³ããã³ã¹ããã¿ã¹ã¯ã¯ããããã¯ãã®æ©èœïŒãŠãŒã¶ã«æäŸãããæ©èœïŒã«çŽæ¥ãã©ã¹ã®åœ±é¿ãããããã§ã¯ãããŸãããèªããšéåžžã®æ©èœéçºãå®åžžæ¹åã«æ¯ã¹åªå
床ã¯èœã¡ããããã¹ããæéã§æ¹åãããŠããããšã«ãªããŸããããããã¹ããæéãæå¹æŽ»çšããããã«ã¯ãã¿ã¹ã¯ã®é£æåºŠã®çè§£ãã¿ã¹ã¯ãé©åœã«åå²ããã§ãŒãžã³ã°ã®èšç»ãè¡ãããšã極ããŠå€§äºã§ãã ãã®ããã«èæ
®ãã課é¡ã®äžã§ãæ¬èšäºã§èšèŒããã®ã¯ä»¥äžã®ïŒã€ã§ãã ã©ã€ãã©ãªã宿çã«ã¢ããããŒãããéçšãåºãŸã£ãŠãªã éçšæ¹åŒãåºãŸã£ãŠããªãããšã§ãæŸçœ®ãããŠããŸããã¡ã§ããçå
ããŠã¢ããããŒãããã¡ã³ããŒããããšããŠããå±äººåã®èª²é¡ãæ®ã£ãŠããŸããŸã æŸçœ®ãããŠããŸã£ãããšã«ãããææ°çãšã®å·®åã倧ãããªãã¢ããããŒãããã³ã¹ãã倧ãããªã£ãŠããŸããŸã çµæçã«ãã©ã€ãã©ãªã®ã»ãã¥ãªãã£ãã£ãã¯ã¹å¯Ÿå¿ãæ°ããæäŸãããæ©èœãããã«é©å¿ã§ããªãç°å¢ã«ãªã£ãŠããŸããŸã è€æ°ã® SPA ã®äŸåãïŒã€ã® package.json ã§ç®¡çããŠãã é»åã«ã«ãã»ãªã³ã©ã€ã³èšºçã瀟å
管ç Web ã¢ããªãæ£è
Web ã¢ããªã¯ããããå¥ã® SPA ãšããŠäœãããŠããŸã ããããïŒã€ã® package.json ã§ç®¡çããŠããããããããã® SPA ãåãäŸåããã±ãŒãžã䜿ããªããŠã¯ãªããŸãããå°èŠæš¡ã®ãšãã¯ãã®ãããªæ§æã§ååã§ããããèŠæš¡ã倧ãããªãã«ã€ããŠæè»æ§ã倱ããããšå
±ã«ãã©ã€ãã©ãªã®ã¢ããããŒãããããã圱é¿ç¯å²ãåºãã£ãŠããŸãããã容æã«ã¢ããããŒãã§ããªããªã£ãŠããŸããŸã æ¬èšäºã§ã¯èšèŒããŸããããRedux ã®æžãæ¹ãæ··åšããŠããããããã³ããšã³ãã®ãã¹ããå°ãªãããç¶²çŸ
çã« TypeScript åã§ããŠããªã JavaScript ããŸã æ®ã£ãŠããããªã©ã®èª²é¡ãæããããŸããã ãããã課é¡ã¯ãã©ã®ãããã¯ãã«ãååšãããšæããŸããããã¯ããŒã³ãåœæã®æè¡æµè¡ã§ãã£ããããããã¯ãã®æåŸ
èŠæš¡ãå°æ°ã¡ã³ãã«é©ããèšèšãªã©èŠå ã¯æ§ã
ãããããã°ã©ã ã®ãªãã¡ã¯ã¿ãªã³ã°ãšåæ§ã« ãããã¯ãã®æé·ã«äŒŽã£ãŠãªãã¡ã¯ã¿ãªã³ã°ããŠããããšãæ£ ã ãšä¿¡ããŠããŸãã ã¢ãããŒã·ã§ã³ã«ãŠèšèŒããéãããããè€æ°ã®èª²é¡ã¯éçºç°å¢ã®ãã€ãºã§ãããé€å»ããããšã«ãã£ãŠãããè¯ã DX ãåŸããããšèããŠããŸããä»ã«ãã®ãããªãªãã¡ã¯ã¿ãªã³ã°ãè¡ãããšã«ãã£ãŠããããã¯ããããå
ç¢ã«ã§ãããšããåŽé¢ããããŸãã äžèšã®ïŒã€ã®èª²é¡ã«å¯ŸããŠãããããã©ã€ãã©ãªã宿çã«ã¢ããããŒãããéçšææ®µãèšããããpackage.json ã SPA åäœã«åå²ããã話ãããããããŠãããŸãã ããã³ããšã³ãéçºç°å¢ã®ãªãã¡ã¯ã¿ãªã³ã° ã©ã€ãã©ãªã®å®æçãªã¢ããããŒããããéçšæé ãèšãã æåã¢ããããŒã ã©ã€ãã©ãªãã¢ããããŒãããã«ã¯ã³ãã³ããå©ãã ãã ãšèããŠããŸããããäŸåããŠããå¥ã®ã©ã€ãã©ãªã«åœ±é¿ãæ¬åœã«ãªãããªã©èª¿æ»ããå¿
èŠããããšç¥ããã©ã€ãã©ãªã®ã¢ããããŒãæ¹æ³ã暡玢ãããšããããéå§ããŸããã ã©ã€ãã©ãªã§ã¯ãªãã§ãããNode.js ã®ã¢ããããŒããããããšãããšãnode-sass ã Firebase ã圱é¿ããŠãããããŠãèã¥ãåŒã§æ ¹ã£ãã«ããã©ã€ãã©ãªã®ã¢ããããŒããããå¿
èŠãåºãŠãããããã®ã§ãäžã€äžã€åé¡ããªãã調æ»ããã®ã倧å€ã§ããã äœãããã¢ããããŒã察象ã©ã€ãã©ãªã®ãªãªãŒã¹ããŒãã« Breaking Changes ãæžãããŠããªãã£ãããsemver ãå®ãããŠãããããããªãã£ãããšããããã¯ãã«åœ±é¿ããªãã調ã¹ãå¿
èŠããããåé¡ã®åãåãæ¹ãé£ããã£ãã®ã§ãã ããã§åŸãããã©ã€ãã©ãªã¢ããããŒãã®å®å
šæ§æ
ä¿ã®ãã©ã¯ãã£ã¹ãšã㊠webpack ã«ãããã«ãçµæãå€ãããªãã±ãŒã¹ ãšã QA ãã¹ãã«ãã£ãŠæ
ä¿ããã±ãŒã¹ ãããããšãããããŸãããåè
㯠webpack ã«ããææç©ãå€ãããªãã®ã§ããã°ä»åã®ã¢ããããŒããå®å
šã§ãããšãããåŸè
ã¯ãšã³ãžãã¢ãš QA ãšã³ãžãã¢ã«ãã£ãŠã©ã€ãã©ãªã®åœ±é¿ç¯å²ã«ãã¬ãŒã·ã§ã³ããªãããšã確ãããŠå®å
šã§ãããšããããšãããã®ã§ãã renovate ã®éçšéå§ æ°ã«æéã¯äžèšã®ããã«ã©ã€ãã©ãªã®ã¢ããããŒããæåã§è¡ã£ãŠããŸãããã確èªå·¥æ°ãå¢ããŠããŸããä»ã®ã¿ã¹ã¯ã®æéãå§è¿«ããŠããŸãã»ã©ã§ããã ããã§ãã¢ããããŒããèªååãã renovate  㚠dependabot ãèŠéã«å
¥ããŸãããrenovate ã¯ãdependabot ã«æ¯ã¹ãŠé«æ©èœã§ãã€ãç¡æã§ãããšããçç±ã§éžå®ããŸããã éçšåœåãrenovate ã Pull Request ãäœæããŠãããããdiff ã«ããã©ã€ãã©ãªã®å€æŽç¹ãèŠãããã£ãããšãæ©æµãæããŠããŸãããããããåŸã
ã«ãã¢ããããŒã察象ãå€ãããããããã©ãããã©ã€ãã©ãªã§ã圱é¿ç¯å²ãã©ããªã®ãããšããããšã®èª¿æ»ã«æéãåãããããã«ãªã£ãŠããŸããŸããã ããã§åŸãããèª¿æ»æéãççž®ãããã©ã¯ãã£ã¹ãšããŠ**ãæ¬çªåœ±é¿ã®ãããã®ããéçºåããããã«ãåšãããš renovate ããæ¥ã Pull Request ãæŽçãã**ããšã§ãããã®ãããªæŽçãè¡ãããšã§ãæ¬çªåœ±é¿ã®ãããã®ã«æ³šåããŠã¬ãã¥ãŒã§ããããã«ãªããèŠã«ãªããã«ã¢ããããŒããã§ããããã«ãªããŸããã çµæ ã©ã€ãã©ãªã¢ããããŒãã®éçšæé ãèšããããšã«ãã£ãŠãä»ãŸã§ä»¥äžã«å
ç¢ãªç°å¢ã«ãªããŸããããããããrenovate ã«ãã£ãŠèªåçã«éèŠãªïŒæ¬çªåœ±é¿ã®ããïŒã©ã€ãã©ãªã®ã¿ã«éäžããŠã¬ãã¥ãŒãè¡ãããšã«ãã£ãŠãå°ãªãå·¥æ°ã§ã¢ããããŒãããŠãããããã«ãªããŸããã package.json ã SPA åäœã«åå² èª²é¡æŽçã§èšèŒããéããé»åã«ã«ãã»ãªã³ã©ã€ã³èšºçã瀟å
管ç Web ã¢ããªãæ£è
Web ã¢ããªã¯ããããå¥ã® SPA ãšããŠäœãããŠããŸãããïŒã€ã® package.json ã§ç®¡çããŠããŸããã§ãã®ã§ããããã® SPA ãåãäŸåããã±ãŒãžã䜿ããªããã°ãªããŸããã åŒå®³ãšã㊠package.json ã«å¯ŸããŠïŒã€ã®å€æŽããã£ããšãã«ãã¹ãŠã® SPA ã«åœ±é¿ãåºãŠããŸããŸããã§ãã®ã§ããã®è¥å€§åãã package.json ãããããã® SPA ã«åå²ããããšããŸããã package.json ã SPA åäœã«åå²ããããšã¯ 責ååé¢ ãšããåŽé¢ããããã©ã€ãã©ãªã ãã§ãªããå
±éããŠãã宿°ãããžãã¯ãã³ã³ããŒãã³ããwebpack.config.jsãbabel.config.js ãš tsconfig.json ãªã©ãã¹ãŠãããããã® SPA ã«äŸåã®ãªã圢ã«éããããã«ããŸããããããã®åå²ããäœæ¥ã¯éåžžã«æ³¥èããã®ã§ãæ¬èšäºã«èšèŒããã»ã©ã®ãã®ã§ã¯ãããŸããããåŸãããçµæã«ã€ããŠèšèŒããŠããããšæããŸãã çµæ ãŸãã責ååé¢ãã§ããã®ã§ãïŒã€ã® SPA ã«å¯Ÿãã倿Žããã£ããšãã«ãä»ã®å
šãŠã® SPA ã«å¯Ÿãã圱é¿ãåºãªããªããŸããããã£ãŠãïŒã€ã® SPA ã«å¯ŸããŠæ°ã㪠Web ãã¬ãŒã ã¯ãŒã¯ãã©ã€ãã©ãªã詊ãããšã容æã«ãªããŸãããä»ã«ããïŒã€ã® webpack ã§ãã¹ãŠã® SPA ãã·ãŒã±ã³ã·ã£ã«ã«ãã«ãããŠããã®ã«å¯ŸããŠãçŸåšã¯ãã©ã¬ã«ã§ãã«ãã§ããããã«ãªããã«ãæéãççž®ããããããä»ãŸã§ä»¥äžã«ã³ããããããããã€ãŸã§ã®ã€ãã¬ãŒã·ã§ã³ãå°ãããªããŸããã ãããã®çµæããããã³ãéçºç°å¢ã®æ¹åããã³ DX åäžãæãããŸããã ä»åŸã®èª²é¡ æç¶çãªãªãã¡ã¯ã¿ãªã³ã°ãããä»çµã¿äœã ãã©ã€ãã©ãªã®å®æçãªã¢ããããŒããããéçšæé ãèšãããã¯ãŸãã«æç¶çã«ã©ã€ãã©ãªãã¢ããããŒãããããã®ææ®µã§ãããpackage.json ã SPA åäœã«åå²ããããããããã® SPA ãã¡ã³ããã³ã¹ããããç°å¢äœããšããŠã¯æ¬ ãããªãäœæ¥ã§ããã ãããããã®ãŸãŸãªãã¡ã¯ã¿ãªã³ã°ãäžæããã°ããããã¯ãã®èŠæš¡ã倧ãããªããšããããã³ããšã³ãã®ææµã«ãã£ãŠåã³ã¡ã³ããã³ã¹ãã¥ããç°å¢ã«ãªã£ãŠããŸããŸãã ãªã®ã§ãæç¶çãªãªãã¡ã¯ã¿ãªã³ã°ãããããã«ã¯ä»çµã¿äœããæ¬ ãããªããšèããŠããŸãããã®ããã«ã¯ãå±äººåã«ãããªãä»çµã¿ã¥ãããã¡ã³ããã³ã¹ããããç°å¢æ¹åããšã³ãžãã¢ããããã®ããã³ããšã³ãéçºç°å¢ã«å¯Ÿãããªãã©ã·ãé«ããåãçµã¿ãè¡ã£ãŠããå¿
èŠããããŸãããã®ãããçŸåš æšªè»žååŒ·äŒ ãªã©ã§ CLINICS ããã³ããšã³ãã®å®è£
èæ¯ãããªãã¡ã¯ã¿ãªã³ã°ããããæžãæ¹ãªã©ã®ãã¬ããžãå
±æããŠããŸãã ãŸãšã ããã³ããšã³ãéçºç°å¢ã®ã¡ã³ããã³ã¹ã»ãªãã¡ã¯ã¿ãªã³ã°èªäœã¯ãããŸã§ããŠãŒã¶ã«æ°ããæ©èœãæäŸããŠããããã§ã¯ãªããç²ã
ãšè¡ã£ãŠãããã®ã§ãããããã課é¡ãæŽãåºããåãåã£ãŠã解決ããŠãã£ãããšã«ãã£ãŠåŸããããã©ã¯ãã£ã¹ã¯å€ããããããã³ããšã³ãã®ãšã³ã·ã¹ãã ã«å¯Ÿããçè§£ãå€ãåŸãããŸããã ãããã®ãªãã¡ã¯ã¿ãªã³ã°ãè¡ãããšã«ãã£ãŠ DX ãåäžããŠãããæè¡çãªãã€ãºã«æ©ãæéãæžãããšã³ãžãã¢ã¯ãããããã¯ãã®æ©èœéçºã«å°å¿µã§ããããã«ãªã£ãŠãããšä¿¡ããŠããŸãã ä»åç§ãã¡ã課é¡ã解決ããããšã«ãã£ãŠãæç¶çã«ãªãã¡ã¯ã¿ãªã³ã°ãããããåå°äœãããããšããåŽé¢ããããšæããŸããä»åŸã®èª²é¡ãšããŠããã®åå°ãåºã«ããããã®ãšã³ãžãã¢ãæèãæã£ãŠã¡ã³ããã³ã¹ã§ãããããªä»çµã¿ã¥ãããè¡ã£ãŠãããããšæããŸãã æåŸãŸã§èªãã§ããã ãããããšãããããŸããã www.medley.jp
ããã«ã¡ã¯ã第äºéçºã°ã«ãŒããšã³ãžãã¢ã®è¥¿æã§ãã䞻㫠CLINICS ã®éçºãæ
åœããŠããŸãã ã¯ããã« CLINICS ã¯é»åã«ã«ãããªã³ã©ã€ã³èšºçãäºçŽã·ã¹ãã ãæ£è
ã¢ããªãªã©ãå«ãçµ±åã¢ããªã§ããCLINICS ãããŒã³ãããŠããçŸåšã«è³ããŸã§åžžã«æ°æ©èœéçºãšå®åžžæ¹åãè¡ãããŠãããéçºç°å¢ã®ã¡ã³ããã³ã¹ã¯åŸæã«ãªããã¡ã§ãããä»åã¯ãããã£ãç¶æ³ãæ¹åãã¹ããéçºç°å¢ã®ã¡ã³ããã³ã¹ããªãã¡ã¯ã¿ãªã³ã°ãè¡ã£ãéçšããåŸããããã©ã¯ãã£ã¹ã«ã€ããŠç޹ä»ããŠããããšæããŸãã ã¢ãããŒã·ã§ã³ ãããã¯ãã®æ°èŠéçºæã«è¡ãããæè¡éžå®ã¯éåžžã«é£ãããæ¥åèŠä»¶ãããŒã ç¶æ³ãªã©ç·åçã«èæ
®ããŠãã®æç¹ã§ã®ãã¹ããªéžæãããå¿
èŠããããŸãã ããããéžæããæè¡ã§é·æéçšãããŠãããã¡ã«ãã¡ã³ããã³ã¹ãè¡ãå±ããªããªã£ãã³ãŒããã©ã€ãã©ãªãåºãŠããŸããŸãã CLINICS ããŒã³ãåœåã¯ãªã³ã©ã€ã³èšºçã®ã¿ãæäŸããŠããŸãããSPA ã§æ§æãããŠããŸããããïŒã€ã® package.json ã§å¹ççã«éçºã§ããŠããŸãããä»ã«ãçŸåšã»ã© TypeScript ãäž»æµã§ã¯ãªãã£ãã®ã§ JavaScript ã®ã³ãŒããã¡ã€ã³ã§å®è£
ãããŠãŸããã æ°ããªã¢ããªã±ãŒã·ã§ã³ïŒé»åã«ã«ããäºçŽã·ã¹ãã ãªã©ïŒãå°å
¥ããã¿ã€ãã³ã°ãããªãã¡ãããã¯ããå°èŠæš¡ããäžèŠæš¡ã«å€é·ããã¿ã€ãã³ã°ããããã³ããšã³ãã®ææµã«ãã£ãŠãéçºç°å¢ãæ¹åã§ããéšåããããŸãããããããŠããªãéšåãåºãŠããŸããã ãã®æ¹åããããŠããªãéšåãæ®ãç¶æ
ãç¶ããš Developer Experience(DX)ã®äœäžã«ç¹ãã£ãŠããŸããŸããã§ãã®ã§ãç§ãã¡ã¯æ¹åããããŠããªãéšåãåãé€ããŠãããããã¢ãã³ãšãããéçºç°å¢ãžãªãã¡ã¯ã¿ãªã³ã°ãããŠããããšèããŸããã DX ãåäžããŠããããšã§æè¡çãªãã€ãºã«æéãåãããªãããã«ãªããŸãããããŠæäŸããæ©èœãã®ãã®ã«ã€ããŠèããæéãå¢ããçµæçã« CLINICS ãããè¯ããããã¯ããžé²åãããŠããã®ãåœãªãã¡ã¯ã¿ãªã³ã°ã®ç®çã§ãã èª²é¡æŽç æ¹åããŠããããã«ã¯ãçŸç¶æŽçãèª²é¡æŽçãè¡ããªãããšã«ã¯äœãå§ãŸããŸãããããã³ããšã³ãéçºç°å¢ãã¡ã³ããã³ã¹ããã¿ã¹ã¯ã¯ããããã¯ãã®æ©èœïŒãŠãŒã¶ã«æäŸãããæ©èœïŒã«çŽæ¥ãã©ã¹ã®åœ±é¿ãããããã§ã¯ãããŸãããèªããšéåžžã®æ©èœéçºãå®åžžæ¹åã«æ¯ã¹åªå
床ã¯èœã¡ããããã¹ããæéã§æ¹åãããŠããããšã«ãªããŸããããããã¹ããæéãæå¹æŽ»çšããããã«ã¯ãã¿ã¹ã¯ã®é£æåºŠã®çè§£ãã¿ã¹ã¯ãé©åœã«åå²ããã§ãŒãžã³ã°ã®èšç»ãè¡ãããšã極ããŠå€§äºã§ãã ãã®ããã«èæ
®ãã課é¡ã®äžã§ãæ¬èšäºã§èšèŒããã®ã¯ä»¥äžã®ïŒã€ã§ãã ã©ã€ãã©ãªã宿çã«ã¢ããããŒãããéçšãåºãŸã£ãŠãªã éçšæ¹åŒãåºãŸã£ãŠããªãããšã§ãæŸçœ®ãããŠããŸããã¡ã§ããçå
ããŠã¢ããããŒãããã¡ã³ããŒããããšããŠããå±äººåã®èª²é¡ãæ®ã£ãŠããŸããŸã æŸçœ®ãããŠããŸã£ãããšã«ãããææ°çãšã®å·®åã倧ãããªãã¢ããããŒãããã³ã¹ãã倧ãããªã£ãŠããŸããŸã çµæçã«ãã©ã€ãã©ãªã®ã»ãã¥ãªãã£ãã£ãã¯ã¹å¯Ÿå¿ãæ°ããæäŸãããæ©èœãããã«é©å¿ã§ããªãç°å¢ã«ãªã£ãŠããŸããŸã è€æ°ã® SPA ã®äŸåãïŒã€ã® package.json ã§ç®¡çããŠãã é»åã«ã«ãã»ãªã³ã©ã€ã³èšºçã瀟å
管ç Web ã¢ããªãæ£è
Web ã¢ããªã¯ããããå¥ã® SPA ãšããŠäœãããŠããŸã ããããïŒã€ã® package.json ã§ç®¡çããŠããããããããã® SPA ãåãäŸåããã±ãŒãžã䜿ããªããŠã¯ãªããŸãããå°èŠæš¡ã®ãšãã¯ãã®ãããªæ§æã§ååã§ããããèŠæš¡ã倧ãããªãã«ã€ããŠæè»æ§ã倱ããããšå
±ã«ãã©ã€ãã©ãªã®ã¢ããããŒãããããã圱é¿ç¯å²ãåºãã£ãŠããŸãããã容æã«ã¢ããããŒãã§ããªããªã£ãŠããŸããŸã æ¬èšäºã§ã¯èšèŒããŸããããRedux ã®æžãæ¹ãæ··åšããŠããããããã³ããšã³ãã®ãã¹ããå°ãªãããç¶²çŸ
çã« TypeScript åã§ããŠããªã JavaScript ããŸã æ®ã£ãŠããããªã©ã®èª²é¡ãæããããŸããã ãããã課é¡ã¯ãã©ã®ãããã¯ãã«ãååšãããšæããŸããããã¯ããŒã³ãåœæã®æè¡æµè¡ã§ãã£ããããããã¯ãã®æåŸ
èŠæš¡ãå°æ°ã¡ã³ãã«é©ããèšèšãªã©èŠå ã¯æ§ã
ãããããã°ã©ã ã®ãªãã¡ã¯ã¿ãªã³ã°ãšåæ§ã« ãããã¯ãã®æé·ã«äŒŽã£ãŠãªãã¡ã¯ã¿ãªã³ã°ããŠããããšãæ£ ã ãšä¿¡ããŠããŸãã ã¢ãããŒã·ã§ã³ã«ãŠèšèŒããéãããããè€æ°ã®èª²é¡ã¯éçºç°å¢ã®ãã€ãºã§ãããé€å»ããããšã«ãã£ãŠãããè¯ã DX ãåŸããããšèããŠããŸããä»ã«ãã®ãããªãªãã¡ã¯ã¿ãªã³ã°ãè¡ãããšã«ãã£ãŠããããã¯ããããå
ç¢ã«ã§ãããšããåŽé¢ããããŸãã äžèšã®ïŒã€ã®èª²é¡ã«å¯ŸããŠãããããã©ã€ãã©ãªã宿çã«ã¢ããããŒãããéçšææ®µãèšããããpackage.json ã SPA åäœã«åå²ããã話ãããããããŠãããŸãã ããã³ããšã³ãéçºç°å¢ã®ãªãã¡ã¯ã¿ãªã³ã° ã©ã€ãã©ãªã®å®æçãªã¢ããããŒããããéçšæé ãèšãã æåã¢ããããŒã ã©ã€ãã©ãªãã¢ããããŒãããã«ã¯ã³ãã³ããå©ãã ãã ãšèããŠããŸããããäŸåããŠããå¥ã®ã©ã€ãã©ãªã«åœ±é¿ãæ¬åœã«ãªãããªã©èª¿æ»ããå¿
èŠããããšç¥ããã©ã€ãã©ãªã®ã¢ããããŒãæ¹æ³ã暡玢ãããšããããéå§ããŸããã ã©ã€ãã©ãªã§ã¯ãªãã§ãããNode.js ã®ã¢ããããŒããããããšãããšãnode-sass ã Firebase ã圱é¿ããŠãããããŠãèã¥ãåŒã§æ ¹ã£ãã«ããã©ã€ãã©ãªã®ã¢ããããŒããããå¿
èŠãåºãŠãããããã®ã§ãäžã€äžã€åé¡ããªãã調æ»ããã®ã倧å€ã§ããã äœãããã¢ããããŒã察象ã©ã€ãã©ãªã®ãªãªãŒã¹ããŒãã« Breaking Changes ãæžãããŠããªãã£ãããsemver ãå®ãããŠãããããããªãã£ãããšããããã¯ãã«åœ±é¿ããªãã調ã¹ãå¿
èŠããããåé¡ã®åãåãæ¹ãé£ããã£ãã®ã§ãã ããã§åŸãããã©ã€ãã©ãªã¢ããããŒãã®å®å
šæ§æ
ä¿ã®ãã©ã¯ãã£ã¹ãšã㊠webpack ã«ãããã«ãçµæãå€ãããªãã±ãŒã¹ ãšã QA ãã¹ãã«ãã£ãŠæ
ä¿ããã±ãŒã¹ ãããããšãããããŸãããåè
㯠webpack ã«ããææç©ãå€ãããªãã®ã§ããã°ä»åã®ã¢ããããŒããå®å
šã§ãããšãããåŸè
ã¯ãšã³ãžãã¢ãš QA ãšã³ãžãã¢ã«ãã£ãŠã©ã€ãã©ãªã®åœ±é¿ç¯å²ã«ãã¬ãŒã·ã§ã³ããªãããšã確ãããŠå®å
šã§ãããšããããšãããã®ã§ãã renovate ã®éçšéå§ æ°ã«æéã¯äžèšã®ããã«ã©ã€ãã©ãªã®ã¢ããããŒããæåã§è¡ã£ãŠããŸãããã確èªå·¥æ°ãå¢ããŠããŸããä»ã®ã¿ã¹ã¯ã®æéãå§è¿«ããŠããŸãã»ã©ã§ããã ããã§ãã¢ããããŒããèªååãã renovate  㚠dependabot ãèŠéã«å
¥ããŸãããrenovate ã¯ãdependabot ã«æ¯ã¹ãŠé«æ©èœã§ãã€ãç¡æã§ãããšããçç±ã§éžå®ããŸããã éçšåœåãrenovate ã Pull Request ãäœæããŠãããããdiff ã«ããã©ã€ãã©ãªã®å€æŽç¹ãèŠãããã£ãããšãæ©æµãæããŠããŸãããããããåŸã
ã«ãã¢ããããŒã察象ãå€ãããããããã©ãããã©ã€ãã©ãªã§ã圱é¿ç¯å²ãã©ããªã®ãããšããããšã®èª¿æ»ã«æéãåãããããã«ãªã£ãŠããŸããŸããã ããã§åŸãããèª¿æ»æéãççž®ãããã©ã¯ãã£ã¹ãšããŠ**ãæ¬çªåœ±é¿ã®ãããã®ããéçºåããããã«ãåšãããš renovate ããæ¥ã Pull Request ãæŽçãã**ããšã§ãããã®ãããªæŽçãè¡ãããšã§ãæ¬çªåœ±é¿ã®ãããã®ã«æ³šåããŠã¬ãã¥ãŒã§ããããã«ãªããèŠã«ãªããã«ã¢ããããŒããã§ããããã«ãªããŸããã çµæ ã©ã€ãã©ãªã¢ããããŒãã®éçšæé ãèšããããšã«ãã£ãŠãä»ãŸã§ä»¥äžã«å
ç¢ãªç°å¢ã«ãªããŸããããããããrenovate ã«ãã£ãŠèªåçã«éèŠãªïŒæ¬çªåœ±é¿ã®ããïŒã©ã€ãã©ãªã®ã¿ã«éäžããŠã¬ãã¥ãŒãè¡ãããšã«ãã£ãŠãå°ãªãå·¥æ°ã§ã¢ããããŒãããŠãããããã«ãªããŸããã package.json ã SPA åäœã«åå² èª²é¡æŽçã§èšèŒããéããé»åã«ã«ãã»ãªã³ã©ã€ã³èšºçã瀟å
管ç Web ã¢ããªãæ£è
Web ã¢ããªã¯ããããå¥ã® SPA ãšããŠäœãããŠããŸãããïŒã€ã® package.json ã§ç®¡çããŠããŸããã§ãã®ã§ããããã® SPA ãåãäŸåããã±ãŒãžã䜿ããªããã°ãªããŸããã åŒå®³ãšã㊠package.json ã«å¯ŸããŠïŒã€ã®å€æŽããã£ããšãã«ãã¹ãŠã® SPA ã«åœ±é¿ãåºãŠããŸããŸããã§ãã®ã§ããã®è¥å€§åãã package.json ãããããã® SPA ã«åå²ããããšããŸããã package.json ã SPA åäœã«åå²ããããšã¯ 責ååé¢ ãšããåŽé¢ããããã©ã€ãã©ãªã ãã§ãªããå
±éããŠãã宿°ãããžãã¯ãã³ã³ããŒãã³ããwebpack.config.jsãbabel.config.js ãš tsconfig.json ãªã©ãã¹ãŠãããããã® SPA ã«äŸåã®ãªã圢ã«éããããã«ããŸããããããã®åå²ããäœæ¥ã¯éåžžã«æ³¥èããã®ã§ãæ¬èšäºã«èšèŒããã»ã©ã®ãã®ã§ã¯ãããŸããããåŸãããçµæã«ã€ããŠèšèŒããŠããããšæããŸãã çµæ ãŸãã責ååé¢ãã§ããã®ã§ãïŒã€ã® SPA ã«å¯Ÿãã倿Žããã£ããšãã«ãä»ã®å
šãŠã® SPA ã«å¯Ÿãã圱é¿ãåºãªããªããŸããããã£ãŠãïŒã€ã® SPA ã«å¯ŸããŠæ°ã㪠Web ãã¬ãŒã ã¯ãŒã¯ãã©ã€ãã©ãªã詊ãããšã容æã«ãªããŸãããä»ã«ããïŒã€ã® webpack ã§ãã¹ãŠã® SPA ãã·ãŒã±ã³ã·ã£ã«ã«ãã«ãããŠããã®ã«å¯ŸããŠãçŸåšã¯ãã©ã¬ã«ã§ãã«ãã§ããããã«ãªããã«ãæéãççž®ããããããä»ãŸã§ä»¥äžã«ã³ããããããããã€ãŸã§ã®ã€ãã¬ãŒã·ã§ã³ãå°ãããªããŸããã ãããã®çµæããããã³ãéçºç°å¢ã®æ¹åããã³ DX åäžãæãããŸããã ä»åŸã®èª²é¡ æç¶çãªãªãã¡ã¯ã¿ãªã³ã°ãããä»çµã¿äœã ãã©ã€ãã©ãªã®å®æçãªã¢ããããŒããããéçšæé ãèšãããã¯ãŸãã«æç¶çã«ã©ã€ãã©ãªãã¢ããããŒãããããã®ææ®µã§ãããpackage.json ã SPA åäœã«åå²ããããããããã® SPA ãã¡ã³ããã³ã¹ããããç°å¢äœããšããŠã¯æ¬ ãããªãäœæ¥ã§ããã ãããããã®ãŸãŸãªãã¡ã¯ã¿ãªã³ã°ãäžæããã°ããããã¯ãã®èŠæš¡ã倧ãããªããšããããã³ããšã³ãã®ææµã«ãã£ãŠåã³ã¡ã³ããã³ã¹ãã¥ããç°å¢ã«ãªã£ãŠããŸããŸãã ãªã®ã§ãæç¶çãªãªãã¡ã¯ã¿ãªã³ã°ãããããã«ã¯ä»çµã¿äœããæ¬ ãããªããšèããŠããŸãããã®ããã«ã¯ãå±äººåã«ãããªãä»çµã¿ã¥ãããã¡ã³ããã³ã¹ããããç°å¢æ¹åããšã³ãžãã¢ããããã®ããã³ããšã³ãéçºç°å¢ã«å¯Ÿãããªãã©ã·ãé«ããåãçµã¿ãè¡ã£ãŠããå¿
èŠããããŸãããã®ãããçŸåš æšªè»žååŒ·äŒ ãªã©ã§ CLINICS ããã³ããšã³ãã®å®è£
èæ¯ãããªãã¡ã¯ã¿ãªã³ã°ããããæžãæ¹ãªã©ã®ãã¬ããžãå
±æããŠããŸãã ãŸãšã ããã³ããšã³ãéçºç°å¢ã®ã¡ã³ããã³ã¹ã»ãªãã¡ã¯ã¿ãªã³ã°èªäœã¯ãããŸã§ããŠãŒã¶ã«æ°ããæ©èœãæäŸããŠããããã§ã¯ãªããç²ã
ãšè¡ã£ãŠãããã®ã§ãããããã課é¡ãæŽãåºããåãåã£ãŠã解決ããŠãã£ãããšã«ãã£ãŠåŸããããã©ã¯ãã£ã¹ã¯å€ããããããã³ããšã³ãã®ãšã³ã·ã¹ãã ã«å¯Ÿããçè§£ãå€ãåŸãããŸããã ãããã®ãªãã¡ã¯ã¿ãªã³ã°ãè¡ãããšã«ãã£ãŠ DX ãåäžããŠãããæè¡çãªãã€ãºã«æ©ãæéãæžãããšã³ãžãã¢ã¯ãããããã¯ãã®æ©èœéçºã«å°å¿µã§ããããã«ãªã£ãŠãããšä¿¡ããŠããŸãã ä»åç§ãã¡ã課é¡ã解決ããããšã«ãã£ãŠãæç¶çã«ãªãã¡ã¯ã¿ãªã³ã°ãããããåå°äœãããããšããåŽé¢ããããšæããŸããä»åŸã®èª²é¡ãšããŠããã®åå°ãåºã«ããããã®ãšã³ãžãã¢ãæèãæã£ãŠã¡ã³ããã³ã¹ã§ãããããªä»çµã¿ã¥ãããè¡ã£ãŠãããããšæããŸãã æåŸãŸã§èªãã§ããã ãããããšãããããŸããã www.medley.jp
ããã«ã¡ã¯ã第äºéçºã°ã«ãŒããšã³ãžãã¢ã®è¥¿æã§ãã䞻㫠CLINICS ã®éçºãæ
åœããŠããŸãã ã¯ããã« CLINICS ã¯é»åã«ã«ãããªã³ã©ã€ã³èšºçãäºçŽã·ã¹ãã ãæ£è
ã¢ããªãªã©ãå«ãçµ±åã¢ããªã§ããCLINICS ãããŒã³ãããŠããçŸåšã«è³ããŸã§åžžã«æ°æ©èœéçºãšå®åžžæ¹åãè¡ãããŠãããéçºç°å¢ã®ã¡ã³ããã³ã¹ã¯åŸæã«ãªããã¡ã§ãããä»åã¯ãããã£ãç¶æ³ãæ¹åãã¹ããéçºç°å¢ã®ã¡ã³ããã³ã¹ããªãã¡ã¯ã¿ãªã³ã°ãè¡ã£ãéçšããåŸããããã©ã¯ãã£ã¹ã«ã€ããŠç޹ä»ããŠããããšæããŸãã ã¢ãããŒã·ã§ã³ ãããã¯ãã®æ°èŠéçºæã«è¡ãããæè¡éžå®ã¯éåžžã«é£ãããæ¥åèŠä»¶ãããŒã ç¶æ³ãªã©ç·åçã«èæ
®ããŠãã®æç¹ã§ã®ãã¹ããªéžæãããå¿
èŠããããŸãã ããããéžæããæè¡ã§é·æéçšãããŠãããã¡ã«ãã¡ã³ããã³ã¹ãè¡ãå±ããªããªã£ãã³ãŒããã©ã€ãã©ãªãåºãŠããŸããŸãã CLINICS ããŒã³ãåœåã¯ãªã³ã©ã€ã³èšºçã®ã¿ãæäŸããŠããŸãããSPA ã§æ§æãããŠããŸããããïŒã€ã® package.json ã§å¹ççã«éçºã§ããŠããŸãããä»ã«ãçŸåšã»ã© TypeScript ãäž»æµã§ã¯ãªãã£ãã®ã§ JavaScript ã®ã³ãŒããã¡ã€ã³ã§å®è£
ãããŠãŸããã æ°ããªã¢ããªã±ãŒã·ã§ã³ïŒé»åã«ã«ããäºçŽã·ã¹ãã ãªã©ïŒãå°å
¥ããã¿ã€ãã³ã°ãããªãã¡ãããã¯ããå°èŠæš¡ããäžèŠæš¡ã«å€é·ããã¿ã€ãã³ã°ããããã³ããšã³ãã®ææµã«ãã£ãŠãéçºç°å¢ãæ¹åã§ããéšåããããŸãããããããŠããªãéšåãåºãŠããŸããã ãã®æ¹åããããŠããªãéšåãæ®ãç¶æ
ãç¶ããš Developer Experience(DX)ã®äœäžã«ç¹ãã£ãŠããŸããŸããã§ãã®ã§ãç§ãã¡ã¯æ¹åããããŠããªãéšåãåãé€ããŠãããããã¢ãã³ãšãããéçºç°å¢ãžãªãã¡ã¯ã¿ãªã³ã°ãããŠããããšèããŸããã DX ãåäžããŠããããšã§æè¡çãªãã€ãºã«æéãåãããªãããã«ãªããŸãããããŠæäŸããæ©èœãã®ãã®ã«ã€ããŠèããæéãå¢ããçµæçã« CLINICS ãããè¯ããããã¯ããžé²åãããŠããã®ãåœãªãã¡ã¯ã¿ãªã³ã°ã®ç®çã§ãã èª²é¡æŽç æ¹åããŠããããã«ã¯ãçŸç¶æŽçãèª²é¡æŽçãè¡ããªãããšã«ã¯äœãå§ãŸããŸãããããã³ããšã³ãéçºç°å¢ãã¡ã³ããã³ã¹ããã¿ã¹ã¯ã¯ããããã¯ãã®æ©èœïŒãŠãŒã¶ã«æäŸãããæ©èœïŒã«çŽæ¥ãã©ã¹ã®åœ±é¿ãããããã§ã¯ãããŸãããèªããšéåžžã®æ©èœéçºãå®åžžæ¹åã«æ¯ã¹åªå
床ã¯èœã¡ããããã¹ããæéã§æ¹åãããŠããããšã«ãªããŸããããããã¹ããæéãæå¹æŽ»çšããããã«ã¯ãã¿ã¹ã¯ã®é£æåºŠã®çè§£ãã¿ã¹ã¯ãé©åœã«åå²ããã§ãŒãžã³ã°ã®èšç»ãè¡ãããšã極ããŠå€§äºã§ãã ãã®ããã«èæ
®ãã課é¡ã®äžã§ãæ¬èšäºã§èšèŒããã®ã¯ä»¥äžã®ïŒã€ã§ãã ã©ã€ãã©ãªã宿çã«ã¢ããããŒãããéçšãåºãŸã£ãŠãªã éçšæ¹åŒãåºãŸã£ãŠããªãããšã§ãæŸçœ®ãããŠããŸããã¡ã§ããçå
ããŠã¢ããããŒãããã¡ã³ããŒããããšããŠããå±äººåã®èª²é¡ãæ®ã£ãŠããŸããŸã æŸçœ®ãããŠããŸã£ãããšã«ãããææ°çãšã®å·®åã倧ãããªãã¢ããããŒãããã³ã¹ãã倧ãããªã£ãŠããŸããŸã çµæçã«ãã©ã€ãã©ãªã®ã»ãã¥ãªãã£ãã£ãã¯ã¹å¯Ÿå¿ãæ°ããæäŸãããæ©èœãããã«é©å¿ã§ããªãç°å¢ã«ãªã£ãŠããŸããŸã è€æ°ã® SPA ã®äŸåãïŒã€ã® package.json ã§ç®¡çããŠãã é»åã«ã«ãã»ãªã³ã©ã€ã³èšºçã瀟å
管ç Web ã¢ããªãæ£è
Web ã¢ããªã¯ããããå¥ã® SPA ãšããŠäœãããŠããŸã ããããïŒã€ã® package.json ã§ç®¡çããŠããããããããã® SPA ãåãäŸåããã±ãŒãžã䜿ããªããŠã¯ãªããŸãããå°èŠæš¡ã®ãšãã¯ãã®ãããªæ§æã§ååã§ããããèŠæš¡ã倧ãããªãã«ã€ããŠæè»æ§ã倱ããããšå
±ã«ãã©ã€ãã©ãªã®ã¢ããããŒãããããã圱é¿ç¯å²ãåºãã£ãŠããŸãããã容æã«ã¢ããããŒãã§ããªããªã£ãŠããŸããŸã æ¬èšäºã§ã¯èšèŒããŸããããRedux ã®æžãæ¹ãæ··åšããŠããããããã³ããšã³ãã®ãã¹ããå°ãªãããç¶²çŸ
çã« TypeScript åã§ããŠããªã JavaScript ããŸã æ®ã£ãŠããããªã©ã®èª²é¡ãæããããŸããã ãããã課é¡ã¯ãã©ã®ãããã¯ãã«ãååšãããšæããŸããããã¯ããŒã³ãåœæã®æè¡æµè¡ã§ãã£ããããããã¯ãã®æåŸ
èŠæš¡ãå°æ°ã¡ã³ãã«é©ããèšèšãªã©èŠå ã¯æ§ã
ãããããã°ã©ã ã®ãªãã¡ã¯ã¿ãªã³ã°ãšåæ§ã« ãããã¯ãã®æé·ã«äŒŽã£ãŠãªãã¡ã¯ã¿ãªã³ã°ããŠããããšãæ£ ã ãšä¿¡ããŠããŸãã ã¢ãããŒã·ã§ã³ã«ãŠèšèŒããéãããããè€æ°ã®èª²é¡ã¯éçºç°å¢ã®ãã€ãºã§ãããé€å»ããããšã«ãã£ãŠãããè¯ã DX ãåŸããããšèããŠããŸããä»ã«ãã®ãããªãªãã¡ã¯ã¿ãªã³ã°ãè¡ãããšã«ãã£ãŠããããã¯ããããå
ç¢ã«ã§ãããšããåŽé¢ããããŸãã äžèšã®ïŒã€ã®èª²é¡ã«å¯ŸããŠãããããã©ã€ãã©ãªã宿çã«ã¢ããããŒãããéçšææ®µãèšããããpackage.json ã SPA åäœã«åå²ããã話ãããããããŠãããŸãã ããã³ããšã³ãéçºç°å¢ã®ãªãã¡ã¯ã¿ãªã³ã° ã©ã€ãã©ãªã®å®æçãªã¢ããããŒããããéçšæé ãèšãã æåã¢ããããŒã ã©ã€ãã©ãªãã¢ããããŒãããã«ã¯ã³ãã³ããå©ãã ãã ãšèããŠããŸããããäŸåããŠããå¥ã®ã©ã€ãã©ãªã«åœ±é¿ãæ¬åœã«ãªãããªã©èª¿æ»ããå¿
èŠããããšç¥ããã©ã€ãã©ãªã®ã¢ããããŒãæ¹æ³ã暡玢ãããšããããéå§ããŸããã ã©ã€ãã©ãªã§ã¯ãªãã§ãããNode.js ã®ã¢ããããŒããããããšãããšãnode-sass ã Firebase ã圱é¿ããŠãããããŠãèã¥ãåŒã§æ ¹ã£ãã«ããã©ã€ãã©ãªã®ã¢ããããŒããããå¿
èŠãåºãŠãããããã®ã§ãäžã€äžã€åé¡ããªãã調æ»ããã®ã倧å€ã§ããã äœãããã¢ããããŒã察象ã©ã€ãã©ãªã®ãªãªãŒã¹ããŒãã« Breaking Changes ãæžãããŠããªãã£ãããsemver ãå®ãããŠãããããããªãã£ãããšããããã¯ãã«åœ±é¿ããªãã調ã¹ãå¿
èŠããããåé¡ã®åãåãæ¹ãé£ããã£ãã®ã§ãã ããã§åŸãããã©ã€ãã©ãªã¢ããããŒãã®å®å
šæ§æ
ä¿ã®ãã©ã¯ãã£ã¹ãšã㊠webpack ã«ãããã«ãçµæãå€ãããªãã±ãŒã¹ ãšã QA ãã¹ãã«ãã£ãŠæ
ä¿ããã±ãŒã¹ ãããããšãããããŸãããåè
㯠webpack ã«ããææç©ãå€ãããªãã®ã§ããã°ä»åã®ã¢ããããŒããå®å
šã§ãããšãããåŸè
ã¯ãšã³ãžãã¢ãš QA ãšã³ãžãã¢ã«ãã£ãŠã©ã€ãã©ãªã®åœ±é¿ç¯å²ã«ãã¬ãŒã·ã§ã³ããªãããšã確ãããŠå®å
šã§ãããšããããšãããã®ã§ãã renovate ã®éçšéå§ æ°ã«æéã¯äžèšã®ããã«ã©ã€ãã©ãªã®ã¢ããããŒããæåã§è¡ã£ãŠããŸãããã確èªå·¥æ°ãå¢ããŠããŸããä»ã®ã¿ã¹ã¯ã®æéãå§è¿«ããŠããŸãã»ã©ã§ããã ããã§ãã¢ããããŒããèªååãã renovate  㚠dependabot ãèŠéã«å
¥ããŸãããrenovate ã¯ãdependabot ã«æ¯ã¹ãŠé«æ©èœã§ãã€ãç¡æã§ãããšããçç±ã§éžå®ããŸããã éçšåœåãrenovate ã Pull Request ãäœæããŠãããããdiff ã«ããã©ã€ãã©ãªã®å€æŽç¹ãèŠãããã£ãããšãæ©æµãæããŠããŸãããããããåŸã
ã«ãã¢ããããŒã察象ãå€ãããããããã©ãããã©ã€ãã©ãªã§ã圱é¿ç¯å²ãã©ããªã®ãããšããããšã®èª¿æ»ã«æéãåãããããã«ãªã£ãŠããŸããŸããã ããã§åŸãããèª¿æ»æéãççž®ãããã©ã¯ãã£ã¹ãšããŠ**ãæ¬çªåœ±é¿ã®ãããã®ããéçºåããããã«ãåšãããš renovate ããæ¥ã Pull Request ãæŽçãã**ããšã§ãããã®ãããªæŽçãè¡ãããšã§ãæ¬çªåœ±é¿ã®ãããã®ã«æ³šåããŠã¬ãã¥ãŒã§ããããã«ãªããèŠã«ãªããã«ã¢ããããŒããã§ããããã«ãªããŸããã çµæ ã©ã€ãã©ãªã¢ããããŒãã®éçšæé ãèšããããšã«ãã£ãŠãä»ãŸã§ä»¥äžã«å
ç¢ãªç°å¢ã«ãªããŸããããããããrenovate ã«ãã£ãŠèªåçã«éèŠãªïŒæ¬çªåœ±é¿ã®ããïŒã©ã€ãã©ãªã®ã¿ã«éäžããŠã¬ãã¥ãŒãè¡ãããšã«ãã£ãŠãå°ãªãå·¥æ°ã§ã¢ããããŒãããŠãããããã«ãªããŸããã package.json ã SPA åäœã«åå² èª²é¡æŽçã§èšèŒããéããé»åã«ã«ãã»ãªã³ã©ã€ã³èšºçã瀟å
管ç Web ã¢ããªãæ£è
Web ã¢ããªã¯ããããå¥ã® SPA ãšããŠäœãããŠããŸãããïŒã€ã® package.json ã§ç®¡çããŠããŸããã§ãã®ã§ããããã® SPA ãåãäŸåããã±ãŒãžã䜿ããªããã°ãªããŸããã åŒå®³ãšã㊠package.json ã«å¯ŸããŠïŒã€ã®å€æŽããã£ããšãã«ãã¹ãŠã® SPA ã«åœ±é¿ãåºãŠããŸããŸããã§ãã®ã§ããã®è¥å€§åãã package.json ãããããã® SPA ã«åå²ããããšããŸããã package.json ã SPA åäœã«åå²ããããšã¯ 責ååé¢ ãšããåŽé¢ããããã©ã€ãã©ãªã ãã§ãªããå
±éããŠãã宿°ãããžãã¯ãã³ã³ããŒãã³ããwebpack.config.jsãbabel.config.js ãš tsconfig.json ãªã©ãã¹ãŠãããããã® SPA ã«äŸåã®ãªã圢ã«éããããã«ããŸããããããã®åå²ããäœæ¥ã¯éåžžã«æ³¥èããã®ã§ãæ¬èšäºã«èšèŒããã»ã©ã®ãã®ã§ã¯ãããŸããããåŸãããçµæã«ã€ããŠèšèŒããŠããããšæããŸãã çµæ ãŸãã責ååé¢ãã§ããã®ã§ãïŒã€ã® SPA ã«å¯Ÿãã倿Žããã£ããšãã«ãä»ã®å
šãŠã® SPA ã«å¯Ÿãã圱é¿ãåºãªããªããŸããããã£ãŠãïŒã€ã® SPA ã«å¯ŸããŠæ°ã㪠Web ãã¬ãŒã ã¯ãŒã¯ãã©ã€ãã©ãªã詊ãããšã容æã«ãªããŸãããä»ã«ããïŒã€ã® webpack ã§ãã¹ãŠã® SPA ãã·ãŒã±ã³ã·ã£ã«ã«ãã«ãããŠããã®ã«å¯ŸããŠãçŸåšã¯ãã©ã¬ã«ã§ãã«ãã§ããããã«ãªããã«ãæéãççž®ããããããä»ãŸã§ä»¥äžã«ã³ããããããããã€ãŸã§ã®ã€ãã¬ãŒã·ã§ã³ãå°ãããªããŸããã ãããã®çµæããããã³ãéçºç°å¢ã®æ¹åããã³ DX åäžãæãããŸããã ä»åŸã®èª²é¡ æç¶çãªãªãã¡ã¯ã¿ãªã³ã°ãããä»çµã¿äœã ãã©ã€ãã©ãªã®å®æçãªã¢ããããŒããããéçšæé ãèšãããã¯ãŸãã«æç¶çã«ã©ã€ãã©ãªãã¢ããããŒãããããã®ææ®µã§ãããpackage.json ã SPA åäœã«åå²ããããããããã® SPA ãã¡ã³ããã³ã¹ããããç°å¢äœããšããŠã¯æ¬ ãããªãäœæ¥ã§ããã ãããããã®ãŸãŸãªãã¡ã¯ã¿ãªã³ã°ãäžæããã°ããããã¯ãã®èŠæš¡ã倧ãããªããšããããã³ããšã³ãã®ææµã«ãã£ãŠåã³ã¡ã³ããã³ã¹ãã¥ããç°å¢ã«ãªã£ãŠããŸããŸãã ãªã®ã§ãæç¶çãªãªãã¡ã¯ã¿ãªã³ã°ãããããã«ã¯ä»çµã¿äœããæ¬ ãããªããšèããŠããŸãããã®ããã«ã¯ãå±äººåã«ãããªãä»çµã¿ã¥ãããã¡ã³ããã³ã¹ããããç°å¢æ¹åããšã³ãžãã¢ããããã®ããã³ããšã³ãéçºç°å¢ã«å¯Ÿãããªãã©ã·ãé«ããåãçµã¿ãè¡ã£ãŠããå¿
èŠããããŸãããã®ãããçŸåš æšªè»žååŒ·äŒ ãªã©ã§ CLINICS ããã³ããšã³ãã®å®è£
èæ¯ãããªãã¡ã¯ã¿ãªã³ã°ããããæžãæ¹ãªã©ã®ãã¬ããžãå
±æããŠããŸãã ãŸãšã ããã³ããšã³ãéçºç°å¢ã®ã¡ã³ããã³ã¹ã»ãªãã¡ã¯ã¿ãªã³ã°èªäœã¯ãããŸã§ããŠãŒã¶ã«æ°ããæ©èœãæäŸããŠããããã§ã¯ãªããç²ã
ãšè¡ã£ãŠãããã®ã§ãããããã課é¡ãæŽãåºããåãåã£ãŠã解決ããŠãã£ãããšã«ãã£ãŠåŸããããã©ã¯ãã£ã¹ã¯å€ããããããã³ããšã³ãã®ãšã³ã·ã¹ãã ã«å¯Ÿããçè§£ãå€ãåŸãããŸããã ãããã®ãªãã¡ã¯ã¿ãªã³ã°ãè¡ãããšã«ãã£ãŠ DX ãåäžããŠãããæè¡çãªãã€ãºã«æ©ãæéãæžãããšã³ãžãã¢ã¯ãããããã¯ãã®æ©èœéçºã«å°å¿µã§ããããã«ãªã£ãŠãããšä¿¡ããŠããŸãã ä»åç§ãã¡ã課é¡ã解決ããããšã«ãã£ãŠãæç¶çã«ãªãã¡ã¯ã¿ãªã³ã°ãããããåå°äœãããããšããåŽé¢ããããšæããŸããä»åŸã®èª²é¡ãšããŠããã®åå°ãåºã«ããããã®ãšã³ãžãã¢ãæèãæã£ãŠã¡ã³ããã³ã¹ã§ãããããªä»çµã¿ã¥ãããè¡ã£ãŠãããããšæããŸãã æåŸãŸã§èªãã§ããã ãããããšãããããŸããã www.medley.jp
ããã«ã¡ã¯ã第äºéçºã°ã«ãŒããšã³ãžãã¢ã®è¥¿æã§ãã䞻㫠CLINICS ã®éçºãæ
åœããŠããŸãã ã¯ããã« CLINICS ã¯é»åã«ã«ãããªã³ã©ã€ã³èšºçãäºçŽã·ã¹ãã ãæ£è
ã¢ããªãªã©ãå«ãçµ±åã¢ããªã§ããCLINICS ãããŒã³ãããŠããçŸåšã«è³ããŸã§åžžã«æ°æ©èœéçºãšå®åžžæ¹åãè¡ãããŠãããéçºç°å¢ã®ã¡ã³ããã³ã¹ã¯åŸæã«ãªããã¡ã§ãããä»åã¯ãããã£ãç¶æ³ãæ¹åãã¹ããéçºç°å¢ã®ã¡ã³ããã³ã¹ããªãã¡ã¯ã¿ãªã³ã°ãè¡ã£ãéçšããåŸããããã©ã¯ãã£ã¹ã«ã€ããŠç޹ä»ããŠããããšæããŸãã ã¢ãããŒã·ã§ã³ ãããã¯ãã®æ°èŠéçºæã«è¡ãããæè¡éžå®ã¯éåžžã«é£ãããæ¥åèŠä»¶ãããŒã ç¶æ³ãªã©ç·åçã«èæ
®ããŠãã®æç¹ã§ã®ãã¹ããªéžæãããå¿
èŠããããŸãã ããããéžæããæè¡ã§é·æéçšãããŠãããã¡ã«ãã¡ã³ããã³ã¹ãè¡ãå±ããªããªã£ãã³ãŒããã©ã€ãã©ãªãåºãŠããŸããŸãã CLINICS ããŒã³ãåœåã¯ãªã³ã©ã€ã³èšºçã®ã¿ãæäŸããŠããŸãããSPA ã§æ§æãããŠããŸããããïŒã€ã® package.json ã§å¹ççã«éçºã§ããŠããŸãããä»ã«ãçŸåšã»ã© TypeScript ãäž»æµã§ã¯ãªãã£ãã®ã§ JavaScript ã®ã³ãŒããã¡ã€ã³ã§å®è£
ãããŠãŸããã æ°ããªã¢ããªã±ãŒã·ã§ã³ïŒé»åã«ã«ããäºçŽã·ã¹ãã ãªã©ïŒãå°å
¥ããã¿ã€ãã³ã°ãããªãã¡ãããã¯ããå°èŠæš¡ããäžèŠæš¡ã«å€é·ããã¿ã€ãã³ã°ããããã³ããšã³ãã®ææµã«ãã£ãŠãéçºç°å¢ãæ¹åã§ããéšåããããŸãããããããŠããªãéšåãåºãŠããŸããã ãã®æ¹åããããŠããªãéšåãæ®ãç¶æ
ãç¶ããš Developer Experience(DX)ã®äœäžã«ç¹ãã£ãŠããŸããŸããã§ãã®ã§ãç§ãã¡ã¯æ¹åããããŠããªãéšåãåãé€ããŠãããããã¢ãã³ãšãããéçºç°å¢ãžãªãã¡ã¯ã¿ãªã³ã°ãããŠããããšèããŸããã DX ãåäžããŠããããšã§æè¡çãªãã€ãºã«æéãåãããªãããã«ãªããŸãããããŠæäŸããæ©èœãã®ãã®ã«ã€ããŠèããæéãå¢ããçµæçã« CLINICS ãããè¯ããããã¯ããžé²åãããŠããã®ãåœãªãã¡ã¯ã¿ãªã³ã°ã®ç®çã§ãã èª²é¡æŽç æ¹åããŠããããã«ã¯ãçŸç¶æŽçãèª²é¡æŽçãè¡ããªãããšã«ã¯äœãå§ãŸããŸãããããã³ããšã³ãéçºç°å¢ãã¡ã³ããã³ã¹ããã¿ã¹ã¯ã¯ããããã¯ãã®æ©èœïŒãŠãŒã¶ã«æäŸãããæ©èœïŒã«çŽæ¥ãã©ã¹ã®åœ±é¿ãããããã§ã¯ãããŸãããèªããšéåžžã®æ©èœéçºãå®åžžæ¹åã«æ¯ã¹åªå
床ã¯èœã¡ããããã¹ããæéã§æ¹åãããŠããããšã«ãªããŸããããããã¹ããæéãæå¹æŽ»çšããããã«ã¯ãã¿ã¹ã¯ã®é£æåºŠã®çè§£ãã¿ã¹ã¯ãé©åœã«åå²ããã§ãŒãžã³ã°ã®èšç»ãè¡ãããšã極ããŠå€§äºã§ãã ãã®ããã«èæ
®ãã課é¡ã®äžã§ãæ¬èšäºã§èšèŒããã®ã¯ä»¥äžã®ïŒã€ã§ãã ã©ã€ãã©ãªã宿çã«ã¢ããããŒãããéçšãåºãŸã£ãŠãªã éçšæ¹åŒãåºãŸã£ãŠããªãããšã§ãæŸçœ®ãããŠããŸããã¡ã§ããçå
ããŠã¢ããããŒãããã¡ã³ããŒããããšããŠããå±äººåã®èª²é¡ãæ®ã£ãŠããŸããŸã æŸçœ®ãããŠããŸã£ãããšã«ãããææ°çãšã®å·®åã倧ãããªãã¢ããããŒãããã³ã¹ãã倧ãããªã£ãŠããŸããŸã çµæçã«ãã©ã€ãã©ãªã®ã»ãã¥ãªãã£ãã£ãã¯ã¹å¯Ÿå¿ãæ°ããæäŸãããæ©èœãããã«é©å¿ã§ããªãç°å¢ã«ãªã£ãŠããŸããŸã è€æ°ã® SPA ã®äŸåãïŒã€ã® package.json ã§ç®¡çããŠãã é»åã«ã«ãã»ãªã³ã©ã€ã³èšºçã瀟å
管ç Web ã¢ããªãæ£è
Web ã¢ããªã¯ããããå¥ã® SPA ãšããŠäœãããŠããŸã ããããïŒã€ã® package.json ã§ç®¡çããŠããããããããã® SPA ãåãäŸåããã±ãŒãžã䜿ããªããŠã¯ãªããŸãããå°èŠæš¡ã®ãšãã¯ãã®ãããªæ§æã§ååã§ããããèŠæš¡ã倧ãããªãã«ã€ããŠæè»æ§ã倱ããããšå
±ã«ãã©ã€ãã©ãªã®ã¢ããããŒãããããã圱é¿ç¯å²ãåºãã£ãŠããŸãããã容æã«ã¢ããããŒãã§ããªããªã£ãŠããŸããŸã æ¬èšäºã§ã¯èšèŒããŸããããRedux ã®æžãæ¹ãæ··åšããŠããããããã³ããšã³ãã®ãã¹ããå°ãªãããç¶²çŸ
çã« TypeScript åã§ããŠããªã JavaScript ããŸã æ®ã£ãŠããããªã©ã®èª²é¡ãæããããŸããã ãããã課é¡ã¯ãã©ã®ãããã¯ãã«ãååšãããšæããŸããããã¯ããŒã³ãåœæã®æè¡æµè¡ã§ãã£ããããããã¯ãã®æåŸ
èŠæš¡ãå°æ°ã¡ã³ãã«é©ããèšèšãªã©èŠå ã¯æ§ã
ãããããã°ã©ã ã®ãªãã¡ã¯ã¿ãªã³ã°ãšåæ§ã« ãããã¯ãã®æé·ã«äŒŽã£ãŠãªãã¡ã¯ã¿ãªã³ã°ããŠããããšãæ£ ã ãšä¿¡ããŠããŸãã ã¢ãããŒã·ã§ã³ã«ãŠèšèŒããéãããããè€æ°ã®èª²é¡ã¯éçºç°å¢ã®ãã€ãºã§ãããé€å»ããããšã«ãã£ãŠãããè¯ã DX ãåŸããããšèããŠããŸããä»ã«ãã®ãããªãªãã¡ã¯ã¿ãªã³ã°ãè¡ãããšã«ãã£ãŠããããã¯ããããå
ç¢ã«ã§ãããšããåŽé¢ããããŸãã äžèšã®ïŒã€ã®èª²é¡ã«å¯ŸããŠãããããã©ã€ãã©ãªã宿çã«ã¢ããããŒãããéçšææ®µãèšããããpackage.json ã SPA åäœã«åå²ããã話ãããããããŠãããŸãã ããã³ããšã³ãéçºç°å¢ã®ãªãã¡ã¯ã¿ãªã³ã° ã©ã€ãã©ãªã®å®æçãªã¢ããããŒããããéçšæé ãèšãã æåã¢ããããŒã ã©ã€ãã©ãªãã¢ããããŒãããã«ã¯ã³ãã³ããå©ãã ãã ãšèããŠããŸããããäŸåããŠããå¥ã®ã©ã€ãã©ãªã«åœ±é¿ãæ¬åœã«ãªãããªã©èª¿æ»ããå¿
èŠããããšç¥ããã©ã€ãã©ãªã®ã¢ããããŒãæ¹æ³ã暡玢ãããšããããéå§ããŸããã ã©ã€ãã©ãªã§ã¯ãªãã§ãããNode.js ã®ã¢ããããŒããããããšãããšãnode-sass ã Firebase ã圱é¿ããŠãããããŠãèã¥ãåŒã§æ ¹ã£ãã«ããã©ã€ãã©ãªã®ã¢ããããŒããããå¿
èŠãåºãŠãããããã®ã§ãäžã€äžã€åé¡ããªãã調æ»ããã®ã倧å€ã§ããã äœãããã¢ããããŒã察象ã©ã€ãã©ãªã®ãªãªãŒã¹ããŒãã« Breaking Changes ãæžãããŠããªãã£ãããsemver ãå®ãããŠãããããããªãã£ãããšããããã¯ãã«åœ±é¿ããªãã調ã¹ãå¿
èŠããããåé¡ã®åãåãæ¹ãé£ããã£ãã®ã§ãã ããã§åŸãããã©ã€ãã©ãªã¢ããããŒãã®å®å
šæ§æ
ä¿ã®ãã©ã¯ãã£ã¹ãšã㊠webpack ã«ãããã«ãçµæãå€ãããªãã±ãŒã¹ ãšã QA ãã¹ãã«ãã£ãŠæ
ä¿ããã±ãŒã¹ ãããããšãããããŸãããåè
㯠webpack ã«ããææç©ãå€ãããªãã®ã§ããã°ä»åã®ã¢ããããŒããå®å
šã§ãããšãããåŸè
ã¯ãšã³ãžãã¢ãš QA ãšã³ãžãã¢ã«ãã£ãŠã©ã€ãã©ãªã®åœ±é¿ç¯å²ã«ãã¬ãŒã·ã§ã³ããªãããšã確ãããŠå®å
šã§ãããšããããšãããã®ã§ãã renovate ã®éçšéå§ æ°ã«æéã¯äžèšã®ããã«ã©ã€ãã©ãªã®ã¢ããããŒããæåã§è¡ã£ãŠããŸãããã確èªå·¥æ°ãå¢ããŠããŸããä»ã®ã¿ã¹ã¯ã®æéãå§è¿«ããŠããŸãã»ã©ã§ããã ããã§ãã¢ããããŒããèªååãã renovate  㚠dependabot ãèŠéã«å
¥ããŸãããrenovate ã¯ãdependabot ã«æ¯ã¹ãŠé«æ©èœã§ãã€ãç¡æã§ãããšããçç±ã§éžå®ããŸããã éçšåœåãrenovate ã Pull Request ãäœæããŠãããããdiff ã«ããã©ã€ãã©ãªã®å€æŽç¹ãèŠãããã£ãããšãæ©æµãæããŠããŸãããããããåŸã
ã«ãã¢ããããŒã察象ãå€ãããããããã©ãããã©ã€ãã©ãªã§ã圱é¿ç¯å²ãã©ããªã®ãããšããããšã®èª¿æ»ã«æéãåãããããã«ãªã£ãŠããŸããŸããã ããã§åŸãããèª¿æ»æéãççž®ãããã©ã¯ãã£ã¹ãšããŠ**ãæ¬çªåœ±é¿ã®ãããã®ããéçºåããããã«ãåšãããš renovate ããæ¥ã Pull Request ãæŽçãã**ããšã§ãããã®ãããªæŽçãè¡ãããšã§ãæ¬çªåœ±é¿ã®ãããã®ã«æ³šåããŠã¬ãã¥ãŒã§ããããã«ãªããèŠã«ãªããã«ã¢ããããŒããã§ããããã«ãªããŸããã çµæ ã©ã€ãã©ãªã¢ããããŒãã®éçšæé ãèšããããšã«ãã£ãŠãä»ãŸã§ä»¥äžã«å
ç¢ãªç°å¢ã«ãªããŸããããããããrenovate ã«ãã£ãŠèªåçã«éèŠãªïŒæ¬çªåœ±é¿ã®ããïŒã©ã€ãã©ãªã®ã¿ã«éäžããŠã¬ãã¥ãŒãè¡ãããšã«ãã£ãŠãå°ãªãå·¥æ°ã§ã¢ããããŒãããŠãããããã«ãªããŸããã package.json ã SPA åäœã«åå² èª²é¡æŽçã§èšèŒããéããé»åã«ã«ãã»ãªã³ã©ã€ã³èšºçã瀟å
管ç Web ã¢ããªãæ£è
Web ã¢ããªã¯ããããå¥ã® SPA ãšããŠäœãããŠããŸãããïŒã€ã® package.json ã§ç®¡çããŠããŸããã§ãã®ã§ããããã® SPA ãåãäŸåããã±ãŒãžã䜿ããªããã°ãªããŸããã åŒå®³ãšã㊠package.json ã«å¯ŸããŠïŒã€ã®å€æŽããã£ããšãã«ãã¹ãŠã® SPA ã«åœ±é¿ãåºãŠããŸããŸããã§ãã®ã§ããã®è¥å€§åãã package.json ãããããã® SPA ã«åå²ããããšããŸããã package.json ã SPA åäœã«åå²ããããšã¯ 責ååé¢ ãšããåŽé¢ããããã©ã€ãã©ãªã ãã§ãªããå
±éããŠãã宿°ãããžãã¯ãã³ã³ããŒãã³ããwebpack.config.jsãbabel.config.js ãš tsconfig.json ãªã©ãã¹ãŠãããããã® SPA ã«äŸåã®ãªã圢ã«éããããã«ããŸããããããã®åå²ããäœæ¥ã¯éåžžã«æ³¥èããã®ã§ãæ¬èšäºã«èšèŒããã»ã©ã®ãã®ã§ã¯ãããŸããããåŸãããçµæã«ã€ããŠèšèŒããŠããããšæããŸãã çµæ ãŸãã責ååé¢ãã§ããã®ã§ãïŒã€ã® SPA ã«å¯Ÿãã倿Žããã£ããšãã«ãä»ã®å
šãŠã® SPA ã«å¯Ÿãã圱é¿ãåºãªããªããŸããããã£ãŠãïŒã€ã® SPA ã«å¯ŸããŠæ°ã㪠Web ãã¬ãŒã ã¯ãŒã¯ãã©ã€ãã©ãªã詊ãããšã容æã«ãªããŸãããä»ã«ããïŒã€ã® webpack ã§ãã¹ãŠã® SPA ãã·ãŒã±ã³ã·ã£ã«ã«ãã«ãããŠããã®ã«å¯ŸããŠãçŸåšã¯ãã©ã¬ã«ã§ãã«ãã§ããããã«ãªããã«ãæéãççž®ããããããä»ãŸã§ä»¥äžã«ã³ããããããããã€ãŸã§ã®ã€ãã¬ãŒã·ã§ã³ãå°ãããªããŸããã ãããã®çµæããããã³ãéçºç°å¢ã®æ¹åããã³ DX åäžãæãããŸããã ä»åŸã®èª²é¡ æç¶çãªãªãã¡ã¯ã¿ãªã³ã°ãããä»çµã¿äœã ãã©ã€ãã©ãªã®å®æçãªã¢ããããŒããããéçšæé ãèšãããã¯ãŸãã«æç¶çã«ã©ã€ãã©ãªãã¢ããããŒãããããã®ææ®µã§ãããpackage.json ã SPA åäœã«åå²ããããããããã® SPA ãã¡ã³ããã³ã¹ããããç°å¢äœããšããŠã¯æ¬ ãããªãäœæ¥ã§ããã ãããããã®ãŸãŸãªãã¡ã¯ã¿ãªã³ã°ãäžæããã°ããããã¯ãã®èŠæš¡ã倧ãããªããšããããã³ããšã³ãã®ææµã«ãã£ãŠåã³ã¡ã³ããã³ã¹ãã¥ããç°å¢ã«ãªã£ãŠããŸããŸãã ãªã®ã§ãæç¶çãªãªãã¡ã¯ã¿ãªã³ã°ãããããã«ã¯ä»çµã¿äœããæ¬ ãããªããšèããŠããŸãããã®ããã«ã¯ãå±äººåã«ãããªãä»çµã¿ã¥ãããã¡ã³ããã³ã¹ããããç°å¢æ¹åããšã³ãžãã¢ããããã®ããã³ããšã³ãéçºç°å¢ã«å¯Ÿãããªãã©ã·ãé«ããåãçµã¿ãè¡ã£ãŠããå¿
èŠããããŸãããã®ãããçŸåš æšªè»žååŒ·äŒ ãªã©ã§ CLINICS ããã³ããšã³ãã®å®è£
èæ¯ãããªãã¡ã¯ã¿ãªã³ã°ããããæžãæ¹ãªã©ã®ãã¬ããžãå
±æããŠããŸãã ãŸãšã ããã³ããšã³ãéçºç°å¢ã®ã¡ã³ããã³ã¹ã»ãªãã¡ã¯ã¿ãªã³ã°èªäœã¯ãããŸã§ããŠãŒã¶ã«æ°ããæ©èœãæäŸããŠããããã§ã¯ãªããç²ã
ãšè¡ã£ãŠãããã®ã§ãããããã課é¡ãæŽãåºããåãåã£ãŠã解決ããŠãã£ãããšã«ãã£ãŠåŸããããã©ã¯ãã£ã¹ã¯å€ããããããã³ããšã³ãã®ãšã³ã·ã¹ãã ã«å¯Ÿããçè§£ãå€ãåŸãããŸããã ãããã®ãªãã¡ã¯ã¿ãªã³ã°ãè¡ãããšã«ãã£ãŠ DX ãåäžããŠãããæè¡çãªãã€ãºã«æ©ãæéãæžãããšã³ãžãã¢ã¯ãããããã¯ãã®æ©èœéçºã«å°å¿µã§ããããã«ãªã£ãŠãããšä¿¡ããŠããŸãã ä»åç§ãã¡ã課é¡ã解決ããããšã«ãã£ãŠãæç¶çã«ãªãã¡ã¯ã¿ãªã³ã°ãããããåå°äœãããããšããåŽé¢ããããšæããŸããä»åŸã®èª²é¡ãšããŠããã®åå°ãåºã«ããããã®ãšã³ãžãã¢ãæèãæã£ãŠã¡ã³ããã³ã¹ã§ãããããªä»çµã¿ã¥ãããè¡ã£ãŠãããããšæããŸãã æåŸãŸã§èªãã§ããã ãããããšãããããŸããã www.medley.jp