2015-09-04 2 views
8

У меня есть предварительно скомпилированное приложение ember.js (в котором фронт-js-framework не имеет значения здесь), который в основном состоит из папки с файлом index.html и несколько js/css активов.Предварительно скомпилированные приложения для одной страницы в приложении Phoenix

Я разместил эту папку под/priv/static в своем приложении phoenix и попытался получить маршрутизацию для ее обслуживания ... без успеха до сих пор. Я на phoenix версии 0.17.1 (так же, как 1.0 afaik). Я пробовал следующие шаги в следующем порядке:

  • В endpoint.ex я удалил фильтр only: ~w(...).
  • Реализован абсолютный минимум контроллер с одного действия, чтобы служить файл: def index(conn, _params) do redirect conn, to: "/my_app/index.html" end
  • добавлен контроллер к моему routes.ex: get "/my_app", MyCustomController, :index

Ни один из вышеуказанных шагов не работал до сих пор, я только получите ошибку no route found for GET /my_app/index.html. Как я могу решить эту проблему? Я просто хочу отобразить URL-адрес "/my_app" (или, если ничего не работает, "/my_app/index.html") на путь priv/static/my_app/index.html в моем приложении phoenix. Есть идеи?

EDIT:

Основной рабочий процесс Я пытаюсь реализовать это следующим образом:

У меня есть разные разработчики, которые строят некоторые ember.js ООР в их выделенной папке, расположенной в $phoenix_root/apps/. Поэтому у меня есть разработчик $phoenix_root/apps/my_app с ember и ember-cli. Этот разработчик использует ember server при разработке своего приложения и работает в фоновом режиме mix phoenix.server, потому что сам приложение phoenix предоставляет необходимые данные в качестве RESTful API.

После каждой реализованной функции, типы разработчиков интерфейса ember build [...], эта задача компилирует все приложение ember.js внешнего интерфейса в одну папку с файлом index.html и некоторыми активами, и перемещает эту папку $phoenix_root/web/static/assets/my_app. Затем феникс (или, бранч) запускает и копирует этот материал as-is - $phoenix_root/priv/static/my_app, готовый к обслуживанию, как и любой другой актив.

Суть заключается в том, чтобы создать кучу изолированных «интерфейсов» в виде автономных пакетов в рамках одной базы кода (приложение phoenix), в то время как у самого приложения phoenix есть дополнительные (другие) вещи.

Поскольку Frontend-Developers автоматически генерируют SPA каждый раз, изменение постоянно обновляемого файла index.html - это то, что я высоко хочу избежать. По производительности было бы лучше всего просто обслуживать эти SPA как статические файлы, которые они есть - они инициализируются самостоятельно в браузере пользователя.

Надеюсь, это добавит некоторые разъяснения, почему я это делаю.

EDIT 2:

У меня есть рабочее решение сейчас, увидеть пример репо, который я создал для демонстрационных целей: https://github.com/Anonyfox/Phoenix-Example-Multiple-SPA-Frontends

необходимые изменения в приложение феникс:

  • модифицируют endpoint.ex 'Plug.Static, чтобы включить ООПТ и их активы.
  • перезапускmix phoenix.server после этого!

модификации необходимому в ember.js приложений:

  • добавить "output-path": "../../web/static/assets/*my_app*/" к .ember-cli, установка удобства для запуска ember build всегда с этим путем
  • добавить baseURL: '/*my_app*/' и locationType: 'none' в config/environment.js
  • rm -rf .git если вы хотите, чтобы весь код был версией в рамках одного проекта (цель этого вопроса)
+0

Я сделал буквально то же самое в новом приложении, и все получилось просто отлично. У вас есть простое приложение, которое показывает проблему? –

+0

Кроме того, чтобы быть уверенным, что если вы измените что-либо в 'lib', вам нужно перезагрузить приложение. –

+0

Поскольку вы используете emberjs (с отдельными разработчиками), я бы предложил вам проверить этот аддон для развертывания. http://ember-cli.github.io/ember-cli-deploy/docs/v0.4.x/ Также проверьте эти - http://blog.abuiles.com/blog/2014/07/08/lightning-fast-deployments-with-rails/ - https://www.youtube.com/watch?v=QZVYP3cPcWQ –

ответ

3

Ваши настройки должны работать. Существует только одна оговорка: каждый раз, когда вы что-то меняете в lib, вы должны перезапустить приложение.

Единственный каталог, который перезагружается по запросам, - web. Фактически, это единственная разница между каталогами lib и web. Вот почему вы ставите длинные процессы и супервизор в lib, потому что нет необходимости перезаписывать их код, а все остальное - в web.

2

Я думаю, что самый простой способ заменить web/templates/layout/app.html.eex вашим индексом html и изменить путь к ресурсам внутри с помощью помощников <%= static_path(@conn, "/js/app.js") %>, чтобы захватить ваш js-файл приложения ember из статической папки.

маршрутизатор часть:

scope "/", Chat do 
    pipe_through :browser 
    get "/", PageController, :index 
end 

И в действии render conn.

+0

Я бы не хотел этого делать. Планируется, что позже будет несколько разных интерфейсных приложений, которые разрабатываются независимо, и все они будут обслуживаться из моего приложения phoenix, и все они используют одни и те же API для обмена данными. – Hisako

+0

Вы все еще можете использовать эту идею. Вместо того, чтобы использовать его как макет, используйте его как шаблон. Внутри действия решайте, какое приложение js загружать с помощью рендеринга различных ember htmls. –

+0

Я уточнил, чего хочу достичь в своем редактировании выше, есть ли у вас идея, как достичь этого * без * касания автоматически генерируемых файлов index.html? – Hisako