Mingle JS - Use React or Vue components in Livewire with Patricio
Hey everyone, welcome back
to the Laravel Creator Series.
With me today is Patricio from Portugal,
who is the creator of
Mingel.js, Boxpop sites,
a live streamer, he's
just big into the community.
So Patricio, did I get all that right?
And if I miss anything,
let me know right now.
- Hello Eric, hello everyone.
So you got it all right?
Yeah, so that's me.
And I guess, I guess
not, I can't add anything.
You did just perfect, yeah.
- Excellent, excellent, all right.
So to jump in first, the
thing that you built that sort of,
I heard sort of a lot of
buzz about is Mingel.js.
Can you sort of give me the highlights
of what is Mingel.js?
- Okay, so I'll start
with the short version.
(laughs)
So Mingel.js is the
opportunity that fills the gap
to bring complex JavaScript components
inside Livewire applications.
So I do love Livewire and Alpine.
Also I do love JavaScript.
But in the end of the day, the more,
the nearest I am to the server,
the more productive and
quick and I don't know,
I just feel moving faster, right?
And that's my kind of thing,
the one-man army or two people projects.
So I can speak only for that,
not for 500 people project through
several teams and so on.
So yeah, I love Livewire and Alpine,
but there's a point when it
reaches some kind of complexity
or maybe it didn't click all for me,
but there are some, there
is some scope, some extent
where we can't just live on the server
and having these
small, how do you say them?
The sprinkles of JavaScript, right?
We have to go all in.
So I didn't want to go inertia or SPA
or any other thing I
wanted to keep next to Livewire.
So yeah, coming, I could
come from other scenarios.
This all started with
scoped slots in Vue,
the Adam Wadden's
advanced Vue components course
back in the day, 2018
or something like so.
So I started putting Vue
with runtime compiler on Blade.
So the JavaScript
functions would be in JavaScript
and server side would give the template
for that JavaScript.
But then Livewire
started to make sense to me.
I started using and I said, huh,
let's bring them
together, JavaScript and,
I mean the heavy side of
JavaScript and Livewire.
So there we go.
- That's awesome.
So you can actually use like React or Vue
or sort of anything, any existing code.
Like I'm trying to
think of like an example
off the top of my head,
if I go and find a React component
that does everything I want,
I can just pull that
in and it just works.
- That's it, that's the promise.
- That's awesome.
- And it seems it's delivering, yeah.
- So like I was, I keep coming back to,
cause you mentioned
Adam, they have that project,
I think it's Catalyst maybe,
that's a lot of React components.
So I could basically go and buy that
and then just kind of hook it right in.
Man, yeah, that's pretty sweet.
You, for let's say, okay,
a stack of blocks, like three
sections on the website, right?
And you wanna do Catalyst,
so you just, you can for example,
do three Livewire
components, one for each section.
And there you go, each
one is a React component
and they blend in just fine
and you have Livewire, Event Bus,
React, Events, you
have all that in it, yeah.
That's it.
- That's awesome, yes.
Well, how's the sort of, how's the
community been so far
as far as like
embracing this and trying it out
and all that, are they, is it getting a,
I guess, heavy usage so far or?
- Well, for me, it's heavy
because it's my first package I'm
actively maintaining
and out there in the world.
I'm going to the sheet sheet
and going to say how many issues I've got
because I don't know how much is heavy,
but we have 13 issues and all fixed
in a matter of, I don't know, few months.
And yeah, people are using, they are
finding some issues,
we're solving them,
people are solving them.
So yeah, I'm feeling the
other end of the community.
I've been all, I don't know,
over 10 years on the other end,
like just consuming
and producing, it's nice,
it's very nice,
creating is awesome, yeah.
- That is awesome, yes.
So I guess what sort of, I
guess what gave you the idea
to even start this or be like,
hey, this is something that people need?
- Right.
So I have like four main things I
consider to communicate it,
but my first, my favorite two are that
when the UI gets to be so much complex,
I could show you an example
that I'll try to articulate by words,
but let's say a very complex data table
with which goes to three tables,
it's an example I can remind.
So each row gets data
from three rows, right?
To assemble, to assemble, three rows, right, to
assemble data in this table,
in this HTML table, right?
So I've done that in LiveWire
and I've done that in JavaScript
and my wiring, maybe my brain feels,
it should go to JavaScript
because it's so much intensive,
but also I'm learning
LiveWire still today.
So maybe I didn't do it the best way,
but I find that when
the things get so complex,
I don't know, I'll try to
think of a better example,
maybe a text editor like Notion
or something like very dense, right?
I think there's not one
tool for all jobs, right?
And I think here
JavaScript is better suited
in very, very complex cases,
but maybe it's only me.
So this was my main motivation.
There's a point in time
where from this DOM element down,
I wanna just work it in different files,
I love view with options
API, that's my favorite.
So I can just make separate
files with template all in,
not in, it just doesn't
click for me the same way,
doing Alpine in a bundle, right?
It's in the template is in blade, right?
But then you wanna make complex stuff.
I don't feel it belongs in blade file.
So I bring it to a
JavaScript file and that's,
I would say that's what I draw the limit
and I would want to go JavaScript more.
So this is first and second one
is the third party
plugins out there, right?
I have one just sitting and waiting.
I have some tweets about it.
Do you like whiteboards?
- Whiteboards, is that
like physical whiteboards
that you write on or?
- Okay, so a virtual one.
- Virtual whiteboard
that you write on or?
- So yeah, so for example, ExcaliDraw,
do you know this app or middle or?
- I do not.
- You do not, okay.
So it's basically where you sketch you,
you get a rectangle and
you type a word in there
and you make a narrow
and you draw some diagrams
or some kind of stuff, but
in a sense of a free hand.
So not like a specific app for diagrams,
but just whiteboarding like you would
on the physical one, right?
So thanks to this, I can
have this kind of component
because I'm very visual and
I wanted to make something
like this, but I just
don't want to tie it together
and launch a package because
it doesn't make sense for me.
I want to make some special functions.
So we could have like
libraries and whiteboarding
with pieces, what can I say?
So like small components, pieces of an,
so think Figma, but lightweight, a
lightweight Figma, right?
So we could have community plugins.
We would bring them all together.
And because
everything is on the database,
a lot of our end point
could stitch together
a collection of components.
And then you could do
it in this whiteboard
on your application, not somewhere else.
- Oh, that's pretty sweet.
Yes.
Well, so when you were
building this Mingle JS,
what was the hardest
part for you to figure out
before you could publish it?
- Okay, so I guess it was hard,
but then the solution
was very, very easy,
which was to keep it
working with wire navigate.
So the SPA mode in LiveWire,
there was someone
complaining about it and,
huh, how am I going to fix this?
Because joining JavaScript in Blade,
I was doing that for a long time,
just not in the Mingle way, right?
Not inside the LiveWire component,
getting all that stuff.
So it actually ended
up being really easy,
but I didn't have the
minimal clue on how to do that.
But in the end, it
clicked that I could PR
something into LiveWire, so I could
listen to some event,
but then I thought something.
And it may seem like a Frankenstein
if you go to the source code,
because I'm booting up Alpine
to then start the JavaScript component.
And that's because if I
adhere to the Alpine protocol,
then I am good to go
with LiveWire, right?
So it's, in fact,
it's an Alpine component
that boots the JavaScript component.
- Nice.
- So yeah, I would say
that that was the most--
- That was the
hardest, was that one of those
you were just laying in bed
one night and you're like,
"Ah, this is simple.
Now I understand what the problem is."
Or did it just sort of hit you?
- I actually don't remember.
So it wasn't that
Eureka moment, I'm sorry.
- But those weren't the best, right?
When you're fighting
some sort of bug for a week
and you're like, "I just
can't figure this out."
And then all of a
sudden, midnight, you're like,
"Oh, this is all I had to do.
What was I thinking?"
- Right, we have so many of those.
- Well, anything you
wanna tell us about Mingo.js
that maybe I've missed
asking questions about or?
- Well, I kind of built
it, not wanting to make it...
So I wanted to make it as
a small connector, right?
But how could I say?
I would be willing to take it further
if more people was using it as well.
But for example, I'm thinking,
or let me materialize something.
You have this component, right?
Or this DOM node where typically would be
the first live wire element then.
And then inside it's
wire ignored and X ignored.
And inside there's a client side
rendering with it all, right?
So we can see the
component like some folk,
it's called like the flash
of unstyled content and so on.
So you see the page
flickering on an initial render,
it can happen.
So things like having a
skeleton, like a loader,
while it doesn't come the real thing
and change it for the actual content.
So mechanisms like this,
or making like examples on
how to use more fully on...
So instead of sprinkling one component,
how to mix and match several, right?
I would want to go into these things.
I just don't know if I should, maybe it
will come with time.
So I don't know if you can help me,
deciding what should I
just do it and that's it?
Or should I just wait?
Because I don't have a
clue on how to do that.
On how to decide, I'm sorry.
- Yeah, that's sort of the
crux of open source, right?
It's trying to make decisions that the
community will like,
but then also that you
want to put in and...
Sort of do it that way,
I guess is the right...
I'm not articulated by questions very
well in my statement.
But yeah, it's sort of like,
you want to do a certain thing
and you think this is the right way,
but then the community
might have a different opinion.
I guess as far as like you're concerned,
like what's the best
way to give you feedback
and to kind of get in on
these questions you might have
that the community might
want to be involved in.
- Right.
Yeah, I wouldn't know where to start.
I would like to make it bigger
than just dropping off one component.
Like I am all in not
making a tedious job.
So everything that I
could make to help people
not having to do repetitive stuff.
So like assembling some
systematic things for,
I don't know for,
you want to do an application layout
which has a other
sidebar and content, right?
So let's do all these.
How would you do it all in
view or all in JavaScript,
for example, or those sorts of things.
But I also don't want
to shape the package
based on some active one voice, you know,
that, oh, everyone
wants this, but maybe not.
Maybe it's just one person needs.
- Yes, for sure.
- That's the difficult
part, but I guess I'll,
I'm welcoming any input on that.
But for the time being,
I'm just going organic,
going as it, going with the flow.
I'm using it for myself and that's it.
In the end of the day,
other people are also
seeing value in that.
So I'm happy with that as it is.
- For sure, for sure.
So you've been sort of
tweeting about something else
you've been working on that
you're very excited about.
What is that?
- Okay, so you must be
referring to PHP WASM?
- Yes. - I guess.
Okay, other than Boxbot.
- I think that's the one you said.
I'm going to have a secret release.
The last tweet I seen
was you said next Tuesday,
but this might've been
actually two weeks ago.
- Oh, right, right, right, right, yeah.
Okay, so that's, for
me, that's uber exciting.
Maybe it's ahead of time or
maybe it's just not there.
Maybe it's just me seeing
it because it will be very,
I don't know, I don't know how it will,
you tell me how it sounds, okay?
So I'll split it into two parts.
So WebAssembly is
running in the browser, right?
So what, not me, but
Sean Morris has done,
the open source is out there
and I've been in touch with him
because I want to
make something a reality,
which is trademarks
aside, codes and boxes, right?
So we wanna play with PHP, right?
But we always need a
server somewhere, right?
To this day, I'm
pretty happy with solutions
like IDX, Codespaces, but above all,
Gitpod has been one of my favorites.
You can see a video of that.
I've made it for Filament,
so in Filament's YouTube channel,
the demo is running in Gitpod
and you can actually run it there.
But, and you can do
this with more things,
but you do need a
server, you do need an account,
you do need all sorts of things.
To make it work.
And with WebAssembly and a service worker
can have PHP CGI
running on a separate thread
from the browser window instance, right?
So this would allow us
to bring the whole server
to the, not will allow us,
it's already allowing, right?
(laughs) So the whole server gets downloaded,
you can have it on a S, on GitHub pages
or an S3 bucket or
whatever, all static, right?
But then it goes down to
your browser, to your computer
and boots the server right there.
So this would allow, I have
a passion, a touch for this,
which is to communicate,
I wanna give you a
snippet of code, right?
But then either it's just partial,
there's missing
context or something, right?
So JavaScript folks have
these since like forever, right?
With code pens and those sorts of things,
the problem is solved if
it's a front end issue.
But, and also backend
now with the stack pleats,
I would say, right?
The web containers, they have node and on
in running in the browser.
So these would facilitate
everyone to just switch,
not switch, sorry,
sharing snippets or projects
or pieces of
functionality just on a link, right?
So here, look how I've done this.
So like the past been,
but with an entire web
server there, PHP web server.
So that's exciting for me.
- I agree, yes.
And especially, I mentioned in the intro
that you do a lot of live streaming
and I assume it's really good for that.
Like once you've, like
once you're going through
like an explaining stuff
through a video or through whatever
and then you just take that code
and upload it to something like this
and then people can actually go there
and sort of if they're
rewatching the live stream,
they can actually
follow along as you're going,
which that seems really handy.
- Yeah, I think so because I mean,
mechanisms are here, right?
If you just share a GitHub repo,
everyone can go and make it work,
but that's a ton of work
or maybe they don't
have a local environment
or maybe this is only Docker
or maybe this is missing some step
or when you have a
link and everything works,
it just works and it's one link.
Have you increased the
probability of people doing that,
right?
Because one click, no
logins, no setups, no nothing.
So that's very appealing to me.
- Yeah, that is sweet.
So would you be able to, I assume since
it's a whole web server,
you can like, you'll be able to install
like composer packages
and pretty much whatever the,
whatever your sharing
needs or are you thinking
that might not work?
- Actually, yes,
still not today, I think,
because Packages doesn't allow,
I'm not 100% sure, but I think to today,
they don't allow cores,
so we cannot download
them from inside the browser,
meaning we could do that
like server side with a proxy,
like downloading or
all the vendor operations
could happen on the server.
But yeah, it's totally possible
and there are some roadblocks to,
some hurdles to pass.
We need to, sorry, to
address some issues.
- But we'll get there
eventually, I would say.
I'm just, you can go, sorry,
you can go to playwithladeval.com.
- Yeah.
- And there's a Ladeval
new application ready to run.
You can see the video there, so,
and changing stuff, changing the files
and updating in real time, that's
happening right now.
Just the Composer
Packages and NPM compilations
are setting it apart from the typical
local development environment.
- Right, yeah.
I was sort of, this was,
that was a selfish question
because you know, at Ladeval News,
we wanna cover the community
packages and stuff like that.
And it seems like we're always,
having a local,
pulling them down locally,
trying to see how they work.
It would be nice to be able to just like,
hey, go to this thing
and boom, it's there
and we could take
screenshots and do all of our stuff.
But sounds like maybe
one day, you never know.
- It's not far ahead.
I mean, what you need
for that right today
is you just have the vendor
directory inside the git repo
and the .env file as well.
So that's not very traditional,
but that repo is meant to
be public and open and all.
So it's not the
mainstream way of doing things,
but if it's only for that,
you can do that right away.
Or Gitbot may be an
option for you as well.
I can show you in the end, I guess, or.
- Yeah, yeah.
We'll do that off the podcast.
But yeah, that sounds cool.
And then the other thing that you've got
since we mentioned it is VoxPop.
So tell us a little
bit about what that is.
- Sure.
I'll get back to the PHP WASM later.
I forgot something.
- Oh, no, no, we'll step back.
Let's go ahead and finish that.
- Okay, sure.
So this is the first part
of the WASM interest of mine
where I see a huge value.
So this is the first part,
like having the web server.
So all in all, it's a zip file and boom,
you get a web server
running in the browser.
I don't see it.
I don't foresee it using that
for offline first
applications or stuff like that.
I think much needs to be done.
But for the near future,
code sandboxes, I think, yes.
But there's the second part,
which is using only PHP
WASM in the main thread,
meaning you can run,
you know, script type,
equals text JavaScript.
So now there is script
type text slash PHP, you know?
So you run PHP in,
you put PHP in the DOM,
PHP code in the DOM and
you just run it, you know?
And I think this is bonkers.
And I don't know if
people just don't appreciate it
or they don't know about
it, but for me, it's bonkers.
And there's an
interoperability with JavaScript.
So I don't know, you tell me.
- Well, going back way back in history,
like PHP like two and three,
they used to could do that, like the
script type text PHP.
But I thought they
deprecated that at one point,
but I guess that's not true
or is it sort of different now,
what you're thinking
than the old Tommy wife?
- I don't know the first way,
but this one is in web assembly.
So I would bet seriously that it's--
- Yeah, so the old way, you know how,
like if you're in say like an HTML file,
you can do open PHP and
then whatever PHP code you want
and then close the PHP, you
know, with the question mark.
- That would run server
side, no entirely different.
- Yes, but no, but see
back in the old days,
you could actually, there
was two ways you could run PHP,
like it's still server side, right?
So you would open and close
it the normal traditional way,
but then you could also
do script type text PHP
and close the script tag and that would
still run server side
and that was just sort of a
way you could sort of use PHP.
This was, this is way
back like early 2000s,
probably like PHP for maybe like 4.3.
- Oh, maybe for my time then.
- That was way back, so
there's my little PHP history lesson
is you used to could
actually use that in as a normal,
like in your HTML files for,
or in your PHP files basically.
But anyway. - I look into that, yeah.
- Yeah.
- So yeah, this is different.
This is really running
PHP, like you click a button
and this PHP runs on
the click of that button.
That's it locally, so.
- Nice.
That's awesome, yes.
- It's just bonkers to
me and I think many folks,
maybe this number is
reducing, but where I come from
and I think still today,
there are many backend developers
that maybe are scared or
never got into JavaScript
or they don't want to, right?
And I don't know if it will happen,
but it's possible to have
a full stack PHP, you know?
So like you don't write
any JavaScript in a project.
So this is possible, so that's why.
I'm going bonkers
with that idea, but yeah,
let's see what happens, yeah.
- For sure, I'm sort
of that way, you know,
that's why I really came
to Embrace Lavire from,
you know, as soon as it
was announced and launched,
I was like, this just makes sense
and I don't have to
fight with Vue or React
or any of these other
things backbone, you know?
So it's, to me, that was just
life-changing there,
so I can't imagine, you know,
what the future's gonna bring.
I think it's gonna be awesome
seeing all these cool things
that's sort of being worked on.
So yeah, very exciting.
- Let's see what the future brings.
- Yes, all right, so now let's jump in.
So you're building
Voxpop, so tell us what that is.
- Oh, sorry, okay, so
Voxpop is a website builder
for non-tech people, the
audience for the platform.
So everyone can just come in
and like shoot some
pre-made blocks, right?
You change text, you change
pictures, boom, that's it.
And I'm co-building it with Shruti,
you might know from the
content creation on YouTube
and from the community, so in the
sentence, that's it.
- So are you going to, I guess,
like say I have a site already,
I can just like kind of pull this in
and I will automatically
get the sort of a block,
you know, site builder,
block builder type thing,
or is it more like it needs
to like hook into existing
like CMSs and things like that?
- Right, so it's
different, so everything is hosted.
We are thinking, not thinking,
we are going to have a
free tier and a paid tier
or multiple still in,
still a work in progress,
what goes where, but so
everything happens in our end.
So it's a no code,
application, right?
From the user standpoint,
you don't get to make any decisions
or you don't make any HTML,
you don't make any queries,
you don't make any code.
We might think to allow to put some CSS
for some advanced use
cases, but that's not the goal.
The goal is for people who are not
technical at all, right?
So if you can make a Instagram
profile or some Facebook page,
then you can make your website,
you can bring your domain, right?
And we will hook that thing up, right?
And your domain
becomes served by the website
that you built in the
hosted builder, yeah.
- Ah, I got you, understand, yes, yes.
So to me, it sort of sounds,
ah, not really, but sort
of kind of like a WordPress
or a Wix or sort of one of those,
sort of like just focus on building nice,
beautiful websites through your sort of,
this really cool UI thing
you built with the blocks
and things like that.
- Right, not, I mean, we want to make it,
we want to move away
all the levers and knobs
and every configuration,
so it's basically just,
just an organized, clean, how can I say,
a sane way of handling
with nowadays web, right?
Because there's all
sorts of customizations
and responsive modes
and all of that stuff
that you can control and decide, right?
And I think there's,
we think there's a gap
that it's not filled,
which is the simple things and sometimes,
and how does that saying go,
we're doing this because we thought it
was going to be easy, not because it is.
There's something like that, right?
It turns out making things simple
is much, much harder than it seems.
But yeah, that's the goal.
That's to make simple things, yeah.
- That's great, yeah,
because from my history
and personal experience,
I'll get people
coming to me all the time,
be like, "Hey, I just, I need a website,
"what do I do?"
And I'm like, "I don't know."
They're like, "Can we hire you?"
I'm like, "I don't
really want to do this.
"This is not for me."
So it would be nice to be like,
"Hey, I have a friend who
has this builder over here.
"You should just go sign up for that
"and buy you a, get the domain, do it,
"and let them handle everything."
And that sounds-- -
Sounds like the place.
- Sounds perfect for that, yes, yes.
- Yeah, right.
You have a friend which has
a shop or a race next month
and they want to put up a website,
some pictures, some forms, and that's it.
So, but then you will eat some
roadblocks, of course.
"Hey, I wanted to add this, I wanted to,
"okay, it's not gonna do that."
So then you need a programmer, right?
Or some kind of other option, yeah.
- Yes, yes.
Which, you know, now there's, you know,
once you get the website,
there's so many sort of,
like you said, no code tools.
Like, you know, you
could even, I don't know,
I'm just thinking like out of the box,
you could even do like some sort of form
to Zapier, to email or something.
You know, it's sort of kind of wild
what all you can build
with no code these days,
which is pretty amazing in itself
is how you can hook all
these things up together
and have sort of a, you know, this,
I guess your wording was
Frankenstein of a website
that's kind of hooked to
14 third-party services.
(laughing) - Yeah, I've seen those as well.
We've actually just put
this morning a video online
with the preview of
how the builder works.
So I can, so it's in our
Twitter or Voxpopcites.com.
You will be able to see how,
how the mechanism of the builder is
because I believe my
words didn't make honesty
to how simple that thing is.
So maybe see it for yourselves and yeah.
- Yeah, yeah, and we'll
be sure to have all these
in the show notes as well.
That way you can
easily find all this stuff.
Basically try to put
everything that we talk about,
you know, sometimes I miss
some things here and there,
but hopefully I'll
get all the big things.
But I'm gonna say, I
think that about does it.
Anything else you wanna
say that I may have missed
anything you're working on
or anything you're
excited about right now?
- Well, I am always about
wanting to do so many things.
But if I can say something
is thank you to the community.
I don't wanna miss anyone.
So I'll just say to Laravel in general.
I think from my early
days in programming,
I was always, I don't know,
switching or changing tools.
But since Laravel 4.0, I
haven't used anything else.
Like it's the backbone of it all.
Maybe there's some things
that come and go around it
depending on the project, right?
But Laravel has been
there since that time
and it made me grow as a developer
and meeting new friends,
knowing how to better
solve problems and that's it.
So I wanna say thank
you to everyone involved
in making Laravel happen.
- Awesome, well, thank
you for joining us today.
We had a lot of fun, Patricio.
- Thank you, Eric, it was fun indeed.