Why put _
in front of the filename in scss?
_filename.scss
- Why does it need _
?
Why put _
in front of the filename in scss?
_filename.scss
- Why does it need _
?
The _ (underscore) is a partial for scss. That means the stylesheet its going to be imported (@import) to a main stylesheet i.e. styles.scss. The advantage on using partials is that you can use many files to organize your code and everything will be compiled on a single file.
When you include "_" in front of the file name, it won't be generated into CSS unless you import it into another sass files which is not partial.
suppose your folder structure is like this
/scss
style.scss
_list.scss
/css
if you run the command
sass --watch scss:css
only style.css and style.css.map files will be created, sass compiler will omit _list.scss without converting its content into a CSS file.
/scss
style.scss
_list.scss
/css
style.css
style.css.map
the only way that you can use partials is to import them into another .scss file with
@import 'list.scss';
if you remove the '_' in front of _list.scss the outcome of the command will be
/scss
style.scss
list.scss
/css
style.css
style.css.map
list.css
list.css.map
The main purpose of using partials is to break down our CSS code into several pieces which are easier to maintain. Hope this helps. Thanks.
A sass file starting with an underscore is a partial. It is a good way to keep your styles separated into logical sections. These files all get merged on compilation when you use @import
.
From the Sass language guide:
You can create partial Sass files that contain little snippets of CSS that you can include in other Sass files. This is a great way to modularize your CSS and help keep things easier to maintain. A partial is simply a Sass file named with a leading underscore. You might name it something like _partial.scss. The underscore lets Sass know that the file is only a partial file and that it should not be generated into a CSS file. Sass partials are used with the @import directive.
Files with _ (underscore) are ignored by compiler. However, all those files are imported into single, main SCSS file (i.e. styles.scss) which is actually the file that is compiled (it doesn't have _ (underscore) in it's name)
The final goal is to compile only one SCSS file, and to have only one CSS file as a result of that, which has various advantages.
_ is used to denote partials. These partials contains the variables and internal functions that are required in the pre-processing stage, and they are not required to be compiled as css. _ partial templates contains utils, scss local variables and functions required in the compilation of the scss to css.
Here is what the documentation says:
As a convention, Sass files that are only meant to be loaded as modules [to be imported], not compiled on their own, begin with _ (as in _code.scss). These are called partials, and they tell Sass tools not to try to compile those files on their own. You can leave off the _ when importing a partial.
Also, note that Sass partials should not be used with @import, but with @use instead:
The Sass team discourages the continued use of the @import rule. Sass will gradually phase it out over the next few years, and eventually remove it from the language entirely. Prefer the @use rule instead. (Note that only Dart Sass currently supports @use. Users of other implementations must use the @import rule instead.)
This is beyond the scope of the original question, but in case you're curious, here is why:
The @import rule has a number of serious issues:
- @import makes all variables, mixins, and functions globally accessible. This makes it very difficult for people (or tools) to tell where anything is defined.
- Because everything’s global, libraries must prefix to all their members to avoid naming collisions.
- @extend rules are also global, which makes it difficult to predict which style rules will be extended.
- Each stylesheet is executed and its CSS emitted every time it’s @imported, which increases compilation time and produces bloated output.
- There was no way to define private members or placeholder selectors that were inaccessible to downstream stylesheets.
Also using the watcher of node-sass in a node environment will result in error messages if you do without the underscore prefix, see https://github.com/sass/node-sass/issues/2762