sass添加全局函数

Posted vieber

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sass添加全局函数相关的知识,希望对你有一定的参考价值。

需要指出因为我们是vue文件里面使用scss,所以这块scss的解析需要在vue-loader里面去解决。

所以配置scss全局函数我们需要在vue-loader里面去添加。

这是webpack.base.conf.js

 
    test: /\\.vue$/,
    loader: 'vue-loader',
    options: vueLoaderConfig
 ,

这里的vueLoaderConfig就有对scss语法的配置。
这是vueloaderconf

'use strict'
const utils = require('./utils')
const config = require('../config')
const isProduction = process.env.NODE_ENV === 'production'
const sourceMapEnabled = isProduction
    ? config.build.productionSourceMap
    : config.dev.cssSourceMap

module.exports = 
    loaders: utils.cssLoaders(
        sourceMap: sourceMapEnabled,
        extract: isProduction
    ),
    cssSourceMap: sourceMapEnabled,
    cacheBusting: config.dev.cacheBusting,
    transformToRequire: 
        video: ['src', 'poster'],
        source: 'src',
        img: 'src',
        image: 'xlink:href'
    

里面关键在于utils.cssLoaders这个函数的实现

exports.cssLoaders = function (options) 
    options = options || 

    const cssLoader = 
        loader: 'css-loader',
        options: 
            sourceMap: options.sourceMap
        
    

    const postcssLoader = 
        loader: 'postcss-loader',
        options: 
            sourceMap: options.sourceMap
        
    

    // generate loader string to be used with extract text plugin
    function generateLoaders(loader, loaderOptions) 
        const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]

        if (loader) 
            loaders.push(
                loader: loader + '-loader',
                options: Object.assign(, loaderOptions, 
                    sourceMap: options.sourceMap
                )
            )

            // 配置全局sass函数和变量
            loaders.push(
                loader: 'sass-resources-loader',
                options: 
                    // it need a absolute path
                    resources: [path.resolve(__dirname, '../src/style/function.scss')]
                
            );

        

        // Extract CSS when that option is specified
        // (which is the case during production build)
        if (options.extract) 
            return MiniCssExtractPlugin.extract(
                use: loaders,
                fallback: 'vue-style-loader'
            )
         else 
            return ['vue-style-loader'].concat(loaders)
        
    

    // https://vue-loader.vuejs.org/en/configurations/extract-css.html
    return 
        css: generateLoaders(),
        postcss: generateLoaders(),
        less: generateLoaders('less'),
        sass: generateLoaders('sass', 
            indentedSyntax: true
        ),
        scss: generateLoaders('sass'),
        stylus: generateLoaders('stylus'),
        styl: generateLoaders('stylus')
    

这个util中他的实现,重点在于

loaders.push(
    loader: 'sass-resources-loader',
    options: 
        // it need a absolute path
        resources: [path.resolve(__dirname, '../src/style/function.scss')]
    
);

增加这个,这样全局就会有对应的scss函数,直接在webpack的专门的scssloader里面是不生效的。

例如下面这种配置就是不生效的。


    test: /\\.scss$/,
    use: [
        MiniCssExtractPlugin.loader,
        
            loader: 'css-loader'
        ,
        
            loader: 'sass-loader',
            options: 
                implementation: require('sass'),
            ,
        ,

    ]
,

以上是关于sass添加全局函数的主要内容,如果未能解决你的问题,请参考以下文章

Nuxtjs如何在所有sass文件中添加全局环境变量

使用样式化的组件创建像全局变量、函数、mixin 这样的 SASS

[Sass]局部变量和全局变量

vue配置sass全局样式

vue配置sass全局样式

vue cli3 配置全局sass变量