「本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!」css
Gulp
单独对样式进行打包来实现按需引入🏇Webpack
配置插件也是能够作到的,就当是复习巩固一次Gulp
吧Gulp
和Webpack
的区别能够参考我以前的文章:谈谈gulp和webpack?✔️node
和npm
node --version
npm --version
复制代码
gulpBegin
中建立一个gulpfile.js
空的js
文件mkdir gulpBegin
cd gulpBegin
echo test>gulpfile.js
复制代码
gulpfile.js
文件中定义咱们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 容许你使用现有
JavaScript
知识来书写gulpfile
文件,或者利用你所掌握的gulpfile
经验来书写普通的JavaScript
代码。虽然gulp
提供了一些实用工具来简化文件系统和命令行的操做,可是你所编写的其余代码都是纯JavaScript
代码。html
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成员
复制代码
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
有挺多的但经常使用的也只有那几个,剩下的有用到就去文档找就能够了读取
出来进行一些操做转换
再放到下一个地方
进行加工
最后再把处理好的文件写入
到一个指定的地方.pipe(写入流)
,实现数据写入src()
dest()
举个例子node
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
自动生成了文件,这就是读取和写入流压缩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 */
{
"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
的细节也还有不少若是感兴趣的话能够去官网文档查查看,相信聪明的你一下就能看懂Webpack的基本配置和打包与介绍(一)⚡️webpack
为了方便,我改了别人的轮子😅json