vue中引入sass、scss

常规步骤

1. 创建项目

使用vue cli 脚手架工具创建项目

Shell 复制代码
vue create xxxx

2. 创建全局样式文件

全局样式变量

路径:@/assets/styles/variables.scss

css 复制代码
//flex 布局变量
$--flex-direction: ("row", "column");
$--flex-position: ("start", "center", "end");

布局样式类

路径:@/assets/styles/layout.scss

css 复制代码
@each $direction in $--flex-direction {
  .flex-#{$direction} {
      display: flex;
      flex-direction: #{$direction};
  }

  @each $p1 in $--flex-position {
      @each $p2 in $--flex-position {
          .flex-#{$direction}-#{$p1}-#{$p2} {
              display: flex;
              flex-direction: #{$direction};
              @if $p1!=center {
                  justify-content: flex-#{$p1};
              } @else {
                  justify-content: #{$p1};
              }

              @if $p2!=center {
                  align-items: flex-#{$p2};
              } @else {
                  align-items: #{$p2};
              }
          }
      }
  }
}

3. 创建全局公用样式文件

全局共用样式

路径:@/assets/styles/main.scss

css 复制代码
@import "@/assets/styles/layout.scss";

div {
    @extend .flex-row;
}

4. 引入全局公用样式

在App.vue或者main.js中映入均可

html 复制代码
<template>
    <router-view />
</template>

<style lang="scss">
@import "@/assets/styles/main.scss";

body {
    margin: 0;
    padding: 0;
    border: none;
    outline: none;
}
#app {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;

    font-family: 微软雅黑;
    color: #000000;
}
</style>

5. 配置全局样式类文件

在vue.config.js中配置全局样式类,具体配置方法可以参考vue cli官方文档

js 复制代码
const { defineConfig } = require("@vue/cli-service");
module.exports = defineConfig({
    transpileDependencies: true,
    css: {
        loaderOptions: {
            scss: {
                additionalData: `@import "~@/assets/styles/variables.scss","~@/assets/styles/layout.scss";`
            }
        }
    }
});

FAQ

1. 样式被多次重复编译

原因

  1. 产生的原因主要是因为在SCSS样式文件中引入了在vue.config.js中配置的样式文件,导致样式类被多次重复编译

  2. vue.config.js是vue编译的入口文件,所以vue在编译时会先加载vue.config.js内配置的SCSS文件,而scss-loader在编译了前置样式文件后会将已经编译的全局样式变量、样式类、带入到后续scss文件的编译中

解决方法

  1. 去掉样式类文件中引入的其他样式文件

例如以下代码,在main.scss中引入了layout.scss文件,而layout.scss文件已经在vue.config.js中配置了载入,所以这里无需再引入

css 复制代码
@import "@/assets/styles/layout.scss";

div {
    @extend .flex-row;
}
  1. vue.config.js只配置工具性样式文件,如果全局变量文件、全局样式类文件;不要引入非工具性样式文件,例如全局组件样式、main.scss等。所以同理在App.vue文件中只引入非工具性样式文件,因为如果在App.vue文件中引入工具性样式文件是不生效的,因为vue项目中,只有在vue.config.js中配置的样式文件,才会被编译到每个vue组件样式内

如以下代码,同样会产生多次重复编译

js 复制代码
const { defineConfig } = require("@vue/cli-service");
module.exports = defineConfig({
    transpileDependencies: true,
    css: {
        loaderOptions: {
            scss: {
                additionalData: `@import "~@/assets/styles/main.scss";`
            }
        }
    }
});

2. 样式类、变量名找不到

原因

  1. scss-loader在编译scss时,是根据从上到下,从前到后的顺序编译,如果文件内的类名不在scss-loader的堆栈内时,就会抛出以上错误

解决方法

  1. 如果存在样式类或变量名不存在的问题时,需要检查引入scss文件的顺序是否正确

例如如下代码:当variables.scss文件位于layout.scss文件后时,在编译layout.scss时就会抛出变量不存在错误,因为此时scss-loader的堆栈中没有对应的变量

js 复制代码
const { defineConfig } = require("@vue/cli-service");
module.exports = defineConfig({
    transpileDependencies: true,
    css: {
        loaderOptions: {
            scss: {
                additionalData: `@import "~@/assets/styles/layout.scss","~@/assets/styles/variables.scss";`
            }
        }
    }
});
相关推荐
Aotman_6 小时前
el-input textarea 禁止输入中文字符,@input特殊字符实时替换,光标位置保持不变
前端·javascript·vue.js·前端框架·es6
百思可瑞教育6 小时前
在Vue项目中Axios发起请求时的小知识
前端·javascript·vue.js·北京百思教育
qq_12498707538 小时前
基于node.js+vue的医院陪诊系统的设计与实现(源码+论文+部署+安装)
前端·vue.js·node.js·毕业设计
科兴第一吴彦祖8 小时前
在线会议系统是一个基于Vue3 + Spring Boot的现代化在线会议管理平台,集成了视频会议、实时聊天、AI智能助手等多项先进技术。
java·vue.js·人工智能·spring boot·推荐算法
沙尘暴炒饭9 小时前
前端vue使用canvas封装图片标注功能,鼠标画矩形框,标注文字 包含下载标注之后的图片
前端·vue.js·计算机外设
百思可瑞教育9 小时前
Vue中使用keep-alive实现页面前进刷新、后退缓存的完整方案
前端·javascript·vue.js·缓存·uni-app·北京百思可瑞教育
前端码虫10 小时前
2.9Vue创建项目(组件)的补充
javascript·vue.js·学习
BillKu10 小时前
Vue3中app.mount(“#app“)应用挂载原理解析
javascript·vue.js·css3
VueVirtuoso12 小时前
SaaS 建站从 0 到 1 教程:Vue 动态域名 + 后端子域名管理 + Nginx 配置
前端·vue.js·nginx
祈祷苍天赐我java之术12 小时前
Vue 整体框架全面解析
前端·javascript·vue.js