Я ищу, как внедрить глобальный (THEME_NAME в моем примере) во все компоненты vue:
<template>..</template>
<style lang = "scss">
@import "bulmaswatch/<%=THEME_NAME=>/bulmaswatch.scss";
.foo {
color: $primary;
}
</style>
Контекст:
Я использую darkly тема из Bulma css в моем приложении vue (vue Cli 3)
<template>..</template>
<style lang = "scss">
@import "bulmaswatch/darkly/bulmaswatch.scss";
.foo {
color: $primary;
}
</style>
Чтобы переключиться на тему cyborg, мне придется везде заменить darkly на cyborg ...
Есть ли способ лучше? Что-то типа
<template>..</template>
<style lang = "scss">
@import "bulmaswatch/<%=THEME_NAME=>/bulmaswatch.scss";
.foo {
color: $primary;
}
</style>
то где-нибудь в Webpack или vue.config.js мы можем решить, что это за тема
configureWebpack: () => {
return {
plugins: [
new webpack.DefinePlugin({
THEME_NAME: "cyborg"
}),
],
}
}





In order to switch to the cyborg theme, I will have to replace darkly with cyborg everywhere...
Нет, если вы используете шаблон реэкспорт. Нет необходимости в каких-либо внешних библиотеках и волшебстве кодогенерации с помощью webpack.
По сути, вы создаете файл, в который импортируете свою тему.
Назовем его _my-bulma-theme.scss, а пока импортируем darkly.
// _my-bulma-theme.scss
@import "bulmaswatch/darkly/bulmaswatch.scss";
В своем коде вы импортируете этот файл вместо прямого импорта из Bulma:
// some-component.vue
<style>
@import "../../my-bulma-theme";
</style>
// some-other-component.vue
<style>
@import "../../my-bulma-theme";
</style>
Теперь, когда вы хотите изменить тему, вам просто нужно изменить ее в одном месте: в файле _my-bulma-theme.scss.
// _my-bulma-theme.scss
@import "bulmaswatch/cyborg/bulmaswatch.scss";
Я считаю, что DefinePlugin работает только для JavaScript, вместо этого вам придется использовать что-то вроде строка-заменить-webpack-плагин. Жаль, что SASS не поддерживает динамические операторы
@import, такие как LESS.