「Node.js について後悔している10の事」
Node.js の作者 Ryan Dahl が Node.js の現状について、
今の視点からみて後悔している事を発表
本人はバグに見えると言っている。
それを克服する Deno プロジェクトを提案
2018/06/06
https://www.youtube.com/watch?v=M3BM9TB-8yA
後悔
- Promisesにこだわらなかったこと
- セキュリティーについて
- ビルドシステムについて
- package.json
- node_modules
- モジュール解決時の拡張子省略
- index.js
Promisesにこだわらなかったこと
- 2009年に追加しながらも2010年2月に削除してしまった
セキュリティーについて
- V8のセキュリティサンドボックス機能を有効活用できていないこと。
- Nodeプログラムを実行すると、あらゆる種類のシステムコールにアクセスできてしまう。
- ディスクのアクセスを許可した場合に悪用される可能性がある。
ビルドシステムについて
- 恐らく最大の後悔だそう。
- Chromeが使っていたGYPを採用したが、
その後ChromeはGYPからGNに変更してしまい取り残された。
その後もGYPを使い続けた
package.json
- ライセンスやリポジトリなど不要な情報を含む仕様になってしまった。
- ライブラリにリンクすることだけが目的だから必要ないべき。
node_modules
- モジュール解決アルゴリズムが複雑になってしまった
- npm でモジュールをダウンロードするが
node_modules のファルダの多さが問題になってしまった。
モジュール解決時の拡張子省略
- 下記のように拡張子を省略できたがコードだけでは拡張子が分からないこと
ES Modules
import default from './module'
CommonJS
require("module")
index.js
- ディレクトリにindex.jsを含めると検索されて可愛いだろうと思ったが無駄だった。
それが単純に可愛いだけで不要な場合は実行しないことをおすすめします。
app/
├ folder/
│ └ index.js/
└ main.js
main.js
import default from './folder'
フォルダを from で指定すると index.js が呼ばれる
後悔からの提案、目標
- セキュリティの強化
- ES Module だけを使う
- TypeScript ビルトイン
- 単体の実行ファイルで動く
- モダンな開発環境を使う
- 可能な限りブラウザ互換にする
Deno とは
"改良版" Node.js
なぜ改良版なのか
今更 Node.js を変えることはできない。
変えてしまうと
Denoはどうなったのか
Promisesにこだわらなかったこと
非同期アクションはpromiseが返されるようになった。
セキュリティーについて
ファイルやネットワーク、環境へのアクセスは明示的なアクセス許可が必要になった
Deno は内部的に V8 エンジンを使うようになった。
実行時に権限オプションを付与することでアクセスが許可される。
7種類のパーミッションがあり、コマンドライン引数で渡す。
--allow-read
ファイル読み取り
--allow-write
ファイル書き込み
--allow-net
ネットワーク
--allow-env
環境変数読み取り
--allow-run
プロセス実行
--allow-ffi
ネイティブ拡張の使用を許可
--allow-hrtime
高精度タイマーの使用を許可
ビルドシステムについて
GYP から GN に変更された。
package.json
使わなくなった
package.json でパッケージ管理やバージョン管理する必要が無くなった
node_modules
外部モジュールを使うときはURLを指定し実行時に
ローカルのキャッシュフォルダにダウンロードされるようになった。
URL指定時にバージョンも指定できるので package.json が要らなくなった。
pnpmと同じ方式
モジュール解決時の拡張子省略
拡張子を省略できなくなった。
index.js
フォルダを指定してもindex.jsを読み込まなくなった。
その他
- TypeScript のサポート
Deno ではデフォルトで使用できるようになった。(ライブラリ追加が不要になった)
ネットワーク越しの TypeScript も型補完が可能になった!
- トップレベル await
使えるようになったよぉ
// Node
const fetchData = async () => await fetch('someapi/data');
const data = fetchData();
// Deno
const data = await fetch('someapi/data');
-
- fetch
const resp = await fetch("https://example.com"); const html = await resp.text(); console.log(html);
外部ライブラリが不要になった
- Web Storage
localStorage.setItem("key", "hoge"); console.log(localStorage.getItem("key")); // hoge
内部では SQLite を使っている
-
- 最近の Node.js 開発の始め方
TypeScript のインストール
ESLint のインストール
Prettier のインストール
Jest のインストール
テストカバレッジツールのインストール
バンドラーのインストール
最初からインストールしないといけないものが多い
- Denoだと。
コードのフォーマット => deno fmt
コードのリント => deno lint
ユニットテストの実行 => deno test
テストカバレッジ => deno coverage
スクリプトのバンドル => deno bundle
TypeScript => 本体に内包
Deno 本体さえあれば、開発に必要なツールが一通り揃っている!
- 最近の Node.js 開発の始め方
デプロイ環境
デプロイ環境は公式が用意してくれる!!
フレームワークもあります
採用例
まとめ
Deno は 改良版 Node.js を目指すプロジェクト
おまけ
Node と Deno プロジェクト名似てませんか?
"node".split("").sort().join("")
気になった方は開発者ツールのコンソールを使って実行してみてね
参考リンク
YouTube : Node.jsに関する10の反省点 - Ryan Dahl - JSConf EU
OSDN Magazine : Node.jsオリジナル開発者、Node.jsでの経験を生かして安全なTypeScript処理系「Deno」を開発
fixel : JSランタイムエンジンDenoを触ってみる
deno : Deno Manual
Twitter : プロジェクト名?
kt3k.github : モダンな JavaScript/TypeScript 実行環境 Deno