grunt构建工具:scss转css

devtools/2025/3/16 23:20:58/

Grunt 是一个基于 JavaScript 的任务运行工具,通常用于自动化重复性任务,例如代码编译、文件压缩、单元测试等。它通过配置文件 Gruntfile.js 来定义任务和插件。
完整项目地址:https://github.com/ylpxzx/grunt-scss-to-css

以下是 Grunt 的一些关键概念:

  1. Gruntfile.js: 这是 Grunt 的配置文件,用于定义任务和插件。它通常包含 module.exports 函数,里面有 grunt.initConfig 方法来初始化任务配置
  2. 任务 (Tasks): Grunt 的核心是任务。任务可以是单个任务,也可以是多个任务的组合。任务可以通过命令行运行,例如 grunt sass 或 grunt watch
  3. 插件 (Plugins): Grunt 有大量的插件,可以用来执行各种任务,例如编译 Sass、压缩 JavaScript 文件、运行单元测试等。插件可以通过 grunt.loadNpmTasks 方法加载
  4. 配置 (Configuration): 在 grunt.initConfig 方法中,定义了各个任务的配置。每个任务都有自己的配置选项,例如文件路径、选项等

csscss_10">用Grunt将scss文件转为css

初始化项目

  • 新建项目目录:grunt-scss-to-css

  • 在项目根目录执行以下命令进行项目初始化

    npm init
    

准备工作

  • 安装 grunt-cli

    npm install -g grunt-cli
    
  • 安装 ruby

    官方下载地址:https://rubyinstaller.org/downloads/archives/

    请添加图片描述

    安装完成后,打开 cmd, 运行"ruby -v" 看是否安装完成 (直接在 vscode 终端执行,好像会提示不存在 ruby 指令)

    在打开的项目根目录下执行下面命令,安装sass

    gem install sass
    
  • 安装构建项目所需的npm包

    npm install grunt
    # sass转css的包
    npm install grunt-contrib-sass
    # 监听文件变化后触发重新构建的包
    npm install grunt-contrib-watch
    
  • 在项目根目录下新建Gruntfile.js文件

项目结构如下:

请添加图片描述

