Denoってなんだのん
https://deno.land/images/deno_logo_3.svg
Deno
A secure runtime for JavaScript and TypeScript built with V8, Rust, and Tokio
Denoとは?
Node.jsの作者Ryan Dahlが開発している新しいサーバーサーサイドTypeScriptランタイム
実はJavaScriptも動く
Node.js における設計ミス By Ryan Dahl - from scratch
Node.jsと同じところ
V8で動くサーバーサイド(非ブラウザ)ランタイム
CLI、システムプログラミング、サーバー用途
Node.jsとの違い
TypeScriptサポート
npmがない
Pure ESModule Only
ブラウザAPIとの互換性
priviledgeモデルのセキュリティ
fully Promisified
TypeScriptサポート
TypeScriptがそのまま動く
ts-nodeとか必要ない
内部的にはV8で実行する前にトランスパイルしている
DenoのAPIはすべてTypeScriptで書かれている
https://github.com/denoland/deno/tree/master/js
https://github.com/denoland/deno_std
JavaScriptも動く
npmがない
デフォルトのパッケージマネージャーがない
code:js
const ts = require("typescript")
こういうコードはこう書く
code:ts
import * as ts from "https://dev.jspm.io/typescript"
これはESModuleのれっきとした仕様
というかfrom文をどう解釈するかがブラウザなどに委ねられている
Denoはブラウザと近い環境を目指しているのでこういう書き方になる
↑はブラウザでも動くが、↓みたいのはブラウザでは動かない
code:ts
import * as ts from "typescript"
Pure ESModule Only
ES2015以降のモジュールシステムしか使えない
code:ts
import {some} from "./other"
export function say (a) { console.log(a) }
require(CommonJS)形式のJavaScriptファイルは動かない
Pure Node.js形式のプログラムは動かせない
一方Node.jsは2019/4/29現在(v12)でもESModuleに完全に対応できていない
Ryan曰くCommonJS形式のモジュール解決システムは曖昧で複雑で重い処理になってしまった
code:js
const ts = require("typescript")
const other = require("./other")
こういうrequireはどこから読み込むのか、あるいは読み込めないのか実行時までわからない
otherはother.jsなのか?other/index.jsなのか?あるいはother.jsonなのか?
曖昧さがなく実行環境によってimportが冪等になるような書き方だけできる
code:ts
import "https://dev.jspm.io/typescript"
import "./other.ts"
http形式のURLか、完全な相対パスだけ
ブラウザAPIとの互換性
globalのAPIにブラウザとの互換性があったりする
完全ではない、似ているところはブラウザに寄せる
windowは(いまのところ)ない
globalThis ≠ window
代表的なところだとfetchが使える
atob、TextEncoder、URLなど
WHATWGの仕様がかなり実装されている
priviledgeモデルのセキュリティ
ランタイムレベルセキュリティが強化されている
node.jsのプログラムは実行してしまうと実行ユーザの権限内でなんでもできてしまう
ファイル読み書き破壊、ネットワーク越しの送信、トロイ木馬の設置…
代表的なところだと~/.aws/credentialsとか~/.ssh/id_rsaとか
秘密鍵はまだホストに平文で保存するのが当たり前な世界観なので
lintプログラムを装って悪意のあるプログラムが実行される危険性がある
というかもうあった NPMのeslint-scopeハッキングとNPM全トークン無効化 - Qiita
npmアカウントが乗っ取られてウィルス入のパッケージを配布
denoはAPIごとに必要な権限が定められていて、すべてのプログラムは実行前にその必要な権限がチェックされる
code:open.ts
Deno.open("./tsconfig.json")
code:bash
$ deno open.ts
⚠️ Deno requests read access to "./tsconfig.json". Grant? a/y/n/d (a = allow always, y = allow once, n = deny once, d = deny always)
code:bash
$ deno --allow-read open.ts
これなら何も表示されない
code:txt
FLAGS:
-A, --allow-all Allow all permissions
--allow-env Allow environment access
--allow-high-precision Allow high precision time measurement
--allow-net Allow network access
--allow-read Allow file system read access
--allow-run Allow running subprocesses
--allow-write Allow file system write access
Fully Promisified
APIの非同期処理がすべてasync functionで書かれている
コールバックモデルはなし
Node.jsならこう
code:js
const fs = require("fs");
fs.readFile("./tsconfig.json", (err, data) => {
// data
})
Denoならこう
code:ts
const file = await Deno.open("./tsconfig.json");
const data = new Deno.Buffer();
await Deno.copy(data, file);
// data
IO APIの設計がGoに影響を受けている
keroxp.iconとDeno.iconの関わり
2018/6 知る
2018/12/26 動くことを知る
2018/12/27 denoでWebSocketを実装した
2018/12/28 第一回Denoもくもく会開催、/deno-ja結成
2019/1
deno-wsがdeno stdにマージされようとしている
denoでredisクライアントを実装している
denoでfetchを実装した
denoでstreamsを実装した
denoでHTTPクライアントを実装した
deno_stdにmultipartモジュールが実装された
2019/2
denoのhttp serverが新しくなりました
寝てる間にrevertされていた話
2019/4
技術書典でDeno本を出しました
DenoでHTTPサーバーを作っている
DenoLandとしての日本
/deno-jaコミュニティがある
技術書典で世界初のDeno本を出版
世界屈指のDenoLand
コアやstdへのコントリビュータ多数
いきなりロゴ作る