Slide 1

Slide 1 text

新しいJSランタイムのDenoと Bunに入門してみた 2024.02.20

Slide 2

Slide 2 text

(C)PharmaX Inc. 2024 All Rights Reserve 2 自己紹介 X@hakotensan Akira Morooka PharmaX 株式会社 薬局DX事業部 アプリケーションエンジニア 好きなもの: ボルダリング、漫画

Slide 3

Slide 3 text

3 (C)PharmaX Inc. 2023 All Rights Reserve 発表の流れ 1. モチベーション 2. 各ランタイムの概要 3. DenoとBunの特徴 4. 感想

Slide 4

Slide 4 text

4 (C)PharmaX Inc. 2024 All Rights Reserve モチベーション

Slide 5

Slide 5 text

(C)PharmaX Inc. 2024 All Rights Reserve 5 JavaScriptランタイムの選択肢 Webブラウザ以外のJavaScriptのラインタイムは長い間、Node.jsが主 導してきました。 しかし最近では、DenoやBunのような新しいランタイムが登場し、開発者 コミュニティに新たな選択肢が増えています。 これから先のJS界隈の開発事情をキャッチアップする意味で、Node.js以 外のランタイム「Deno」と「Bun」について調べてみました。

Slide 6

Slide 6 text

6 (C)PharmaX Inc. 2024 All Rights Reserve 各ランタイムの概要

Slide 7

Slide 7 text

(C)PharmaX Inc. 2024 All Rights Reserve 7 Node.js ● 2009年に登場 ● ブラウザ以外のJavaScriptランタイムとして圧倒的なシェアでフロ ントエンド、バックエンド問わず使われている。 ● イベント駆動、シングルスレッドによるノンブロッキングなIO処理 ● NPMという巨大なパッケージエコシステム ● 代表的なフレームワーク: Express、NextJS、etc

Slide 8

Slide 8 text

(C)PharmaX Inc. 2024 All Rights Reserve 8 Deno(ディーノ) ● 2018年に登場 ● Node.jsと同じ作者(ライアン・ダール)が、Node.jsの反省を踏ま えて作成 ● セキュリティを意識した設計 ● TypeScriptの標準サポート ● NodeJS同様にイベント駆動で非同期IOに注力して開発されてい る

Slide 9

Slide 9 text

(C)PharmaX Inc. 2024 All Rights Reserve 9 Bun(バン) ● 2021年に登場 ● 高速なスタートアップタイムとランタイムパフォーマンスを売りにし ている(Node.jsよりも4倍早いとのこと) ● TypeScriptのサポート ● NPMに対する互換性(package.json互換) ● JSX、textなどの多くのファイル形式のローダーがサポート (textやtomlなどをそのままimportできる)

Slide 10

Slide 10 text

(C)PharmaX Inc. 2024 All Rights Reserve 10 比較① : モジュール解決 ランタイム モジュール NodeJS CommonJSで作られていたが 現在はES Modulesもサポート Deno ES Modulesのみ Bun ES Modulesを推奨しているが、 CommonJSもサポート const { PI } = Math; exports.area = (r) => PI * r ** 2; ….. const circle = require('./circle.js'); console.log(circle.area()); const { PI } = Math; export const area = (r) => PI * r ** 2; ….. import { area } from ‘./circle.js’; console.log(circle.area()); CommonJS ES Modules

Slide 11

Slide 11 text

(C)PharmaX Inc. 2024 All Rights Reserve 11 V8 Googleが開発。ChromeなどChromium ベースのブラウザで採用。 比較② : JavaScriptエンジン ランタイム JavaScriptエンジン Node.js V8 Deno V8 Bun JavaScriptCore JavaScriptCore Safariを始めとするWebKitベースのブラウ ザで採用。 その他 SpiderMokey(Firefox), Chakra(Edge), Hermes(React Native), etc..

Slide 12

Slide 12 text

(C)PharmaX Inc. 2024 All Rights Reserve 12 比較③ : 開発言語 ランタイム 開発言語 Node.js C++, JavaScript Deno Rust Bun Zig

Slide 13

Slide 13 text

13 (C)PharmaX Inc. 2024 All Rights Reserve Denoの特徴

Slide 14

Slide 14 text

(C)PharmaX Inc. 2024 All Rights Reserve 14 ランタイムセキュリティ ● --allow-read: ファイルの読み込み許可 ● --allow-write: ファイルの書き込み許可 ● --allow-net: ネットワークの許可 ● -A : 全ての権限を許可 Denoではネットワークや、ファイルなどの I/Oアクセスを 標準で許可されていない。 (Node.jsでは全てのアクセスを許可している ) 実行時に明示的に権限を付与するため、高いセキュリ ティが担保されている。 % deno run --allow-net server.ts https://docs.deno.com/runtime/manual/basics/permissions

