Phoenix App 中的预编译单页应用程序

Precompiled Single-Page-Apps in Phoenix App

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

我在我的 phoenix 应用程序中将此文件夹放在 /priv/static 下,并试图让路由为其提供服务...到目前为止没有成功。我使用的是 phoenix 版本 0.17.1(与 1.0 afaik 相同)。我按顺序尝试了以下步骤:

None 以上步骤目前有效,我只得到错误 no route found for GET /my_app/index.html。我该如何解决这个问题?我只想将 URL "/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 运行ning,因为 phoenix 应用程序本身将所需数据公开为 RESTful API.

在每个实现的功能之后,前端开发人员键入 ember build [...],此任务将整个 ember.js 前端应用程序编译到一个文件夹中,其中包含一个 index.html 文件和一些资产,并且将此文件夹移动到 $phoenix_root/web/static/assets/my_app。然后 phoenix(或 b运行ch)触发,并将这些东西 按原样 复制到 $phoenix_root/priv/static/my_app,准备好像任何其他资产一样提供服务。

重点是能够在单个代码库(phoenix 应用程序)中构建一堆独立的 "frontends" 作为自包含包,而 phoenix 应用程序本身有额外的(其他)东西做。

因为前端开发人员每次都会自动生成 SPA,所以我 非常 想避免修改不断更新的 index.html 文件。在性能方面,最好将这些 SPA 作为静态文件提供——它们在用户的浏览器中自行初始化。

我希望这能澄清我这样做的原因。

编辑 2:

我现在有一个可行的解决方案,请参阅我为演示目的创建的示例存储库:https://github.com/Anonyfox/Phoenix-Example-Multiple-SPA-Frontends

对凤凰APP的必要修改:

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

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

路由器部分:

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

和内部动作render conn

您的设置应该可以正常工作。只有一个警告:每次更改 lib 中的某些内容时,您都必须重新启动应用程序。

根据请求重新加载代码的唯一目录是 web。事实上,这是 libweb 目录之间的唯一区别。这就是为什么你将长 运行 进程和主管放在 lib 中,因为不需要重新加载它们,其他所有内容都放在 web.