一、SCSS 全局变量设置

一般项目需要全局的一个是变量,一个是公共的样式(mixin)。我们在assets新建目录如下:

// index 文件内容
// 这个在main.js 中导入无效, 使用sass-resources-loader在vue.config.js中配置
// 全局sass文件,里面不要包含任何会被编译成css的代码,因为它们会被应用到每一个sass文件中,出现多个相同的样式
@import './mixins';
@import './var';

先安装2个库,这两个东西的版本真是麻烦,先看版本问题记录

npm install node-sass --save --dev
npm install sass-loader --save --dev

在vue.config.js 中配置

css: {
    loaderOptions: {
      sass: {
        additionalData: `@import "@/assets/style/scss/index.scss";`
      }
    }
  },

注意sass-loader不同的版本,选项名称也不同:

sass-loader v8- : 选项名为 data
sass-loader v8 中: 选项名为 prependData
sass-loader v8 中: 选项名为 additionalData

这样就能再任意vue文件中使用变量和函数了

color: $blue;
@include box-default;

版本问题记录:
之前使用过 sass-resources-loader, 发现一个神奇的问题,一旦离开该分支再回来,就开始报错,变量找不到。 后来改用sass-loader, 配置删除了,但是库没uninstall, 还是会出现之前的问题, sass-resources-loader uninstall 之后就好了。

参考博文:解决vue中使用scss时,依赖node-sass和sass-loader的版本问题:

webpack4 使用 sass-loader, 存在版本问题, 不能用过高的版本,历史版本信息查询:
node-sass: https://github.com/sass/node-sass/tags sass-loader: https://github.com/webpack-contrib/sass-loader/tags

可使用版本:

//卸载
npm uninstall sass-loader node-sass   

//安装对应的版本
npm install sass-loader@7.3.1 node-sass@4.14.1  --save-dev 
或者
npm install sass-loader@10.2.0 node-sass@6.0.1 --save-dev
二、设置全局函数

在assets的js中创建common.js, 用来设置需全局引入的函数文件

import { zhaohu } from "@/assets/js/ui/zhaohu.js"
import { notExist } from "@/assets/js/ui/notExist.js"

//全局函数
exports.install = function(Vue, options) {
  Vue.prototype.zhaohu = zhaohu
  Vue.prototype.notExist = notExist
}

在main.js中设置,将全局函数当做插件来进行注册

import common  from "@/assets/js/common.js";
Vue.use(common);
二、设置全局混入(mixin)

在src下新建一个mixin文件夹,里面放置各种混入js, 需要全局使用的js文件就在main.中导入

// 比如: 新开页面的混入
import openPage from '@/mixins/open-page.js';
Vue.mixin(openPage)
三、设置全局组件

在components中新建一个global文件夹,里面的index.js 用来注册所有的公共组件。

import Vue from 'vue'

const componentsContext = require.context('./', true, /\.vue$/);

componentsContext.keys().forEach(component => {
  const componentConfig = componentsContext(component);
  // 兼容import export和require module.export两种规范
  const ctrl = componentConfig.default || componentConfig;
  // 加载全局组件
  if (ctrl && ctrl.name) {
    Vue.component(ctrl.name, ctrl);
  }
})

比如有个全局组件CButton.vue,这个里面封装了一些样式,处理了按钮的防抖事件组件。这个组件一定要写name

<template>
  <el-button>
    <slot></slot>
  </el-button>
</template>

<script>
export default {
  name: 'CButton',
}

最后,在main.js 中导入即可

import '@/components/global';
四、设置全局指令

在src下新建一个directives文件夹, 在main.js 中导入即可

import '@/directives';
五、设置全局样式
// 在main.js 中导入即可
// 这个里面有reset element的全局样式,必须放在elementui样式的后面,不然无法覆盖
import '@/assets/style/index.scss';

// 字体图标文件
import '@/assets/icon/iconfont.css';

// 如果有自己的字体文件
import '@/assets/font/font.css';
::v-deep .el-main {
    //FIXME el-main中设置为auto,使得内部组件的阴影设置不显示
    overflow: visible;
  }

媒体查询和scss
只能 @mixin 不能 @extend