Slide 15

Slide 15 text

(C)PharmaX Inc. 2024 All Rights Reserve 15 モジュール解決 Node.jsとはモジュール解決 (import)の記述が異なる。 URLを直接記述可能で、拡張子も省略しない。 (インストールせずにそのまま実行できる ) index.js はサポートされていない。対象のモジュールは 直接参照する必要がある。 // urlを直接書いてOK // 拡張子を省略しない import { serve } from "https://deno.land/std/http/server.ts"; // npm: でnpmモジュールも使える import express from "npm:express@4"; https://docs.deno.com/runtime/manual/basics/modules/

Slide 16

Slide 16 text

(C)PharmaX Inc. 2024 All Rights Reserve 16 開発エコシステム ● deno check: Typescriptの型チェック ● deno fmt: コードフォーマッター ● deno lint: リンター ● deno task: タスクランナー ● deno test: テストランナー ● deno bench: ベンチマーカー ● etc.. フォーマッタやリンタなどが標準で使えるため、 ESlintや Pretterを別途インストールする必要がない。 https://docs.deno.com/runtime/manual/tools/

Slide 17

Slide 17 text

(C)PharmaX Inc. 2024 All Rights Reserve 17 その他 その他、Node.jpでNPMパッケージが必要だった機能が標準 サポートされているため開発体験が良い https://docs.deno.com/runtime/manual/references/cheatsheet

Slide 18

Slide 18 text

18 (C)PharmaX Inc. 2024 All Rights Reserve Bunの特徴

Slide 19

Slide 19 text

(C)PharmaX Inc. 2024 All Rights Reserve 19 Node.jsとの互換性 Bunは「package.json」がサポートされており、 「bun install」に変えるだけで、既存の Node.jsのプロジェ クトを実行可能。 (bun installは、npm installと比べると25倍高速とのこと) https://bun.sh/docs/cli/install

Slide 20

Slide 20 text

(C)PharmaX Inc. 2024 All Rights Reserve 20 NextJSもそのまま動く NextJSもAPI互換されており、基本はそのまま動く。 (App Routerについては一部未対応とのこと ) https://bun.sh/guides/ecosystem/nextjs

Slide 21

Slide 21 text

(C)PharmaX Inc. 2024 All Rights Reserve 21 モジュール解決方法が豊富 index.js(ts)にも互換性があり、基本的には ES Modulesを推奨しているが、CommonJSにも対応し ている。拡張子の有無もサポート。 https://bun.sh/docs/runtime/modules

Slide 22

Slide 22 text

(C)PharmaX Inc. 2024 All Rights Reserve 22 独自のlockファイル package.jsonでインストールされたパッケージは、 グローバルでキャッシュされる (~/.bun/install/cache/)。 依存性の管理は、独自のロックファイル「 bun.lockb」で管 理される。 bun.lockbは高速化のためバイナリ形式になっており、エ ディタで読むことはできない。 (yarn.lockに変換可能) https://bun.sh/docs/install/lockfile (~/.bun/install/cache/ に管理されたファイル )

Slide 23

Slide 23 text

23 (C)PharmaX Inc. 2024 All Rights Reserve 個人的な感想

Slide 24

Slide 24 text

(C)PharmaX Inc. 2024 All Rights Reserve 24 最近の開発ニーズに合わせ、エコシステムが充実している。 (テストランナー、watch機能、TypeScript、JSXのネイティブサポートな ど。) 従来のNode.jsを使用した開発環境のセットアップに比べ、早くかつ容易 に開発できるようになった。 Deno, Bun共通

Slide 25

Slide 25 text

(C)PharmaX Inc. 2024 All Rights Reserve 25 Node.jsのパラダイムを一新するというコンセプトのため、大胆な変更が 導入されている。 互換性を減らし、開発者体験が良い機能を導入している。 NPM互換が採用されたことで、NPMの資産を使えるようになり、既存 Node.jsユーザーにとっても有力な選択肢になった。 CLIツールやシンプルなスクリプトなどのユースケースは特に良さそうに 感じた。 Deno

Slide 26

Slide 26 text

(C)PharmaX Inc. 2024 All Rights Reserve 26 「既存のNode.jsを高速に置き換える」ことを目的にしていて 「互換性と速度」を強く意識している。 (他のエコシステムとの互換性やサポートが充実している) NextJSやNuxtJSなどメジャーフレームワークが、安全に置き換えれるの であれば、積極的に試したい。 Bun

Slide 27

Slide 27 text

27 (C)PharmaX Inc. 2024 All Rights Reserve ありがとうございました!