如果您正在开发一个大型的 Vue 应用程序,那么您很有可能会在某个时候想要组织应用程序的结构,以便为 CSS 定义一些全局变量,以便在应用程序的任何部分使用。
这可以通过将这段代码写入应用程序中的每个组件来实现
<style lang="scss">
@import "./styles/_variables.scss";
</style>
但是谁有时间做这个?!我们是程序员,让我们以编程的方式来做。
为什么?
您可能想知道为什么要这样做,尤其是在您刚开始学习 Web 开发时。全局变量不好,对吧?为什么我们需要这个?Sass 变量到底是什么?如果您已经了解所有这些,那么您可以跳到下一节查看实现。
大大小小的公司往往每隔一到两年就会进行一次重新设计。如果您的代码库很大,由很多人管理,并且您需要将所有地方的line-height
从1.1rem
更改为1.2rem
,您真的想回到每个模块并更改该值吗?全局变量在这里变得非常有用。您可以决定哪些可以在顶层,哪些需要由其他较小的部分继承。这避免了 CSS 中的意大利面条代码,并使您的代码保持DRY。
我曾经在一个拥有庞大而分散的代码库的公司工作。在重大版本发布的前一天,上面传达了命令,要求我们更改主要品牌颜色。因为代码库设置良好,并且正确定义了这些类型的变量,所以我只需要在一个位置更改颜色,它就会传播到 4000 个文件中。这非常强大。我还可以避免熬夜才能及时完成更改。
样式与设计有关。**好的设计本质上在保持一致时才能成功。**一个重用通用结构部分的代码库看起来更统一,也往往看起来更专业。如果您必须在每个组件中重新定义应用程序的一些基本部分,它将开始崩溃,就像在经典的传话游戏中一样。
全局定义也可以供设计师进行自我检查:“等等,我们还有另一个三级按钮?为什么?”这种模型可以很好地显示 UI/UX 中的一致性漏洞。
如何操作?
首先,我们需要安装vue-cli 3。然后我们创建我们的项目
npm install -g @vue/cli
# OR
yarn global add @vue/cli
# then run this to scaffold the project
vue create scss-loader-example
当我们运行此命令时,我们将确保使用具有 Sass 选项的模板
? Please pick a preset: Manually select features
? Check the features needed for your project:
◉ Babel
◯ TypeScript
◯ Progressive Web App (PWA) Support
◯ Router
◉ Vuex
❯ ◉ CSS Pre-processors
◉ Linter / Formatter
◯ Unit Testing
◯ E2E Testing
其他选项由您决定,但您需要选中 CSS 预处理器选项。如果您有一个现有的 vue cli 3 项目,请不要担心!您也可以运行
npm i node-sass sass-loader
# OR
yarn add node-sass sass-loader
首先,让我们在 src 目录中创建一个新文件夹。我将其命名为styles
。在其中,我创建了一个_variables.scss
文件,就像您在像 bootstrap 这样的流行项目中看到的那样。目前,我只是在其中放入一个变量进行测试
$primary: purple;
现在,让我们在项目根目录(与您的package.json
位于同一级别)中创建一个名为vue.config.js
的文件。在其中,我们将定义一些配置设置。您可以在此处阅读有关此文件的更多信息。
在其中,我们将添加前面看到的那个导入语句
module.exports = {
css: {
loaderOptions: {
sass: {
data: `@import "@/styles/_variables.scss";`
}
}
}
};
读者 Dan Danciu 指出,从 sass-loader 8 开始,data
需要改为 prependData
。
读者 Esteban Jelicich 指出,从 sass-loader 9 开始,data
需要改为 additionalData
。
好的,这里需要注意几个关键点
- 您需要关闭并重新启动本地开发服务器才能使这些更改生效。
- 目录结构中
styles
之前的@/
将告诉此配置文件在src
目录中查找。 - 您不需要在文件名中使用下划线才能使它工作。这是一个 Sass 命名约定。
- 您导入的组件需要在
.vue
单文件组件的样式标签上具有lang="scss"
(或sass
、less 或您正在使用的任何预处理器)属性。(请参阅下面的示例。)
现在,我们可以进入我们的默认App.vue
组件并开始使用我们的全局变量了!
<style lang="scss">
#app {
font-family: "Avenir", Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
//this is where we use the variable
color: $primary;
margin-top: 60px;
}
</style>
这是一个可工作的示例!您可以看到我们应用中的文本变成了紫色
感谢 Ives 创建了 CodeSandbox,为我们设置了特殊的配置,以便我们可以在浏览器中看到这些更改。如果您想更改此沙盒,左侧边栏中有一个特殊的**服务器控制面板**选项,您可以在其中重新启动服务器。感谢,Ives!
就是这样!您不再需要重复执行在整个 Vue 应用程序中@import
相同变量文件的任务。现在,如果您需要重构应用程序的设计,您可以在一个地方完成所有操作,它将传播到整个应用程序。这对于规模较大的应用程序尤其重要。
如果您使用 vue-cli,您可以安装插件“vue-cli-plugin-style-resources-loader”
有没有办法在使用 vue-cli 2 的情况下实现相同的功能?
您需要根据 gist 修改 utils.js:https://gist.github.com/vladmarchuk/34263cd3483296fa91af68705d467d85#file-utils-js-L71-L75
感谢 Sarah,工具箱中又添加了一个绝妙的技巧!#h5yr!
请注意:由于您正在注入代码,这将破坏入口文件中源映射。
请参阅自述文件中的该备注:https://github.com/webpack-contrib/sass-loader#environment-variables
我测试了这种方法,它在开发环境中有效,但在生产环境中构建(vue-cli 3 中的 pwa 模式)时,全局添加的 scss 在外部 css 中重复...有什么建议可以解决吗?
不确定我是否遗漏了什么,但在我的项目中,我的结构如下
在我的 main.scss 中,我导入了所有部分文件。然后在 App.vue 中,我导入了 main.scss,我可以在
中使用我的变量。
在每个组件中,我都有一个样式部分,其中包含这样的注释
我将其作为对其他开发人员的便利,但它不是必需的,我可以删除它们。
哦,我忘记提了,我们没有
在我们的 vue.config.js 文件中。
关于:Tim Myers,对我来说效果很好,一切都看起来非常整洁——只是想知道是否有人发现了任何问题
它也适用于 stylus 吗?