<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Gyula Kerezsi</title>
    <description>The latest articles on Forem by Gyula Kerezsi (@gardient).</description>
    <link>https://forem.com/gardient</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F875751%2Faac6ffc3-4fa3-4ba8-a104-f62b2d5250fd.png</url>
      <title>Forem: Gyula Kerezsi</title>
      <link>https://forem.com/gardient</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/gardient"/>
    <language>en</language>
    <item>
      <title>Global scss in SvelteKit</title>
      <dc:creator>Gyula Kerezsi</dc:creator>
      <pubDate>Sat, 11 Jun 2022 18:15:15 +0000</pubDate>
      <link>https://forem.com/gardient/global-scss-in-sveltekit-2e8p</link>
      <guid>https://forem.com/gardient/global-scss-in-sveltekit-2e8p</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Run: &lt;code&gt;npm i -D nodemon concurrently&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Add the following npm scripts&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"dev:full"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"concurrently --kill-others &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;npm run scss:dev&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;npm run dev:nodemon&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"dev:nodemon"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"nodemon --exec &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;npm run dev&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"scss"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sass src/scss/:static/style/"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"scss:dev"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sass -w src/scss/:static/style/"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add &lt;code&gt;npm run scss &amp;amp;&amp;amp;&lt;/code&gt; before the &lt;code&gt;build&lt;/code&gt;, &lt;code&gt;package&lt;/code&gt;, &lt;code&gt;preview&lt;/code&gt; and&lt;br&gt;
&lt;code&gt;prepare&lt;/code&gt; scripts&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm run scss &amp;amp;&amp;amp; svelte-kit build"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"package"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm run scss &amp;amp;&amp;amp; svelte-kit package"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"preview"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm run scss &amp;amp;&amp;amp; svelte-kit preview"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"prepare"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm run scss &amp;amp;&amp;amp; svelte-kit sync"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;So I started a little project &lt;em&gt;(hopefully I will write about it soon)&lt;/em&gt; and I&lt;br&gt;
tought I would write the frontend in svelte&lt;/p&gt;

&lt;p&gt;Then I remembered that SvelteKit was a thing, and I meant to learn it as well,&lt;br&gt;
so I started a new project with it.&lt;/p&gt;

&lt;p&gt;I was pleasantly surprised when the new project setup asked about both&lt;br&gt;
Typescript and Sass (scss), I like both, but when I looked into changing the&lt;br&gt;
full body style I was a bit disappointed&lt;/p&gt;

&lt;p&gt;No support for directly compiling an scss file for the body, to include in the&lt;br&gt;
&lt;code&gt;app.html&lt;/code&gt; file&lt;/p&gt;
&lt;h2&gt;
  
  
  Well, let's see what options we got
&lt;/h2&gt;

&lt;p&gt;The first thing that jumps out is perhaps the best option&lt;/p&gt;

&lt;p&gt;SvelteKit's preprocessor for styles has a special &lt;code&gt;:global&lt;/code&gt; selector, so you&lt;br&gt;
could have the following block in your main &lt;code&gt;__layout.svelte&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;style &lt;/span&gt;&lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"scss"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nd"&gt;:global&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="err"&gt;@import&lt;/span&gt; &lt;span class="err"&gt;'&amp;lt;path&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;global&lt;/span&gt; &lt;span class="err"&gt;scss&amp;gt;';&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which works just fine, but it generates a lot of warnings in other components,&lt;br&gt;
paths, that don't have any element matching some selector in your global file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Annoying.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  let's try something else
&lt;/h2&gt;

&lt;p&gt;If you run &lt;code&gt;sass -w &amp;lt;path to global&amp;gt;:&amp;lt;path to static&amp;gt;&lt;/code&gt; to have Sass compile your&lt;br&gt;
stylesheet, adding &lt;code&gt;&amp;lt;link rel="stylesheet" href="%sveltekit.assets%/global.css"&amp;gt;&lt;/code&gt;&lt;br&gt;
to your &lt;code&gt;app.html&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It works fine...&lt;/p&gt;

