Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Denoを通じて調べたNode.jsの失敗(?)

 Denoを通じて調べたNode.jsの失敗(?)

Akihiro Iwata

August 27, 2020
Tweet

More Decks by Akihiro Iwata

Other Decks in Programming

Transcript

  1. • Node.jsの初期開発者のRyan Dahlが開発 
 • A secure runtime for JavaScript

    and TypeScript.
 • TypeScriptがout of the box 
 • npmに頼らないパッケージ管理 
 Denoとは

  2. Denoとは
 
 • Ryan Dahlの言い分
 ◦ 私はNode.jsの初期開発と開発マネージメントを行っていた 
 ◦ Server

    side JSにはイベントループモデルを取り入れることに成功、一定の成功を得た 
 ◦ 2012年にNode.jsの開発から退いた。2012年の時点でもう既にゴールは達成された、と思っていま た
 ◦ しかし、今現在2018年にNode.jsを半年間使ってみたところそれは勘違いだった 
 初期メンバーによる梯子外し(´・ω・`) 

  3. Denoとは
 • Feature Highlights(一部抜粋) 
 ◦ Deno is a simple,

    modern and secure runtime for JavaScript and TypeScript that uses V8 and is built in Rust.
 ◦ Secure by default. No file, network, or environment access, unless explicitly enabled. 
 ◦ Ships a single executable (deno). 

  4. ビルドツール
 
 
 • Deno is a simple, modern and

    secure runtime for JavaScript and TypeScript that uses V8 and is built in Rust.
 • Secure by default. No file, network, or environment access, unless explicitly enabled. 
 • Ships a single executable (deno). 

  5. ビルドツール
 
 
 • “GYP (Generate Your Projects) は、自動ビルドツール。GYPはGoogleにより作成された、Chromiumウェ ブブラウザをビルドするために統合開発環境のプロジェクトファイル(Visual

    StudioやXcode)を生成する オープンソースソフトウェア。ライセンスはBSDライセンス。” 
 • “V8[3]、WebRTC[4]は、以前までGYPを用いてビルドされていたが、現在ではGNに ビルドツールを移行し ている。”
 2009年。。。もしかしてPython2では? (Python3のリリースは2008年12月) 

  6. • Deno is a simple, modern and secure runtime for

    JavaScript and TypeScript that uses V8 and is built in Rust.
 • Secure by default. No file, network, or environment access, unless explicitly enabled. 
 • Ships a single executable (deno). 
 ビルドツール
 
 • Node.jsのときはビルドツール選定に(結果的に)失敗してし まった • Denoではシンプルなビルドツールを Rustで内製
  7. セキュリティ
 • Deno is a simple, modern and secure runtime

    for JavaScript and TypeScript that uses V8 and is built in Rust.
 • Secure by default. No file, network, or environment access, unless explicitly enabled. 
 • Ships a single executable (deno). 

  8. • V8はsecureなsandboxモデルを実現(Isolated) 
 ◦ ただし、V8単体はファイルシステムやネットワークシステムへのアクセスを提供していない 
 ▪ console.logもV8の範囲外 
 ◦

    Node.jsはfsやhttp等のモジュールでこれを提供している 
 • 時代は変わり、Node.jsは様々なユースケースで使われるように 
 ◦ 多くのライブラリが開発された 
 ◦ そのライブラリの全てが、ファイルシステムやネットワークシステムへのアクセス権限をデフォルトで 持っている
 ▪ 悪意あるパッケージがnpmで配布されたら・・・? 
 • そしてQiitaやStackoverflowで謎の紹介記事が出たりして・・・? 
 • せっかくV8が持っているsecureなsandboxが活かしきれていない 
 ◦ npmの脆弱性多い問題 
 セキュリティ

  9. • Deno is a simple, modern and secure runtime for

    JavaScript and TypeScript that uses V8 and is built in Rust.
 • Secure by default. No file, network, or environment access, unless explicitly enabled. 
 • Ships a single executable (deno). 
 セキュリティ
 • せっかくV8が持っているsecureなsandboxが活かしきれな かった • denoではデフォルトでファイルシステムやネットワークシステ ムへのアクセスを禁止
  10. package.json, node_modules
 
 • Deno is a simple, modern and

    secure runtime for JavaScript and TypeScript that uses V8 and is built in Rust.
 • Secure by default. No file, network, or environment access, unless explicitly enabled. 
 • Ships a single executable (deno). 

  11. • npmはNode.jsの一部。デファクトに 
 ◦ いわゆる中央集権モデルへ(運営母体が経営危機に陥り、GitHubが買収なんてことも) 
 • ライセンス、リポジトリURL、description、毎回聞かれるのめんどい 
 •

    単一ファイルを指定できれば良くない?ディレクトリ指定はアプリケーション側でやれば良くない? 
 • moduleの解決アルゴリズムはだいぶ複雑 
 ◦ node_modules 内の依存関係をたどる 
 ◦ moduleは指定元からの相対パスでファイルを指定 
 ◦ $NODE_PATH 環境変数にパスがセットされているとそこからも読み込まれる 
 ▪ これ誰も使ってないよね by Ryan 
 package.json, node_modules

  12. • で、結局denoではどうしたのか 
 ◦ import * as log from "

    https://deno.land/std/log/mod.ts ";
 • npmなどなかった
 • vendoring、バージョン管理が不要に 
 ◦ 取得先が壊れたらどうするんだ・・・? 
 ◦ 結局は何かしらのvendoringは要る気がする 
 ▪ third party開発待ち? 
 package.json, node_modules

  13. Denoとは
 • Deno is a simple, modern and secure runtime

    for JavaScript and TypeScript that uses V8 and is built in Rust.
 • Secure by default. No file, network, or environment access, unless explicitly enabled. 
 • Ships a single executable (deno). 
 • Node.jsのときはモジュール管理を複雑にしすぎてしまった • Denoではシンプルなimportのみ提供
  14. 調べてみた感想
 • 製作者の意図とか見るの楽しい 
 ◦ 「とりあえず作ってみた」では見えてこないことが見えた 
 ◦ 批判的に見るきっかけにはなった 


    • denoがNode.jsの置き換えになるかというと・・・? 
 ◦ パッケージ管理の仕組みすら全く違う→ライブラリ全部書き直しでは? 
 ▪ ReactやVueといったライブラリが今更そんなことできるか? 
 ▪ express等のサーバーサイドではまだ置き換えがありえそうな気もする 
 ▪ そもそもNode.jsでもTypeScriptは使える。out of the boxではないだけ