this post was submitted on 02 Aug 2023
66 points (100.0% liked)

Programming

13362 readers
1 users here now

All things programming and coding related. Subcommunity of Technology.


This community's icon was made by Aaron Schneider, under the CC-BY-NC-SA 4.0 license.

founded 1 year ago
MODERATORS
top 50 comments
sorted by: hot top controversial new old
[–] [email protected] 23 points 1 year ago (2 children)

I have to disagree with this paragraph. That Tailwind enforces a design system is its biggest strength. Having a small selection of colors, font sizes, and padding to choose from is what makes a website feel much more cohesive than one where developers pick arbitrary values every time they style an element.

But you don't need Tailwind for that; design systems are easy to implement these days using CSS custom properties.

[–] [email protected] 13 points 1 year ago* (last edited 1 year ago) (1 children)

I think the author is rage baiting or doesn’t appreciate design systems. Calling this “the death of web craftsmanship” is hyperbolic nonsense. I’ve seen mangled UIs in basically every CSS stack.

I use Tailwind as part of a design system’s component library, but I’ve done the same with many other tools before. As with all libs in a UI stack, there is hype, then there is fit with you and your project. I think we could do with less hype & gripe, and more well considered neutral discussion of ergonomics and technical pros & cons.

[–] [email protected] 4 points 1 year ago

Can confirm, I have mangled UIs in almost every CSS framework, its a talent of mine apparently ᕕ( ᐛ )ᕗ

[–] [email protected] 22 points 1 year ago (2 children)

I've seen people, lead and principal engineers, who refuse to learn modern JS, insisting that since it was bad in 2006 its bad today.

It's still bad, though. That's not the reason why, but it still is. All the frameworks and things like TypeScript try to work around and hide the uglyness and stupidity of JavaScript, but they neither remove nor fix it. The way HTML was initially designed is the exact opposite of how it is used. It was intended to present data in a standardized way and leave the rendering and styling to the client application. People tried to create pixel-perfect designs with it. The entire resulting technology stack was created by idiots for idiots. And JavaScript is consistent in the misguidedness of the endeavor. All the marketing talk about platform independence is bullshit. It is easier to write platform independent GUI applications in C than in HTML + CSS + JavaScript. All the frameworks and languages transpiling to JavaScript trying to belie that just lead to a breeding ground of incompetent GUI developers doing esotheric coding ("doing it the way it is done" while understanding zilch about the fundament). The resulting developers are useless outside of their steaming pile of web GUI shit. The least worse of them are the ones promoting and perpetuating this failed technology stack by adding further layers of abstraction to try and hide that it is build on and from shit, creating even more esoteric developers in the process - by idiots, for idiots. Web GUI developers are paid less than any other branch of developers and it is completely justified.

[–] [email protected] 14 points 1 year ago (11 children)

It is easier to write platform independent GUI applications in C than in HTML + CSS + JavaScript.

Um, what? There are very few GUI toolkits targeting both desktops and phones, and none of them are reasonably usable from C.

load more comments (11 replies)
[–] [email protected] 10 points 1 year ago* (last edited 1 year ago) (1 children)

Lol so you're one of the devs the author is talking about. Imagine getting this worked up over a topic you clearly don't understand. "Failed technology stack" -- that's right everyone, the most widely used stack on the planet is a failure because this guy doesn't like javascript. Everyone else in the world is obviously a stupid moron for not seeing things his way.

If you program in anything other than machine code you are an idiot. Remember that next time you use a failed abstraction like C.

Can't believe this nonsense actually got upvoted. You never even identify any real issues with modern JS or HTML. It's just a bunch of run-on whining. "HTML was meant to provide a standardized way for presenting data" -- lol so literally how it's still used today.

[–] [email protected] 3 points 1 year ago

At least C has a working equals operator. Go on, tell me about ===, invite the ridicule. I bet I know more about JavaScript than you do. I hate it because I am intimately familiar with it.

console.log(null==0)
console.log(null>0)
console.log(null>=0)

console.log(0==[])
console.log(0=='0')
console.log('0'==[])

// no equality comparison, but that shit is funny
console.log("2"+"2"-"2")

Any proper programming language wouldn't even compile any of that nonsense.

And something being widespread doesn't mean it's either right or good - look at religions.

[–] [email protected] 17 points 1 year ago (1 children)

I've always preferred CSS preprocessing with tools like SASS over frameworks like Tailwind.

They work extremely well with JS frameworks like React since they're both pretty much just syntactic upgrades of existing systems rather than an obfuscation of systems that abuse modularity.

