그림이 천 단어의 가치가 있다면 대화식 데모는 가치가 있어야합니다 ... 백만?
앱의 목적을 이해하기 위해 유행어를 스크롤하는 것을 즐기십니까? 아마. 그리고 나는 나의 최신 열정 프로젝트 인 Wanna를 위해 그 모든 멍청이를 쓰지 않았다. 그래서 나는 더 흥미로운 솔루션을 추구했습니다. 사용자가 탐색 할 수 있도록 자체 방문 페이지 내부의 앱을 둥지!
React의 composability 덕분에 우리는 거의 단순히 루트 앱 구성 요소를 렌더링하고 하루를 호출 할 수 있습니다 :
export const InteractiveDemo = () => { return () }
그러나 몇 가지 문제가 발생할 것입니다 :
그것들을 해결합시다. React Router v6 및 Apollo GraphQL을 사용하고 싶지만 개념은 기술에 관계없이 적용됩니다.
실제 앱에서 데모 앱의 탐색을 분리하려면 다른 내비게이션 제공 업체 안에 래핑합니다.
import { MemoryRouter, UNSAFE_LocationContext } from 'react-router' export const InteractiveDemo = () => { return ( // Hack to nest MemoryRouter inside BrowserRouter. // https://github.com/remix-run/react-router/issues/7375}>) }
참고 메모리 로터를 사용하여 브라우저가 같은 페이지에 유지되는 동안 데모는 내부적으로 탐색합니다.
데모 앱에 가짜 데이터를 제공하기 위해, 우리는 클라이언트 앱 내부의 가짜 "백엔드"를 사용하여 Mock 클라이언트 또는 서버를 통해 (구현에 따라) 제공합니다. 그것은 앱 코드의 나머지 부분에 최소 침습적이며 수동 테스트에 데모를 사용할 수 있습니다. 빠르게 반복 할 때 매우 편리합니다.
나는 Mock-Apollo-Client를 사용했습니다. REST 또는 TRPC의 경우 Nock과 같은 것을 사용할 수 있습니다. 그들은 자동화 된 테스트를 의미하지만 여기서 우리가 필요로하는 것입니다.
먼저, 우리는 실제 백엔드를 모방하는 방식으로 요청 처리기 쿼리 및 데모 데이터를 돌연변이하는 모의 클라이언트를 만듭니다.
import { InMemoryCache } from '@apollo/client' import { createMockClient, createMockSubscription } from 'mock-apollo-client' import { useMemo, useState } from 'react' // GraphQL documents that our client sends to the real server import GET_FRIENDS from '../../gql/getFriends.gql' import ADD_FRIEND from '../../gql/addFriend.gql' // Simplified example export const useDemoClient = () => { const [friends, setFriends] = useState[{ __typename: 'User', id: 1, name: 'Nick', }] // Cache should persist across clients const cache = useMemo(() => { // Should be the same cache configuration you provide to your real Apollo client return new InMemoryCache() }, []) // We need to recreate the mock client whenever the data changes // because it doesn't support resetting request handlers. const mockClient = useMemo(() => { const client = createMockClient({ cache }) client.setRequestHandler(GET_FRIENDS, () => Promise.resolve({ data: { friends: friends } })) client.setRequestHandler(ADD_FRIEND, ({ user }) => { setFriends((prev) => prev.concat([user])) return Promise.resolve({ data: { addFriend: user } }) }) return client }, [friends]) return mockClient }'@apollo/client'에서 {inmemoryCache} 가져 오기 {inmemoryCache} 'mock-apollo-client'에서 {createmockclient, createmocksubscription} import 'react'에서 {usememo, usestate} 가져 오기 // 클라이언트가 실제 서버로 보내는 GraphQL 문서 '../../gql/getfriends.gql'에서 get_friends import get_friends '../../gql/addfriend.gql'에서 add_friend import add_friend // 단순화 된 예 const usedemoclient = () => {내보내기 const [친구, setfriends] = usestate [{ __typename : '사용자', ID : 1, 이름 : 'Nick', }] // 캐시는 클라이언트에서 지속되어야합니다 const cache = usememo (() => { // 실제 아폴로 클라이언트와 제공하는 동일한 캐시 구성이어야합니다. 새로운 InmemoryCache () 반환 }, []) // 데이터가 변경 될 때마다 모의 클라이언트를 재현해야합니다. // 요청 핸들러 재설정을 지원하지 않기 때문입니다. const mockclient = usememo (() => { const client = createmockclient ({cache}) client.setRequestHandler (get_friends, () => Promise.Resolve ({{ 데이터 : { 친구 : 친구 } })) client.setRequestHandler (add_friend, ({user}) => { setfriends ((prev) => prev.concat ([user])) Return Promise.resolve ({{ 데이터 : { 추가 친구 : 사용자 } }) }) 반환 클라이언트 }, [친구]) 모의 클라이언트를 반환하십시오 }
그런 다음 내비게이션과 마찬가지로, 우리는 모의 클라이언트와 함께 새로운 제공 업체에 데모를 랩핑합니다 :
import { InMemoryCache } from '@apollo/client' import { createMockClient, createMockSubscription } from 'mock-apollo-client' import { useMemo, useState } from 'react' // GraphQL documents that our client sends to the real server import GET_FRIENDS from '../../gql/getFriends.gql' import ADD_FRIEND from '../../gql/addFriend.gql' // Simplified example export const useDemoClient = () => { const [friends, setFriends] = useState[{ __typename: 'User', id: 1, name: 'Nick', }] // Cache should persist across clients const cache = useMemo(() => { // Should be the same cache configuration you provide to your real Apollo client return new InMemoryCache() }, []) // We need to recreate the mock client whenever the data changes // because it doesn't support resetting request handlers. const mockClient = useMemo(() => { const client = createMockClient({ cache }) client.setRequestHandler(GET_FRIENDS, () => Promise.resolve({ data: { friends: friends } })) client.setRequestHandler(ADD_FRIEND, ({ user }) => { setFriends((prev) => prev.concat([user])) return Promise.resolve({ data: { addFriend: user } }) }) return client }, [friends]) return mockClient }'@apollo/client'에서 {apolloprovider} 가져 오기 ConstractivedEmo = () => {내보내기 const democlient = usedemoclient () 반품 (
비주얼
작동합니다! 이제 사용자에게 대화식 데모를보고 있음을 어떻게 분명하게 만들까요?
Wanna는 모바일 우선입니다. 그래서 나는 전화 프레임 내부에서 데모를 렌더링하기로 결정했습니다. 나는 가장 잘 보이는 장치를 제공하기 때문에 devices.css를 사용했습니다 (즉, 데모 공간을 극대화하기 위해 최소한의 베젤). 그러나 간단하게하기 위해 여기에서 우리는 반응을 지원하는 라이브러리를 사용합니다 : react-device-frameset.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3