Phoenix App中预编译的单页应用

时间:2015-09-04 22:39:39

标签: single-page-application elixir phoenix-framework

我有一个预编译的ember.js应用程序(这里的fronted-js-framework应该不重要),它基本上由一个带有index.html文件的文件夹和一些js / css资产组成。

我把这个文件夹放在我的凤凰应用程序的/ priv / static下,并试图让路由服务它...到目前为止没有成功。我在凤凰版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。我怎么能解决这个问题?我只想将网址"/my_app"(或者,如果没有其他工作,"/my_app/index.html")映射到我的凤凰应用中的路径priv/static/my_app/index.html。有任何想法吗?

编辑

我尝试实施的基本工作流程如下:

我有不同的开发人员在位于$phoenix_root/apps/的专用文件夹中构建一些ember.js SPA。所以我有一个开发人员使用ember和ember-cli构建$phoenix_root/apps/my_app。这个开发人员在开发他的应用程序时使用ember server,并在后台运行mix phoenix.server,因为phoenix应用程序本身将所需数据公开为RESTful API。

在每个实现的功能之后,前端开发人员键入ember build [...],此任务将整个ember.js前端应用程序编译到一个文件夹中,带有index.html文件和一些资源,并将此文件夹移动到{{ 1}}。然后凤凰(或早午餐)触发,并将这些东西原样复制到$phoenix_root/web/static/assets/my_app,准备好像任何其他资产一样投放。

关键是能够在单个代码库(凤凰应用程序)中构建一堆独立的“前端”作为自包含的包,而凤凰应用程序本身还有其他(其他)要做的事情。

因为Frontend-Developers每次都会自动生成SPA,所以我高度想要避免修改新的index.html文件。在性能方面,将这些SPA作为静态文件提供服务是最好的 - 它们在用户浏览器内自行初始化。

我希望这可以为我这样做添加一些说明。

编辑2:

我现在有一个有效的解决方案,请参阅我为示例目的创建的示例回购:https://github.com/Anonyfox/Phoenix-Example-Multiple-SPA-Frontends

凤凰应用程序的必要修改:

  • 修改$phoenix_root/priv/static/my_app'endpoint.ex以包含SPA及其资产。
  • 在此之后
  • 重新启动 Plug.Static

对ember.js应用程序的必要修改:

  • mix phoenix.server添加到"output-path": "../../web/static/assets/*my_app*/",方便设置以始终使用此路径运行.ember-cli
  • ember buildbaseURL: '/*my_app*/'添加到locationType: 'none'
  • config/environment.js如果您希望在一个项目中对所有代码进行版本控制(此问题的目的)

1 个答案:

答案 0 :(得分:2)

我认为最简单的方法是用您的索引html替换web/templates/layout/app.html.eex并使用<%= static_path(@conn, "/js/app.js") %>帮助程序更改资产路径以从静态文件夹中获取您的ember app js文件。

路由器部分:

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

内部行动render conn