That being said, CSS frameworks are still wonderful, used right they can save a lot of time during early development by outsourcing the majority of design to the framework devs.

[–] [email protected] 10 points 1 year ago* (last edited 1 year ago) (1 children)

That being said, CSS frameworks are still wonderful, used right they can save a lot of time during early development by outsourcing the majority of design to the framework devs.

That's actually my intent with using a CSS framework. A personal project of mine reached minimum viable product ~~statud~~ status (phones...) recently, I included bulma, and used some of its components for stuff like menus and modals. It was definitely faster than writing everything by hand early on. But I also ended up writing my own CSS anyway, especially with the grid, which is the foundation on which my app works on (it's a grid-based colour mixing app).

I agree, I think CSS frameworks have a place for prototyping and we shouldn't rely on them as a project moves towards a proper release 🤔

Then again, some people might think the obfuscation in 20+ classes is somehow a good thing...frankly, I think it's worse than inline styles. It's basically obfuscated inline styles!

[–] [email protected] 4 points 1 year ago (1 children)

Then again, some people might think the obfuscation in 20+ classes is somehow a good thing…

I'd argue that CSS is itself an obfuscation (read: abstraction), and isn't even implemented consistently across browsers. If the abstraction results in less duplication, more consistency across the website, and higher productivity, then I don't think that's a bad thing. (Of course, the flip side is that if using the abstraction results in the same learning curve with less transparency, then the benefits might not outweigh the cost.)

Having never used tailwind, I can't give a personal opinion on that, but I find it hard to work on any decently sized project without SCSS. Sure I can write pure CSS, but SCSS provides so many QoL features over raw CSS that it's hard to pass it up, and it's easy enough to get setup.

[–] [email protected] 3 points 1 year ago (1 children)

I mentioned some of this in another comment in this thread[^1], but CSS has gotten tremendously better since Sass was first introduced in the 00s. Many features we used are now native to CSS, and can be used in your browser, today. Some of them are even better than their sass variants, or at least have special abilities sass doesn't. calc() comes to mind, as it can mix and match units in a way a preprocessor just cant. You can do calc(100% - 10px), which is good for all sorts of stupid corner cases.

And native CSS nesting is basically 1:1 with how Sass does it:

.parent {
  font-weight: 600;

  &:hover {
    background: purple;
  }

  .child {
    font-weight: 900;
  }

  @media screen and (max-width: 800px) {
    display: none;
  }
}

I still use Sass or Stylus[^2] on virtually all of my projects, but its nice to not have to when you just need to get something out or write a userstyle or something.

[^1]: Not sure how to provide an instance agnostic link, the few things I've seen people attempt didn't work, but here's the lemdro.id link [^2]: I'm largely giving up on Stylus, its sadly unmaintained. My favorite preprocessor though; takes .sass (indented) style to a whole new level on what you can omit

[–] [email protected] 2 points 1 year ago (1 children)

Wait CSS supports nesting? Since when?

Also, SASS's mixins, variables (CSS has variables too but they work differently), and many of the other features are hard to beat, which is why I feel like it's almost never a negative to get it up and running on any project I work on (unless the project is a tiny one-off, then it's probably not worth it). One thing I like is that it's close to CSS - increasing the transparency - while still providing abstractions that let you save time and increase consistency across the project.

[–] [email protected] 2 points 1 year ago

Landed earlier this year :D

I used to really use mixins a ton, but these days I haven't really written any in a good long time. Still useful, still something plain-ol-css can't do, but I've found autoprefixer has managed to handle most of my mixin needs.

[–] [email protected] 17 points 1 year ago

Tailwind is just shorthand inline CSS.

[–] [email protected] 12 points 1 year ago (1 children)

Very good article imo. I didn’t disagree with anything. I especially agree with the ugliness of the many class names in my html.

My problem I guess is reconciling how much of a pleasure it's been to use. Perhaps I, a primarily backend developer historically, embody the death of web craftsmanship, but I don’t really want to learn modern CSS if I don’t have to 😅

The easier I can get something styled and back to doing actual business logic rather than making things pretty the happier I am. I highly respect frontend styling gurus but I'm not that interested in spending time mastering true web craftsmanship, I care more about delivering the product as fast and as beautifully to the user as possible.

[–] [email protected] 8 points 1 year ago (2 children)

I'd encourage you to take a look at modern CSS with a fresh eye. It's gotten really good. Good enough I've got another blog post in the works talking about how much goddamned fun its gotten. In the last few years alone, we've got sass-style nesting, parent selectors (!), combinator selectors (roughly like list comprehensions in their ability to fill out a matrix of potential selectables), color functions, and far more.

[–] [email protected] 4 points 1 year ago (1 children)

wholeheartedly agree! css has been my main job for going on 15 years because i’ve always enjoyed its quirks. the past 5 years or so have felt like leaps and bounds in terms of how i structure markup and styling. it’s such a fun language to learn. stuff like flex and grid make my work so much easier so i can spend more time on the fun stuff.

[–] [email protected] 6 points 1 year ago (1 children)

But can you vertically and horizontally align something that isn't text reliably by now?

[–] [email protected] 4 points 1 year ago (1 children)

yes! flexbox is great for this.

[–] [email protected] 3 points 1 year ago

(and grid, which is very very similar to flexbox and uses much of the same rules)

[–] [email protected] 3 points 1 year ago

Thank you for this response. Indeed I will. And feel excited to do so :) Look forward to that blog post as well.

