Denoとは
#Deno
Denoとは
RustとV8エンジンをベースに実装されたJavaScript/TypeScriptランタイムです
作者はNode.jsの開発者でもあるRyan Dahlさんです
Node.jsにおける設計ミスや反省点等を修正すべく開発されました
Denoの特徴
Rustで記述されている
DenoのコアはRustで記述されています
また、ネイティブ拡張もRustで記述することができます(Pluginと呼びます)
PluginシステムはDeno v1.13.0で廃止され、代わりにFFIが導入されました
TypeScriptを標準でサポート
DenoではTypeScriptコードをスクリプトとして実行できます
tscが内部に組み込まれており、型チェックも行えます
また、通常のJavaScriptコードを実行することもできます
パーミッションシステム
Denoはパーミッションシステムを採用しており、権限を与えない限り、デフォルトでは以下のような処理は実行できません
ディスクIO(--allow-read/--allow-write)
ネットワークIO(--allow-net)
外部プロセスの実行(--allow-run)
環境変数の参照(--allow-env)
モジュールシステム
DenoはES Modulesを標準のモジュール形式としてサポートしています
デフォルトではCommon JS形式のモジュールは読み込めません (ただし、npm:経由でなら読み込めます)
パッケージ管理
Denoにはnpmやyarnのようなパッケージマネージャは存在しません
Denoはnpmやjsrパッケージを管理する仕組みを標準で提供しています
また、Denoは任意のURLからのJavaScript/TypeScriptモジュールの読み込みもサポートしています
スクリプトを実行する際に、Denoが自動的にサードパーティモジュール(npm/jsr/https:)などのをインストールしてくれます(一度インストールしたモジュールは、ローカルにキャッシュされます)
そのため、都度、npm installなどを実行する必要がありません
code:typescript
import { parse } from "https://deno.land/std@0.68.0/encoding/csv.ts"; // このファイルを実行する際に、自動でインストールされます
console.log(await parse("a,b,c\n1,2,3"));
ブラウザ(Web標準)との互換性
Denoはブラウザ(Web標準)との互換性を意識しています。
ある機能を実現する上でWeb APIが活用できる場合は、極力Web APIをベースに機能が提供されます
例えば、DenoでHTTPリクエストを送信したいときはFetch APIを使います
また、Denoに組み込まれているHTTPサーバー(Deno.serve)もFetch APIをベースに実装されています
現時点では、以下のような機能が提供されています
ES Modules
WebSocket
Fetch API
TextEncoder/TextDecoder
TypedArray
Web workers
WebAssembly
WebGPU API (denoland/webgpu-examples)
標準モジュールが豊富
Denoにはdeno_std標準モジュールが存在します
deno_stdはGoの標準モジュールに大きな影響を受けており、※以下のような様々な機能が提供されています
std/testing - アサーション等
std/encoding/yaml - YAML
std/encoding/toml - TOML
std/encoding/csv - CSV
std/io - IO
std/http - HTTPサーバ
std/flags - コマンドライン引数の解析
std/uuid - UUIDの生成
std/node - Node.jsの互換レイヤ
std/wasi - WASI
等...
※deno_stdは初期の頃はGoの影響をかなり受けていたものの、現在はどちらかというとWebやDenoのAPIをベースにした機能などが多くを占めます
生産性を重視
Denoでは生産性が重視されており、以下のような機能が処理系に最初から組み込まれています
テストランナ(deno test)
リソースリークの検知
カバレッジの取得
ベンチマーキング(deno bench)
ソースコードのフォーマット (deno fmt)
deno fmtコマンドの内部では、dprintというRust製のフォーマッタが使用されています
APIドキュメントの出力 (deno doc)
リンタ (deno lint)
Rustで書かれており、とても速いのが特徴です
バンドラ(deno bundle)
現時点では、webpack程高機能ではありません
ただし、Deno v1.5にてツリーシェイキング等に対応するなど、徐々に高機能化しつつあります
LSP (deno lsp)
Deno本体にはLSPサーバーが組み込まれています
vscode-denoなどと連携することで、自動補完やシンボルジャンプなどの機能を提供してくれます
最新のJavaScript仕様に準拠
Denoの組み込みAPIや標準モジュール(deno_std)は、PromiseやAsync Iterator, using/await using等の最新機能を念頭に設計されています
Node.jsとの互換性
DenoはNode.jsとの互換性もサポートします
具体的にはnpmパッケージやNode.js組み込みモジュールの読み込みなどができます
Denoのnpmパッケージサポート
jsrのファーストクラスサポート
jsrはDeno/Node.js/Bunなどの様々なランタイムからの使用が想定されたパッケージレジストリです
Denoはjsrをファースクラスでサポートしており、パッケージのダウンロード(deno add)や公開(deno publish)などをDenoから行うことができます
Jupyterとの連携
Deno本体にはJupyterカーネルが組み込まれています (deno jupyter)
denoに関する情報
Deno Modules
Deno公式のモジュールレジストリ
https://doc.deno.land/
各モジュールのAPIドキュメントを参照できます
awesome-deno
/deno-ja
開発環境
VSCode
公式でvscode-denoという拡張が提供されています
denoの標準ライブラリをVS Codeでいい感じに補完するためにやった作業 - Qiita
Vim/Neovim
coc.nvimを使用しているのであれば、coc-denoがおすすめです
Vimでdenoの開発環境を構築する
本
Denobook 01
その他
denopkg.com
Deno アプリを Heroku にデプロイする
ソース
deno内部のCompiler APIと非同期のお話
Deno のディレクトリ構造 2019 冬
参考
“I have only one learning technique: projects that I’m working on” — interview with Ryan Dahl
Node.js における設計ミス By Ryan Dahl
/keroxp/deno入門2018
/keroxp/denoについて知っていること2019年1月編
Deno vs Node.js
From Node.js to Deno
Suggestion: Look into porting to Rust and using Tokio
Deno JS.LA
Deno internals, how modern runtime is built