fp-ts:fp-ts 네트워크 드라이버 개발
fpts를 사용하여 Unsplash라는 웹 드라이버와 통신하는 방법을 찾고 있습니다.부작용을 줄이고 테스트 가능한 코드를 만들 수 있기 때문에 API를 좋아합니다.
다음은 불완전한 도전 목록입니다. 문제를 해결하는 과정이 도전에 대처하는 데 도움을 줄 수 있기를 바랍니다.
fp-ts-webdriver
왜?
그토록 많은 웹 드라이브 프레임워크가 심연 속에 있다.왜 한 편을 더 써야 합니까?fpts에 기존 클라이언트 API를 봉인하지 않는 이유는 무엇입니까?
나는 이미 시험해 보았다.아뿔싸:
async/await
문법이 엉망이에요.then().then().then()
도전하다
네트워크 드라이버 이해
웹driver 프로토콜은 웹의 공식 표준 기구인 W3C가 작성한 규범이다.이 규범은 클라이언트-서버 관계를 나타낸다. 예를 들어 우리가 서버에 메시지를 보내고 서버에서 메시지를 보내는 것과 같다. 예를 들어 웹 페이지와 같다.저희는 클라이언트(또는 로컬)입니다. 서버는 원격입니다.
규범에 따라 클라이언트가 원격 웹 드라이버에 요청(webdriver 명령)을 보냅니다.원격에서 요청을 처리하고 요청한 동작을 실행한 다음 규범에 따라 오류나 응답을 돌려보냅니다.
웹 개발자로서 클라이언트와 서버 간의 관계를 여러 번 보았을 수도 있습니다.
API 작성 방법 선택
비동기식 작성
fpts와 함수식 프로그래밍에서 우리는 단자를 사용하여 동작을 조합한다.
우리에게는 다음과 같은 희망이 있다.
<200 && >=300
를 되돌려주고 사용자가 보낸 다른 요청을 보내지 마십시오.fetch
API를 사용하여 잘못된 약속을 되돌릴 수 있는 요청을 보낼 것을 알고 있다.선택한 쪽지는TaskEither
입니다.ATask
는 게으른 약속이고 AEither
는 서로 존재하는 값의 목록이다. 이것은 그것이 하나의 값이거나 다른 값이라는 것을 의미한다.여기에 내가 너에게 쓴 문장이 한 편 있다.
의존 주입
우리는 몇 개의 값이 있지만, 아직 그것들의 정확한 값은 잘 모른다.이 옵션들을 사용자에게 공개하고 싶습니다. 그러면 그들이
endpoint
(URL) 을 선택하고 RequestInit
변경할 수 있습니다. 그러면 에이전트를 사용하거나 내가 모르는 다른 HTTP 설정을 할 수 있습니다.fpts에서
Reader
monad 컴파일 의존 주입을 사용합니다.이 모든 것은 항상 같은 매개 변수 <R, A>(dependency: R) => A
를 사용하는 함수이다.여러 요소를 주입하려면 원조나 대상을 사용하십시오.우리는 하나의 대상을 사용하여 우리의 속성을 명명할 것이다.우리의 명세서는 현재
ReaderTaskEither
이고 그중Reader
은 소포TaskEither
되어 있다.이 느낌 정말 좋아요!우리 더 멀리 갈 수 있을까요?
회의 구성
맞아요!우리는 더 멀리 갈 수 있다.
나는 내가 필요로 하는 함수 중에서 세션은 시종 하나의 매개 변수라는 것을 알아차렸다.전체가 아닌 80%의 기능.이것은 일종의 의존이다.당신은 우리가 의존 관계를 어떻게 처리하는지 아십니까?우리는 그들을 신청했다.
의존항을 합병하는 것보다 그것들을 분리하는 것이 낫다.재구성을 통해 우리는 현재 fpts가 본 적이 없는 새로운 목록을 만들었습니다:
ReaderReaderTaskEither
.듣자니 우리는 이미 한계를 넘어섰다고 한다. 보아하니 우리는 정말 미친 것 같다...
브라우저를 제어하고 싶으시죠?이것은 매우 큰 책임이다.우리는 함수식 프로그래밍의 힘이 필요하다!
위대한 책임은 위대한 권력을 수반한다.
런타임 유형 보안
우리는 응답의 형상이
Success<A> = {value: A}
이어야 한다는 것을 알고 있다. 그 중에서 A
는 무엇이든 될 수 있다.우리가 컴파일할 때 A의 모양을 알았을 때, 우리가 사용하는 모든 응답이 실행할 때 정확한 유형임을 어떻게 확보합니까?상상한 것은 응답500
이지 응답 주체가 유형200
이 아닌 응답Success<A>
이다.아이고.fpts 생태계에 대해 잘 알고 있다면, 프로젝트에서 본 유형 스크립트가 실행될 때 보증을 받을 수 있도록 boy
io-ts
를 사용하고 있음을 알 수 있을 것입니다.Decode
모듈을 사용하겠습니다.앞에서 말한 바와 같이, 그것은
Either
쪽지를 사용한다.이것은 Kleisli Composition을 통해 (우리는 내부에서 사용할 것) 으로 쉽게 향상될 수 있다. *TaskEither
본보기
이것이 바로 우리가 본문을 응용하기 전의 모든 내용을 응용하는 곳이다.
잠시 후, 우리는 하나의 패턴이 나타나는 것을 보기 시작했다.우리는 대량의 코드를 복사하고 붙이고 있다.통합 API를 작성할 때 복사하여 붙여넣을 수 있습니다.그러나 6번의 재구성을 한 후에 무엇을 재구성해야 할지 알게 된다.
만약 당신이 그 중에서 시사점을 얻었다면, 그것은 코드를 반복해서 작성해서 어떻게 재구성할 수 있는지, 왜 재구성할 수 있는지 진정으로 이해해야 한다는 것이다.
나는
make
함수를 만들었는데 decoder
, method
, endomorphicURL
와 하나body
가 필요하다.자동태<A>(a: A) => A
;입력 유형은 출력 유형과 같습니다.우리는 이 속성을 표시하기 위해 문자열을 사용합니다.설명서를 읽다
지금 규범은 명확하고 규범화되어야 한다.우리 함께 하나를 해독합시다.
The remote end steps are:
- Let data be the result of getting a property named cookie from the parameters argument.
- If data is not a JSON Object with all the required (non-optional) JSON keys listed in the table for cookie conversion, return error with error code invalid argument.
서버(원격)는 응답 주체에서 최소한 다음과 같은 내용을 보길 원합니다:
{ cookie: { name: "", value: "", path?: "", ... rest } }
.나는 나머지는 열거하지 않겠지만, 너는 에서 그것들을 볼 수 있다
이것은 많은 행화였지만, 시간이 지나면 그것은 마치 제2의 언어와 같다.
table for cookie conversion
네트워크 드라이버 테스트
처음부터 나는 6점을 맞았다.
농담입니다. 웹 드라이브를 시작하려면
beforeAll()
를 호출하고, 웹 드라이브를 닫으려면 afterAll()
를 호출해야 합니다.내 로컬 기기에서, 그것은 실제 브라우저를 열어서, 나는 그것을 보고 테스트를 할 수 있다.만약 우리가 그것이 CI에서 실행되기를 원하지 않는다면?헤드리스에 오신 걸 환영합니다.
나는 이 해결 방안을 찾기 위해 대량의 자원을 집중해야 한다. 다음은 코드이다.
const capabilities: Capabilities = {
alwaysMatch: {
"goog:chromeOptions": { args: ["--headless"] },
},
}
현재 모든 설정이 완성되었으니, 나는 하나의 특성을 위해 테스트를 작성할 수 있다.만약 성공한다면 출하할 수 있을 거야!
출판업
나는 이미 몇 개의 라이브러리를 출판했지만, 나는 이 라이브러리를 자동화해야 한다는 것을 안다.
GitHub의 행동을 생각해냈다
semantic-release
.내가 유일하게 해야 할 일은 git
를 정확하게 사용하고 운행git pull --rebase
전에 운행git push
을 해서 얻는 것이다.어쨌든, 너는 반드시 이렇게 해야 한다. 이것은 너의 업무 절차에 달려 있다.GitHub에서 교체 변경 로그, 발표된 NPM 패키지, 버전을 받았습니다. 심지어 발표를 고려할 필요도 없습니다.놀랍다!
Reference
이 문제에 관하여(fp-ts:fp-ts 네트워크 드라이버 개발), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/waynevanson/building-fp-ts-webdriver-18jg텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)