vue.js: always load a settings.scss file in every vue style section
I have struggled with the same question for a while. But there's a really simple fix. This feature comes through node-sass itself.
so you can declare your scss globals in a file, say globals.scss
whose path is:
/src/scss/globals.scss
Now you can simply edit the vue-loader
config:
loaders: {
sass: 'vue-style-loader!css-loader!sass-loader?indentedSyntax=1&data=@import "./src/scss/globals"',
scss: 'vue-style-loader!css-loader!sass-loader?data=@import "./src/scss/globals";'
}
and voila! You have the scss globals available across all your vue components. Hope it helps!
Update:
A lot of settings have been updated in new releases of vue. So the above changes may not seem trvial in latest vue projects. So I'll brief how everything is tied together-
Short version:
Find build/utils.js
which would contain a method (most probably named cssLoaders()
). This method would return an object like this :
return {
...
sass: generateLoaders('sass', { indentedSyntax: true }),
scss: generateLoaders('sass'),
...
}
You simply need to change the scss/sass
specific line to something like this:
return {
...
sass: generateLoaders('sass', { indentedSyntax: true }),
scss: generateLoaders(['css', 'sass?data=@import "~assets/styles/app";']),
...
}
Long Version:
webpack.base.conf.js
contains vue-loader
in it, it would look something like this :
...
{
test: /\.vue$/,
loader: 'vue-loader',
options: vueLoaderConfig
},
...
The vueLoaderConfig
variable is imported from the vue-loader.conf.js
file, which is equal to this object:
{
loaders: utils.cssLoaders( Obj ), // actual settings coming from cssLoader method of build/utils.js
transformToRequire: {
//some key value pairs would be here
}
}
in build/utils.js
file we find the cssLoaders()
method which returns:
....
return {
css: generateLoaders(),
postcss: generateLoaders(),
less: generateLoaders('less'),
sass: generateLoaders('sass', { indentedSyntax: true }),
scss: generateLoaders('sass'),
stylus: generateLoaders('stylus'),
styl: generateLoaders('stylus')
}
You simply need to update the above code with updated scss
configuration like this:
...
{
...
scss: generateLoaders(['css', 'sass?data=@import"~assets/scss/main";']),
...
}
...
Thus, the variables/mixins written in src/assets/scss/main.scss
file will be available across all your components.
If you use the Vue webpack template, you can fix it with one line of code in build/utils.js
:
scss: generateLoaders(['css', 'sass?data=@import "~assets/styles/app";'])
Then, in src/assets/styles/app
, you add all the @imports and voilà!
I reckon you're using webpack?
You can require the settings.scss
file in your app.js file something like this
require("!style!css!sass!./file.scss");
hence when it's compiled. All your components will get it. You won't have to require it on each of them.
The official docs have been updated since I asked this question: https://vue-loader.vuejs.org/en/configurations/pre-processors.html
For anyone else viewing this in 2017 and beyond, check out the instructions under 'loading a global settings file'.