Hacker News new | past | comments | ask | show | jobs | submit login
Show HN: Polished – A lightweight toolset for writing styles in JavaScript (github.com/styled-components)
106 points by mxstbr on March 28, 2017 | hide | past | favorite | 48 comments



This tool seems useful if you buy into the philosophy, but I'm just not sold yet - component based styling leads to a lot of style duplication and makes it very easy for a developer to go "off the playbook" when it comes to enforcing a consistent styleguide throughout an app.

The idea that "globals" in CSS are bad is counter intuitive to my experience that globals in CSS encourage consistency

Maybe when you're facebook size and you have many product teams all expected to produce something that all works together - I can see how the global namespace would be impossible to manage. For your average website or app? Not even close. It'll be awhile before you run into the limitations of CSS that Facebook is running into.


>This tool seems useful if you buy into the philosophy, but I'm just not sold yet - component based styling leads to a lot of style duplication and makes it very easy for a developer to go "off the playbook" when it comes to enforcing a consistent styleguide throughout an app.

You just handle it the same way you handle any shared code. You can keep files in a file scope, in a package / folder scope, or in the top-level global scope (in a small app that's totally fine). But removing globals-by-default removes a lot of "gotcha's" from working with CSS.


What are these gotchas if I may ask? Have you got experience with BEM?


Uhm.. Having to use BEM is a gotcha.

Why don't you write all your applications code in a global scope and just use a BEM-like naming scheme for your functions?


Globals are hard to name, so we use things like BEM [0] as a good naming convention to mitigate human error. CSS-in-JS is nothing more than an automatic BEM. I wrote down some thoughts on this today [1].

[0]: http://getbem.com/

[1]: https://medium.com/@jdan/css-is-fine-its-just-really-hard-63...


You should still use CSS and general programming best practices even if you define your styles in JS. For me, the big win is that I get access to proper variables, constants, dead code elimination, minification, template strings, destructuring, spreads, real computed values etc. out of the box and in an language I'm very familiar with as a programmer. That it eliminates half the build toolchain is also a plus.


In some of my projects I have 2 scopes: A framework scope and a component scope.

The framework scope has all the composeable classes and standard forms like lists, shadows, colors, grids, cards etc.

Then, when the framework doesn't cover everything, I use component scoped css to complete it, without having to worry about a naming scheme like BEM. It just makes things easier when you have css that is really only relevant to one component. Just like programming, I can always make the code abstract and move it up to the framework.


What is the advantage of bringing your styling into javascript to do that?

I do the exact same thing (I don't use BEM either) by isolating specific component styling to it's own SASS file.


The parent post as more about component based styling then css-in-js.

As for css-in-js, there isn't much of an advantage to using it vs importing sass files as scoped.

With Sass you get:

- Familiare Syntax

- Avoids inline styles

- All benefits of the Sass community

vs with css-in-js you primarily gain:

- Dynamic and regular styles together

- One less compiler dependency

- Benefits of full JS for style generation

So I think this really depends on the project and your preference, I don't think there's a massive benefit either way.


Can I see how you setup webpack to parse individual sass files imported into components?


CSS-in-JS doesn't mean you have to inline everything in the component file..

You can totally create a style library and include pieces of it as mixins for the styles of each component.


> It'll be awhile before you run into the limitations of CSS that Facebook is running into.

Or until your designer wants the corporate website and the internal dashboard to have buttons that look different.


Why would my corporate website be sharing the same codebase as our product app?


I'm not 100% what this is exactly... Care to clear it up a bit?

At first I though this is for those situations where you find yourself urged to modify the css in your javascript. But looking at the documentation, this seems to be a way to write the complete CSS in JS, and then to have it compiled into CSS. Do I understand that wrong? If not: Why would one want that?


Yes, this is kinda like the "lodash" for writing styles in JavaScript.

The main goal with writing styles in JavaScript is to make CSS work in the context of component-based systems. The language is magnificent, but it was made in an age where the web consisted of documents.

These days we're building rich, interactive, client-side user interfaces with the same language, but it's standing in our way. That's why there has been a lot of exploration, especially in the React ecosystem, around putting styles in JavaScript.

I'd encourage you to take a look at these magnificent resources which I cannot do justice in a single comment:

- The talk that kicked it all off: "CSS in JS" by vjeux[0] (made React Native, works at Facebook)

- "Rendering Khan Academys Learn Menu Whereever I Please" [1]

- "Scale FUD and style components" [2]

and a bunch of other talks and articles if you google "CSS in JS".

[0]: https://speakerdeck.com/vjeux/react-css-in-js [1]: https://medium.com/@jdan/rendering-khan-academys-learn-menu-... [2]: https://medium.learnreact.com/scale-fud-and-style-components...


The idea of writing CSS in JS is horrible to me. But I'm coming from a completely different developer camp, and find the vjeux talk completely unconvincing, so that does not mean much :) And with your comment it is clearer now where this might be useful.

Maybe add a "How to use this" section describing possible workflows to the Readme?

Also I run into situations where my js produces inline css, and a lodash style lib for that could be useful. Thanks for the answer, congratz for launching!


Thanks for the kind words, totally understand that this isn't for everybody.

Definitely will work on improving the README, just needed to finally get this out of the door ;)

Cheers!


> this seems to be a way to write the complete CSS in JS, and then to have it compiled into CSS.

That isn't what this is although I also had to poke around the source code to figure out what it is exactly.

It's a set of mixins and utility functions that return a js object that is then used as input for either inline styles, or for one of the may CSS in JS libraries that convert do a JS object to CSS.

As for how useful? Well, the color utilities seem to replicate what color.js does, so nothing new there. The mixins seem to be mostly about prefixing, and you're going to need to prefix the rest of your CSS-in-JS anyway - for which there are various standalone libraries, and plugins to the aforementioned libraries.

The shorthands let you do things like:

borderWidth('12px', '24px', '36px', '48px')

=>

{ 'border-top-width': '12px', 'border-right-width': '24px', 'border-bottom-width': '36px', 'border-left-width': '48px' }

Thing is, I can already do that without the expansion:

{ 'borderWidth': '12px 24px 36px 48px' }

As much as I respect the guys behind this, I'd question how useful it is overall.


Sorry it isn't clear to you, we could definitely do a better job with the README. If you look on the website[0] you'll see actual examples of usage. (I just announced this project on stage at ReactLondon during my talk, so it's very fresh and we haven't had a lot of time to clean up the docs yet)

Basically, there is lots of styles in JavaScript libraries floating around, especially in the React ecosystem. The issue is that many people need Sass utility functions and mixins like lighten/darken/clearfix to be productive with their styling, and no real comprehensive "Compass for styles in JavaScript" exists—so this is it.

We looked at a lot of existing JavaScript color libraries, but most of them have some sort of fluent API that is very different from the way CSS preprocessors handle these functions. This confuses people and makes the API hard to learn, so we decided to build our own that mimics the Sass API as closely as possible. (apart from being all curried functions that are composeable, which means switching some argument orders around)

[0]: https://polished.js.org


Thanks for the clarification "SASS-like mixins for CSS in JS" sums it up.

I did look at the docs, but that doesn't have an explanation of what value this is trying to offer either.

If designers are being asked to write CSS-IN-JS, I can get where there the difficulty comes from, but I'd still argue that most of these functions are just moving the chairs around.

This [1] IMHO is the defacto JS color lib, but again can see how, if the only thing you know is SASS, it looks a bit to much like real code.

[1] https://github.com/brehaut/color-js#color-methods


This was a big missing piece of code in the CSS-in-JS world. Thanks for providing the stdlib (following SASS is definitely a great approach).


I imagine it's the same appeal as wanting to run JavaScript on the server. The more things you can do in one language, the fewer times you have to switch from thinking in one language to another.


To me, this is like trying to use a hammer for nails, screws and painting. Use the right tools for the job at hand. Don't know how to hang dry wall? It's ok to get help!


Not really that simple. People like myself learnt CSS back in the day, and modern CSS systems like BEM, and Sass/LESS and friends, (I love Sass), yet still see the benefits of CSS-in-JS for certain kinds of 'component-based apps' (not every site). See [0] for some of the reasonings behind CSS-in-JS.

[0] https://speakerdeck.com/vjeux/react-css-in-js


I think that's a fair point, but I'd say it's more like wanting to use the tools in your pocket knife instead of getting an actual screw driver or set of pliers. No, it's not as good as the real thing, but you can save time by using the slightly inferior version that's already at hand.


The current state of the JS world is getting closer every day to the J2EE craziness about 10 years ago. As an outsider it was nearly impossible to understand for what all those frameworks with funky names were required at all. For an insider every of those new frameworks looked like the solution to a fundamental CS problem. However, those fundamental CS problems where nothing else then some shortcomings introduced by the latest framework before.


The J2EE comparison is an interesting one.

I remember attending NodeJS meetups in the local Engine Yard office buildings around 2012 before there was an extant local NodeJS community, so most of the attendees were coming from non-JS programming backgrounds. There was the odd Ruby and PHP dev, but the vast majority of the initial local NodeJS community here were Java people for some odd reason. I didn't really know much about the Java community, but my general impression of the Java-backgrounded presenters demoing NodeJS apps they'd cobbled together with libraries they didn't care to understand the internals of didn't give me good impressions.

I've never noticed any other strong connections between Java & JS communities online or elsewhere, this was a just general one-off (but strong) impression from local meetups.


Wouldn't these two lines of code do the same thing?

  var addCSS = (css) => { window.document.styleSheets[0].insertRule(css, window.document.styleSheets[0].cssRules.length); };
  addCSS('.x { color: red; width: 5px; }');
Test examples (+ another version that can add multiple selectors in the same line): https://jsfiddle.net/xkLnj9st/


Perhaps Show HN would be more appropriate than "just launched"?


Good call, will update!


Updated, thanks!


Can somebody explain how this approach affects the style caching by the browser? It seems that this will just throw away all the caching optimizations built around that.


It is replaced by script caching. Loading the styles from JS rather than CSS is a bit slower, but not much.


I mean more like the AST behind parsing/rendering the styling rules, not caching the downloaded file.


I didn't know it was a thing... Some CSS-in-JS libs support isomorphic apps, but I don't know how well they take advantage of the caching abilities of browsers.


I'm a massive CSS-in-JS skeptic but this is a very nicely thought out low-level tool for that stack.

It's basically a JS version of SASS mixins (kinda).

Most of my objections to CSS-in-JS are they are all poorly architected high-level abstractions taking a bad solution to a lower level problem.

This feels like a good basis for a higher level tool that doesn't suck.

And like I said - I say that as someone broadly skeptical of the whole topic.


Mods: consider linking to the project homepage, https://polished.js.org/ which appears to give much more context


Thanks for the hint. We forgot about it and I just added it.


I'm coming around slowly but I still have a hard time with css being embedded in JS components. I have used SCSS for so long I am used to style and function being separate concerns and separate files. I like the idea of being able to use 'mixins' for js components.


Also interesting, for people who fear style duplication: http://styletron.js.org


Automatic atomification of styles meshes badly with conditional at-rules. You can end up with conditional rules that are ignored.


I found that the killer application for Javascript would be to write github repos for Javascript wrappers for typescript. Seriously, why is CSS as Javascript objects a thing? Are we so bored with the stack we've been using that we can only make things interesting by cross compiling everything? It makes me think of this video: https://www.destroyallsoftware.com/talks/the-birth-and-death...


That's exactly why we made styled-components![0]

I really dislike writing styles as JavaScript objects, so styled-components let's you write actual CSS in JavaScript. We have also added support for a bunch of editors, so you don't miss out on syntax highlighting just because of that.

I'd encourage you to check it out!

[0]: https://www.styled-components.com


I just discovered http://typestyle.io/ which should make it much easier to write CSS in JS... Auto-completion everywhere...

I'll probably steal the approach for my own CSS-in-JS lib (j2c).


+1 for typestyle. My team and I have been using it for the past few weeks in trying to clean up a rather monolithic css project, and it's been really cool to work with.


i'd like a relative positioning framework for css, to clamp anchors point relative to each other. that stuff is HARD in CSS


No.


We've asked you already to please stop posting unsubstantive comments. We have to ban accounts that won't.

https://news.ycombinator.com/newsguidelines.html




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: