{"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

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\n\n\n\n

\n

Update from September 6, 2018:<\/strong> I updated the post to show a solution with Webpack 4.<\/p>\n\n

Update from October 28, 2022:<\/strong> The css-loader syntax changed, as Nick pointed out in his comment<\/a>.\n<\/div>\n\n\n\n

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, the solution<\/a> was to use the extract-loader<\/a>.<\/p>\n\n\n\n

This is my webpack.config.json<\/code>:<\/p>\n\n\n

const<\/span> path = require<\/span>('path'<\/span>);\n\nmodule<\/span>.exports = {\n\tmode<\/span>: process.env.NODE_ENV === 'production'<\/span> ? 'production'<\/span> : 'development'<\/span>,\n\tentry<\/span>: ['.\/blocks\/index.js'<\/span>, '.\/blocks\/editor.scss'<\/span>, '.\/blocks\/frontend.scss'<\/span>],\n\toutput<\/span>: {\n\t\tpath<\/span>: path.resolve(__dirname, 'assets'<\/span>),\n\t\tfilename<\/span>: 'js\/editor.blocks.js'<\/span>,\n\t},\n\tmodule<\/span>: {\n\t\trules<\/span>: [\n\t\t\t{\n\t\t\t\ttest<\/span>: \/\\.scss$\/<\/span>,\n\t\t\t\tuse<\/span>: [\n\t\t\t\t\t{\n\t\t\t\t\t\tloader<\/span>: 'file-loader'<\/span>,\n\t\t\t\t\t\toptions<\/span>: {\n\t\t\t\t\t\t\tname<\/span>: 'css\/[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\tloader<\/span>: 'extract-loader'<\/span>\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tloader<\/span>: 'css-loader?-url'<\/span>\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tloader<\/span>: 'postcss-loader'<\/span>\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tloader<\/span>: '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><\/div>Code language:<\/span> JavaScript<\/span> (<\/span>javascript<\/span>)<\/span><\/small><\/pre>\n\n\n

With that, Webpack compiles the .\/blocks\/editor.scss<\/code> to the editor.blocks.css<\/code> inside the assets\/css<\/code> directory and the .\/blocks\/frontend.scss<\/code> to the assets\/css\/frontend.blocks.css<\/code>. The postcss-loader<\/code> runs Autoprefixer. To get that working, I created a postcss.config.js<\/code> with the following content:<\/p>\n\n\n

module<\/span>.exports = {\n\tplugins<\/span>: {\n\t\t'autoprefixer'<\/span>: {}\n\t}\n}<\/code><\/div>Code language:<\/span> JavaScript<\/span> (<\/span>javascript<\/span>)<\/span><\/small><\/pre>\n\n\n

These are the dev dependencies from my package.json<\/code> (a few are not necessary for the Webpack task) and the NPM tasks to run Webpack:<\/p>\n\n\n

\"scripts\"<\/span>: {\n \"build:dev\"<\/span>: \"webpack\"<\/span>,\n \"build:production\"<\/span>: \"cross-env NODE_ENV=production webpack\"<\/span>,\n \"watch\"<\/span>: \"webpack --watch\"<\/span>\n},\n\"devDependencies\"<\/span>: {\n \"@babel\/core\"<\/span>: \"^7.0.0\"<\/span>,\n \"@wordpress\/babel-preset-default\"<\/span>: \"^2.1.0\"<\/span>,\n \"@babel\/runtime-corejs2\"<\/span>: \"^7.0.0\"<\/span>,\n \"autoprefixer\"<\/span>: \"^9.1.3\"<\/span>,\n \"babel-loader\"<\/span>: \"^8.0.0\"<\/span>,\n \"cross-env\"<\/span>: \"^5.2.0\"<\/span>,\n \"css-loader\"<\/span>: \"^1.0.0\"<\/span>,\n \"extract-loader\"<\/span>: \"^2.0.1\"<\/span>,\n \"file-loader\"<\/span>: \"^2.0.0\"<\/span>,\n \"node-sass\"<\/span>: \"^4.9.3\"<\/span>,\n \"postcss-cli\"<\/span>: \"^6.0.0\"<\/span>,\n \"postcss-loader\"<\/span>: \"^3.0.0\"<\/span>,\n \"sass-loader\"<\/span>: \"^7.1.0\"<\/span>,\n \"webpack\"<\/span>: \"^4.17.2\"<\/span>,\n \"webpack-cli\"<\/span>: \"^3.1.0\"<\/span>\n},<\/code><\/div>Code language:<\/span> JavaScript<\/span> (<\/span>javascript<\/span>)<\/span><\/small><\/pre>\n\n\n

Now, if I run the webpack<\/code> command, I get my SASS compiled into CSS.<\/p>\n","protected":false},"excerpt":{"rendered":"

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":{"footnotes":"","wpf_show_in_dewp_planet_feed":false,"flobn_post_versions":"","lazy_load_responsive_images_disabled":false},"categories":[6],"tags":[],"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"}],"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}]}}