🫥

org-babelでJavaScriptを実行しようとすると"command not found: node" エラーになる

2024/09/16に公開

Emacsのorg-modeでJavaScriptを実行しようと思い、init.elに以下の記述をしました。

init.el
(require 'ob-js)
(org-babel-do-load-languages 'org-babel-load-languages
  '((js . t))
)

そして、orgファイルにjsのコードブロックを記述し、実行してみましたが、
command not found: node と言われてしまいます。

nodeはインストール済みです。念の為ターミナルで確認しました。

$ node --version
v20.6.1

しかし、org-modeのコードブロック上で実行すると...

なぜかnodeが見つかりません。何故?

原因

nvmでnodeをインストールしていたのが原因でした。

$ which node
/Users/<usename>/.nvm/versions/node/v20.6.1/bin/node

org-babel実行時に、.zshrcで設定した環境変数がロードされていないためnodeが見つからなかったようです。

.zshrc
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion"  # This loads nvm bash_completion

解決法

ユーザーのシェルの環境変数をロードするEmacsのパッケージexec-path-from-shellをインストールすることで解決しました。

https://github.com/purcell/exec-path-from-shell

init.el
(use-package exec-path-from-shell
   :config (exec-path-from-shell-initialize))
(require 'ob-js)
(org-babel-do-load-languages 'org-babel-load-languages
  '((js . t))
)

雑談

nodeorg-babel と検索しても、JavaScriptコンパイラのBabel.jsしか出てこなくて困りました...
そして自分がnvmでnodeをインストールしていたことをすっかり忘れていたのでかなりこの問題にハマってしまいました。

とにかく解決できてよかった。

Discussion