前端自动化构建工具gulp的安装和使用(包括添加版本号)

     一直以来工作中都没有用到过gulp,所以一直没花时间去看,前段时间做公司年会项目的时候,因为是微信端的网页应用,需要在手机上运行,但是手机的缓存会导致每次修改的代码没有生效,于是每次修改了css和js都要重新修改对应的css和js的版本号,特别麻烦,于是开始学习gulp,网上与gulp相关的文章写的都不太清楚,所以一直看不明白。综合自己看到的几篇文章,结合自己的理解之后,重新写了一篇,希望对大家有所帮助,文章中有不正确的地方,欢迎批评指正!

1、安装nodejs;

2、新建package.json文件;

3、全局和本地安装gulp;

4、安装gulp插件;

5、新建gulpfile.js文件;

6、通过命令提示符运行gulp任务。


一、安装nodejs

https://nodejs.org/en/选择对应的版本下载

二、使用命令行

node -v查看安装的nodejs版本,出现版本号,说明刚刚已正确安装nodejs。PS:未能出现版本号,请尝试注销电脑重试;

npm -v查看npm的版本号,npm是在安装nodejs时一同安装的nodejs包管理器

cd定位到目录,用法:cd + 路径;

dir列出文件列表;

cls清空命令提示符窗口内容

新建项目工程gulp_web(可以自定义其他名称),原文件夹的名称为assets

压缩后的文件夹的名称为build

在命令行打开gulp_web文件夹所在的路径,执行下图所示操作

三、全局安装gulp

1、说明:全局安装gulp目的是为了通过她执行gulp任务;

2、安装:命令提示符执行cnpm install gulp -g;(npm安装有问题可以换成cnpm,cnpm安装过程自行百度)

3、查看是否正确安装:命令提示符执行gulp -v,出现版本号即为正确安装。

安装gulp的时候,可能会提示gulp安装失败,如图所示,遇到这个问题,可能是node的版本过低,重新安装下node的最新版本

四、新建package.json文件

1、说明:package.json是基于nodejs项目必不可少的配置文件,它是存放在项目根目录的普通json文件;

2、它是这样一个json文件(注意:json文件内是不能写注释的,复制下列内容请删除注释):

{

  "name":"test",  //项目名称(必须)

  "version":"1.0.0",  //项目版本(必须)

  "description":"This is for study gulp project !",  //项目描述(必须)

  "homepage":"",  //项目主页

  "repository":{    //项目资源库

    "type":"git",

    "url":"https://git.oschina.net/xxxx"

  },

  "author":{    //项目作者信息

    "name":"surging",

    "email":"surging2@qq.com"

  },

  "license":"ISC",    //项目许可协议

  "devDependencies":{    //项目依赖的插件

    "gulp":"^3.8.11",

    "gulp-less":"^3.0.0"

  }

}

3、当然我们可以手动新建这个配置文件,命令提示符执行cnpm init

五、本地安装gulp插件

接着开始本地安装gulp各种插件,在这里找你需要的插件。有四个是用得最多的,必备的

1、语法检查   (gulp-jshint)

2、合并文件   (gulp-concat)

3、压缩代码   (gulp-uglify)

4、文件重命名   (gulp-rename)

常用插件安装步骤:

本示例以gulp-less为例(编译less文件),命令提示符执行cnpm install gulp-less --save-dev

为了能正常使用,我们还得本地安装gulp

cnpm install gulp --save-dev

cnpm install gulp-sass --save-dev

cnpm install gulp-concat --save-dev;多个文件合并为一个

cnpm install gulp-minify-css --save-dev;将CSS压缩处理成一行(以前的写法)

cnpm install gulp-clean-css --save-dev;将CSS压缩处理成一行(现在常用gulp-clean-css)

cnpm install gulp-uglify --save-dev;生产环境下将JS压缩处理成一行

cnpm install gulp-sourcemaps --save-dev

cnpm install gulp-smushit --save-dev;图片压缩

npm install gulp-rev --save-dev;对文件名加MD5后缀

cnpm install gulp-rev-collector --save-dev;路径替换

cnpm install run-sequence --save-dev

cnpm install del --save-dev

安装过程如下图

--save-dev 是可以省掉你手动修改package.json文件的步骤,正常情况下得连同版本号手动将他们添加到模块配置文件package.json中的依赖里

安装成功后的插件在package.json文件的devDependencies中可以看到,如下图

PS:细心的你可能会发现,我们全局安装了gulp,项目也安装了gulp,全局安装gulp是为了执行gulp任务,本地安装gulp则是为了调用gulp插件的功能。

更改gulp-rev和gulp-rev-collector(重要)

1.打开node_modules\gulp-rev\index.js

  第135行: manifest[originalFile] = revisionedFile;

  更新为: manifest[originalFile] = originalFile + '?v=' + file.revHash;

2.打开node_modules\rev-path\nodemodules\rev-path\index.js

第9行:return modifyFilename(pth, (filename, ext) => `${filename}-${hash}${ext}`);

更新为: returnmodifyFilename(pth, (filename, ext) =>`${filename}${ext}`);

3.打开node_modules\gulp-rev-collector\index.js

第40行: var cleanReplacement =  path.basename(json[key]).replace(new RegExp( opts.revSuffix ), '' );

