elbasti

elbasti

Hi folks,

I’m working on a greenfield webapp. The stack I’d like to try is Vue on top of Phoenix. I’m not new to vue, but I’m new to Phoenix.

I wonder how you all have been addressing the js build chain at development & build time.

I’d love to be able to use the vue cli as much as possible. JS tooling is definitely not my strong suit and so far I’ve found it incredibly useful, with super sane defaults and really cool features (ex, modern mode )

However, one side effect of using vue-cli is that webpack config is kind of abstracted away.

Right now I’m thinking about structuring my project as follows:

  1. Start a new phoenix project with --no-webpack ;
  2. Start a vue project using vue-cli-service , with these two changes:
  • priv/static should be the build target
  • lib/myapp/templates/layout/app.html.eex should be the index_path for vue-cli-service

Would this work? Anyone here using vue & phoenix have a similar setup?

As well, how do you handle developing the vue component of your app (ie, leveraging vue-cli-service serve ) with such a setup?

Many thanks, loving phoenix so far.

Showing Posts 1 to 10

sribe

sribe

Personally, I run them completely separately in development. And have a shell script in the Vue project that builds the release then rsync’s it into a folder in the Phoenix project when I’m ready to push out a release.

nthock

nthock

We are using Phoenix as the backend, and Nuxt (a Vue framework) as the frontend. Both frontend and backend are separate application and we deploy them separately.

elbasti

elbasti OP

Thanks! I suppose that makes sense. So you have Phonenix serve your static vue app? Just for clarification, does this mean that your phoenix templates/layout/app.html.eex is actually the vue index page? Where do you have a <div id="app"> (or similar), in templates/layout/app.html.eex or in templates/pages/index.html.eex ?

Sorry for the follow up; just trying to figure out how to marry the phoenix pages with the index page created by vue.

elbasti

elbasti OP

Thanks. So your vue app is served by a different server? (node.js, presumably)?

peerreynders

peerreynders

No. With that setup Phoenix doesn’t serve any of the Vue app’s asset’s - it strictly functions as an independent JSON server.

I had a Vue example for Phoenix 1.3 using the app.html.eex but the consensus seems to be to keep Phoenix/Vue separate so that using Nuxt.js remains an option.

For React there is elixir_react_render

but there is nothing like that for Vue yet.


Some “Phoenix as a JSON API server” resources:

Harvested from:

sribe

sribe

In dev, I have a dev (Node) server serving the Vue app, which talks to the Phoenix server, websockets in my case, but could just a well be a REST API. In production, the Phoenix server just serves the Vue app as static assets.

I don’t. I create the Phoenix app with --no-html.

mikemccall

mikemccall

I don’t. If I’m using the cli I use it standalone. The vue cli doesn’t do a good job integrating with existing frameworks, I believe this is an oversight and it will be resolved but it doesn’t seem to be a priority. There are some open issues and ongoing discussions around this. I have a hard time accepting the whole “Just output the index.html file where your backend app will server it” There are many cases where people don’t want to replace the entire rendered page with vue. I love vue as a frontend framework because you can use it in many different forms. From adding it from the cdn and sprinkle in some components all the way to full SPA. The vue-cli really pushes towards SPA. Now that phoenix uses webpack adding vue (and using single file components) is as easy as adding the vue loader.

It’s actually fairly straight forward!

cd assets && npm install --save-dev vue-loader

Update the webpack.config.js

...
{
  test: /\.vue$/,
    use: {
      loader: 'vue-loader'
    }
  },
...

In your app.js

import Vue from 'vue'
import App from './src/App.vue'

new Vue({
  el: '#app',
  render: (h) => h(App)
})

Any page you want to render vue just add the appropriate tag:

For example myapp_web/templates/page/index.html.eex

<div id="app"></div>

At this point nothing stops you from installing and using the vue-router or vuex. Customize and use at will.

11
Post #7
nthock

nthock

No. You do not really need a backend server if you are not using server-side rendering. The nuxt portion can be compiled to a JS file that can then deploy as a static site in Netlify.

amnu3387

amnu3387

In fact, if you just have a bunch of static pages along with a walled section (like user area, that doesn’t need to be SEOed) then nuxt generate and deploying that as a static website is great (you can also use Aws S3 and distribute the frontend through cloudfront for instance). If you have a lot of dynamic generated pages that you need to have SEOed then indeed you need to have a back-end server, or generate the dynamic bits (which can become overly complex easily and require a pipeline for continuous generation & deployment).

DragosMocrii

DragosMocrii

Sorry for re-spawning this thread, but I’m struggling with something similar. So far, I think I understood the gist of the responses here, but just to re-cap, can someone please validate if the following ideas are correct? I’d like to use VueJs/Apollo client for building the front-end of my app, and Phoenix 1.4/Absinthe for serving GraphQL responses.

With the proposed setup:

  • The front-end app built with VueJS does not have to be integrated in the same project with the Phoenix back-end app
  • In fact, the front-end app can be worked on independently from the back-end (planning to mock all GraphQL responses anyway while working on the front-end first)
  • The Phoenix back-end app does not need to have any JS build tools, since it does not serve any static content. Its sole purpose is to serve the GraphQL queries. As suggested before, this can be achieved by creating the Phoenix app with the --no-webpack --no-html arguments.
  • The front-end can be deployed as a static site to AWS S3 to leverage distribution through Cloudfront
  • The front-end app (regardless from where it is served in Cloudfront) would send the GraphQL requests to the same central Phoenix app
  • Since the VueJS app would be a walled section (ie app.mysite.com) requiring the user to log in, it’s not supposed to be SEO friendly anyway, so no concerns needed about that
  • The content site (mysite.com) can be built independently with other tools for content management like Hugo, Wordpress, etc
  • (This last one item is something I’m curious how to solve. Supposedly, we can use Cloudfront to make sure the front-end is served with no bottlenecks. Could something similar be used to serve the Phoenix back-end, but keep the same GraphQL endpoint URI? Or, am I being too paranoid about this, given that Phoenix can handle millions of requests at once, which means this should be of no concerns until it becomes an issue?)
  • Is this a valid way to use an Elixir/Phoenix app? I know Phoenix is touted for being exceptionally efficient at rendering templates, so if I’m only using it as a GraphQL server, am I losing any of Elixir’s/Phoenix’s advantages?

Would something like this work for a production ready application? Appreciate any comments or concerns!

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
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
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
dillonoconnor
Is there any way to avoid the Hologram compiler running when using iex? It seems like the front-end code could potentially be disregarded...
New
thiagogsr
** (ArgumentError) expected :max_attempts to be a positive integer, got: {:@, [line: 10, column: 19], [{:max_attempts, [line: 10, column:...
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
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
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
KristerV
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
mcass19
ExRatatui lets you cook up rich terminal UIs in Elixir, powered by Rust’s ratatui via Rustler NIFs. Build interactive terminal applicatio...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews