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 相同)。我按顺序尝试了以下步骤:
- 在 endpoint.ex 中,我删除了
only: ~w(...)
过滤器。
- 实现了一个最低限度的控制器,只需一个操作即可提供文件:
def index(conn, _params) do
redirect conn, to: "/my_app/index.html"
end
- 将控制器添加到我的 routes.ex:
get "/my_app", MyCustomController, :index
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的必要修改:
- 修改
endpoint.ex
' Plug.Static
以包含 SPA 及其资产。
- 重启
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
如果你想在一个项目中对所有代码进行版本控制(这个问题的目的)
我认为最简单的方法是将 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
。事实上,这是 lib
和 web
目录之间的唯一区别。这就是为什么你将长 运行 进程和主管放在 lib
中,因为不需要重新加载它们,其他所有内容都放在 web
.
中
我有一个预编译的 ember.js 应用程序(fronted-js-framework 在这里不重要),它基本上由一个文件夹和一个 index.html 文件组成,还有一些 js/css资产。
我在我的 phoenix 应用程序中将此文件夹放在 /priv/static 下,并试图让路由为其提供服务...到目前为止没有成功。我使用的是 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
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的必要修改:
- 修改
endpoint.ex
'Plug.Static
以包含 SPA 及其资产。 - 重启
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
如果你想在一个项目中对所有代码进行版本控制(这个问题的目的)
我认为最简单的方法是将 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
。事实上,这是 lib
和 web
目录之间的唯一区别。这就是为什么你将长 运行 进程和主管放在 lib
中,因为不需要重新加载它们,其他所有内容都放在 web
.