webpack+vue+sass專案中,sass提取全域性引用

LIJING0906發表於2018-12-19

此文首發於 lijing0906.github.io

接近年底,工作沒有那麼忙,業餘時間就比較多了,就想著把小demo整合到一起,自己搭建一個專案。 在網上找了兩篇部落格作為參考:在vue中使用sass的配置的方法vue引入sass全域性變數

基礎依賴包安裝

安裝sass-loader和node-sass(sass-loader依賴於node-sass)。-D是--save-dev的縮寫,依賴包在開發環境和生產環境都需要;對應的-S是--save的縮寫,只需在生產環境需要。

    $ cnpm i node-sass sass-loader -D
複製程式碼

webpack配置

在build資料夾下的webpack.base.conf.js的rules裡面新增以下配置程式碼:

{
  test: /\.sass$/,
  loaders: ['style', 'css', 'sass']
}
複製程式碼

寫sass樣式

在App.vue檔案中寫上sass程式碼,測試配置是否成功。

<style lang="scss">
    $backgroundColor: #000;
    body{
        background-color: $backgroundColor;
    }
</style>
複製程式碼

啟動專案看效果

重啟專案(cnpm run dev)會發現頁面背景色變成黑色了。 如圖:

webpack+vue+sass專案中,sass提取全域性引用

全域性引用sass變數

全域性樣式如下圖

webpack+vue+sass專案中,sass提取全域性引用
在main.js中全域性引入一個scss檔案,然後在任何需要用到sass變數的檔案中引用變數即可。
webpack+vue+sass專案中,sass提取全域性引用
webpack+vue+sass專案中,sass提取全域性引用
在其中定義變數在其他元件或者頁面中引用報變數未定義錯誤,其他的樣式可以正常顯示,顯然是編譯的問題。

安裝sass-resources-loader

    $ cnpm i sass-resources-loader -D
複製程式碼

修改sass配置

在 build 資料夾下找到 util.js 修改sass編譯器loader的配置

    // 全域性檔案引入 當然只想編譯一個檔案的話可以省去這個函式
    function resolveResource(name) {
        return path.resolve(__dirname, '../src/assets/css/' + name);  //我把提取的樣式放在src/assets/css下
    }
    function generateSassResourceLoader() {
        var loaders = [
            cssLoader,
            'sass-loader',
            {
                loader: 'sass-resources-loader',
                options: {
                    resources: [resolveResource('common.scss')]  // 多個檔案時用陣列的形式傳入,單個檔案時可以直接使用 path.resolve(__dirname, '../src/assets/css/common.scss'
                }
            }
        ];
        if (options.extract) {
            return ExtractTextPlugin.extract({  //要確保util.js有引入ExtractTextPlugin這個外掛,通常都是有的
                use: loaders,
                fallback: 'vue-style-loader'
            })
        } else {
            return ['vue-style-loader'].concat(loaders)
        }
    }
複製程式碼

修改sass配置的呼叫為 generateSassResourceLoader()

return {
    css: generateLoaders(),
    postcss: generateLoaders(),
    less: generateLoaders('less'),
        // vue-cli預設sass配置
        // sass: generateLoaders('sass', { indentedSyntax: true }), 
        // scss: generateLoaders('sass'),
    // 新引入的sass-resources-loader
    sass: generateSassResourceLoader(),
    scss: generateSassResourceLoader(),
    stylus: generateLoaders('stylus'),
    styl: generateLoaders('stylus')
  }
複製程式碼

webpack+vue+sass專案中,sass提取全域性引用

引入檔案,重啟專案

修改配置檔案都需要重啟專案。重啟專案沒有報錯,全域性樣式生效

webpack+vue+sass專案中,sass提取全域性引用

相關文章