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.
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].
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.
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".
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!
> 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.
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)
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.
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.
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.
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.
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.
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 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.
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...
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.
+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.
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.