&lt;p&gt;When you start &lt;code&gt;svelte-kit dev&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If you modify your file afterwards, it won't change even if you reload your page.&lt;br&gt;&lt;br&gt;
It's &lt;em&gt;static&lt;/em&gt; why should it?&lt;/p&gt;
&lt;h2&gt;
  
  
  Enter &lt;code&gt;nodemon&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;nodemon&lt;/code&gt; is a wonderful little node package/application, it watches your files,&lt;br&gt;
if something changes it stops and restarts your process(es)&lt;/p&gt;

&lt;p&gt;Which is nice, you can tell it to run the npm cript for svelte-kit and watch&lt;br&gt;
your global file&lt;/p&gt;

&lt;p&gt;So let's install nodemon with &lt;code&gt;npm i -D nodemon&lt;/code&gt;, and to keep the npm script&lt;br&gt;
short let's add a &lt;code&gt;nodemon.json&lt;/code&gt; file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"delay"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"watch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;path to static file&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will tell nodemon to watch the file for changes, and to wait for 250ms to&lt;br&gt;
restart (might not be needed, but it helps with giving sass time to settle files)&lt;/p&gt;

&lt;p&gt;Let's add a new npm script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"dev:nodemon"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"nodemon --exec &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;npm run dev&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I like leaving the original alone, as hopefully global styles will rarely change.&lt;/p&gt;

&lt;p&gt;The only thing missing is a single command that will start both the Sass&lt;br&gt;
compilation. Thankfully someone made &lt;code&gt;concurrently&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Adding &lt;code&gt;concurrently&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;concurrently&lt;/code&gt; is a node package made for running things side by side...&lt;br&gt;
conurrently&lt;/p&gt;

&lt;p&gt;It's cross platform, so it will run on pretty much all development environments.&lt;br&gt;
It has the &lt;code&gt;--kill-others&lt;/code&gt; option which will make sure that everything dies&lt;br&gt;
together&lt;/p&gt;

&lt;p&gt;You can install it by running &lt;code&gt;npm i -D concurrently&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;We're almost there, last thing we need to do is add a few more npm scripts&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"dev:full"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"concurrently --kill-others &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;npm run scss:dev&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;npm run dev:nodemon&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"scss"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sass &amp;lt;path to global&amp;gt;:&amp;lt;path to static&amp;gt;"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"scss:dev"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sass -w &amp;lt;path to global&amp;gt;:&amp;lt;path to static&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now running &lt;code&gt;npm run dev:full&lt;/code&gt; will start the Sass compiler in watch mode&lt;/p&gt;

&lt;h3&gt;
  
  
  One more preventative measure
&lt;/h3&gt;

&lt;p&gt;Just to make sure that you always have the global css compiled when packaging,&lt;br&gt;
we'll modify a few of the default SvelteKit npm scripts&lt;/p&gt;

&lt;p&gt;Let's add &lt;code&gt;npm run scss &amp;amp;&amp;amp;&lt;/code&gt; before the &lt;code&gt;build&lt;/code&gt;, &lt;code&gt;package&lt;/code&gt;, &lt;code&gt;preview&lt;/code&gt; and&lt;br&gt;
&lt;code&gt;prepare&lt;/code&gt; scripts&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm run scss &amp;amp;&amp;amp; svelte-kit build"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"package"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm run scss &amp;amp;&amp;amp; svelte-kit package"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"preview"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm run scss &amp;amp;&amp;amp; svelte-kit preview"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"prepare"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm run scss &amp;amp;&amp;amp; svelte-kit sync"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that's it, now you can run &lt;code&gt;npm run dev:full&lt;/code&gt; to get your global css&lt;br&gt;
recompiling. No hot reload I'm afraid, but hitting refresh is not that hard.&lt;/p&gt;

&lt;h2&gt;
  
  
  PS.: should I add the generated css to .gitignore
&lt;/h2&gt;

&lt;p&gt;Personally i'm not going to, it's really not that big in the first place, and&lt;br&gt;
it's not likely to change a lot, at least in my setup, where I mostly just set a&lt;br&gt;
few css variables&lt;/p&gt;

&lt;p&gt;On the other hand, you are more likely to notice it missing, than seeing that&lt;br&gt;
some change hasn't propagared into it.&lt;/p&gt;

&lt;p&gt;This one is up to you&lt;/p&gt;

</description>
      <category>svelte</category>
      <category>sass</category>
    </item>
  </channel>
</rss>
