데노 섬 두 번째 모험

28125 단어 learningdenojavascript
나의 지난 게시물에 나는 my first adventure in deno.land 를 썼다.
이것은 흥미로운 과정으로 신기술을 시도하는 흥분감이 줄곧 존재한다.deno는 나로 하여금 새로운 가능성을 생각하게 하고, 내가 그것을 이용하여 무엇을 세울 것인지를 스스로에게 묻게 한다.
지난번에 나는 소형 트위터 로봇을 구축했는데 그 목적은 표준 라이브러리의 베일을 벗고 더욱 깊은 언어 환경에서 간단한'hello 세계'가 아니라deno를 더 잘 이해하는 것이다.
이것은 나의 예상을 훨씬 뛰어넘는 환영을 받았다.그것은 결국 당시 내가 읽고 반응한 가장 뜨거운 댓글이 되었다.나는 내가'denohype 기차'에서 상당히 운이 좋았다고 생각한다.
내가 오늘 여기 온 이유.표준 라이브러리, 모듈 가져오기, 간단한 권한 시스템과 의존 관계 관리를 배운 후에 오늘 저는 다음과 같은 주제를 배울 것입니다.
  • Lock files
  • Official VSCode extension
  • Documentation generation
  • Permission system
  • Running deno code in the browser
  • Testing
  • 코드를 따르고 싶으시면

    파일 잠금


    이전 글의 의존 관계에 대한 정보를 완성하기 위해서 나는 자물쇠 파일에 관한 글을 쓸 것이다.거의 모든 생산 응용 프로그램에서 그것들은 많은 언어의 표준 방법이다.그것들은 버전이 일치하지 않아 발생하는 문제를 피하기 위해 정확한 의존 관계 트리를 설명하는 데 사용된다.
    deno에서 실행할 수 있습니다
    deno cache --lock=lock.json --lock-write ./src/deps
    
    이 명령은 lock.json 파일 캐시 (로컬 설치에 사용되는 의존 항목) 를 기반으로 합니다.--lock-write 로고 업데이트 또는 생성lock.json 파일.마지막 매개 변수는 의존항을 사용하는 파일입니다.
    모든 설치된 자원의 완전성을 검사하는 동시에 의존 항목을 설치하려면 다음을 실행할 수 있습니다.
    $ deno cache -r --lock=lock.json deps.ts
    
    단지 의존항과 그 검사와 json 대상에 불과하다

    공식 VSCode 확장


    공식 vscode 확장이 시작되었습니다!그러나 이것은 내가 이전 게시물에서 언급한 것과 완전히 같다.changelog가 말한 바와 같이, 그것은 단지 정부 환매로 옮겨졌을 뿐이다

    Moved from https://github.com/justjavac/vscode-deno to https://github.com/denoland/vscode_deno in order to have an "official" Deno plugin.


    그것은 예상한 대로 자동으로 완성되고 파일 가져오기가 잘 되어 있다.단, cmd 키를 누르고 외부 의존 항목을 눌렀을 때 언어가 검출되지 않기 때문에 파일이 표시될 때 강조 표시가 없습니다.
    나는 그것이 곧 복구될 것이라고 확신하지만, 이것도 좋은 기회이다. 내가 vscode와 플러그인 자체에서 코드를 이해할 시간이 있는 후에 내가 기여할 수 있을 것이다.

    문서


    라이언이 강연에서 제시한 또 다른 장점은 데노가 도구 체인에 문서 생성기를 포함하고 있다는 것이다.그것은 사이트에 아직 한 부분도 없지만, 우리는 이곳에서 탐색할 것이다.

    모듈 문서 찾아보기


    비록 데노는 install 절차가 없지만, cache 비행기에서 개발할 수 있습니다. node_modules 모듈을 처음 불러오고 캐시 모듈을 사용하기 때문입니다.
    비행기에서 일할 때 제3자 코드 문서를 보려면 어떻게 해야 합니까?편집기를 사용할 수 있습니다. 그렇지만 대체할 것이 있습니다.
    deno는 코드를 조회하지 않고 제3자 코드 문서를 볼 수 있는 멋진 방법을 제공합니다.
    $ deno doc https://deno.land/std/http/server.ts
    
    이것은 표준 라이브러리의 http 서버를 출력하는 방법을 공개합니다.
    function listenAndServe(addr: string | HTTPOptions, handler: (req: ServerRequest) => void): Promise<void>
      Start an HTTP server with given options and request handler
    
    function listenAndServeTLS(options: HTTPSOptions, handler: (req: ServerRequest) => void): Promise<void>
      Start an HTTPS server with given options and request handler
    
    function serve(addr: string | HTTPOptions): Server
      Create a HTTP server
    
    function serveTLS(options: HTTPSOptions): Server
      Create an HTTPS server with given options
    
    class Server implements AsyncIterable
    
    class ServerRequest
    
    interface Response
      Interface of HTTP server response. If body is a Reader, response would be chunked. If body is a string, it would be UTF-8 encoded by default.
    
    type HTTPOptions
      Options for creating an HTTP server.
    
    type HTTPSOptions
      Options for creating an HTTPS server.
    
    깔끔하죠?이것은 매우 좋은 방법으로 도출된 모듈 기호를 개술할 수 있다.
    특정 기호의 문서를 보려면 를 실행할 수도 있습니다.
    $ deno doc https://deno.land/std/http/server.ts listenAndServe
    
    어떤 출력
    function listenAndServe(addr: string | HTTPOptions, handler: (req: ServerRequest) => void): Promise<void>
        Start an HTTP server with given options and request handler
            const body = "Hello World\n";     const options = { port: 8000 };     listenAndServe(options, (req) => {       req.respond({ body });     });
        @param options Server configuration @param handler Request handler
    
    
    documentation 명령 개요 코드의 내보내기 모듈을 사용할 수 있습니다. 작업 방식이 같습니다.
    $ deno doc twitter/client.ts
    
    출력:
    const search
      Searches for the recent tweets of the provided username that have more than 5 likes
    
    interface Tweet
      Fields in a tweet
    
    interface TweetResponse
      The response from Twitter API
    
    --json 로고도 지원되지만 기호에는 적용되지 않으며 json 형식으로 문서를 생성하고 프로그래밍을 지원합니다.
    문서 생성에 사용되는 좋은 예는denoruntime API입니다.
    이 모듈은 Deno를 사용하여 --json 명령이 있는 모듈을 생성하고 매우 좋은 레이아웃을 제공합니다.우리는 우리가 한 것처럼 모듈에 typedoc 을 추가하기만 하면 된다.

    세립도 권한


    우리가 말한 바와 같이 데노가 잘하는 일은 권한이다.기본적으로 사용하기 쉽고 안전합니다.이전에 나는 스크립트가 네트워크에 접근할 수 있도록 설명하였다. 예를 들어 스크립트를 실행할 때 --allow-net 로고를 현시적으로 사용해야 한다.
    이것은 정말이다. 그러나 나의 친구는 나에게 더욱 엄격하기 위해서 우리는 사용할 수 있다고 일깨워 주었다.
    deno run --allow-net=api.twitter.com,0.0.0.0 index.ts
    
    예상할 수 있는 바와 같이, 이것은 api.twitter.com 과 부터 0.0.0.0 에 대한 네트워크 호출을 허용하지만, 모든 다른 호출은 허용하지 않습니다.우리는 네트워크에 완전히 접근하는 것을 허용하지 않고 일부만 허용하며, 기본적으로 그것을 화이트리스트에 넣고 다른 모든 내용을 차단합니다.
    이것은 on my previous post에서 좋은 해석을 얻었다. 이것은 v.1.0.0이 발표된 후에 추가된 문서 개선 중의 하나이다.

    사용 권한 페이지 브라우저에서 코드 실행


    deno의 또 다른 흥미로운 특징은 bundle 명령이다.
    그것은 우리가 코드를 단일 .js 파일에 묶을 수 있도록 한다.이 파일은 다른 deno 프로그램으로 실행할 수 있습니다 deno run.
    재미있는 것은 생성된 코드가 이름 공간을 사용하지 않을 때 브라우저에서 실행될 수 있다는 것이다.
    이렇게 할 가능성은 무한하다.예를 들어, 내 API에 HTTP 클라이언트를 생성하여 프런트엔드와 상호 작용하게 하려면 어떻게 해야 합니까?
    우리는 deno에서 클라이언트를 작성하고 API 코드(와 형식)를 다시 사용할 수 있습니다.다음은 유행하는 트윗을 가져오는 코드입니다.
    import { TweetResponse } from "../twitter/client.ts"
    
    export function popular(handle: string): Promise<TweetResponse> {
      return fetch(`http://localhost:8080/popular/${handle}`)
        .then(res => res.json())
        .catch(console.error)
    }
    
    이 코드는 API 코드 라이브러리에 있으며 deno로 작성됩니다.API에서 사용하는 트위터 클라이언트와 같은 유형을 사용합니다.
    API 클라이언트를 API 코드 라이브러리에서 생활하게 하는 것은 누가 API를 업데이트하든지 클라이언트를 업데이트하고 프런트엔드 코드에서 백엔드와 API 변경을 추출할 수 있다는 것을 의미한다.이것은 deno 특성이 아니라 묶음 특성을 통해 이루어진 특성이다.
    그런 다음 Deno 명령을 실행하고 생성된 파일을 폴더에 넣을 수 있습니다.
    $ deno bundle client/index.ts public/client.js
    
    브라우저에서 실행할 수 있는 bundle 파일을 생성합니다.
    프레젠테이션 목적으로 다음 코드를 사용하여 client.js 파일을 만들 수 있습니다.
    <script type="module">
      // Imports the generated client
      import * as client from "./client.js"
    
      async function fetchTwitter(event) {
        // Uses the methods on it
        const result = await client.popular(event.target.value)
    
        /*
          Omitted for brevity
        */
      }
    </script>
    
    이 코드를 사용하는 클라이언트는 처음에deno로 작성되었는데, 지금은 js 파일입니다.
    현재 이 폴더는 모든 웹 서버에서 서비스를 제공할 수 있습니다.기왕 우리가 데노를 토론하고 있는 이상, 우리는 그것을 이용하여 표준 도서관의 파일 서버로 파일에 서비스를 제공할 수 있다.
    # inside the public folder
    $ deno run --allow-net --allow-read https://deno.land/std/http/file_server.ts
    
    우리는 현재 public/index.html에 방문하여 우리의 매우 오래된 전단을 사용하여 유행하는 추문을 조회할 수 있다.이렇게 하면 우리 코드는 최초로 전방에서 deno로 작성된 클라이언트와 API를 사용하여 상호작용을 할 수 있다.

    테스트


    deno의 목표는 바이너리 파일에 기본 내용을 발표하는 것이다. 테스트는 분명히 포함되어 있다.서류는 이 방면에서도 매우 좋다.public 명령의 도움으로 테스트 작성은 매우 간단해졌다.
    $ deno doc https://deno.land/std/testing/asserts.ts
    
    이것은deno 표준 라이브러리의 assert 모듈에서 온 문서를 인쇄합니다
    function assert(expr: unknown, msg): <UNIMPLEMENTED>
      Make an assertion, if not `true`, then throw.
    
    function assertEquals(actual: unknown, expected: unknown, msg?: string): void
      Make an assertion that `actual` and `expected` are equal, deeply. If not deeply equal, then throw.
    
    function assertMatch(actual: string, expected: RegExp, msg?: string): void
      Make an assertion that `actual` match RegExp `expected`. If not then thrown
    
    /* Cut for brevity */
    
    function fail(msg?: string): void
      Forcefully throws a failed assertion
    
    
    위의 몇 줄에서 만든'동구'클라이언트를 위해 간단한 테스트를 작성합시다.http://0.0.0.0:4507/는 테스트체를 성명하고 doc를 호출하여 단언하는 데 사용될 것이다.서버 응답을 시뮬레이션하기 위해 표준 라이브러리 http\U 서버를 사용하여 서버를 시작합니다.
    클라이언트로부터의 Deno.test 방법 호출 assertEquals 을 기대합니다.이 테스트를 만듭니다.
    import * as ApiClient from "./index.ts"
    import { assertEquals } from "../deps.ts"
    import { runServer } from "../util.ts"
    
    Deno.test("calls the correct url", async () => {
      runServer(async req => {
        assertEquals(req.url, "/popular/ampsantos0")
        await req.respond({ body: JSON.stringify({ statuses: [] }) })
      })
    
      await ApiClient.popular("ampsantos0")
    })
    
    우리의 popularutil은 매우 간단한 함수입니다. 첫 번째 연결 후에 닫힌 웹 서버만 생성합니다.
    import { serve, ServerRequest } from "./deps.ts"
    
    export const runServer = async (
      handler: (req: ServerRequest) => Promise<any>
    ) => {
      const server = serve(":8080")
    
      for await (const req of server) {
        await handler(req)
        server.close()
      }
    }
    
    우리는 지금 테스트를 실행할 수 있다.deno 프로그램을 실행할 때마다 권한 표시를 전달해야 한다는 것을 기억하십시오.
    다음 정규 표현식 /popular/:twitterHandle 과 일치하는 모든 파일을 테스트하는 파일로 실행됩니다.
    TLDR: 이름에 포함된 각 파일runServer을 실행하고 위의 파일 확장자 중 하나로 끝냅니다.
    $ deno test --allow-net
    
    만약 테스트에 실패한다면 우리는 매우 좋은 차이를 보게 될 것이다.
    test calls the correct url ... error: Uncaught AssertionError: Values are not equal:
    
        [Diff] Actual / Expected
    
    
    -   "/popular/ampsantos0"
    +   "/popular/handle-that-doesnt-work"
    
      throw new AssertionError(message);
            ^
        at assertEquals (https://deno.land/std/testing/asserts.ts:170:9)
        at file:///Users/alexandre/dev/personal/deno/testing-deno/client/index.test.ts:7:5
        at runServer (file:///Users/alexandre/dev/personal/deno/testing-deno/util.ts:9:11)
    
    일부 테스트만 실행하기 위해 {*_,*.,}test.{js,ts,jsx,tsx}: 로고를 사용할 수 있습니다.
    $ deno test --allow-net --filter="correct url"
    
    마지막 매개 변수로 경로 보내기
    $ deno test --allow-net ./client
    
    위의 테스트와 관련된 모든 변경 사항을 따를 수 있습니다.
    이것으로 우리는 종합 테스트를 작성하는 데 필요한 모든 것을 거의 갖게 되었다.다시 한 번 말하지만, 우리는 표준 라이브러리를 바탕으로 더 많은 테스트 실용 프로그램을 만들 수 있지만, 우리가 방금 작성한 간단한 테스트에 있어서는 이 정도면 충분하다.

    결론


    우리의 두 번째 모험에서 우리는 언어만 소개한 것이 아니다.
    우리는 운행할 때의 다른 부분을 탐색했다.테스트, 문서 생성, 파일 잠금, 더 엄격한 권한, 자바스크립트 코드 생성, 클라이언트에서 실행까지.이 모든 것은 우리가 생산 코드를 작성할 때 유용하다고 생각하는 특성이다.우리는 다음 모험을 위해 기준 테스트를 발표했다😉.
    이 모든 것은deno에 포함된 도구 모음으로 이루어졌고 라이브러리를 사용하지 않았다는 것을 잊어서는 안 된다.
    이것은 개발자가 라이브러리를 사용하고 작성하지 않는다는 것을 의미하지 않는다.이것은 표준 라이브러리가 매우 잘 작성되어 사용하기 쉽다는 것을 의미한다.이것은 개발자들이 위에서 강력하고 의미 있는 추상을 작성하기 위해 문을 열었다.
    표준 라이브러리와 함께 주요 바이너리 파일이 제공하는 도구 체인에 따라 자신이 완전하다는 것을 증명하고deno 문서에서 언급한 실행 가능한 파일만 발표하는 목표와 일치합니다.내가 말하고자 하는 것은 모든 필수품이 거기에 있으니 너는 공구를 걱정할 필요가 없다.
    이번 모험은 예상보다 좀 길었다.읽어주셔서 감사합니다.
    나는 이것이 내가 그것을 탐색하기 때문에 재미있는 독서가 되기를 바란다.나는 네가 이것에 대해 어떤 견해를 가지고 있는지 듣고 싶고, 네가 제기할 수 있는 모든 문제에 대답하고 싶다.

    좋은 웹페이지 즐겨찾기