Deno는 무엇입니까? '더 나은'Node.js

Node.js를 좋아하지만 패키지 관리자 npm이 아닌 경우 또는 Node.js보다 더 안전한 JavaScript 런타임 환경을 원하는 경우 관심있는 새로운 오픈 소스 프로젝트 Deno를 찾을 수 있습니다 (Deno라는 단어는 Node의 anagram입니다). 반면에, 프로덕션에서 Node.js를 사용하는 경우 여기에서 볼 것이 없습니다. Deno는 여전히 "개발 중"입니다.

Deno는 브라우저 외부에서 JavaScript 및 TypeScript 코드를 실행하는 프로그램입니다. 2009 년 Node.js 프로젝트를 설립 한 Ryan Dahl이 주도한 가장 최근의 노력이며, TypeScript 컴파일러를 포함하여 2009 년 이후 JavaScript의 발전을 고려하여 Node.js를 재 구상하려는 시도입니다. Node.js와 마찬가지로 Deno는 기본적으로 Google V8 JavaScript 엔진을 둘러싼 셸이지만 Node.js와 달리 실행 가능 이미지에 TypeScript 컴파일러를 포함합니다.

Deno 및 고급 JavaScript

Dahl에 따르면 2009 년 JavaScript에는 Node.js에 유용한 몇 가지 기능이 없었습니다. 이들 중 일부는 ECMAScript (ES) 표준의 일부로 수년에 걸쳐 JavaScript에 추가되었으며 TypeScript는 몇 가지를 더 다루었습니다.

JavaScript는 본질적으로 영원히 이벤트와 콜백을 가지고 있지만, 특히 비동기 작업을 연결하려는 경우 다소 복잡한 코드로 이어질 수 있습니다. 약속 은 구문을 좀 더 읽기 쉽게 만듭니다. A promise는 콜백을 함수에 전달하는 대신 콜백을 연결할 수있는 비동기 작업의 최종 완료 또는 실패를 나타내는 반환 된 객체입니다. 함수를 선언 async하면 구문이 더욱 단순화 await되어 약속이 해결 될 때까지 비 차단 방식으로 일시 중지 할 수 있도록 함수 내에서 사용할 수 있습니다 .

Node.js가 생성되었을 때 JavaScript 모듈에 대한 사실상의 표준은 npm이 지원하는 CommonJS였습니다. 그 이후 ECMAScript위원회는 jspm이 지원하는 다른 표준 인 ES 모듈을 공식적으로 축복했습니다. Deno는 ES 모듈을 지원합니다.

형식화 된 배열은 Node.js가 사용할 수있는 바이너리 데이터를 처리하기위한 ES6 API입니다. 바이너리 데이터 지원이 부족하여 일부 Node.js 디자인 문제가 발생했습니다. Deno는 원시 이진 데이터를 조작해야 할 때 형식화 된 배열을 사용합니다. Node.js는 이제 사용자 코드에 대해 형식화 된 배열을 지원합니다.

TypeScript는 일반 JavaScript (ES3 이상, 구성 가능)로 컴파일되는 JavaScript의 유형화 된 상위 집합입니다. TypeScript는 JavaScript에 선택적 유형, 클래스 및 모듈을 추가하고 대규모 JavaScript 응용 프로그램을위한 도구를 지원합니다. (Anders Hejlsberg는 이것을 "확장되는 자바 스크립트"라고 부릅니다.) 앞서 언급했듯이 Deno는 런타임의 일부로 TypeScript 컴파일러의 이미지를 포함합니다. Deno에 TypeScript 파일을 전달하면 먼저 JavaScript로 컴파일 한 다음 V8 엔진에 전달합니다.

Node.js 디자인 단점

결국 Node.js와 Deno를 모두 디자인 한 Dahl에 따르면 Node.js는 세 가지 주요 디자인 문제를 겪고 있습니다.

  • 중앙 집중식 배포로 잘못 설계된 모듈 시스템
  • 지원해야하는 많은 레거시 API;
  • 보안 부족.

Deno는 세 가지 문제를 모두 해결합니다. 

데노 보안 실행

Deno가 Node.js보다 보안을 향상시키는 방법은 간단합니다. 기본적으로 Deno는 프로그램이 디스크, 네트워크, 하위 프로세스 또는 환경 변수에 액세스하도록 허용하지 않습니다. 이러한 항목을 허용해야하는 경우 명령 줄 플래그를 사용하여 옵트 인 할 수 있습니다. 명령 줄 플래그는 원하는대로 세분화 할 수 있습니다 (예 : --allow-read=/tmp또는) --allow-net=google.com. Deno의 또 다른 보안 개선 사항은 Node.js와 달리 잡히지 않은 오류에서 항상 죽는다는 것입니다. Node.js는 잡히지 않은 오류 이후에 실행을 진행할 수 있으며 결과는 예측할 수 없습니다.

Deno 모듈

Node.js에서는 require키워드를 사용하여 CommonJS 모듈을로드 하며 표준 및 타사 모두 모두 npmjs.com에서 암시 적으로 제공됩니다. Deno에서는 import키워드를 사용하여 ES 모듈을로드 하고 URL을 명시 적으로 지정합니다. 예를 들면 :

"//deno.land/std/log/mod.ts"에서 로그로 * 가져 오기;

Deno 모듈은 어디서나 호스팅 할 수 있습니다. 타사 모듈을위한 중앙 저장소가 없습니다. 또한 모듈은 항상 로컬로 캐시되고 컴파일되며 명시 적으로 새로 고침을 요청하지 않는 한 업데이트되지 않습니다. 따라서 연결되지 않은 비행기에 있더라도 모든 가져 오기가 한 번 해결되면 이미 랩톱에있는 Deno 프로그램을 실행할 수 있어야합니다.

Deno 에는 외부 종속성이없는 중앙 집중식 표준 모듈 모음이 있으며 Deno 핵심 팀에서 검토합니다. deno.land 서버에 있습니다. deno_std 모듈 컬렉션은 Go의 표준 라이브러리의 느슨한 포트입니다.

도서관 모델 선택 뒤에는 약간의 역사가 있습니다. Dahl은 주로 Go 언어로 Deno의 프로토 타입을 작성했지만 Go와 V8의 가비지 수집기간에 잠재적 인 충돌을 발견했습니다. 그와 그의 공동 작업자는 V8, Rust 및 Rust 비동기 I / O 패키지 Tokio로 Deno를 적절하게 다시 작성했습니다. 그들은 TypeScript에서 Deno 표준 라이브러리를 구현했습니다.

이 시점에서 Deno는 TypeScript에서 소규모 개인 스크립팅 프로젝트를 빌드하는 데 사용할 수있는 합리적이고 재미있는 환경입니다. Dahl에 따르면 Deno는 Node.js의 성공에 실제로 영향을 미치지 않습니다. 그럼에도 불구하고 Deno가 버전 1.0에 도달하면 더 큰 프로젝트를 구축하기위한 실행 가능한 선택이 될 수 있습니다.