OvermindDL1

OvermindDL1

I’ve been trying to see if Phoenix supports HTTP/2 but I am not able to see any hint of a sign of negotiation or how to PUSH data over HTTP/2? It would be nice if, say, the View’s could specify mandatory files to be pushed to the browser based on their knowledge of the templates for example. Is there something that I am missing?

Showing Posts 21 to 30

aseigo

aseigo

Awesome! Thanks; will read it today and let you know if I have any feedback. Thanks for writing this up, most useful…

ChaseGilliam

ChaseGilliam

Let me know specifically if there are any areas that I’m glossing over, especially with the JS stuff.

markschultz

markschultz

@ChaseGilliam is there a reason why webpack is run as a server instead of emitting static js? Is that related to the bit at the end:

I’ll leave it as an exercise for readers to explore pushing multiple js files to the client and combining Webpack’s lazy loading to push files on demand.

If so could you elaborate on that?

Minus webpack, as far as I can tell all thats needed to enable http2 is the updated deps, the cert, and the changed https endpoint config. Neat!

ChaseGilliam

ChaseGilliam

why webpack is run as a server instead of emitting static js

This is just in development mode so that you can make use of code reloading. For production you would use webpack -p or similar to build production assets.

Minus webpack, as far as I can tell all thats needed to enable http2 is the updated deps, the cert, and the changed https endpoint config.

Right, that’s basically the minimal set of requirements. However, webpack gives you nice tools for splitting your JavaScriot into N small files. This helps you leverage HTTP/s’s multiplexing. I didn’t want to go into too much detail on that point, because Webpack 4 will have some major changes, and I want to revisit the topic once their ecosystem has transitioned to their new APIs.

Also, thanks for checking out the guide!

markschultz

markschultz

i’ve been reading up on http2 push and it needs to be initiated from server. Can you tell me what you were thinking about regarding webpack lazy load and push?

ChaseGilliam

ChaseGilliam

Webpack’s lazy load is well suited to pulling js on an as needed basis, but I suppose you could you it for push, I’m just not sure how. In general I’m still thinking through how best use push with Phoenix, and when to use that vs. channels/web sockets.

idi527

idi527

  defmodule Http2TodayWeb.LayoutView do
    use Http2TodayWeb, :view
    def js_script_tag do
      if Mix.env == :prod do
        # In production we'll just reference the file
        """
        <script src="<%= static_path(@conn, "/js/vendor.js") %>"></script>
        <script src="<%= static_path(@conn, "/js/app.js") %>"></script>
        """
      else
        # In development mode we'll load it from our webpack dev server
        """
        <script src="https://localhost:8080/vendor.js"></script>
        <script src="https://localhost:8080/app.js"></script>
        """
      end
    end

    # Ditto for the css
    def css_link_tag do
      if Mix.env == :prod do
        "<link rel=\"stylesheet\" href=\"<%= static_path(@conn, \"/css/app.css\") %>" 
      else
        "<link rel=\"stylesheet\" type=\"text/css\" href=\"https://localhost:8080/css/app.css\" />"
      end
    end
  end

can be somewhat optimized if you move if outside of the function

  defmodule Http2TodayWeb.LayoutView do
    use Http2TodayWeb, :view

    js_script_tag = 
      if Mix.env == :prod do
        # In production we'll just reference the file
        """
        <script src="<%= static_path(Http2TodayWeb.Endpoint, "/js/vendor.js") %>"></script>
        <script src="<%= static_path(Http2TodayWeb.Endpoint, "/js/app.js") %>"></script>
        """
      else
        # In development mode we'll load it from our webpack dev server
        """
        <script src="https://localhost:8080/vendor.js"></script>
        <script src="https://localhost:8080/app.js"></script>
        """
      end
    
    def js_script_tag, do: unquote(js_script_tag)

    # Ditto for the css
    css_link_tag = 
      if Mix.env == :prod do
        "<link rel=\"stylesheet\" href=\"<%= static_path(Http2TodayWeb.Endpoint, \"/css/app.css\") %>" 
      else
        "<link rel=\"stylesheet\" type=\"text/css\" href=\"https://localhost:8080/css/app.css\" />"
      end
    
    def css_link_tag, do: unquote(css_link_tag)
  end

if you care about small performance gains …

OvermindDL1

OvermindDL1 OP

Not just a performance cain, but you want to keep Mix.* calls outside of function calls so they stay at compile-time only. If you deploy a release then Mix will not exist (it’s a build system after all) so that would crash if inside a function (you can unquote it to move it outside the function if necessary). ^.^

idi527

idi527

Yeah, that’s much more important, didn’t think of that …

ChaseGilliam

ChaseGilliam

@idi527 and @OvermindDL1, that’s a great point. I’ll make a note and update the post soon.

Where Next? Top

Trending in Questions Top

katta
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
achenet
Hello, I’m trying to build a basic Phoenix web-app, and I’d like to use Tailwind. However, when I launch mix phx.server, I get an error...
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
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
Cxx-mlr
I’m working on a small exercise involving update_in/3, and I came up with this solution: data = %{ name: "Periodic Table", category:...
New
ChrisAmelia
I’ve got trouble wrapping my head around the order in which functions are called in this snippet (from Phoenix’s authentication): toke...
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
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
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
budgie
A little off-topic, but I feel like people here have a good head on their shoulders. I used to be quite good at making software. Was luc...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews