zudo-tauri

Type to search...

to open search from anywhere

Node.js のバンドル

作成2026年3月29日更新2026年3月29日Takeshi Takatsudo

Tauri アプリにスタンドアロンの Node.js バイナリを同梱するためのダウンロードスクリプト

Node.js のバンドル

一部の Tauri アプリでは、Node.js をサイドカープロセスとして実行する必要がある(例えば、開発サーバーやビルドツールの実行)。ユーザーに Node.js のインストールを要求する代わりに、スタンドアロンの Node.js バイナリをアプリにバンドルできる。

Node.js をバンドルする理由

  • ユーザー側の依存関係が不要 — アプリがそのまま動作する
  • バージョン固定 — 実行される Node.js のバージョンを完全に制御できる
  • 再現性 — 異なるマシン上の異なる Node.js バージョンによる予期しない問題を防止できる

ダウンロードスクリプト

以下の bash スクリプトは、ターゲットプラットフォーム向けの Node.js スタンドアロンバイナリをダウンロードし、SHA256 チェックサムを検証し、展開した後、ターゲットトリプルのサフィックスを付けてリネームする(Tauri がサイドカーバイナリに要求する命名規則)。

#!/bin/bash
set -euo pipefail

# Configuration
NODE_VERSION="v20.11.1"
NODE_BASE_URL="https://nodejs.org/dist/${NODE_VERSION}"

# Detect platform
ARCH=$(uname -m)
OS=$(uname -s | tr '[:upper:]' '[:lower:]')

case "$ARCH" in
  x86_64)  NODE_ARCH="x64" ;;
  arm64)   NODE_ARCH="arm64" ;;
  aarch64) NODE_ARCH="arm64" ;;
  *)
    echo "Unsupported architecture: $ARCH"
    exit 1
    ;;
esac

case "$OS" in
  darwin) NODE_OS="darwin" ;;
  linux)  NODE_OS="linux" ;;
  *)
    echo "Unsupported OS: $OS"
    exit 1
    ;;
esac

TARBALL="node-${NODE_VERSION}-${NODE_OS}-${NODE_ARCH}.tar.gz"
DOWNLOAD_URL="${NODE_BASE_URL}/${TARBALL}"
SHASUMS_URL="${NODE_BASE_URL}/SHASUMS256.txt"

# Target triple for Tauri sidecar naming
case "$OS-$ARCH" in
  darwin-arm64)  TARGET_TRIPLE="aarch64-apple-darwin" ;;
  darwin-x86_64) TARGET_TRIPLE="x86_64-apple-darwin" ;;
  linux-x86_64)  TARGET_TRIPLE="x86_64-unknown-linux-gnu" ;;
  linux-aarch64) TARGET_TRIPLE="aarch64-unknown-linux-gnu" ;;
  linux-arm64)   TARGET_TRIPLE="aarch64-unknown-linux-gnu" ;;
  *)
    echo "Unsupported platform: $OS-$ARCH"
    exit 1
    ;;
esac

# Output directory
BINARIES_DIR="./binaries"
mkdir -p "$BINARIES_DIR"

echo "Downloading Node.js ${NODE_VERSION} for ${NODE_OS}-${NODE_ARCH}..."

# Download tarball
curl -fsSL "$DOWNLOAD_URL" -o "/tmp/${TARBALL}"

# Download and verify SHA256
echo "Verifying SHA256 checksum..."
EXPECTED_SHA=$(curl -fsSL "$SHASUMS_URL" | grep "$TARBALL" | awk '{print $1}')

if [ -z "$EXPECTED_SHA" ]; then
  echo "ERROR: Could not find SHA256 for $TARBALL"
  exit 1
fi

ACTUAL_SHA=$(shasum -a 256 "/tmp/${TARBALL}" | awk '{print $1}')

if [ "$EXPECTED_SHA" != "$ACTUAL_SHA" ]; then
  echo "ERROR: SHA256 mismatch!"
  echo "  Expected: $EXPECTED_SHA"
  echo "  Actual:   $ACTUAL_SHA"
  rm -f "/tmp/${TARBALL}"
  exit 1
fi

echo "SHA256 verified: $ACTUAL_SHA"

# Extract the node binary
echo "Extracting node binary..."
tar -xzf "/tmp/${TARBALL}" \
  -C /tmp \
  "node-${NODE_VERSION}-${NODE_OS}-${NODE_ARCH}/bin/node"

# Move and rename with target triple
OUTPUT_NAME="node-${TARGET_TRIPLE}"
mv "/tmp/node-${NODE_VERSION}-${NODE_OS}-${NODE_ARCH}/bin/node" \
   "${BINARIES_DIR}/${OUTPUT_NAME}"

# Make executable
chmod +x "${BINARIES_DIR}/${OUTPUT_NAME}"

# Clean up
rm -rf "/tmp/${TARBALL}" \
       "/tmp/node-${NODE_VERSION}-${NODE_OS}-${NODE_ARCH}"

echo "Done: ${BINARIES_DIR}/${OUTPUT_NAME}"
ls -lh "${BINARIES_DIR}/${OUTPUT_NAME}"

使い方

スクリプトを scripts/download-node.sh として保存し、実行する。

chmod +x scripts/download-node.sh
./scripts/download-node.sh

以下のファイルが作成される。

binaries/
  node-aarch64-apple-darwin     (Apple Silicon Mac の場合)
  node-x86_64-apple-darwin      (Intel Mac の場合)

バイナリを .gitignore に追加

Node.js のバイナリは大きい(60〜80MB)。git にコミットしてはならない。

# .gitignore
binaries/

ビルドのセットアップや CI パイプラインの一部としてダウンロードすること。

Tauri サイドカー設定

ダウンロードした Node.js を Tauri のサイドカーとして使用するには、tauri.conf.json に追加する。

{
  "bundle": {
    "externalBin": [
      "binaries/node"
    ]
  }
}

📝 Note

externalBin のパスにはターゲットトリプルのサフィックスを含めない。Tauri はビルドターゲットに基づいて正しいサフィックス(例:-aarch64-apple-darwin)を自動的に付加する。これが、ダウンロードスクリプトでバイナリにターゲットトリプルを付けて命名する理由である。

Rust コードからの呼び出し方法は以下の通りである。

use tauri::Manager;
use tauri_plugin_shell::ShellExt;

// Spawn Node.js with a script
let output = app_handle
    .shell()
    .sidecar("node")
    .expect("failed to create sidecar command")
    .args(["server.js"])
    .output()
    .await
    .expect("failed to run node");

SHA256 検証

スクリプトは、Node.js が以下の URL で公開している公式 SHA256 チェックサムとダウンロードを照合する。

https://nodejs.org/dist/v20.11.1/SHASUMS256.txt

これにより、破損したバイナリや改ざんされたバイナリのインストールを防止する。チェックサムが一致しない場合、スクリプトはエラーで終了する。

⚠️ Warning

バイナリをダウンロードする際に SHA256 検証を省略してはならない。破損した Node.js バイナリは、微妙でデバッグが不可能なランタイムエラーを引き起こす可能性があり、さらに悪い場合はサプライチェーン攻撃につながる。

複数プラットフォーム

クロスコンパイルなどで複数のプラットフォーム向けに Node.js をバンドルする必要がある場合は、各ターゲットに対してスクリプトを1回ずつ実行する。

# On an Apple Silicon Mac, download for both architectures
./scripts/download-node.sh  # Gets arm64 automatically

# For cross-compilation, modify the script or download manually:
# curl the x86_64 tarball and rename appropriately

binaries/ ディレクトリにはターゲットごとに1つのバイナリが格納される。

binaries/
  node-aarch64-apple-darwin
  node-x86_64-apple-darwin
  node-x86_64-unknown-linux-gnu