dakora

dakora

Adding Tailwind to an older Phoenix project

I’m having some issues adding Tailwind into an existing project, and I’m hoping the community can help me. I’ve tried a few different methods for adding Tailwind into the project, but they end up with this error, and I can’t seem to find any information about it online:

% mix assets.setup
% mix assets.build

Rebuilding...

Done in 348ms.
✘ [ERROR] Could not resolve "tailwindcss/base"

    css/app.css:3:8:
      3 │ @import "tailwindcss/base";
        ╵         ~~~~~~~~~~~~~~~~~~

  You can mark the path "tailwindcss/base" as external to exclude it from the bundle, which will remove this error.

✘ [ERROR] Could not resolve "tailwindcss/components"

    css/app.css:4:8:
      4 │ @import "tailwindcss/components";
        ╵         ~~~~~~~~~~~~~~~~~~~~~~~~

  You can mark the path "tailwindcss/components" as external to exclude it from the bundle, which will remove this error.

✘ [ERROR] Could not resolve "tailwindcss/utilities"

    css/app.css:5:8:
      5 │ @import "tailwindcss/utilities";
        ╵         ~~~~~~~~~~~~~~~~~~~~~~~

  You can mark the path "tailwindcss/utilities" as external to exclude it from the bundle, which will remove this error.

3 errors
** (Mix) `mix esbuild default` exited with 1

I’ve followed the official Tailwind guide on adding it to a Phoenix project, as well as poked around a new project generated with mix phx.new and can’t seem to nail it down. I’ve taken several steps:

app.css

@import "tailwindcss/base";
@import "tailwindcss/components";
@import "tailwindcss/utilities";
  • added asets/tailwind.config.js (from a new Phoenix project

mix.exs

      "assets.setup": ["tailwind.install --if-missing", "esbuild.install --if-missing"],
      "assets.build": ["tailwind default", "esbuild default"],
      "assets.deploy": [
        "tailwind default --minify",
        "esbuild default --minify",
        "phx.digest",
        "cmd cp -r assets/static/* priv/static/"
       ]

config.exs

config :esbuild,
  version: "0.17.11",
  default: [
    args:
      ~w(js/app.js --bundle --target=es2017 --loader:.svg=file --loader:.woff=file --outdir=../priv/static/assets),
    cd: Path.expand("../assets", __DIR__),
    env: %{"NODE_PATH" => Path.expand("../deps", __DIR__)}
  ]

config :tailwind,
  version: "3.3.2",
  default: [
    args: ~w(
      --config=tailwind.config.js
      --input=css/app.css
      --output=../priv/static/assets/app.css
    ),
    cd: Path.expand("../assets", __DIR__)
  ]

dev.exs

watchers: [
    esbuild: {Esbuild, :install_and_run, [:default, ~w(--watch)]},
    tailwind: {Tailwind, :install_and_run, [:default, ~w(--watch)]}
  ]

mix.exs dep: {:tailwind, "~> 0.2.0", runtime: Mix.env() == :dev}

I’ve plodded around a newly generated app but nothing else seems to stand out other than the changes made above. Any help is highly appreciated!

Marked As Solved

dakora

dakora

Wow okay, so my app.js still had import css from "../css/app.css" at the top. Removing that fixed the issue :tada:

Where Next?

Popular in Questions Top

Darmani72
If I have a post route which an argument: post /my_post_route/:my_param1, MyController.my_post_handler How would get the post params ...
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New
qwerescape
Is there a way to get the call stack or stack trace at any point in the code? Not from exceptions, but an expression that returns how the...
New
jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod – where is this set? Thanks.
New
stefanchrobot
What’s the safe way to decode a JSON string into a struct? I want to avoid calling String.to_atom. Jason.decode can give me a map with st...
New
ycv005
I have followed this StackOverflow post to install the specific version of Erlang. And When I am running mix ecto.setup then getting fol...
New
dokuzbir
I want to highlight html closing tags when i click a html tag. That works in .html files but doesnt work for html.eex templates. How can...
New
vrod
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors: [WARN] - (starship::utils): Executing command ...
New
Qqwy
Original source of discussion: This topic on the Pragmatic Programmers’ Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New
chensan
I have a User schema with a :from_id field set to type :string: defmodule TweetBot.Repo.Migrations.CreateUsers do use Ecto.Migration ...
New

Other popular topics Top

albydarned
Hello all! I am typing this post from my new MacBook Pro with the M1 chip. I’m loving it so far, and will probably use it as my daily dr...
New
skosch
To my knowledge, put_in, Map.update etc. all have the one limitation of not automatically creating intermediate keys when needed (for exa...
New
chrismccord
As promised, the first release candidate of Phoenix 1.3.0 is out! This release focuses on code generators with improved project structure...
New
stefanchrobot
What’s the safe way to decode a JSON string into a struct? I want to avoid calling String.to_atom. Jason.decode can give me a map with st...
New
AngeloChecked
What learn first? Rust or Elixir Hi Elixir community! I’m here because i want learn a new language. I’m a junior developer and mainly i ...
New
nsuchy
Hi. I’ve noticed that Windows Powershell has it’s own IEX command and you cannot access Elixir’s IEX due to the conflict. This isn’t a cr...
New
joaquinalcerro
Hi there, I am working with Ecto-Postgresql and I need to call all of the records from a specific table but the table has 40,000 records...
New
marick
I had some trouble figuring out how to make many-to-many associations work. Once I got it working, I wrote a blog post. Because I’m a nov...
New
PeterCarter
There are pre-rolled solutions for other frameworks that do work. However, Phoenix does not seem to have these. Have people had good expe...
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New

We're in Beta

About us Mission Statement