「本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!」
前言🤺
- 最近在搭自己的组件库,里面想用
Gulp
单独对样式进行打包来实现按需引入🏇 - 当然用
Webpack
配置插件也是可以做到的,就当是复习巩固一次Gulp
吧 - 关于
Gulp
和Webpack
的区别可以参考我之前的文章:谈谈gulp和webpack?✔️ - 由于本文比较基础,大佬可以直接绕道啦😊,本文意在记录巩固知识的过程和运用🙆♂️
动手🤹♂️
创建项目🧱
- 在一切开始之前分别执行以下命令要先确保电脑安装好了
node
和npm
node --version
npm --version
- 如果上述未安装可以参考Node.js安装及环境配置
- 在本地空文件夹
gulpBegin
中创建一个gulpfile.js
空的js
文件
mkdir gulpBegin
cd gulpBegin
echo test>gulpfile.js
- 接下来我们就要在这个
gulpfile.js
文件中定义我们gulp
的任务了
gulp依赖安装🏘️
- 自动创建
package.json
文件一直回车即可(用于存储配置信息及版本号)
npm init
- 安装
gulp
命令行命令
npm install -g gulp
- 安装
gulp
并写入package.json
文件的依赖
npm install --save-dev gulp
- 此时目录应该是这样
glupBegin
├─ gulpfile.js #接下来运行的主文件
├─ node_modules
├─ package-lock.json
└─ package.json
gulp使用🛀
Gulp 允许你使用现有
JavaScript
知识来书写gulpfile
文件,或者利用你所掌握的gulpfile
经验来书写普通的JavaScript
代码。虽然gulp
提供了一些实用工具来简化文件系统和命令行的操作,但是你所编写的其他代码都是纯JavaScript
代码。
- 按照官网所说的
gulp
是可以用JavaScript
代码来进行书写,我们来编写第一个任务
导出任务🥽
- 定义构建任务的方式就是通过导出函数成员的方式定义
/* gulpfile.js */
function gulpFun() {
console.log('hi gulp')
}
exports.default=gulpFun //导出一个默认任务 default成员
- 在
gulpfile.js
所在的目录的命令行执行gulp
即可
- 在最新的
gulp
当中,它取消了同步任务模式,约定我们的每个任务必须是异步任务,当我们的任务执行完成过后,我们需要通过调用回调函数去标识这个任务已经完成 - 如果是具名任务则需要在命令行执行
gulp
+任务名称
/* gulpfile.js */
function gulpFun(cb) {
console.log('hi gulp')
cb()
}
exports.task1=gulpFun //导出一个task1成员
组合任务⚔️
- 在面对有多个独立任务的情况下,gulp提供了两个强大的组合方法
series()
和parallel()
series()
会让任务们依次执行
/* gulpfile.js */
const { series } = require('gulp');
function gulpFun(cb) {
//任务1
console.log('hi gulp')
cb()
}
function gulpFun2(cb) {
//任务2
console.log('hi 小卢')
cb()
}
exports.default=series(gulpFun,gulpFun2) //导出一个default成员
parallel()
会让任务们同步执行
/* gulpfile.js */
const { parallel } = require('gulp');
function gulpFun(cb) {
//任务1
console.log('hi gulp')
cb()
}
function gulpFun2(cb) {
//任务2
console.log('hi 小卢')
cb()
}
exports.default=parallel(gulpFun,gulpFun2) //导出一个default成员
看到这里其实基本的gulp操作你已经学会了,但我们使用gulp的目的无非就是为了处理文件从而减少我们所浪费的时间,所以我们需要借助gulp的api来实现
gulp的API🍻
gulp
的Api
有挺多的但常用的也只有那几个,剩下的有用到就去文档找就可以了
- 构建过程大多数情况下都是将文件
读取
出来进行一些操作转换
再放到下一个地方
进行加工
最后再把处理好的文件写入
到一个指定的地方 - 这一整套流程就像一根管道一样是有顺序并且一步一步来的,所以在任务中我们可以使用
.pipe(写入流)
,实现数据写入
src()
- 创建一个流用于读取对象,你可以当做是这个文件的入口
dest()
- 创建一个用于将对象写入到文件系统的流 举个例子
- 在文件夹建立一个
scss
文件进行测试
/* gulpfile.js */
const { src,dest,series } = require('gulp');
function gulpFun(cb) {
src('./styles/text.scss')
.pipe(dest('./lib/styles'))
cb()
}
exports.default=series(gulpFun)
- 运行
gulp
后目录结构会变成如下所示
glupBegin
├─ gulpfile.js
├─ node_modules
├─ lib
│ └─ styles
│ └─ text.scss
├─ package-lock.json
├─ package.json
└─ styles
└─ text.scss
- 可以发现
gulp
在读取了styles/text.scss
后再./lib/styles
自动生成了文件,这就是读取和写入流
gulp插件配合🥂
- 当然我们要处理文件可不仅仅只是像这样转移文件而已,我们需要对我们的文件进行转换比如说
压缩css
,压缩js
、重命名
、css背景图生成雪碧图
等等,这时候就需要用到一些插件来辅助了。 - 在
gulp
官网中可查的插件也有很多,如果有需要查找的可以访问官网 - 接下来就介绍几个插件来配合构建我上文说的对
css
样式进行打包 - 假设在
styles
目录中有三个scss
文件
styles
├─ button.scss
├─ icon.scss
└─ index.scss
- 在
index.scss
中import
了上面两个scss的样式
/* index.scss */
@import "button";
@import "icon";
- 接下来我们只需要打包
index.scss
就可以在别的地方引入这个打包后的文件 - 我用到了这四个插件,这些都要在
npm
下载为了方便贴出来直接复制到package.json
执行npm install
就可以
"devDependencies": {
"gulp": "^4.0.2",
"gulp-autoprefixer": "^7.0.0",
"gulp-clean-css": "^4.2.0",
"gulp-rename": "^1.4.0",
"gulp-sass": "^4.0.2"
}
- 在
gulpfile.js
编写以下代码
/* gulpfile.js */
const { src,dest,series } = require('gulp');
const cleanCSS = require('gulp-clean-css');
const sass = require('gulp-sass');
const rename = require('gulp-rename');
const autoprefixer = require('gulp-autoprefixer');
function gulpFun(cb) {
src('./styles/index.scss')
.pipe(sass()) //将sass转化成css
.pipe(autoprefixer()) //根据浏览器的不同版本自动处理浏览器的前缀,实现css浏览器的兼容
.pipe(cleanCSS()) //压缩css文件,减小文件大小
.pipe(rename('xl-ui.css')) //给文件重命名
.pipe(dest('./lib/styles')) //写入这个目录
cb()
}
exports.default=series(gulpFun)
- 运行
gulp
打包后可以在./lib/styles
看到xl-ui.css
文件 - 简单的来说就是把你需要处理的文件用
src()
读取然后通过引入
的各种插件
来进行处理
通过pipe
来进行管道连接,让一整个流程按照顺序执行
,我们只需要把它每个步骤需要做的事情给它规范好了
我们之后就不需要做重复的繁琐的操作
了 - 接下来除了打包
index.scss
后我还想把每个单独组件的scss
进行打包怎么办呢? - 打包一个是这么做,打包二三个也是这么做,我们只需要把他要做的任务给规定好就可以了
- 创建一个component.json文件来存储我们要打包的文件
/* component.json */
{
"button": "./styles/button.scss",
"icon": "./styles/icon.scss"
}
- 在
gulpfile.js
编写以下代码
/* gulpfile.js */
const { src,dest,series } = require('gulp');
const cleanCSS = require('gulp-clean-css');
const sass = require('gulp-sass');
const rename = require('gulp-rename');
const autoprefixer = require('gulp-autoprefixer');
const components = require('./component.json')
function gulpFun(cb) {
src('./styles/index.scss')
.pipe(sass()) //将sass转化成css
.pipe(autoprefixer()) //根据浏览器的不同版本自动处理浏览器的前缀,实现css浏览器的兼容
.pipe(cleanCSS()) //压缩css文件,减小文件大小
.pipe(rename('xl-ui.css')) //给文件重命名
.pipe(dest('./lib/styles')) //写入这个目录
cb()
}
// 打包单独的css文件
function gulpFun2(cb) {
Object.keys(components).forEach(compName => {
src(`./styles/${compName}.scss`) //遍历json文件中要转化的scss文件
.pipe(sass()) //将sass转化成css
.pipe(autoprefixer()) //根据浏览器的不同版本自动处理浏览器的前缀,实现css浏览器的兼容
.pipe(cleanCSS()) //压缩css文件,减小文件大小
.pipe(rename(`${compName}.css`)) //给文件重命名
.pipe(dest('./lib/styles')); //写入这个目录
})
cb()
}
exports.default=series(gulpFun,gulpFun2)
- 运行
gulp
打包后可以在./lib/styles
看到xl-ui.css
文件和分开打包的css
文件
glupBegin
├─ node_modules
├─ component.json
├─ gulpfile.js
├─ lib
│ └─ styles
│ ├─ button.css
│ ├─ icon.css
│ └─ xl-ui.css
├─ package-lock.json
├─ package.json
└─ styles
├─ button.scss
├─ icon.scss
└─ index.scss
- 我们打开打包后
lib
文件夹中的css
文件发现确实每个都单独进行了压缩打包并且重命名 - 这样我们的文件就处理好了!是不是很方便!在我们规定好一系列需要做的事情的任务后,下次我们有需要打包的文件就直接执行一句简单的
gulp
命令即可
写在最后👋
- 本文上面说的只是用
gulp
对样式进行打包,如果对于多种模块化的js
互相引用的时候还是用webpack
来处理吧,毕竟webpack
侧重模块化打包,会把所有的文件都统一处理成js
文件 - 对于
gulp
的细节也还有很多如果感兴趣的话可以去官网文档查查看,相信聪明的你一下就能看懂 - 如果您觉得这篇文章有帮助到您的的话不妨点赞支持一下哟~~😛