You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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找不到对应路径。

可以通过以下方式修复:

  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)
    
  2. 确认文件位置正确
    确保app.js放在priv/static/assets/目录下,这样请求/assets/app.js时就能正确匹配到文件。

如果是临时测试场景,也可以直接填写绝对路径(比如from: "/Users/xxx/your-test-folder/priv/static"),但相对路径更适合脚本的可移植性。

内容的提问来源于stack exchange,提问作者Jason O.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 12:06:12