使用gulp4自动生成一个reset.min.css

257 阅读3分钟

一、前言

团队需要开发一个前端开发脚手架,这里我要写一个reset.css文件,方便开发中使用。
因为不想只写一个临时文件,所以做成了一个工具。

好处就是,这样生成的文件可以在大多数项目中通用,可以大大减少css的代码量,提升项目性能。

项目地址:common-css-bag

二、项目目录

├─ .gitignore
├─ config
│  ├─ build.js
│  ├─ clean.js
│  ├─ concat.js
│  └─ watch.js
├─ dist
│  ├─ base.min.css
│  ├─ box.min.css
│  ├─ flex.min.css
│  ├─ font.min.css
│  └─ reset.min.css
├─ gulpfile.js
├─ index.css
├─ index.html
├─ package-lock.json
├─ package.json
├─ readme.md
├─ styles
│  ├─ base.css // 基础reset
│  ├─ box.css // 容器
│  ├─ flex.css // flex
│  └─ font.css // 字体
├─ test
│  └─ clean-css.js
├─ utils
│  └─ chalkLog.js // 彩色console.log
└─ yarn.lock // 依赖控制

三、逻辑

最终实现就是,定义好src目录下的base、box、flex、font(或更多)css文件,启动gulp命令,在编写src目录下的每个css文件时候,自动去minify(压缩)生成目标*.min.css文件以及concat(合并)源css文件生成reset.min.css文件,并保持监听。

四、代码部分

压缩每个css文件 到dist目录下

// build.js
const { src, dest }  = require('gulp');
const rename = require("gulp-rename");
const cleanCSS = require('gulp-clean-css');
const chalkLog = require('../utils/chalkLog');

function build(cb) {
	chalkLog('开始压缩...', 'greenBright.bold');

	src(['styles/*.css', '!styles/*.min.css']) // 过滤 *.min.css
		.pipe(rename({
			suffix: '.min'
		}))
		.pipe(cleanCSS())
		.pipe(dest('dist'));
	
	chalkLog('压缩完毕!', 'blueBright.bold');
	
	if (cb !== undefined) {
		cb()
	}
}

module.exports = build

清理dist

// clean.js
const { src }  = require('gulp');
const gulpClean = require('gulp-clean');
const chalkLog = require('../utils/chalkLog');

function clean(cb) {
	chalkLog('清理dist文件夹')
	src('dist/*.css', {
		read: false
	})
		.pipe(gulpClean())

	if (cb !== undefined) {
		cb()
	}
}

module.exports = clean

合并css文件到reset.min.css

// concat.js
const { src, dest }  = require('gulp');
const gulpConcat = require('gulp-concat');
const cleanCSS = require('gulp-clean-css');
const chalkLog = require('../utils/chalkLog');


function concat(cb) {
	chalkLog('开始合并文件...', 'greenBright.bold');

	src(['styles/*.css', '!styles/*.min.css']) // 过滤 *.min.css
		.pipe(gulpConcat('reset.min.css'))
		.pipe(cleanCSS())
		.pipe(dest('dist'));
	
	chalkLog('合并完毕!', 'blueBright.bold');

	if (cb !== undefined) {
		cb()
	}
}

module.exports = concat

监听文件改动

// watch.js
const build = require('./build');
const chalkLog = require('../utils/chalkLog');
const gulpWatch = require('gulp-watch');
const clean = require('./clean');
const concat = require('./concat');


function watch() {
	chalkLog('开始监听文件...')
	gulpWatch(['styles/*.css', '!styles/*.min.css'], function(e) {
		const start = e.path.indexOf('/styles')
		const path = e.path.slice(start)
		chalkLog(path + ' ' + e.event, 'redBright.bold')

		clean()
		build()
		concat()
	});
}

module.exports = watch

集成、导出task
执行顺序:clean => build => concat => watch

// gulpfile.js
const { series } = require('gulp');

const build = require('./config/build.js')
const watch = require('./config/watch.js')
const clean = require('./config/clean.js')
const concat = require('./config/concat.js')

exports.clean = clean
exports.watch = watch
exports.build = build
exports.concat = concat

exports.default = series(clean, build, concat, watch)

五、坑点

捯饬了差不多一天,gulp4和之前的区别还是有的,也有一些坑点,所以记录下,防止踩坑。

  1. gulpfile.js文件为导出task文件了,可以看作其是一个集成多个task的核心文件。走gulp命令可以看到如下:
[17:13:34] Using gulpfile ~/Desktop/Work/cli-reset-css/gulpfile.js
[17:13:34] Starting 'default'...
[17:13:34] Starting 'clean'...
清理dist文件夹
[17:13:34] Finished 'clean' after 7.83 ms
[17:13:34] Starting 'build'...
开始压缩...
压缩完毕!
[17:13:34] Finished 'build' after 3.98 ms
[17:13:34] Starting 'concat'...
开始合并文件...
合并完毕!
[17:13:34] Finished 'concat' after 2.67 ms
[17:13:34] Starting 'watch'...
开始监听文件...

会先执行default,接着执行series按顺序来执行task。这里的集成没有像gulp老版本每个任务都要声明一个task name,这里只需要导出执行task的匿名函数即可。

  1. 导出的函数都有一个cb参数,并且在顺序执行中需要让其能够执行,就是有cb即执行,没有cb则不处理,这是一个done function。

每个任务都需要done才能执行下一个任务(注意:在这里除了watch不需要,因为不结束)

  1. gulp官方文档确实有点难懂,在watch()这个api中,就只是描述了它是监听文件,但是没有去告诉怎么去做热更新(持续监听),官方watch()使用只执行了一次watch task就结束了,所以没有采用,这里采用了gulp-watch插件来做处理,效果不错。