前言

前端自动化构建工具从最开始的grunt, gulp, fis等到现在比较流行的webpack可谓层出不穷,个人还是比较倾向于gulp,虽然有的时候会因为某个插件的配置问题头疼很久,但不可否认gulp真的很灵活,而且个人觉得它和node结合起来比较舒服,再有对项目目录结构的要求比较低,即使再老再乱的项目也可以通过它进行整理和自动化构建。这里用本公司的一个老项目举例子。

项目目录

因为是老项目,各种资源的引用乱七八糟,首先花费大量时间把项目中所有静态资源全部整理至新的目录中,并且把原来项目中的路径全部替换掉。现在新的静态资源目录为项目根目录Public下,如下图:

初始化npm

安装node,完了继续npm init,下一步下一步生成package.json,里面包含了我们项目所需要的各种模块的依赖和基本信息。这里拿我的package.json举例:

{
"name": "test",
"version": "1.0.0",
"description": "test web gulp",
"main": "gulpfile.js",
"dependencies": {
"gulp": "^3.9.1",
"gulp-clean-css": "^3.9.0",
"gulp-concat": "^2.6.0",
"gulp-csso": "^1.1.0",
"gulp-filter": "^4.0.0",
"gulp-jshint": "^2.0.0",
"gulp-minify-html": "^1.0.6",
"gulp-rename": "^1.2.2",
"gulp-rev-collector": "^1.2.2",
"gulp-zip": "^4.0.0",
"jshint": "^2.9.5"
},
"devDependencies": {
"arr-flatten": "^1.1.0",
"array-differ": "^1.0.0",
"array-uniq": "^1.0.3",
"beeper": "^1.1.1",
"dateformat": "^2.2.0",
"expand-range": "^2.0.0",
"expand-tilde": "^2.0.2",
"extend-shallow": "^2.0.1",
"gulp-aliyun-oss": "^0.1.1",
"gulp-clean": "^0.3.2",
"gulp-make-css-url-version": "0.0.13",
"gulp-minify-css": "^1.2.4",
"gulp-replace": "^1.0.0",
"gulp-rev": "^7.1.2",
"gulp-uglify": "^1.5.4",
"has-gulplog": "^0.1.0",
"lodash": "^3.0.0",
"lodash._reescape": "^3.0.0",
"lodash._reevaluate": "^3.0.0",
"lodash._reinterpolate": "^3.0.0",
"lodash.assignwith": "^4.2.0",
"lodash.template": "^4.4.0",
"multipipe": "^0.1.2",
"object-assign": "^3.0.0",
"parse-filepath": "^1.0.1",
"repeat-element": "^1.1.2",
"replace-ext": "^0.0.1",
"run-sequence": "^1.2.2",
"through2": "^2.0.0",
"vinyl": "^0.5.0"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "hxj",
"license": "ISC"
}

安装依赖

这个没什么说的,安装相应功能的gulp插件,npm install package(安装的包名,如:gulp) —save-dev然后回车。

这里有一个很多人一直弄不明白的问题,就是为什么有时候加-save, 有时候加--save-dev,那么他们的区别到底是什么:

  —save-dev(也可以缩写成-D)输出的会出现在devDependencies,代表着是开发调试时的依赖,等到项目真正发布的时候不会真正出现在项目中。

  —save(也可以缩写成-S)输出的会出现在dependencies,代表着是发布后的依赖,等到项目真正发布的时候会真正出现在项目中,缺少它们项目会运行不了。

构建gulp任务

这里直接贴代码,构建出来的静态文件全部上传到阿里云oss,因为公司项目是用jenkins部署的,所以在jenkins中会专门有一个shell脚本用来执行gulp构建任务:

#!/bin/bash
if [ -f gulpfile.js ] ; then
/usr/bin/gulp buildBeta
else
echo "未找到gulpfile.js"
exit
fi #!/bin/bash
tar czf ROOT.tar.gz *

完整代码:

var gulp = require("gulp");
var runSequence = require('run-sequence'); // 按顺序逐个同步地运行 Gulp 任务
var oss = require('gulp-aliyun-oss'); // 阿里云上传文件
var cssmin = require('gulp-minify-css'); // 压缩css文件
var uglify = require('gulp-uglify'); //js压缩
var rev = require('gulp-rev'); // 为静态文件随机添加一串hash值, 解决cdn缓存问题
var clean = require('gulp-clean'); // 删除文件及文件夹
var revCollector = require('gulp-rev-collector'); //gulp-rev的插件 ,用于html模板更改引用路径 // 配置开发环境, 默认为测试环境
var ENV = "beta";
var config = {
beta: {
accessKeyId: '******',
accessKeySecret: '******',
region: '******',
bucket: '******',
prefix: 'www/',
domain: '//www.beta.example.com/www/'
},
prod: {
accessKeyId: '******',
accessKeySecret: '******',
region: '******',
bucket: '******',
prefix: 'www/',
domain: '//www.example.com/www/'
}
} // 配置输入输出路径
var path = {
base: "Public/static",
input: {
html: "app/Tpl/**/*.html",
css: "Public/static/styles/**/*.css",
js: "Public/static/script/**/*.js",
images: "Public/static/images/**/*",
},
output: "Public/target"
} function params() {
return (ENV == 'prod') ? config.prod : config.beta;
} // 压缩图片
gulp.task('imgmin', function() {
return gulp.src(path.input.images, { base: path.base })
.pipe(rev())
.pipe(gulp.dest(path.output))
.pipe(rev.manifest())
.pipe(gulp.dest(path.output + "/rev/images"));
}); // 压缩css
gulp.task('cssmin', function() {
return gulp.src(path.input.css, { base: path.base })
.pipe(cssmin({
advanced: false, //类型:Boolean 默认:true [是否开启高级优化(合并选择器等)]
compatibility: 'ie7', //保留ie7及以下兼容写法 类型:String 默认:''or'*' [启用兼容模式; 'ie7':IE7兼容模式,'ie8':IE8兼容模式,'*':IE9+兼容模式]
keepBreaks: false, //类型:Boolean 默认:false [是否保留换行]
keepSpecialComments: '*'
//保留所有特殊前缀 当你用autoprefixer生成的浏览器前缀,如果不加这个参数,有可能将会删除你的部分前缀
}))
.pipe(rev())
.pipe(gulp.dest(path.output))
.pipe(rev.manifest())
.pipe(gulp.dest(path.output + "/rev/styles"));
}); // 压缩js
gulp.task('jsmin', function() {
return gulp.src(path.input.js, { base: path.base })
.pipe(uglify({
mangle: true,
compress: true
}))
.pipe(rev())
.pipe(gulp.dest(path.output))
.pipe(rev.manifest())
.pipe(gulp.dest(path.output + "/rev/script"));
}); // css中的引用资源路径替换
gulp.task('replaceImgPath', function() {
return gulp.src(
[
path.output + "/rev/images/*.json",
path.output + "/styles/**/*.css"
]
)
.pipe(revCollector({
replaceReved: true // 用来说明模板中已经被替换的文件是否还能再被替换,默认是false
}))
.pipe(gulp.dest(path.output + "/styles"));
}); // 上传静态文件到oss
gulp.task('uploadOss', function(cb) {
var options = {
accessKeyId: params().accessKeyId,
accessKeySecret: params().accessKeySecret,
region: params().region,
bucket: params().bucket,
prefix: params().prefix,
ossOpt: {
headers: {
'Cache-Control': 'no-cache'
}
}
}; return gulp.src(['./Public/target/**/*', '!Public/target/rev/**/*']).pipe(oss(options));
}) /**
* 页面模版资源路径替换
*/
gulp.task('replaceHtml', function() {
return gulp.src([
path.output + "/rev/**/*.json",
path.input.html
])
.pipe(revCollector({
replaceReved: true,
dirReplacements: {
'/Public/static/': params().domain + '/',
}
}))
.pipe(gulp.dest('./app/Tpl/'));
}); /**
* 删除输出目录
*/
gulp.task('del', function() {
return gulp.src([path.output], { read: false }).pipe(clean());
}); //构建
gulp.task('buildBeta', function(done) {
ENV = "beta";
runSequence(
['imgmin'],
['cssmin'],
['jsmin'],
['replaceImgPath'],
['uploadOss'],
['replaceHtml'],
['del'],
done);
})
gulp.task('buildProd', function(done) {
ENV = "prod";
runSequence(
['imgmin'],
['cssmin'],
['jsmin'],
['replaceImgPath'],
['uploadOss'],
['replaceHtml'],
['del'],
done);
})

gulp前端自动化构建并上传oss的更多相关文章

  1. gulp前端自动化构建工具新手入门篇

    很久没有更新博文了. 经过了一次年前吐血的赶项目,终于在年后回血了.趁着有空,新学到了一个前端自动化构建工具-gulp. 现在我们通过这3个问题来学习一下: 1.什么是gulp? 2.为什么要用gul ...

  2. gulp前端自动化构建工具使用

    (1)新建项目目录gulp_web (2)项目目录下建目录src里面存放需要进行gulp处理的文件目录及文件 (3)gulpfile.js文件内容为声明需要打包应用的gulp组件及打包文件路径和打包任 ...

  3. gulp前端自动化构建工具入门篇

    现在我们通过这3个问题来学习一下: 1.什么是gulp? 2.为什么要用gulp? 3.怎么用?   什么是gulp 答:是一个前端自动化的构建工具,直白点说,如果没有这个工具,我们利用人工依旧可以做 ...

  4. gulp前端自动化构建工具

    博主不易,不求赞赏,希望把自己遇到的难点写出来,以及希望自己能有能力写出一篇不错的博文. 前端构建工具本人 bootstrap+jquery用gulp vue+element 用webpack 引文 ...

  5. gulp --- 前端自动化构建工具

    目录 1. gulp使用步骤 1.1 安装Node.js 1.2 全局安装gulp 1.3 安装项目依赖包gulp 1.3.1 了解package.json 1.3.2 根据package.json安 ...

  6. gulp 前端自动化工具

    一开篇 在前端开发的过程中,我们经常会碰到压缩.合并.图片script 等,于是就有了gulp 前端自动化构建工具,它能帮你在前端开发中,节省时间. 1,安装 node.js 因为gulp 构建工具是 ...

  7. 前端自动化构建工具gulp的使用总结

    前端自动化构建工具gulp的使用总结 博主最近偶的空闲,在此对gulp的使用做一个总结,让小伙伴知道如何合理的使用gulp以及gulp的使用技巧. 谈到gulp,有人可能就会想到另外一个构建工具gru ...

  8. 前端自动化构建工具——gulp

    gulp是基于流的前端自动化构建工具. 一.环境配置 gulp是基于nodejs的,所以没有 nodejs 环境的要先去安装好 然后给系统配上gulp环境 npm install -g gulp 再到 ...

  9. 前端自动化构建工具 Gulp 使用

    一个月没写博客了,今天有时间,就写个gulp的入门使用吧.. 简介:gulp是一个前端自动化构建工具,可以实现代码的检查.压缩.合并……等等,gulp是基于Node.js的自动任务运行器 一.安装No ...

随机推荐

  1. C++或C#调用外部exe的分析

    假如有个外部程序名为A.exe,放在目录E:\temp\下,然后我们用C++或者C#写一个程序调用这个A.exe的话(假设这个调用者所在的路径在D:\invoke),通常会采用下面的代码: // C# ...

  2. 【盛派周三分享-2019.2.20】开放分享内容,本期主题:《SCF、DDD及相关架构思想讨论》

    “周三分享”是盛派网络约定的每周三晚上定时举办的内部分享活动,活动主要由技术人员分享各方面的技术主题,并由所有参与者围绕主题进行讨论.除技术话题外,也可能涉及到相关的设计.财税.金融.政策等方面的延伸 ...

  3. 【安富莱二代示波器教程】第6章 示波器设计—双通道ADC驱动

    第6章        示波器设计—双通道ADC驱动 本章节为大家讲解示波器的ADC驱动,采用STM32自带ADC实现.关于STM32F429的ADC,可以说处处有地雷,不小心就踩上了,如果简单的使用, ...

  4. [Swift]LeetCode598. 范围求和 II | Range Addition II

    Given an m * n matrix M initialized with all 0's and several update operations. Operations are repre ...

  5. 写给需要的Javaer-大数据学习路线篇

    已经更新100+篇~ 关注公众号,BAT大神带你飞~ 听说你还在写Java,看Spring,看Dubbo,今天SpringCloud, 明天Dubbo3.X新版本... 10个开发9个半在写Java后 ...

  6. 【视频】使用ASP.NET Core开发GraphQL服务

    GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时. GraphQL来自Facebook,它于2012年开始开发,2015年开源. GraphQL与编程语言无关,可以使用很 ...

  7. Mongodb的集合插入一个字段

    在mongodb的现有集合中增加一个字段: db.rules.update({"_id" : ObjectId("587e5e0e09a4670334208e88&quo ...

  8. 4.DOM

    定义 文档对象模型(Document Object Model)是一种用于HTML和XML文档的编程接口. 查找元素 1.直接查找 document.getElementById 根据ID获取一个标签 ...

  9. 【netty】(1)---BIO NIO AIO演变

    BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使用的技术. Net ...

  10. ConcurrentModificationException 异常处理

    在工作中碰到有个异常:java.util.ConcurrentModificationException 腾讯bugly工具给出的解决方案和说明如下:该异常表示迭代器迭代过程中,迭代的对象发生了改变, ...