Вью.js: всегда загружайте настройки.файл scss в каждом разделе стиля vue
я обнаружил, что повторяю этот же шаблон в каждом .файл vue, чтобы использовать переменные и т. д.:
<style lang="scss">
@import "../styles/settings.scss";
.someclass { color: $some-variable; }
</style>
или если он вложен в папку, я должен помнить, чтобы быть осторожным с пути:
<style lang="scss">
@import "../../styles/settings.scss";
</style>
есть ли способ глобально импортировать это в каждом .файл Vue создать? Я посмотрел в документах и не увидел его, но, возможно, я пропустил его, или, может быть, это то, что мне нужно использовать webpack?
9 ответов
я некоторое время боролся с одним и тем же вопросом. Но есть очень простое решение. Эта функция поставляется через сам node-sass.
таким образом, вы можете объявить свои глобалы scss в файле, скажем globals.scss
путь к которому:
/src/scss/globals.scss
теперь вы можете просто отредактировать 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";'
}
и вуаля! Глобалы scss доступны для всех компонентов vue. Надеюсь на это. помогает!
обновление:
многие настройки были обновлены в новых выпусках vue. Таким образом, вышеуказанные изменения могут не казаться trvial в последних проектах vue. Поэтому я кратко расскажу, как все это связано ... --22-->
короткая версия:
найти build/utils.js
, который будет содержать метод (скорее всего по имени cssLoaders()
). Этот метод вернет такой объект:
return {
...
sass: generateLoaders('sass', { indentedSyntax: true }),
scss: generateLoaders('sass'),
...
}
вам просто нужно изменить scss/sass
конкретная строка для чего-то вроде этого:
return {
...
sass: generateLoaders('sass', { indentedSyntax: true }),
scss: generateLoaders(['css', 'sass?data=@import "~assets/styles/app";']),
...
}
Версия:
webpack.base.conf.js
содержит vue-loader
в нем это выглядело бы примерно так:
...
{
test: /\.vue$/,
loader: 'vue-loader',
options: vueLoaderConfig
},
...
на vueLoaderConfig
переменная импортируется из vue-loader.conf.js
файл, который равен этому объекту:
{
loaders: utils.cssLoaders( Obj ), // actual settings coming from cssLoader method of build/utils.js
transformToRequire: {
//some key value pairs would be here
}
}
на build/utils.js
файл мы находим cssLoaders()
метод, который возвращает:
....
return {
css: generateLoaders(),
postcss: generateLoaders(),
less: generateLoaders('less'),
sass: generateLoaders('sass', { indentedSyntax: true }),
scss: generateLoaders('sass'),
stylus: generateLoaders('stylus'),
styl: generateLoaders('stylus')
}
вам просто нужно обновить приведенный выше код с помощью обновлено scss
конфигурация такая:
...
{
...
scss: generateLoaders(['css', 'sass?data=@import"~assets/scss/main";']),
...
}
...
таким образом, переменные/миксины написано src/assets/scss/main.scss
файл будет доступен во всех ваших компонентах.
Я думаю, вы используете webpack?
Вы можете потребовать settings.scss
файл в вашем приложении.файл JS что-то вроде этого
require("!style!css!sass!./file.scss");
следовательно, когда он составлен. Все ваши компоненты получат его. Вам не придется требовать этого от каждого из них.
официальные документы были обновлены, так как я задал этот вопрос: https://vue-loader.vuejs.org/en/configurations/pre-processors.html
для всех, кто просматривает это в 2017 году и за его пределами, ознакомьтесь с инструкциями в разделе "загрузка файла глобальных настроек".
Если вы используете шаблон Vue webpack, вы можете исправить его с помощью одной строки кода в build/utils.js
:
scss: generateLoaders(['css', 'sass?data=@import "~assets/styles/app";'])
затем в src/assets/styles/app
, вы добавляете все @imports и вуаля!
Я не верю, что вы можете глобально импортировать файл. Я, вероятно, не сделал бы этого в любом случае, это недостаточно ясно. Если кто-то хочет переместить этот компонент в другой проект, у них будет нет идея полагается на этот файл.
вы можете, однако, сделать управление пути намного проще. Вы можете добавить это в файл конфигурации webpack...
sassLoader: {
includePaths: [
path.resolve(__dirname, './sass')
]
},
затем вы можете включить файлы из корня ваших проектов /sass
каталог свободно, не беспокоясь о пути.
Если вы храните все свои компоненты в одном каталоге, ваш путь к вашим настройкам.scss всегда останется неизменной.
это желаемая функциональность webpack. Принцип состоит в том, чтобы иметь как можно меньше глобалов и включать только то, что вам нужно, сохраняя ваш проект бережливым, эффективным и простым в рассуждении.
Возможно, вам следует реструктурировать свои компоненты / стиль так, чтобы у вас не было так много пользовательских стилей в каждом компоненте Vue (создайте свой собственные?), поэтому вам не придется включать определенную таблицу стилей в каждый компонент Vue.
Это на самом деле не ответ на ваш вопрос, но это может привести вас к согласованию с принципами, лежащими в основе инструментов, которые вы выбрали для работы.
удачи!
там, к сожалению, не существует способа сделать это без импорта файла в каждом компоненте. Чтобы обойти это, вы можете попробовать создать вспомогательные классы с помощью color: $some-variable
и background-color: $some-variable
который может охватывать некоторые из ваших вариантов использования.
если вы импортируете файл в каждом из них, убедитесь, что он содержит только переменные. Вы не хотите включать правила стиля несколько раз.
в противном случае, я бы создал отдельную .scss
файлы для каждого компонента. Вы все еще можете использовать .vue
шаблоны для html и js, но держите свои стили отдельно. Это, пожалуй, самый эффективный способ сделать это.
для пользователей, использующих vue CLI, прочитайте https://cli.vuejs.org/guide/css.html#css-modules. Пример:
// vue.config.js
const fs = require('fs')
module.exports = {
css: {
loaderOptions: {
// pass options to sass-loader
sass: {
// @/ is an alias to src/
// so this assumes you have a file named `src/variables.scss`
data: `@import "@/variables.scss";`
}
}
}
}
это исправило его для меня отлично.
мое решение установлено settings.scss
папка файла псевдоним в webpack,
может быть settings.scss
не является глобальной потребностью, возможно, Вам также нужен подобный setting2.файл scss, но settings.scss
конфликт с setting2.scss, в этом случае вы можете ввести только файл.
конфигурация webpack выглядит так:
resolve: {
alias: {
'~src': path.resolve(__dirname, '../src'),
'~styles': path.resolve(__dirname, '../src/styles'),
}
таким образом, вы можете импортировать settings.scss
в компоненте
<style lang="scss">
@import "~styles/settings.scss";
</style>