sergio
Phoenix 1.6.0 LiveView + esbuild + Tailwind JIT + AlpineJS - A brief tutorial
I couldn’t find any guides that worked well with Phoenix 1.6.0 and esbuild. I hope this helps people test the waters and eases you into the next-gen of Phoenix!
Most Liked
praveenperera
For people following this guide if you get errors with AlpineJS you need to change the target from es2016 to a minimum of es2017.
# Configure esbuild (the version is required)
config :esbuild,
version: "0.13.10",
default: [
args:
~w(js/app.js --bundle --target=es2017 --outdir=../priv/static/assets --external:/fonts/* --external:/images/*),
cd: Path.expand("../assets", __DIR__),
env: %{"NODE_PATH" => Path.expand("../deps", __DIR__)}
]
For google the errors you’ll see are:
module.esm.js:1635 Alpine Expression Error: func(...).catch is not a function
module.esm.js:1701 Uncaught TypeError: func(...).catch is not a function
at module.esm.js:1701
at tryCatch (module.esm.js:1628)
at evaluate (module.esm.js:1646)
at module.esm.js:2998
at Function.<anonymous> (module.esm.js:2390)
at flushHandlers (module.esm.js:1757)
at stopDeferring (module.esm.js:1762)
at deferHandlingDirectives (module.esm.js:1765)
at initTree (module.esm.js:1953)
at module.esm.js:1921
reisub
Just to offer an alternative solution how to add a font file, you can also include the font using the postcss-url plugin as follows. (cc @cvkmohan )
1. Place the font in assets/fonts
I only need the one variable font file in WOFF2 format so for me it’s at assets/fonts/Inter.var.woff2.
2. Add postcss-url dependency
npm install postcss-url --save-dev
3. Add the plugin to assets/postcss.config.js
Mine looks like this after adding it:
module.exports = {
plugins: {
'postcss-import': {},
'postcss-url': { url: 'inline' },
tailwindcss: {},
autoprefixer: {},
}
}
4. Add the @font-face definition to your app.css
@font-face {
font-family: 'Inter';
font-weight: 1 999;
src:
url('../fonts/Inter.var.woff2') format('woff2-variations');
}
–
The above configuration will inline the font into your CSS like this:
@font-face { font-family: "Inter"; src: url("data:font/woff2;base64,d09G[...]d6eMC") format("woff2-variations"); font-weight: 1 999; }
If you prefer to keep the font(s) in separate files, use copy instead of inline.
outlog
not quite as easy as @thomas.fortes suggests..
but close if you are OK with a seperate css file for the font (face) and thus using esbuild for it..
- download the font Inter font family
- copy the
Inter Webfolder into say /assets/vendor/fonts and rename the folder toInterWeb(need to avoid spaces!) - change the esbuild args in config.exs to:
~w(js/app.js vendor/fonts/InterWeb/inter.css --bundle --loader:.woff2=file --loader:.woff=file --target=es2016 --outdir=../priv/static/assets), - notice that the app.js is now outputted inside a js folder
go to your layout and change the js script src toRoutes.static_path(@conn, "/assets/js/app.js") - above your app.css stylesheet do a:
<link phx-track-static rel="stylesheet" href="<%= Routes.static_path(@conn, "/assets/vendor/fonts/InterWeb/inter.css") %>"/>
for bonus points:
add GitHub - semencov/tailwindcss-font-inter: TailwindCSS Plugin to integrate with Inter Typeface · GitHub by doing:
npm install --save-dev tailwindcss-font-inter (in the assets folder)
and then add the plugin in the tailwind config:
plugins: [require('tailwindcss-font-inter')({
importFontFace: false,
})]
now you can use the css class font-inter wherever you want..
Last Post!
lszyba1
For this one specific error. I wanted to comment, that this error means that you did not install it. And what it usually means is that you don’t have npm as one of the dependencies to do npm install --prefix /assets.
More on a solution here:
It took some time to realize what the error actually meant.
Hope this helps future searchers that find this page on google.
Thanks
Lucas
Popular in Guides/Tuts
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #hex









