Rsass 0.27.0 released
Posted 2023-01-17 21:06. Tagged rust, project, css, rsass, sass.
Again, after almost four months since the last release, it is time to announce rsass 0.27.0. There is a bunch of breaking changes and a bunch of improvements.
This time, one change may seem drastic: The
rsass crate no longer
contains the command-line program rsass.
Instead, that is now provided by a separate
So you no longer have to enable a “commandline” feature, instead you can
install the command line interface with:
There is also a new rsass-macros crate. Read on into the Macros section for that.
In case you just want some to get some constant css from scss source in a
rust project, you can now use a macro for that, and may no longer need a
To use this, you need to add
rsass-macros as a dependency.
You should not need
rsass as a build dependency anymore.
use scss; const CSS: &str = scss!;
CSS is a regular
const &'static str, that can be used any way such
a constant can be used, containing the resulting css code in compressed
(You don’t have to write out the type, I’m just showing it in the example.)
I think this is kind of a big deal, since “just want some to get some constant css from scss source in a rust project” was pretty much the main reason for me to start this project, and is probably still the main reason for anyone to use it.
If you prefer to keep your scss code in a separate file, you can do so like this:
use include_scss; const CSS: &str = include_scss!;
The argument to the
include_scss! macros should be a path relative to
the project directory (the directory containing your
Thanks to Frédéric Nieto for contributing the base of this crate.
A css document tree
Previously, the main work-driving routine of rsass, the (private)
output::transform module, worked by looking at each
writing some css output to a
Now, it still looks at each
sass::Item, but rather than just creating
css text directly, it creates
css::Items as needed, and pushes them onto
the current css context.
That context may be a
CssData root context, or it may be a special
context in for example an
@media rule (which itself creates a
css::Item representing the full at-rule including it’s contents, which
is added to the parent context).
When all of the sass is transformed, the
CssData represents the full
resulting css, and can be serialized to a
Vec<u8> with its
All of this is a refactorization that makes much of the transform code
It is also a preparation for supporting the
Now that we have a
CssData representation, it is possible to write
methods that query it for existing rules to extend, and to let it contain
placeholder rules which can be queried, but which are ignored by the
There is a bunch of changes related to the
SourcePos used to have a string field containing a copy of the
Now, it holds a
SourceFile (which is internally reference-counted)
instead, so keeping a lot of
SourcePos data in the sass and css data
representation should be cheaper in terms of memory use and allocations.
Dart sass improved some numeric handling, so I could too.
I mainly removed some special cases, as the new sass behavior was closer
to the default rust behavior.
There is also new variables
now supported by rsass.
There was a bunch of other changes as well. See the changelog for the whole list.
Write a comment