[–] [email protected] 11 points 1 year ago* (last edited 1 year ago) (2 children)

I think the article fails to mention that one of the reasons tools like Tailwind (and methodologies like BEM, etc.) exist in the first place is to facilitate bigger organisation sites.

In my personal experience "plain old CSS" isn't feasible as the number of mainterners on a site goes up. Once there is multiple teams (possibly even across multiple departments) contributing to a site, the cascading part of CSS means that it is more or less unavoidable that some change from one team unintentionally breaks something for another team - and this being visual things means that it is very hard to catch with automated tests.

After having working in a big organisation for a while, most developers will eventually start wishing for something that would make sure that their CSS only applies to their own components. div tags with inline style attributes suddenly starts to look very attractive - which is what eventually led to something like Tailwind.

[–] [email protected] 4 points 1 year ago* (last edited 1 year ago)

That's what shadow DOM and custom elements are for.

load more comments (1 replies)
[–] [email protected] 9 points 1 year ago (3 children)
[–] [email protected] 4 points 1 year ago

... I'm very much not sure how I feel about that article. And I don't mean that in a negative way, it's just very... huh.

[–] [email protected] 4 points 1 year ago* (last edited 1 year ago)

Interesting perspective. I've added it to the appendix at the bottom of the article

load more comments (1 replies)
[–] [email protected] 9 points 1 year ago (1 children)

I mean, for me, the greatest pro I've heard for the usage of Tailwind is that it makes collaboration much easier. For example, a PR to add styling to a component is easy to read - you just see the new classes added. Not only that but you know that it only affects that element and that no CSS is still being kept in your CSS files that is no longer being used.

The cascade is seen by some as one of the most annoying parts of CSS at times because it can make debugging harder - and many will simply abuse !important as a result.

[–] [email protected] 3 points 1 year ago (1 children)

I'd argue that styled components, like Vue SFCs or Surface-ui, are even better in this regard. You can see the whole component there, and all the classes along for the ride. And they're usually written in something fairly close to "real" CSS

[–] [email protected] 4 points 1 year ago (1 children)

But I mean, if they're gonna be component specific CSS, why even bother over just using tailwind?

[–] [email protected] 2 points 1 year ago

Well, you get all the real advantages of real CSS. The browser tools work. Various other preprocessors work. You can use timesavers like Sass or Less or whatever else.

The biggest advantage, imo, of using a component based design, where components handle not only the styling but the entire appearance of a "thing", is that you make the contracts for what that thing has to support explicit. If your button needs to be able to change colors, you can add a prop that exposes that ability. If it needs to change sizes, again, that can be exposed by a prop. But they aren't by default.

You can sort of accomplish this in "real" css using attributes carefully, but its not as elegant.

[–] [email protected] 7 points 1 year ago (2 children)

Tailwind only really makes sense in a precise use case that absolutely does not cover everything web based and I wish the makers where clearer about it.

First off, the abstraction problem: since you give up on defining custom classes at length, elements will often receive more than a dozen utility classes. This is fine IF you use a component based framework like Vue and you break down your app into components with a small granularity.

Second, the stylesheet problem: even minified and compressed, a stylesheet containing all of Tailwind's utility classes is multiple Megabytes. The issue will not come from where you'd expect; downloading may take a while on the first page load, but all page loads will suffer from taking into account such a massive set of rules. Tree shaking makes this fine IF your content is already known at the moment of building the app.

In the end I feel that Tailwind implements ideas on top of tech it is incompatible with and the abstractions it create are seriously leaking.

[–] [email protected] 4 points 1 year ago (2 children)

Ok so use modern frameworks and tools that implement the tailwind plugin. Because if you are shipping the entire tailwind css that's a developer problem not tailwinds. News flash: using a technology wrong doesn't make the tech wrong.

[–] [email protected] 5 points 1 year ago (1 children)

News flash: your snark makes you an unpleasant person. Read my comment again. I said tree shaking fixes this... unless you don't know what content you'll display and what classes you'll need at build time. Not all sites are static.

[–] [email protected] 3 points 1 year ago (1 children)

Unless you are going to be allowing custom html to be added the tooling is smart enough to figure out what possible classes your code can use. You'd have to do something dumb to not have the tools able to tell what components you are serving.

[–] [email protected] 1 points 1 year ago (1 children)

More generally, the more you have a flexible editor in the app, the worst it gets. This is the use case where I ran into trouble.

load more comments (1 replies)
[–] [email protected] 2 points 1 year ago

The "News Flash" bit was unnecessary. Please keep your replies to other users respectful on Beehaw.

Thanks!
[email protected] Moderation Team

[–] [email protected] 3 points 1 year ago

I don't believe anyone who uses tailwind is shipping the whole thing with all of those megabytes of classes in production. It's actually sort of hard to even do that on accident if you're following a tutorial or their official docs.

[–] [email protected] 6 points 1 year ago (1 children)

So glad people are catching on to this. Until like a month ago if you said anything bad about Tailwind you would literally get shadowbanned on HN.

[–] [email protected] 2 points 1 year ago (2 children)

Isn't that still the case there?

[–] [email protected] 5 points 1 year ago* (last edited 1 year ago)

Idk, this post is getting a healthy debate over there.

Amusingly, reddit is full of smartest-guys-in-the-room, who are all tripping over themselves to defend tailwind. Very much "LEAVE ~~Brittney~~ Tailwind alone!"

[–] [email protected] 3 points 1 year ago

There was a post about plain HTML-and-CSS there that was anti-Tailwind the other day, although I can't find it now. Seeing both of these posts is why I made my comment. :)

[–] [email protected] 4 points 1 year ago (1 children)

I am not sure how other people do it but we use tailwind in SASS using the apply directive, inside a BEM-first structure. I feel like this is the best of what everything can offer.

[–] [email protected] 5 points 1 year ago

You might consider dropping tailwind entirely then, and using something like open-props, which gives you basically all the features of apply, but in a native CSS package

[–] [email protected] 3 points 1 year ago* (last edited 1 year ago)

Websites that use reasonable or good HTML markup with structure, the correct HTML tags, useful ids and classes are great to work with. But regularly you see websites with generated HTML without any useful identifiers or structure. A generated garbled mess of anonymous, generic components and styling CSS classes.

I've worked on content extraction for OpenTermsArchive and write my own injected CSS hacks and browser extensions. Working with good website sources is great. Working with garbled messes is awful.

HTML losing its markup aspect - that you can traverse and select - makes websites inaccessible.


/edit - adding:

The CSS tailwind generates might not be bloated, but repeating the gigantic strings of classes all over your codebase certainly adds to the size of the final HTML output.

The HTML is not just bigger, but bloated and inaccessible. HTML markup with identifiers and classes is readable and understandable. It has structure and labeling. Inlining styling rules bloats it to the point of unreadability. And losing identifiers and classes is a loss of labeling and selectors.

[–] [email protected] 2 points 1 year ago

While I understand the idea behind using CSS "correctly", I have, in my 15 years of professional experience, never ever seen even one project where the hypothetical promises of CSS were actually realized. It ALWAYS ends up with a fuckton of importants, or hunting for ages for the one class fifteen levels of abstraction up that changes your one element, coming up with more and more absurd class names, until they are literally no different from just some random name. Tailwind might seem horrible in a theoretical sense, but in an actually using it sense it's a heaven sent. I want to change the padding on THIS ONE SINGLE ELEMENT, I change it EXACTLY RIGHT THERE where the element is defined, and i can be absolutely sure that I haven't accidentally cascaded someone else's work to death.

#CSS, in practice, is the insane idea of every single element on your website sharing global, mutable state, and thinking that's in anyway smart.

[–] [email protected] 2 points 1 year ago
.btn {
  @apply m-2 p-2 bg-blue text-white
}

lol, they're basically writing a CSS class with CSS rules

Why bother to even use @apply? Just write the damn CSS.

I agree.

load more comments
view more: next ›