如果您认为在生产中使用它,那么不要! :)。从我的角度来看,不值得让phoenix app 负责node.js app。但是,如果您想在开发过程中将所有这些作为单个 mix phx.server 命令运行,请按照以下步骤操作。
创建GenServer,它将启动 nuxt 应用程序并将该 genserver 添加到应用程序监督树。 assets_path 应该是您的 nuxt 应用程序 package.json 文件所在的路径,此 assets_path 不必在您的凤凰应用程序中
defmodule NuxtServer do
use GenServer, restart: :permanent
require Logger
def start_link(assets_path, opts \\ []) do
GenServer.start(\__MODULE__, [assets_path], opts)
end
def init([assets_path]) do
# in assets folder package.json should contain under scripts node
# scripts: {
# ...
# "nuxt": "nuxt"
# }
port = Port.open({:spawn, "npm run nuxt"}, [{:cd, assets_path}])
ref = Port.monitor(port)
{:ok, %{port: port, ref: ref, assets_path: assets_path}}
end
def handle_info({:DOWN, _, :port, _, _}, %{assets_path: assets_path, ref: ref, port: port}) do
Logger.error("Nuxt server is down, restarting ...")
Port.close(port)
Port.demonitor(ref)
{:ok, state} = init([assets_path])
{:noreply, state}
end
def handle_info({_prot, {:data, msg}}, s) do
Logger.debug msg
{:noreply, s}
end
def handle_info(msg, state), do: super(msg, state)
end
然后按照说明如何在 phoenix 中使用例如添加反向代理。这个lib 如果你需要通过phoenix http 端口访问所有内容。