更新为: var cleanReplacement =path.basename(json[key]).split('?')[0];

安装配置完成,要开始写代码啦。

六、新建gulpfile.js文件(非常重要)

在项目目录gulp_web下新建gulpfile.js文件,gulp有五种方法:task,run,watch,src,和dest.

说明:gulpfile.js是gulp项目的配置文件,是位于项目根目录的普通js文件(其实将gulpfile.js放入其他文件夹下亦可)

它的内容大致是这样的,如下:

// 引入 gulp

var gulp = require('gulp');

// 引入组件

var cssminify = require('gulp-minify-css');// 压缩CSS

var uglify = require('gulp-uglify');// 生产环境下压缩JS

var smushit = require('gulp-smushit');// 图片压缩

var rev = require('gulp-rev');// 对文件名加MD5后缀(版本号)

var revCollector = require('gulp-rev-collector');// 路径替换

var runSequence = require('run-sequence');

var del = require('del');

// 创建一个名为css的任务

gulp.task('css',function(){

return gulp.src('./asset/css/*.css')// 该任务针对的css文件

       .pipe(cssminify())// 将css压缩处理成一行

       .pipe(rev())// 文件名加MD5后缀

       .pipe(gulp.dest('./build/css'))// 生成到根目录build文件夹下

       .pipe(rev.manifest())// 生成一个rev-manifest.json

       .pipe(gulp.dest('./rev/revcss'));// 将rev-manifest.json保存到revcss目录内

});

// 创建一个名为script的任务

gulp.task('script',function(){

return gulp.src('./asset/scripts/app/*.js')// 获取全部的js文件     

       .pipe(uglify())// 生产环境下将JS压缩处理成一行

       .pipe(rev())// 文件名加MD5后缀

       .pipe(gulp.dest('./build/scripts/app'))// 生成到根目录build文件夹下

       .pipe(rev.manifest())// 生成一个rev-manifest.json

       .pipe(gulp.dest('./rev/revjs'));// 将rev-manifest.json保存到revjs目录内

});

gulp.task('revHtml',function () {

return gulp.src(['./rev/**/*.json','./asset/view/*.html'])// 读取rev-manifest.json文件以及需要进行css名替换的文件

       .pipe(revCollector())// 执行文件内css名和js名的替换

       .pipe(gulp.dest('./build/view'));// 替换后的文件输出的目录,Html更换css、js文件版本

});

// 在样式文件中修改的内容一旦保存可以直接在显示器显示渲染效果,无需刷新浏览器,这就是watch的功能。

gulp.task('watch',function () {

gulp.watch(['./asset/css/*.css'], ['css']);

gulp.watch(['./asset/scripts/app/*.js'], ['script']);

gulp.watch(['./rev/**/*.json','./asset/view/*.html'], ['revHtml']);

});

gulp.task('dev',function (done) {

condition =false;

runSequence(

['css'],

['script'],

['revHtml'],

['watch'],

done);

});

// 执行命令gulp clean

gulp.task('clean',function (cb) {

del([

// 这里我们使用一个通配模式来匹配 文件夹中的所有东西

       './build/css/*',

'./build/scripts/app/*',

       './build/view/*'

   ], cb);

});

// 执行命令gulp

gulp.task('default', ['dev']);

完成以上配置,现在开始写你的代码啦!代码写完再执行下面的七。

七、运行gulp

1、说明:命令提示符执行gulp 任务名称

2、gulp clean 清空生成的文件

3、当执行gulp default或gulp将会调用default任务里的所有任务

八、使用webstorm运行gulp任务或者命令提示符执行gulp

1、说明:使用webstorm可视化运行gulp任务;

2、使用方法:将项目导入webstorm,右键gulpfile.js 选择”Show Gulp Tasks”打开Gulp窗口,若出现”No task found”,选择右键”Reload tasks”,双击运行即可。


踩过的坑:

来谈谈我遇到的一点小小的坑。

  代码敲完,需要回到命令行,运行gulp。直接输入gulp,就开始运行,期间会报一些error,不要紧张,指的是js文件里一些语法错误,无伤大雅,成功创建出压缩文件才是最终目的。

        那么如果需要修改代码,必须一直把cmd控制台保持打开状态,否则无法执行watch操作。第一点坑,就是编辑器的自动保存功能,一行代码如果写的不顺,或是中途打岔,比如‘$scope.’,还没接着写完,编辑器自动保存的功能会使jshint检查出语法错误,导致gulp的停止运行。

如果用的是webstrom编辑器的,可以不用每次打开命令行,右键选中gulpfile.js,show gulp tasks,再点击default即可。

操作过程中,我遇到的第二个坑就是安装gulp插件。由于我的电脑以前就安装过node,所以没有重新安装,导致运行cnpm install gulp --save-dev的时候,一直安装gulp报错,后来重新安装了最新版的node之后,再运行cnpm install gulp --save-dev就可以成功安装gulp了。

遇到的第三个坑就是添加版本号,找了好几篇文章都说的不清楚,研究了好久才成功,以上我的代码是经过自己验证过才贴上去的,可以达到当修改asset里面的css和js,同步改变build里面的css和js的目的,同时会使得html里面的版本号发生改变,可解决缓存问题。

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

推荐阅读更多精彩内容