본문으로 바로가기

Deno 간략한 소개와 std 살펴보기

category Node, Nest, Deno/🦕 Deno 2020. 5. 11. 07:58

Deno is a simple, modern and secure runtime for JavaScript and TypeScript that uses V8 and is built in Rust.

 

크롬 V8 엔진을 사용하는 건 Node와 동일하지만 Rust로 만들어졌다는 점이 다르다.

 

 

 

기반 기술

 

1. V8 Javascript Runtime

2. Rust ( replace C ++ ) 

3. Tokio (event loop 컨트롤)  

4. TypeScript (Built-in TypeScript)

 

 

Node 특징

1. Unique ES Modules System 

 

  • Node는 ES module 사용하기 때문에 다음과 같이 외부 패키지를 가져왔지만 Deno에서는 URL을 통해 가져옵니다. 따라서 npm을 이용할 필요가 없어졌습니다!!
  • ES 모듈이 기본이므로 require가 아니라 import/export를 babel와 같은 트랜스컴파일러 없이 사용할 수 있게 되었습니다~
  • Deno will cache our dependencies to hard drive in first run => so it is available offline
// node
const express = require("express");

// deno
import { serve } from "http://deno.land/std/http/server.ts";

 

그런데 다운로드 받은 이 모듈들의 캐시는 어디에 저장되는 걸까요?

 

Deno caches remote imports in a special directory specified by the $DENO_DIR environment variable. It defaults to the system's cache directory if $DENO_DIR is not specified. The next time you run the program, no downloads will be made. If the program hasn't changed, it won't be recompiled either. The default directory is:

 

  • On Linux/Redox: $XDG_CACHE_HOME/deno or $HOME/.cache/deno
  • On Windows: %LOCALAPPDATA%/deno (%LOCALAPPDATA% = FOLDERID_LocalAppData)
  • On macOS: $HOME/Library/Caches/deno
  • If something fails, it falls back to $HOME/.deno

위 내용들은 외울필요가 전혀 없습니다.

built-in dependency inspector를 활용해서 DENO_DIR나 cache 경로를 쉽게 확인할 수 있습니다.

deno info

 

 

2. Enhanced Security

 

Deno는 샌드박스처럼 작동하기 때문에 외부와 소통할 때는 permission이 필요합니다.

 

-  It requires permission by default when accessing to Disk, Network, or the things that ask for the permission

 

 

permission 없이 deno run을 돌리면 오류가 뜹니다.

 

// ❌ Error
deno run https://deno.land/std/examples/chat/server.ts

// ✔ Good
deno run --allow-net https://deno.land/std/examples/chat/server.ts

 

 

 

3. Built-in TypeScript

 

4. Top level await is supported (https://github.com/tc39/proposal-top-level-await)

 

탑레벨 await를 제공합니다. 무슨 말이냐면, async/awiat는 다음과 같이 await를 async를 감싸줬어야 했습니다. 그러나 탑레벨에서 await를 사용할 경우 async로 감싸주지 않아도 됩니다. (이 말은 탑레벨이 아니면 여전히 async로 감싸줘야 한다는 것을 말합니다.)

const encoder = new TextEncoder();

const helloTest = encoder.encode("hello");

await Deno.writeFile("hello.txt", helloTest);

 

 

5.Browser compatible (브라우저와의 호환성)

 

예를 들어, node에서는 브라우저에서 기본으로 지원하는 fetch api를 사용할 수 없어서 별도로 node-fetch를 npm으로 설치해줬어야 했지만 deno에서는 별다른 설치없이 사용할 수 있습니다.

 

deno의 버전이 올라감에 따라 브라우저와의 호환성을 높여나갈 계획이라고 합니다. (이 말인 즉슨 이제 브라우저에서 제공하는 음성인식과 CV도 사용할 수 있습니다~)

 

 

 

Deno 설치 및 deno run

 

문서를 봅시다~

https://deno.land/#installation

 

Deno — A secure runtime for JavaScript and TypeScript.

Deno is a simple, modern and secure runtime for JavaScript and TypeScript that uses V8 and is built in Rust.

deno.land

 

Deno ships as a single executable with no dependencies. 

아~ 간단합니다. 설치 후 간단히 VScode를 통해 deno를 이용해 ts 파일을 컴파일해보겠습니다.

extension도 설치해줍시다.

 

 

test.ts 생성 후 deno run [파일명]을 통해 컴파일했습니다.

와! 이제 tsconfig.json이 없어도 됩니다 ㅋㅋ

console.log("helo deno!");

deno run test.ts

 

Standard Library(std) 

 

Node에서 기본 내장 모듈을 사용했듯 Deno에는 std가 있습니다. (https://deno.land/std) 에서 확인할 수 있습니다.

std의 Datetime std를 가져와서 사용해보았습니다. 처음 실행하면 이 std는 한 번 컴파일하면 우리의 컴퓨터에 캐시됩니다. 오프라인에서도 해당 모듈을 사용할 수 있다는 것입니다.

 

import {
  dayOfYear,
  currentDayOfYear,
} from "https://deno.land/std/datetime/mod.ts";

console.log(dayOfYear(new Date("2019-03-11T03:24:00")));
console.log(currentDayOfYear());

 

간단하게 std 중 http를 이용해 바닐라 deno로 웹서버를 하나 열어보겠습니다.

 

import { serve } from "https://deno.land/std/http/server.ts";

const server = serve({ port: 8000 });

console.log("server on : http://localhost:8000/");

for await (const req of server) {
  req.respond({ body: "Hello World\n" });
}

 

 

 

 

 

 

 

'Node, Nest, Deno > 🦕 Deno' 카테고리의 다른 글

deno 설치 및 denon 세팅  (0) 2021.04.19

darren, dev blog
블로그 이미지 DarrenKwonDev 님의 블로그
VISITOR 오늘 / 전체