gulp构建详细流程

简介

gulp是前端开发过程中对代码进行自动化构建的工具,它不仅能对网站资源进行优化,而且在开发过程中能避免很多重复的工作,比如对相关文件的操作,还有自动监视一些文件的变化等功能。

构建流程

Node.js安装

gulp是基于Node开发环境运行的,所以需要使用npm的包管理工具去安装它。要使用npm,就必须安装Node.js,可前往Node.js的官网下载:

http://nodejs.cn/download/

下载并安装完成后,运行Node.js command prompt并输入命令:

node -v  // 出现版本号即为node安装成功
npm -v  // 出现版本号即为npm安装成功

gulp安装

安装好Node.js之后,接着在Node.js command prompt中输入命令:

npm install -g gulp         
// 全局安装gulp,”-g”代表全局

gulp -v
// 出现版本号即为gulp安装成功

cd 项目根目录所在位置                   
// 进入到项目根目录 

npm init                    
// 初始化项目,之后是一连串的信息填写,最后生成package.json

npm install gulp --save-dev 
// 项目安装gulp依赖
// --save的作用是将配置信息保存至package.json文件中
// -dev的作用是保存至package.json中的devDependencies对象内,不指定则会保存到dependencies对象中

如果对于前端自动化构建工具熟悉的朋友应该知道,package.json定义了项目所需要的各种模块,以及项目的配置信息,接下来我主要对这个文件的内容进行介绍(PS:规范的package.json不能出现注释):

{
  "name": "test",               //项目名称
  "version": "1.0.0",           //项目版本
  "description": "This is my first gulp project !",   //项目描述
  "homepage": "index.js",               //项目主页
  "repository": {             
    "type": "git",                      //仓库类型
    "url": "https://git.oschina.net/xxxx"              //仓库地址
  },
  "scripts": {
    "dev": "cross-env NODE_ENV=dev gulp dev",
    "build": "cross-env NODE_ENV=production gulp build"
  },
  "author": {                 
    "name": "alolonghun",          //作者名
    "email": "906268297@qq.com"    //作者邮箱
  },
  "license": "ISC",                //项目许可协议
  "devDependencies": {             //项目开发环境依赖的插件
    "gulp": "^3.9.1",
    "gulp-less": "^3.3.2",
    "gulp-sass": "^3.1.0",
    "cross-env": "^5.0.5",
    "del": "^3.0.0",
    "gulp-concat": "^2.6.1",
    "gulp-uglify": "^3.0.0",
    "webpack": "^3.5.5"
  },
  "dependencies": {             //项目生产环境依赖的插件
    ...
  }
}

如果对于package.json文件还有什么不理解的,可以输入以下命令获取帮助:

npm help package.json

相关依赖插件的安装

依然在Node.js command prompt中操作:

npm install gulp-less cross-env del gulp-concat gulp-uglify webpack --save-dev
//一次性可安装多个依赖插件

这里要注意一下:
由于网络原因,gulp-sass的安装比较特殊,可能会安装失败,因为安装过程中部分细节会到亚马逊云服务器上获取文件,获取失败则安装不了。
详细安装过程如下:
执行安装gulp-sass命令,这个过程中会先安装 node-sass ,因为 gulp-sass 依赖于 node-sass 。中间出现的错误信息类似下面这条:
Cannot download https://github.com/sass/node-sass/releases/download/v3.4.2/win32-x64-46_bind
现象是这些二进制文件使用了GitHub的lfs 服务,而lfs使用的是亚马逊云,由于网络原因,这些服务器无法访问。
解决方法有以下三种:

方法一:进入项目根目录,执行命令(最简单的方法):
npm install --save-dev gulp-sass@latest

方法二:首先全局环境下配置淘宝镜像(PS:这里是全局环境,不是项目根目录)
执行语句:npm install -g cnpm --registry=https://registry.npm.taobao.org
然后进入项目根目录,执行语句:cnpm install --save-dev node-sass
仍然是项目根目录,执行语句: npm install --save-dev gulp-sass

方法三:下载源码,然后自己编译一个二进制文件或翻墙下载一个官方的二进制文件,来解决该文件的下载问题,之后就能顺利安装gulp-sass了。
可参考:http://blog.csdn.net/jimmyhandy/article/details/50723174

编写gulpfile.js文件

gulpfile.js是gulp项目的配置文件,负责配置编译打包等相关任务,gulpfile.js类似JS的语法,也支持ES6,具体可参照gulp.js官网的语法:

http://www.gulpjs.com.cn/docs/api/

这里简单介绍一下gulpfile.js:

// 使用 require('node_modules里对应模块') 的语法
// 引入gulp
var gulp = require('gulp');

//导入相关插件包 
var less = require('gulp-less'),
    sass = require('gulp-sass'),
    minifycss = require('gulp-minify-css'),
    concat = require("gulp-concat"),
    uglify = require("gulp-uglify"),
    del = require("del");
 
// "./src/a.js":当前目录中src目录下的a.js文件;
// "*":匹配所有文件            例:src/*.js(包含src下的所有js文件);
// "**":匹配0个或多个子文件夹   例:src/**/*.js(包含src的0个或多个子文件夹下的js文件);
// "{}":匹配多个属性           例:src/{a,b}.js(包含a.js和b.js文件)  src/*.{jpg,png,gif}(src下的所有jpg/png/gif文件);
// "!":排除文件                例:!src/a.js(不包含src下的a.js文件);
var src = {
    images: './src/**/*.{png,jpg,jpeg,svg}',
    js: './src/**/*.js',
    less: './src/**/*.less',
    scss: './src/**/*.scss'
};

// gulp.task(name[, deps], fn) 定义任务  name:任务名称 deps:依赖任务名称 fn:回调函数
// gulp.src(globs[, options]) 执行任务处理的文件  globs:处理的文件路径(字符串或者字符串数组) 
// gulp.dest(path[, options]) 处理完后文件生成路径
// gulp.watch(glob[, opts], tasks) 监视文件,并且可以在文件发生改动时候做一些事情。
// 注意:gulp.run()方法已被废弃

// 创建一个"clean"任务,作用是在编译文件之前清空dist目录下的文件 
gulp.task('clean', function(cb) { 
    return del([
        './dist/**/*'
    ], cb); 
});

// sass 任务会编译scss文件,并把编译完成的css文件保存到指定目录中
 gulp.task('sass',function () {
     gulp.src(src.scss)
         .pipe(sass({outputStyle: 'compact'}))     //sass转css
         .pipe(minifycss())                        //压缩css
         .pipe(gulp.dest("./dist/css"));           //输出到./dist/css目录下
 });

// 同上,创建一个名为"less"的任务
gulp.task(less', function () {
    gulp.src(src.less)                  
        .pipe(less())                     //less转css
        .pipe(minifycss())                //压缩css
        .pipe(gulp.dest('./dist/css'));   //输出到./dist/css目录下
});

// 合并,压缩文件
// scripts任务会合并所有js文件,压缩合并后的文件,输出到dist目录。
 gulp.task('scripts',function () {
     gulp.src(src.js)
         .pipe(concat('index.js'))         //合并所有js文件到index.js
         .pipe(uglify())                   //压缩合并后的文件
         .pipe(gulp.dest("./dist"))        //输出到dist目录下
 });

//创建dev任务
 gulp.task('dev',function(){
    // 监听文件变化
     gulp.watch("src/**/*", ['sass', 'less', 'scripts']);
 });
 
//创建build任务,关联和运行上面定义的任务
gulp.task('build', ['sass', 'less', 'scripts']); 

程序运行及打包

运行命令:npm run dev
打包命令:npm run build

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容