构建逻辑编写

  • Gruntfile.js

    module.exports = function(grunt) {grunt.initConfig({    //初始化配置grunt任务sass: {dist: {files: {'dist/css/output.css': 'src/scss/index.scss'  // src/scss/index.scss文件编译后输出到dist/css/output.css文件}}},watch:{scripts:{files:["src/scss/*.scss"],  // 监控文件夹下的scss文件tasks:["sass"],  // 监控到文件变化后,执行sass任务options:{spawn: false}}},});grunt.loadNpmTasks('grunt-contrib-watch');   //加载watch监听插件任务grunt.loadNpmTasks('grunt-contrib-sass');   //加载sass插件任务grunt.registerTask('scsstocss', ['sass', 'watch']);  //新增一个注册任务test, 运行sass和watch任务
    };
    
  • 新增scss文件进行测试:src/scss/index.scss

    css">* {border: 0;box-sizing: border-box;margin: 0;padding: 0;
    }
    :root {--hue: 223;--bg: hsl(var(--hue),10%,90%);--fg: hsl(var(--hue),10%,10%);--primary: hsl(var(--hue),90%,30%);--trans-dur: 0.3s;--trans-timing: cubic-bezier(0.65,0,0.35,1);font-size: calc(16px + (48 - 16) * (100vw - 280px) / (3840 - 280));
    }
    body,
    button {font: 1em/1.5 "DM Sans", sans-serif;
    }
    body {background-color: var(--bg);color: var(--fg);display: flex;height: 100vh;
    }
    form {container: form / inline-size;margin: auto;padding: 1.5em;width: 100%;max-width: 36em;
    }
    .btn {background-color: var(--primary);border-radius: 0.25em;color: hsl(0,0%,100%);cursor: pointer;display: block;padding: 0.375em 0.75em;transition:background-color var(--trans-dur) var(--trans-timing),opacity var(--trans-dur) var(--trans-timing);width: 100%;-webkit-appearance: none;appearance: none;-webkit-tap-highlight-color: transparent;&:disabled {cursor: not-allowed;opacity: 0.5;}&:not(:disabled):hover {background: hsl(var(--hue),90%,10%);}&-group {display: flex;justify-content: center;gap: 0.75em;margin-top: 1.5em;}
    }
    .steps {// --trans-dur: 0.15s;background-color: hsl(0,0%,100%);border-radius: 0.75em;display: flex;padding: 1.5em;flex-direction: column;justify-content: center;width: 100%;&__connector,&__step {position: relative;}&__connector {background-color: hsl(var(--hue),10%,80%);margin-inline-start: 0.75em;width: 0.125em;height: 1.25em;transform: translateX(-50%);transition: background-color var(--trans-dur);&:before {background-color: var(--primary);content: "";display: block;width: 100%;height: 100%;transform: scale(1,0);transform-origin: 50% 0;transition:background-color var(--trans-dur),transform var(--trans-dur) var(--trans-timing);}}&__step {display: flex;align-items: center;flex-shrink: 0;z-index: 1;&-name {color: hsl(var(--hue),10%,50%);font-size: 0.75em;line-height: 2;transition:color var(--trans-dur) var(--trans-timing),font-weight var(--trans-dur) var(--trans-timing);}&-number {background-color: hsl(var(--hue),10%,80%);color: hsl(0,0%,100%);border-radius: 50%;margin-inline-end: 0.5em;text-align: center;width: 1.5em;height: 1.5em;transition:background-color var(--trans-dur) var(--trans-timing),box-shadow var(--trans-dur) var(--trans-timing);}&--current &-name,&--done &-name {color: hsl(var(--hue),10%,10%);font-weight: 700;}&--current &-number,&--done &-number {background-color: var(--primary);}&--current &-number,&--current &-name {transition-delay: var(--trans-dur);}&--current &-number {box-shadow: 0 0 0 0.125em hsla(var(--hue),90%,30%,0.4);}}&__step--done + &__connector {&:before {transform: scale(1,1);}}
    }/* Change layout depending on form width */
    @container form (min-width: 30em) {.btn {width: auto;}.steps {flex-direction: row;align-items: center;padding: 1.5em 2.25em 2.25em 2.25em;&__connector {margin-inline-start: 0;width: 100%;height: 0.125em;transform: translateY(-50%);&:before {transform: scale(0,1);transform-origin: 0 50%;[dir="rtl"] & {transform-origin: 100% 50%;}}}&__step {&-name {position: absolute;top: 100%;left: 50%;text-align: center;width: 6em;transform: translateX(-50%);}&-number {margin-inline-end: 0;}}}
    }/* Dark theme */
    @media (prefers-color-scheme: dark) {:root {--bg: hsl(var(--hue),10%,10%);--fg: hsl(var(--hue),10%,90%);--primary: hsl(var(--hue),90%,70%);}.btn {color: hsl(var(--hue),10%,10%);&:not(:disabled):hover {background: hsl(var(--hue),90%,50%);}}.steps {background-color: hsl(var(--hue),10%,20%);&__connector {background-color: hsl(var(--hue),10%,40%);}&__step {&-name {color: hsl(var(--hue),10%,50%);}&-number {background-color: hsl(var(--hue),10%,40%);color: hsl(var(--hue),10%,20%);}&--current &-name,&--done &-name {color: hsl(var(--hue),10%,90%);}&--current &-number {box-shadow: 0 0 0 0.125em hsla(var(--hue),90%,70%,0.4);}}}
    }
    
  • 执行任务

    # 在项目根目录下运行该命令
    grunt scsstocss
    
  • 最终项目结构:.sass-cache、dist/css/…为构建后生成的文件

    请添加图片描述


http://www.ppmy.cn/devtools/167668.html

相关文章

爬虫基础之爬取豆瓣同城信息(保存为csv excel 数据库)

网站:长沙最近一周戏剧活动_豆瓣 温馨提示: 本案例仅供学习交流使用 本案例所使用的模块 requests(发送HTTP请求)pandas(数据保存模块)lxml(用于解析数据模块)csv(用于保存为csv文件)pymysql(用于操作数据库)parsel(解析数据的模块) 确定爬取的信息内容: 戏剧的名称…

贪心算法(6)(java)优势洗牌

题目: 给定两个长度相等的数组nums1和nums2,nums1相对于nums2的优势可以满足nums1【1】>nums[2]的索引的数目来描述。 返回nums1的任意排列,使其相对于nums2的透视最大化呀。 原理(贪心策略):田忌赛马 1.如果比不…

数据类设计_图片类设计之6_混合图形类设计(前端架构)

前言 学的东西多了,要想办法用出来.C和C是偏向底层的语言,直接与数据打交道.尝试做一些和数据方面相关的内容 引入 接续上一篇,讨论混合图形类设计 方法论-现在能做什么 这段属于聊天内容---有句话是这么说的:不要只埋头拉车,还要抬头看路。写代码也是…

蓝桥杯_LED模块

一 前言 还有四十多天将要进行蓝桥杯的比赛,接下来一个多月我将进行我的知识点的复习,争取在蓝桥杯提交一个满意的答卷 二 锁存器M74HC753M1R 在我这一年并没有进行在csdn上发布任何文章,这一年我学了stm32、51,还有部分理论知…

css梯形tab

效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Tab 示例</…

【go】函数类型的作用

Go 语言函数类型的巧妙应用 函数类型在 Go 语言中非常强大&#xff0c;允许将函数作为值进行传递和操作。下面详细介绍函数类型的各种妙用&#xff1a; 1. 回调函数 // 定义一个函数类型 type Callback func(int) int// 接受回调函数的函数 func processData(data []int, ca…

算力服务器主要是指什么?

随着科技的快速发展&#xff0c;人工智能也逐渐兴起&#xff0c;算力服务器也受到了各个企业的重视&#xff0c;本文就来为大家介绍一下算力服务器主要都是指什么吧&#xff01; 算力服务器对于人工智能领域来说&#xff0c;在深度学习模型的训练和推理过程中扮演着非常重要的角…

ngx_conf_read_token

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_conf_read_token-CSDN博客 static ngx_int_t ngx_conf_read_token(ngx_conf_t *cf) {u_char *start, ch, *src, *dst;off_t file_size;size_t len;ssize_t n, size;ngx_uint_t found, need_space, last_space…