如何在view中使用scss

简介

在开发过程中由于没有前后端分离,编写部分前端代码,其中编写css的时候各种class穿插,此时如果可以使用 scss 或者 less 将能大大方便 css 样式的编写。下面将实现在 blade 中使用 scss 做 css 的预处理。

思路

问题一: 如何使用更为优雅?

参照vue中,在完成各种预处理器的配置后,使用 scss 时需要在 style 标签中 添加属性 lang="scss" 此处亦希望能达到该效果。

<style lang='scss'>
.body{
    .a{
    }
}
</style>

问题二: scss编译器

scss编译器是实现该功能的核心部分,很幸运的是有国外的朋友开发了基于php的scss编译器 scssphp 此处将使用该编译器完成scss的编译工作。

很幸运,到此已经具备了足够的条件,接下来将提供一种实现方案,供有需要的朋友参考

一. 安装scss

安装命令 :

composer require scssphp/scssphp

二. app/Providers/AppServiceProvider.php

<?php
namespace App\Providers;

use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;
use ScssPhp\ScssPhp\Compiler;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {

        $this->app->singleton(Compiler::class,function($app){
            //创建编译器
            return new Compiler();
        });

    }


    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //scss 预编译
        Blade::precompiler(function ($value) {
            return preg_replace_callback("/(<style[^>]*(lang\s*=\s*['\"]scss['\"])[^>]*>)(.*?)(<\/style>)/s", function ($matches) {
                /** @var Compiler $cc */
                $cc =  app()->make(Compiler::class);
                return str_replace($matches[2],"",$matches[1]) . $cc->compileString(trim($matches[3]))->getCss() . $matches[4];
            }, $value);
        });

    }
}

一切正常的情况下,此时已经可以像下面一样使用,

<style lang='scss'>
.body{
    .c{
        width: 100px;
    }
}
</style>

在访问view时,样式部分将会被预编译进模板文件的缓存中。

三. 进阶—注册scss内部函数

scss的使用中,可能会使用到部分function,如:

<style lang="scss">

        @function calcWidth($bw){
            @return sqrt(pow($bw,2)*2)*cos(15*3.1415926/180);
        }

        $cWidth: calcWidth(80);

        .body{
            --def-width:  #{$cWidth}px;

            .c{
                width: var(---def-width);
            }
        }
</style>

此时非自带的function,如 sqrt pow cos 必须使用 registerFunction方法进行注册。

<?php
namespace App\Providers;

use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;
use ScssPhp\ScssPhp\Compiler;

class AppServiceProvider extends ServiceProvider
{
...
    public function register()
    {

        $this->app->singleton(Compiler::class,function($app){
            //创建编译器
            $cc = new Compiler();
            //注册scss中的数学部分方法
            $cc->registerFunction('pow',function($args){
                list($n,$ex)=$args;
                return pow($n->getDimension(),$ex->getDimension());
            });
            $cc->registerFunction('sqrt',function($args){
                list($n)=$args;
                return sqrt($n->getDimension());
            });
            $cc->registerFunction('sin',function($args){
                list($n)=$args;
                return sin($n->getDimension());
            });
            $cc->registerFunction('cos',function($args){
                list($n)=$args;
                return cos($n->getDimension());
            });
            return $cc;
        });

    }
    ...
}

更详细的使用说明可以阅读 scssphp 的文档 scssphp.github.io/scssphp/

总结

到此,实现了在视图模板中使scss的目的,上述代码由于具体情况不尽相同,所以仅作参考,有需要的朋友可以自行进行修改,适应自己的项目。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 1
Mutoulee

那为啥不直接用laravel-mix呢?

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
1
粉丝
0
喜欢
0
收藏
0
排名:3229
访问:104
私信
所有博文
博客标签
社区赞助商