{"id":4240,"date":"2017-09-28T13:34:14","date_gmt":"2017-09-28T11:34:14","guid":{"rendered":"https:\/\/florianbrinkmann.com\/en\/?p=4240"},"modified":"2022-10-28T11:12:50","modified_gmt":"2022-10-28T09:12:50","slug":"sass-webpack","status":"publish","type":"post","link":"https:\/\/florianbrinkmann.com\/en\/sass-webpack-4240\/","title":{"rendered":"Compile SASS with Webpack into a CSS file"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">It is not trivial to compile an SCSS file with Webpack, which is not included in the JS file, into its own CSS file. This post shows you how to do that.<\/p>\n\n\n\n<!--more-->\n\n\n\n<div class=\"update-box\">\n<p><strong>Update from September 6, 2018:<\/strong> I updated the post to show a solution with Webpack 4.<\/p>\n\n<p><strong>Update from October 28, 2022:<\/strong> The css-loader syntax changed, as <a href=\"https:\/\/florianbrinkmann.com\/en\/sass-webpack-4240\/#comment-21093\">Nick pointed out in his comment<\/a>.\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">I needed this because I had to use Webpack for a project and did not want to use another tool for compiling the SASS. At the end of my search, <a href=\"https:\/\/github.com\/webpack-contrib\/extract-text-webpack-plugin\/issues\/159#issuecomment-292568527\">the solution<\/a> was to use the <a href=\"https:\/\/www.npmjs.com\/package\/extract-loader\">extract-loader<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is my <code class=\"lang-markup\">webpack.config.json<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code lang-js\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">const<\/span> path = <span class=\"hljs-built_in\">require<\/span>(<span class=\"hljs-string\">'path'<\/span>);\n\n<span class=\"hljs-built_in\">module<\/span>.exports = {\n\t<span class=\"hljs-attr\">mode<\/span>: process.env.NODE_ENV === <span class=\"hljs-string\">'production'<\/span> ? <span class=\"hljs-string\">'production'<\/span> : <span class=\"hljs-string\">'development'<\/span>,\n\t<span class=\"hljs-attr\">entry<\/span>: &#91;<span class=\"hljs-string\">'.\/blocks\/index.js'<\/span>, <span class=\"hljs-string\">'.\/blocks\/editor.scss'<\/span>, <span class=\"hljs-string\">'.\/blocks\/frontend.scss'<\/span>],\n\t<span class=\"hljs-attr\">output<\/span>: {\n\t\t<span class=\"hljs-attr\">path<\/span>: path.resolve(__dirname, <span class=\"hljs-string\">'assets'<\/span>),\n\t\t<span class=\"hljs-attr\">filename<\/span>: <span class=\"hljs-string\">'js\/editor.blocks.js'<\/span>,\n\t},\n\t<span class=\"hljs-attr\">module<\/span>: {\n\t\t<span class=\"hljs-attr\">rules<\/span>: &#91;\n\t\t\t{\n\t\t\t\t<span class=\"hljs-attr\">test<\/span>: <span class=\"hljs-regexp\">\/\\.scss$\/<\/span>,\n\t\t\t\t<span class=\"hljs-attr\">use<\/span>: &#91;\n\t\t\t\t\t{\n\t\t\t\t\t\t<span class=\"hljs-attr\">loader<\/span>: <span class=\"hljs-string\">'file-loader'<\/span>,\n\t\t\t\t\t\t<span class=\"hljs-attr\">options<\/span>: {\n\t\t\t\t\t\t\t<span class=\"hljs-attr\">name<\/span>: <span class=\"hljs-string\">'css\/&#91;name].blocks.css'<\/span>,\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t<span class=\"hljs-attr\">loader<\/span>: <span class=\"hljs-string\">'extract-loader'<\/span>\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t<span class=\"hljs-attr\">loader<\/span>: <span class=\"hljs-string\">'css-loader?-url'<\/span>\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t<span class=\"hljs-attr\">loader<\/span>: <span class=\"hljs-string\">'postcss-loader'<\/span>\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t<span class=\"hljs-attr\">loader<\/span>: <span class=\"hljs-string\">'sass-loader'<\/span>\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t}\n};<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">With that, Webpack compiles the <code class=\"lang-markup\">.\/blocks\/editor.scss<\/code> to the <code class=\"lang-markup\">editor.blocks.css<\/code> inside the <code class=\"lang-markup\">assets\/css<\/code> directory and the <code class=\"lang-markup\">.\/blocks\/frontend.scss<\/code> to the <code class=\"lang-markup\">assets\/css\/frontend.blocks.css<\/code>. The <code class=\"lang-js\">postcss-loader<\/code> runs Autoprefixer. To get that working, I created a <code class=\"lang-markup\">postcss.config.js<\/code> with the following content:<\/p>\n\n\n<pre class=\"wp-block-code lang-js\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-built_in\">module<\/span>.exports = {\n\t<span class=\"hljs-attr\">plugins<\/span>: {\n\t\t<span class=\"hljs-string\">'autoprefixer'<\/span>: {}\n\t}\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">These are the dev dependencies from my <code class=\"lang-markup\">package.json<\/code> (a few are not necessary for the Webpack task) and the NPM tasks to run Webpack:<\/p>\n\n\n<pre class=\"wp-block-code lang-js\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-string\">\"scripts\"<\/span>: {\n  <span class=\"hljs-string\">\"build:dev\"<\/span>: <span class=\"hljs-string\">\"webpack\"<\/span>,\n  <span class=\"hljs-string\">\"build:production\"<\/span>: <span class=\"hljs-string\">\"cross-env NODE_ENV=production webpack\"<\/span>,\n  <span class=\"hljs-string\">\"watch\"<\/span>: <span class=\"hljs-string\">\"webpack --watch\"<\/span>\n},\n<span class=\"hljs-string\">\"devDependencies\"<\/span>: {\n  <span class=\"hljs-string\">\"@babel\/core\"<\/span>: <span class=\"hljs-string\">\"^7.0.0\"<\/span>,\n  <span class=\"hljs-string\">\"@wordpress\/babel-preset-default\"<\/span>: <span class=\"hljs-string\">\"^2.1.0\"<\/span>,\n  <span class=\"hljs-string\">\"@babel\/runtime-corejs2\"<\/span>: <span class=\"hljs-string\">\"^7.0.0\"<\/span>,\n  <span class=\"hljs-string\">\"autoprefixer\"<\/span>: <span class=\"hljs-string\">\"^9.1.3\"<\/span>,\n  <span class=\"hljs-string\">\"babel-loader\"<\/span>: <span class=\"hljs-string\">\"^8.0.0\"<\/span>,\n  <span class=\"hljs-string\">\"cross-env\"<\/span>: <span class=\"hljs-string\">\"^5.2.0\"<\/span>,\n  <span class=\"hljs-string\">\"css-loader\"<\/span>: <span class=\"hljs-string\">\"^1.0.0\"<\/span>,\n  <span class=\"hljs-string\">\"extract-loader\"<\/span>: <span class=\"hljs-string\">\"^2.0.1\"<\/span>,\n  <span class=\"hljs-string\">\"file-loader\"<\/span>: <span class=\"hljs-string\">\"^2.0.0\"<\/span>,\n  <span class=\"hljs-string\">\"node-sass\"<\/span>: <span class=\"hljs-string\">\"^4.9.3\"<\/span>,\n  <span class=\"hljs-string\">\"postcss-cli\"<\/span>: <span class=\"hljs-string\">\"^6.0.0\"<\/span>,\n  <span class=\"hljs-string\">\"postcss-loader\"<\/span>: <span class=\"hljs-string\">\"^3.0.0\"<\/span>,\n  <span class=\"hljs-string\">\"sass-loader\"<\/span>: <span class=\"hljs-string\">\"^7.1.0\"<\/span>,\n  <span class=\"hljs-string\">\"webpack\"<\/span>: <span class=\"hljs-string\">\"^4.17.2\"<\/span>,\n  <span class=\"hljs-string\">\"webpack-cli\"<\/span>: <span class=\"hljs-string\">\"^3.1.0\"<\/span>\n},<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Now, if I run the <code class=\"lang-bash\">webpack<\/code> command, I get my SASS compiled into CSS.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>It is not trivial to compile an SCSS file with Webpack, which is not included in the JS file, into its own CSS file. This post shows you how to do that.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"wpf_show_in_dewp_planet_feed":false,"flobn_post_versions":"","webmentions_disabled_pings":false,"webmentions_disabled":false,"lazy_load_responsive_images_disabled":false,"footnotes":""},"categories":[6],"tags":[],"class_list":["post-4240","post","type-post","status-publish","format-standard","hentry","category-web-development"],"wp-worthy-pixel":{"ignored":false,"public":"644f5aebac7a443ca1fee0dd1b041130","server":"vg07.met.vgwort.de","url":"https:\/\/vg07.met.vgwort.de\/na\/644f5aebac7a443ca1fee0dd1b041130"},"wp-worthy-type":"normal","_links":{"self":[{"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/posts\/4240","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/comments?post=4240"}],"version-history":[{"count":5,"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/posts\/4240\/revisions"}],"predecessor-version":[{"id":6204,"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/posts\/4240\/revisions\/6204"}],"wp:attachment":[{"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/media?parent=4240"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/categories?post=4240"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/tags?post=4240"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}