повторное использование кодов nuxt в Elixir / Phoenix - PullRequest
0 голосов
/ 07 октября 2018

Фон

Я создавал фронтенд с нукстом и эликсиром / фениксом в качестве бэкенда, с nginx для обратного прокси.

Однако, чтобы улучшить производительность,Я хочу развернуть все это в Эликсире / Фениксе.

Моя цель

Я хочу использовать свой пустой код в Эликсире / Фениксе.

Чего я не понимаю

Я не знаю, как сохранить маршрутизацию, рендеринг на стороне сервера и настройки, сделанные в nuxt.config.js.Хотя, если мне удастся сохранить компоненты, которые я сделал доступными глобально, я могу отказаться от других настроек.

1 Ответ

0 голосов
/ 09 октября 2018

Если вы думаете использовать это в производстве, то не делайте этого!:).С моей точки зрения, не стоит делать приложение Phoenix ответственным за приложение node.js.Но если вы хотите запустить все это во время разработки как одну команду mix phx.server, выполните следующие шаги:

Создайте GenServer, которая запустит приложение nuxt и добавит этот genserver к наблюдению за приложениями три.assets_path должен быть путь к вашему файлу nuxt app package.json, этот assets_path не обязательно должен быть в вашем приложении Phoenix.


    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.

...