We decided to use GraphQL in the next project. I summarized to slides about what we needed for GraphQL development. Slides for M3 tech meetup! #4
(SBQI2-։ൃͰඞཁʹͳͬͨ͜ͱ.UFDINFFUVQ!NBHF
View Slide
5BLBZVLJ.BUTVCBSBϚϧνσόΠενʔϜ௨শϚϧσόνʔϜϦʔμʔUXJUUFS!NBHF3VCZ &MJYJSBOE044044͘͘ձओ࠵
1PXFS"TTFSU&Y⭐HJUIVCDPNNBHFEFWQPXFS@BTTFSU@FY
(SBQI2-։ൃͰඞཁʹͳͬͨ͜ͱ
ࠓ͞ͳ͍͜ͱw (SBQI2-ʹ͍ͭͯͬ͘͟Γ͍ͬͯΔલఏw ͔͠Βͳ͍ͱ͍͏ਓ͕͍ͨΒԼهNPHBNJOH͞Μͷࢿྉɺ͞Μͷॻ͍ͨهࣄΛݟΔͱͲΜͳͷ͔͔Γ͍͢Ͱ͢ࢀߟϦϯΫJ04º(SBQI2-ͷخ͠Έͱπϥϛ1SPTBOEDPOTPGJ04BOE(SBQI2-IUUQTTQFBLFSEFDLDPNNPHBNJOHQSPTBOEDPOTPGJPTBOEHSBQIRM(SBQI2-ೖ3FBDUKT&YQSFTTKT"QPMMPͷ؆୯νϡʔτϦΞϧIUUQTXXXNUFDICMPHFOUSZHSBQIRMBQPMMPSFBDUFYQSFTTOPEFKT
ϚϧσόνʔϜͱw J04 "OESPJEΞϓϦ։ൃ෦ୂw "1*αʔόݟ͍ͯΔw 1VTI৴ج൫ݟ͍ͯΔ
ϚϧσόνʔϜͱw J04 "OESPJEΞϓϦ։ൃ෦ୂw "1*αʔόݟ͍ͯΔ(SBQI2-ͰϦϓϨΠε͍ͨ͠w 1VTI৴ج൫ݟ͍ͯΔࢀߟϑϩϯτΤϯυ͚ͷ"1*αʔόϦχϡʔΞϧʹ(SBQI2-Λݕ౼͍ͯ͠ΔIUUQTXXXNUFDICMPHFOUSZHSBQIRMPOTQSJOHCPPUXJUILPUMJOαʔόαΠυ,PUMJO
,POUSJCVUPS
γεςϜߏ ݱࡏ"1*αʔό(SBQI2-αʔό"1*αʔό܈"1*αʔό܈"1*αʔό܈"1*αʔό܈
γεςϜߏ কདྷ"1*αʔό(SBQI2-αʔό"1*αʔό܈"1*αʔό܈"1*αʔό܈"1*αʔό܈
։ൃ࢝͠Ίͯগͨͬͨ͠ͱ͋Δ
r4MBDLΑΓl"OESPJE൛ຊனʹୟ͖༧ఆͰ͢z
(SBQI2-αʔόͰ͖ͯͳ͍͜ͷઌͷ։ൃͲ͏͢Δͷ
͜ͷ··͍͘ͱɻɻɻw ͍"1*ͳͯ͘ϑϩϯτ͋Δఔ։ൃͰ͖Δͱͷ͜ͱw ͔͠͠ཪଆͷ࣮ͭͭ͠ɺ(SBQI2-"1*Λఏڙͯ͠ߦ͘ͱͳΔͱ͍ͣΕ͍͔ͭΕͯ࣌ؒΓͳ͘ͳΓͦ͏ʜ
(SBQI2-εΩʔϚϑΝʔετ։ൃࢀߟϦϯΫ(SBQI2-BOE4DIFNB'JSTU%FWFMPQNFOUIUUQTTQFBLFSEFDLDPNLZNNUHSBQIRMBOETDIFNBpSTUEFWFMPQNFOU
εΩʔϚϑΝʔετ։ൃw ΠϯλʔϑΣʔε *'ΛઌʹܾΊΔ ͷ෦w ϑϩϯτΤϯυɺόοΫΤϯυڞʹ*'Λͱʹ։ൃ͢Δ (SBQI2-αʔό
ϞοΫαʔόw ϑϩϯτΤϯυ͕։ൃ͢ΔͨΊʹϞοΫαʔό͕ඞཁw "QPMMPͷ(SBQI2-UPPMTΛ͏ࢀߟϦϯΫ(SBQI2-UPPMTHFOFSBUFBOENPDL(SBQI2-KTTDIFNBTIUUQTHJUIVCDPNBQPMMPHSBQIRMHSBQIRMUPPMT
QBDLBHFKTPOࢀߟҎԼʹ͜ͷޙͷࢿྉͰ͍ͬͯΔαϯϓϧίʔυΛࡌͤͯ͋Γ·͢IUUQTHJUIVCDPNNEFWHSBQIRMTQSJOHCPPULPUMJOTBNQMFQVMM{"name": "mock","version": "1.0.0","description": "graphql mock server","dependencies": {"apollo-server-express": "^1.4.0","body-parser": "^1.18.3","express": "^4.16.3","graphql": "^0.13.2","graphql-tools": "^4.0.0"},"scripts": {"start": "node ./index.js"},"devDependencies": {},"author": "Takayuki Matsubara","license": "MIT"}
JOEFYKT શମconst express = require('express');const bodyParser = require('body-parser');const { graphqlExpress, graphiqlExpress } = require('apollo-server-express');const { addMockFunctionsToSchema, makeExecutableSchema } =require('graphql-tools');const typeDefs = require('./type_defs');const schema = makeExecutableSchema({ typeDefs });const mocks = require('./mocks')addMockFunctionsToSchema({ schema, mocks });const app = express();app.use('/graphql', bodyParser.json(), graphqlExpress({ schema }));app.use("/graphiql", graphiqlExpress({ endpointURL: "/graphql" }));app.listen(3000, () => {console.log('/graphiql is running');});
JOEFYKT ൈਮconst typeDefs = require('./type_defs');const schema = makeExecutableSchema({ typeDefs });const mocks = require('./mocks')addMockFunctionsToSchema({ schema, mocks });εΩʔϚΛఆٛ͢Δ
UZQF@EFGTKT ൈਮmodule.exports = `…# ஶऀtype Author {id: ID!# ஶऀ໊name: String!# ஶऀͷຊbooks: [Book]!}# ຊtype Book {id: ID!# ໊લname: String!}…`;
࣮͜͜·ͰͰಈ͘OQNSVOTUBSU
MPDBMIPTUHSBQIJRM
ABEE.PDL'VODUJPOT5P4DIFNBAͰBQPMMP͕͍͍ײ͡ʹฦͯ͘͠ΕΔ
εΩʔϚ͕͋Εw ͦΕͬΆ͍ϞοΫ࡞ΕΔw ͋ͱεΩʔϚʹ͍ͭͯ͠߹ܾͬͯΊΔͳΓ͢ΕΑ͍w ܾΊͨΒͦΕΛͦͷ··ϞοΫαʔόଆʹઃఆ͢Δ
ͬͱͩ͜ΘΓ͍ͨw ͦΜͳํNPDLͰ৭ʑఆٛͰ͖Δ
JOEFYKT ൈਮconst typeDefs = require('./type_defs');const schema = makeExecutableSchema({ typeDefs });const mocks = require('./mocks')addMockFunctionsToSchema({ schema, mocks });ϞοΫΛఆٛ͢Δ
NPDLTKTmodule.exports = {Author: () => ({name: 'Takayuki Matsubara',}),Book: () => ({name: 'Elixir Book',}),};ࢀߟެࣜʹͬͱΧελϜͰ͖Δྫ͕͋ΔIUUQTXXXBQPMMPHSBQIRMDPNEPDTHSBQIRMUPPMTNPDLJOHIUNM
ϞοΫαʔόͰ͖ͨw ͜ΕΛͱʹࠓޙεΩʔϚఆ͔ٛΒ͠߹ͬͯਐΊ͍ͯ͘w ࠓޙ։ൃͰ͍͔ͭΕͯେৎ
(SBQI2-։ൃͰඞཁʹͳͬͨ͜ͱw εΩʔϚϑΝʔετͳ։ൃw ฒߦͯ͠։ൃͰ͖ͦ͏w ͜Ε͔Β͞Βʹ։ൃ͍ͯ͘͠