fp-ts:fp-ts 네트워크 드라이버 개발

Tobias Keller 비범한 사진
fpts를 사용하여 Unsplash라는 웹 드라이버와 통신하는 방법을 찾고 있습니다.부작용을 줄이고 테스트 가능한 코드를 만들 수 있기 때문에 API를 좋아합니다.
다음은 불완전한 도전 목록입니다. 문제를 해결하는 과정이 도전에 대처하는 데 도움을 줄 수 있기를 바랍니다.
fp-ts-webdriver
왜?
그토록 많은 웹 드라이브 프레임워크가 심연 속에 있다.왜 한 편을 더 써야 합니까?fpts에 기존 클라이언트 API를 봉인하지 않는 이유는 무엇입니까?
나는 이미 시험해 보았다.아뿔싸:
  • 명령식 코드는 이해하기 어렵다.
  • 사용async/await 문법이 엉망이에요.then().then().then()
  • 약속은 게으른 것이 아니기 때문에 약속을 하기가 쉽지 않다.

  • 도전하다

    네트워크 드라이버 이해
    웹driver 프로토콜은 웹의 공식 표준 기구인 W3C가 작성한 규범이다.이 규범은 클라이언트-서버 관계를 나타낸다. 예를 들어 우리가 서버에 메시지를 보내고 서버에서 메시지를 보내는 것과 같다. 예를 들어 웹 페이지와 같다.저희는 클라이언트(또는 로컬)입니다. 서버는 원격입니다.
    규범에 따라 클라이언트가 원격 웹 드라이버에 요청(webdriver 명령)을 보냅니다.원격에서 요청을 처리하고 요청한 동작을 실행한 다음 규범에 따라 오류나 응답을 돌려보냅니다.
    웹 개발자로서 클라이언트와 서버 간의 관계를 여러 번 보았을 수도 있습니다.

    API 작성 방법 선택

    비동기식 작성
    fpts와 함수식 프로그래밍에서 우리는 단자를 사용하여 동작을 조합한다.
    우리에게는 다음과 같은 희망이 있다.
  • 원격 웹드라이브(서버)에 요청을 보냅니다.
  • 요청을 보냅니다.
  • 응답을 받습니다.
  • 응답(200)에 성공하면 다음 요청
  • 을 보냅니다.
  • 응답이 성공하지 못하면 오류 (<200 && >=300 를 되돌려주고 사용자가 보낸 다른 요청을 보내지 마십시오.
  • 항상 모든 리소스를 정리합니다(예: 오픈 세션).
  • 나는 fetch API를 사용하여 잘못된 약속을 되돌릴 수 있는 요청을 보낼 것을 알고 있다.선택한 쪽지는TaskEither입니다.ATask는 게으른 약속이고 AEither는 서로 존재하는 값의 목록이다. 이것은 그것이 하나의 값이거나 다른 값이라는 것을 의미한다.
    여기에 내가 너에게 쓴 문장이 한 편 있다.

    의존 주입
    우리는 몇 개의 값이 있지만, 아직 그것들의 정확한 값은 잘 모른다.이 옵션들을 사용자에게 공개하고 싶습니다. 그러면 그들이 endpoint (URL) 을 선택하고 RequestInit 변경할 수 있습니다. 그러면 에이전트를 사용하거나 내가 모르는 다른 HTTP 설정을 할 수 있습니다.
    fpts에서 Readermonad 컴파일 의존 주입을 사용합니다.이 모든 것은 항상 같은 매개 변수 <R, A>(dependency: R) => A 를 사용하는 함수이다.여러 요소를 주입하려면 원조나 대상을 사용하십시오.우리는 하나의 대상을 사용하여 우리의 속성을 명명할 것이다.
    우리의 명세서는 현재ReaderTaskEither이고 그중Reader은 소포TaskEither되어 있다.
    이 느낌 정말 좋아요!우리 더 멀리 갈 수 있을까요?

    회의 구성
    맞아요!우리는 더 멀리 갈 수 있다.
    나는 내가 필요로 하는 함수 중에서 세션은 시종 하나의 매개 변수라는 것을 알아차렸다.전체가 아닌 80%의 기능.이것은 일종의 의존이다.당신은 우리가 의존 관계를 어떻게 처리하는지 아십니까?우리는 그들을 신청했다.
    의존항을 합병하는 것보다 그것들을 분리하는 것이 낫다.재구성을 통해 우리는 현재 fpts가 본 적이 없는 새로운 목록을 만들었습니다: ReaderReaderTaskEither.
    듣자니 우리는 이미 한계를 넘어섰다고 한다. 보아하니 우리는 정말 미친 것 같다...
    브라우저를 제어하고 싶으시죠?이것은 매우 큰 책임이다.우리는 함수식 프로그래밍의 힘이 필요하다!
    위대한 책임은 위대한 권력을 수반한다.

    런타임 유형 보안
    우리는 응답의 형상이 Success<A> = {value: A}이어야 한다는 것을 알고 있다. 그 중에서 A는 무엇이든 될 수 있다.우리가 컴파일할 때 A의 모양을 알았을 때, 우리가 사용하는 모든 응답이 실행할 때 정확한 유형임을 어떻게 확보합니까?상상한 것은 응답500이지 응답 주체가 유형200이 아닌 응답Success<A>이다.아이고.
    fpts 생태계에 대해 잘 알고 있다면, 프로젝트에서 본 유형 스크립트가 실행될 때 보증을 받을 수 있도록 boyio-ts를 사용하고 있음을 알 수 있을 것입니다.Decode 모듈을 사용하겠습니다.
    앞에서 말한 바와 같이, 그것은 Either 쪽지를 사용한다.이것은 Kleisli Composition을 통해 (우리는 내부에서 사용할 것) 으로 쉽게 향상될 수 있다. *TaskEither
    본보기
    이것이 바로 우리가 본문을 응용하기 전의 모든 내용을 응용하는 곳이다.
    잠시 후, 우리는 하나의 패턴이 나타나는 것을 보기 시작했다.우리는 대량의 코드를 복사하고 붙이고 있다.통합 API를 작성할 때 복사하여 붙여넣을 수 있습니다.그러나 6번의 재구성을 한 후에 무엇을 재구성해야 할지 알게 된다.
    만약 당신이 그 중에서 시사점을 얻었다면, 그것은 코드를 반복해서 작성해서 어떻게 재구성할 수 있는지, 왜 재구성할 수 있는지 진정으로 이해해야 한다는 것이다.
    나는 make 함수를 만들었는데 decoder, method, endomorphicURL와 하나body가 필요하다.자동태<A>(a: A) => A;입력 유형은 출력 유형과 같습니다.우리는 이 속성을 표시하기 위해 문자열을 사용합니다.

    설명서를 읽다
    지금 규범은 명확하고 규범화되어야 한다.우리 함께 하나를 해독합시다.

    The remote end steps are:

    1. Let data be the result of getting a property named cookie from the parameters argument.
    2. 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.

    - Add Cookie


    서버(원격)는 응답 주체에서 최소한 다음과 같은 내용을 보길 원합니다: { 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 패키지, 버전을 받았습니다. 심지어 발표를 고려할 필요도 없습니다.놀랍다!

    좋은 웹페이지 즐겨찾기