如何在Elixir脚本(exs)中读取外部文件?LiveView引入JS报错
问题描述
我正在编写一个渲染LiveView的exs文件,尝试用以下script标签读取外部JavaScript文件,但出现了报错:
<script type="text/javascript" src="/assets/app.js"></script>
错误信息
17:30:10.499 [error] #PID<0.385.0> running Example.Endpoint (connection #PID<0.383.0>, stream id 2) terminated Server: localhost:5001 (http) Request: GET /assets/app.js ** (exit) an exception was raised: ** (ArgumentError) unknown application: :sample (elixir 1.15.5) lib/application.ex:1010: Application.app_dir/1 (plug 1.15.0) lib/plug/static.ex:420: Plug.Static.path/2 (plug 1.15.0) lib/plug/static.ex:191: Plug.Static.call/2 live.exs:108: Example.Endpoint.plug_builder_call/2 live.exs:108: Example.Endpoint.call/2 (plug_cowboy 2.6.1) lib/plug/cowboy/handler.ex:11: Plug.Cowboy.Handler.init/2
我的路由和端点设置
Application.put_env(:sample, Example.Endpoint, http: [ip: {127, 0, 0, 1}, port: 5001], server: true, live_view: [signing_salt: "aaaaaaaa"], secret_key_base: String.duplicate("a", 64) ) defmodule Example.Router do use Phoenix.Router import Phoenix.LiveView.Router pipeline :browser do plug(:accepts, ["html"]) end scope "/", Example do pipe_through(:browser) live("/", HomeLive, :index) end end defmodule Example.Endpoint do use Phoenix.Endpoint, otp_app: :sample socket("/live", Phoenix.LiveView.Socket) plug Plug.Static, at: "/", from: :sample, gzip: false, only: ~w(assets js fonts images uploads favicon.ico robots.txt) plug(Example.Router) end
解决方法
报错核心是Plug.Static配置里的from: :sample试图读取名为:sample的Elixir应用目录,但你是在独立exs脚本中运行,并未注册或启动:sample应用,导致Application.app_dir/1找不到对应路径。
可以通过以下方式修复:
调整静态资源路径配置
把Plug.Static的from参数从应用名改为本地实际的静态文件目录路径。比如在脚本所在目录下创建priv/static/assets文件夹并放入app.js,然后修改Endpoint中的配置:plug Plug.Static, at: "/", from: Path.expand("./priv/static"), # 改用本地相对路径 gzip: false, only: ~w(assets js fonts images uploads favicon.ico robots.txt)确认文件位置正确
确保app.js放在priv/static/assets/目录下,这样请求/assets/app.js时就能正确匹配到文件。
如果是临时测试场景,也可以直接填写绝对路径(比如from: "/Users/xxx/your-test-folder/priv/static"),但相对路径更适合脚本的可移植性。
内容的提问来源于stack exchange,提问作者Jason O.
相关产品推荐
相关产品推荐

