kokolegorille

kokolegorille

Hello everyone,

I am trying to implement live reload on a static page, for an API.

I build the project with --no-html --no-webpack, and added a bucklescript pipeline instead.

There is only one page, a static index.html, located in priv/static. I render with the following action

  def index(conn, _params) do
    conn
    |> put_resp_header("content-type", "text/html; charset=utf-8")
    |> IO.inspect()
    |> send_file(200, "priv/static/index.html")
  end

I added phoenix-live-reload, configured the api to use it… and now code is reloading when frontend files change. I can see bsb and webpack reloading in the background.

I have configured my Endpoint with live/code reload, and I can see in my connection when in development.

  before_send: [#Function<1.112466771/1 in Plug.Logger.call/2>, 
   #Function<0.66982185/1 in Phoenix.LiveReloader.before_send_inject_reloader/2>],

But as it is an api only, there is no phoenix_html, I need to inject the live reload iframe manually into the static index.html.

Can somebody point me where (and when) Phoenix inject the live reload iframe? I find it hard to find in the source code.

Thanks for taking time

Showing Posts 1 to 3

kokolegorille

kokolegorille OP

Thank You for the response, but I read this and configured accordingly…

It does set the before_send in my connection correctly.

But I would like to know where this function is applied in reality (the plug just add a function in the before_send). As it is a static file, not an eex template, I will need to inject manually.

kokolegorille

kokolegorille OP

The code is in the live_reloader, as said by @dom, in the private functions…

At the very end, we can find

  defp before_send_inject_reloader(conn, endpoint) do
    register_before_send(conn, fn conn ->
      if conn.resp_body != nil && html?(conn) do
        resp_body = IO.iodata_to_binary(conn.resp_body)
        if has_body?(resp_body) and :code.is_loaded(endpoint) do
          [page | rest] = String.split(resp_body, "</body>")
          body = page <> reload_assets_tag(conn) <> Enum.join(["</body>" | rest], "")
          put_in conn.resp_body, body
        else
          conn
        end
      else
        conn
      end
    end)
  end

  defp reload_assets_tag(conn) do
    path = conn.private.phoenix_endpoint.path("/phoenix/live_reload/frame")
    """
    <iframe src="#{path}" style="display: none;"></iframe>
    """
  end

The solution is dead simple (once You get how it works), Not even the need to parse the static file, just render with.

  def index(conn, _params) do
    file = "priv/static/index.html"
    {:ok, binary} = File.read(file)
    html(conn, binary)
  end

The html helper will take care of this. Sorry for the question…

Now I have a slim api, with live reload enable on the static file.

— All posts loaded —

Where Next? Top

Trending in Questions Top

RSP87
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
nseaSeb
Hello, I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
kpanic
Hi everyone, I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding. I sta...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
asweet-confluent
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
apz
I’m new to elixir and just tried to install the elixirLS extension for VScode(ium) and it is throwing some errors that I would like help ...
New

Other Trending Topics Top

GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
marciok
Hi there! We created Gust: A task orchestrator inspired by Airflow. For those who have never heard about Aiflow, it’s a Python-based wor...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews