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

Single Executable Applicationsについて / About Sing...

Single Executable Applicationsについて / About Single Executable Applications

関西Node学園 10時限目の発表資料です。
Node.js v19.7で追加された機能 “Single Executable Applications” について説明しています。

スライド内のアプリケーション例はGitHubに公開しています

Avatar for shimataro

shimataro

May 09, 2023
Tweet

More Decks by shimataro

Other Decks in Programming

Transcript

  1. この発表について ▼内容 Node.js v19.7で追加された機能 “Single Executable Applications” (以下SEA)について ▼対象者 Node.jsの基本的なことは知っている

    ▼その他 発表内容はLinuxで動作確認しています スライドは公開しています → https://speakerdeck.com/shimataro 完全に理解した 何も わからない チョット デキル このへん
  2. よくわからなかったのでもう一回聞いてみた ツンデレ風だとどうなりますか? ほ、ほんとに知りたいの?!う、うっそうそ、私なんてSingle Executable Applicationsなんて知らないもんっ!でも、でも、た、たしかに便利なんだから、 ちょっとだけ教えてあげるけど、嫌いだからね! Single Executable Applicationsってのは、ひとつのプログラムファイルに、いろんなファイルやライブラリが詰め込まれている、うざったいアプリなんだか らっ!いつも、このファイルはここに、あのファイルはあっちにって、めんどくさい作業がいらないのはいいけど、私は個別のファイルをいじりたい時もある

    のよ! でも、でも、たまには便利かもしれないわね。例えば、ゲームなんかは、グラフィックや音声、プログラム自体など、たくさんのファイルが必要だけど、それら をひとまとめにして、実行ファイルをダブルクリックするだけで遊べるようにするってわけ。まあ、私は使わないわよ!そんなこと、誰でもできるもん! 従来のNode.jsランタイムでソースコードを実行するのではなく 単独で実行可能なバイナリファイルを生成
  3. バイナリ生成手順(v20.0) https://nodejs.org/docs/latest-v20.x/api/single-executable-applications.html Node.jsランタイムを 作業ディレクトリにコピー ランタイムの電子署名を削除 (Windows / macOS) hell.jsを 注入用のブロブに変換

    ブロブをランタイムに注入 注入したランタイムに電子署名を付加 (Windows / macOS) $ ./hell hell word (node:66827) ExperimentalWarning: Single executable application is an experimental feature and might change at any time (Use `hell --trace-warnings ...` to show where the warning was created) 地獄の言葉が表示された!!
  4. 実行結果 $ ./sea-example (node:82154) ExperimentalWarning: Single executable application is an

    experimental feature and might change at any time (Use `sea-example --trace-warnings ...` to show where the warning was created) $ curl http://localhost:3000 {"hell":"word"} サーバ側 クライアント側 地獄の言葉が返ってきた!!
  5. 実行結果 $ ./sea-example (node:82154) ExperimentalWarning: Single executable application is an

    experimental feature and might change at any time (Use `sea-example --trace-warnings ...` to show where the warning was created) $ curl http://localhost:3000 {"hell":"word"} サーバ側 クライアント側 地獄の言葉が返ってきた!! 本当に単一ファイル? • バイナリだけを他のマシンに移動 しても実行できた • ≒他の依存ファイルはなさそう
  6. 使いどころ コマンドラインツール • 多分あんまり実用的ではない • ちょっとしたツールを作るたびにバカでかいランタイムが必要 • package.jsonのbinフィールドを使う or Cとかで作成するほうがいい

    ウェブアプリケーション • 多分これが実用的な用途( Node.jsチームもこれを想定?) • システムに影響を与えずに ランタイムバージョンを気軽に更新できる • なにか問題があればすぐに戻せる • 自動デプロイにも組み込めそう
  7. 注意点 Graceful Reload • 業務システムは、極力無停止でリリースしたい • SEAでは、PM2等のNode.js用プロセスマネージャーを使えない 対応方法 • Circusなどの汎用プロセスマネージャー

    を使う • K8sとかNomadとかでコンテナ管理する ただし... • コンテナ管理するなら、SEAを使わなくても気軽にランタイムバージョンを更新できる • =SEAのメリットが薄れる