關於vue中scss公用的解決方案

簡述


最近因爲項目要求查閱了不少關於scss公用的文章,如下只是對那些文章進行簡單的總結javascript


解決方法

a.當咱們要使用scss文件的共用時,首先咱們就要想到如何應當如何編輯scss文件,好比下降scss文件的變量與混入的耦合,咱們能夠將scss文件中的變量和混入分離開來使用單獨的文件存儲,此外還能夠編寫一些默認樣式的scss文件 。css

  • variable.scss:存儲scss變量的文件html

    @charset 'utf-8';
    $bg:skyblue;
    $w:100px;
    $h:100px;
    $tsize:50px;
    $w2:200px;
    $h2:200px;
  • mixin.scss:存儲scss混入的文件vue

    @charset 'utf-8';
    @mixin wh($w,$h) {
      width: $w;
      height: $h;
      border: 1px solid red;
    }
  • base.scss:存儲默認樣式的scss文件java

    @charset 'utf-8';
    .test{
      border: 5px solid pink;
      height: 100px;
      width: 100px;
    }

b.如今最關鍵的是如何讓vue組件也能用使用咱們定義的公用的scss文件 ,固然咱們也能夠在每一個組件中使用import語句導入相應的scss文件,可是這樣會致使代碼臃腫,難以維護。因此咱們能夠藉助相關工具來解決這個問題。vue-cli


a.方法1

若是使用的是vue-cli的版本是比較低的版本,咱們能夠經過使用 sass-resources-loader這個插件,修改vue-cli的目錄下build/utils.js 。從而實現scss文件的共享。npm

  • 步驟1:首先安裝sass-resources-loader這個插件。segmentfault

    npm i sass-resources-loader --save-dev
  • 步驟2:修改build文件夾下的utils.js文件,找到return選項,修改它的scss屬性進行入下配置,其餘不用改變。sass

    return {
        css: generateLoaders(),
        postcss: generateLoaders(),
        less: generateLoaders('less'),
        sass: generateLoaders('sass', { indentedSyntax: true }),
        //修改這個scss屬性
        scss: generateLoaders('sass').concat({
          loader:'sass-resources-loader',  
              options:{  
              resources:[
                path.resolve(__dirname,'../src/assets/variable.scss'),
                path.resolve(__dirname,'../src/assets/mixin.scss'),
                path.resolve(__dirname,'../src/assets/base.scss')  
              ]
              }
        }),
        stylus: generateLoaders('stylus'),
        styl: generateLoaders('stylus')
      }
  • 步驟3:測試階段,新建一個Test.vue組件,進行入下配置less

    <template>
      <div>
        <!-- test類的默認樣式 -->
        <div class="test">
          test
        </div>
        <div class="box2">
          ssss
        </div>
      </div>
    </template>
    <style lang="scss">
      .test{
        //訪問公共的scss變量  
        font-size:$tsize;
        background: $bg;
      }
      .box2{
        //訪問公共的scss混入  
        @include wh($w2,$h2) 
      }
    </style>

    測試結果.png


b.方法2

若是使用的vue-cli的版本是高版本的,那麼能夠直接修改vue.config.js這個文件的css.loaderOptions選項,就可讓每一個組件使用公用的scss文件了。

  • 步驟1:一樣首先安裝sass-resources-loader這個插件。

    npm i sass-resources-loader --save-dev
  • 步驟2:在項目主目錄下新建一個vue.config.js配置文件。大概的配置參考這篇文章

    const path=require('path')
      module.exports={
        publicPath: process.env.NODE_ENV === 'production' ? '/public/' : './',
        assetsDir:'assets',
        indexPath:'myIndex.html',
        filenameHashing:false,
        productionSourceMap: false,
        css: {
          loaderOptions: {
              sass: {
                  //依次導入的公用的scss變量,公用的scss混入,共用的默認樣式
                  prependData: `
                      @import "./src/assets/css/variable.scss";
                   @import "./src/assets/css/mixin.scss";    
                      @import "./src/assets/css/base.scss";
                  `
              }
          }
        }
      }
  • 步驟3:測試階段,和方法一的步驟3同樣。

c.方法3

若是使用的vue-cli的版本是高版本的,那麼能夠直接修改vue.config.js這個文件的chainWebpack這個屬性來實現多個scss文件的公用。

  • 步驟1:一樣首先安裝sass-resources-loader這個插件。

    npm i sass-resources-loader --save-dev
  • 步驟2:在項目主目錄下新建一個vue.config.js配置文件。大概的配置參考這篇文章

    const path=require('path')
    module.exports={
      publicPath: process.env.NODE_ENV === 'production' ? '/public/' : './',
      assetsDir:'assets',
      indexPath:'myIndex.html',
      filenameHashing:false,
      productionSourceMap: false,
      chainWebpack:config=>{
        const types=['vue']
        types.forEach(type=>{
          config.module.rule('scss').oneOf(type).use('style-resource')
          .loader('style-resources-loader')
          .options({
            patterns:[
              //公用的scss變量  
              path.resolve(__dirname,'./src/assets/css/variable.scss'),
              //公用的scss混入  
              path.resolve(__dirname,'./src/assets/css/mixin.scss'),
              //共用的默認樣式  
              path.resolve(__dirname,'./src/assets/css/base.scss')
            ]
          })
        })
      }
    }
  • 步驟3:測試階段,和方法一的步驟3同樣。

參考文檔

vue-cli中chainWebpack的使用
在vue中引用.SCSS的公用文件

相關文章
相關標籤/搜索