gulp前端自动化构建并上传oss
前言
前端自动化构建工具从最开始的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的更多相关文章
- gulp前端自动化构建工具新手入门篇
很久没有更新博文了. 经过了一次年前吐血的赶项目,终于在年后回血了.趁着有空,新学到了一个前端自动化构建工具-gulp. 现在我们通过这3个问题来学习一下: 1.什么是gulp? 2.为什么要用gul ...
- gulp前端自动化构建工具使用
(1)新建项目目录gulp_web (2)项目目录下建目录src里面存放需要进行gulp处理的文件目录及文件 (3)gulpfile.js文件内容为声明需要打包应用的gulp组件及打包文件路径和打包任 ...
- gulp前端自动化构建工具入门篇
现在我们通过这3个问题来学习一下: 1.什么是gulp? 2.为什么要用gulp? 3.怎么用? 什么是gulp 答:是一个前端自动化的构建工具,直白点说,如果没有这个工具,我们利用人工依旧可以做 ...
- gulp前端自动化构建工具
博主不易,不求赞赏,希望把自己遇到的难点写出来,以及希望自己能有能力写出一篇不错的博文. 前端构建工具本人 bootstrap+jquery用gulp vue+element 用webpack 引文 ...
- gulp --- 前端自动化构建工具
目录 1. gulp使用步骤 1.1 安装Node.js 1.2 全局安装gulp 1.3 安装项目依赖包gulp 1.3.1 了解package.json 1.3.2 根据package.json安 ...
- gulp 前端自动化工具
一开篇 在前端开发的过程中,我们经常会碰到压缩.合并.图片script 等,于是就有了gulp 前端自动化构建工具,它能帮你在前端开发中,节省时间. 1,安装 node.js 因为gulp 构建工具是 ...
- 前端自动化构建工具gulp的使用总结
前端自动化构建工具gulp的使用总结 博主最近偶的空闲,在此对gulp的使用做一个总结,让小伙伴知道如何合理的使用gulp以及gulp的使用技巧. 谈到gulp,有人可能就会想到另外一个构建工具gru ...
- 前端自动化构建工具——gulp
gulp是基于流的前端自动化构建工具. 一.环境配置 gulp是基于nodejs的,所以没有 nodejs 环境的要先去安装好 然后给系统配上gulp环境 npm install -g gulp 再到 ...
- 前端自动化构建工具 Gulp 使用
一个月没写博客了,今天有时间,就写个gulp的入门使用吧.. 简介:gulp是一个前端自动化构建工具,可以实现代码的检查.压缩.合并……等等,gulp是基于Node.js的自动任务运行器 一.安装No ...
随机推荐
- AI应用开发实战
AI应用开发实战 出发点 目前,人工智能在语音.文字.图像的识别与解析领域带来了跨越式的发展,各种框架.算法如雨后春笋一般,互联网上随处可见与机器学习有关的学习资源,各大mooc平台.博客.公开课都推 ...
- Go语言反射reflect
目录 通过反射获取类型信息 理解反射的类型(Type)与种类(Kind) reflect.Elem() - 通过反射获取指针指向的元素类型 通过反射获取结构体的成员类型 通过反射获取值信息 使用反射值 ...
- [Swift]LeetCode448. 找到所有数组中消失的数字 | Find All Numbers Disappeared in an Array
Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and ot ...
- [Swift]LeetCode513. 找树左下角的值 | Find Bottom Left Tree Value
Given a binary tree, find the leftmost value in the last row of the tree. Example 1: Input: 2 / \ 1 ...
- [Swift]LeetCode698. 划分为k个相等的子集 | Partition to K Equal Sum Subsets
Given an array of integers nums and a positive integer k, find whether it's possible to divide this ...
- 解决SpringMVC中文乱码问题 -----这是服务器返回参数到前端中文乱码
方法一,使用(produces = "application/json; charset=utf-8"): @RequestMapping(value="/getUser ...
- MySQL优化之推荐使用规范
一.基础规范 使用InnoDB存储引擎支持事务.行级锁.并发性能更好.CPU及内存缓存页优化使得资源利用率更高 推荐使用utf8mb4字符集无需转码,无乱码风险, 支持emoji表情以及部分不常见汉字 ...
- 微信小程序实战--集阅读与电影于一体的小程序项目(一)
1.首页欢迎界面 项目目录结构 新建项目ReaderMovie,然后新建文件,结构如下 welcome.wxml <view class='container'> <image cl ...
- ubuntu 下安装docker 踩坑记录
ubuntu 下安装docker 踩坑记录 # Setp : 移除旧版本Docker sudo apt-get remove docker docker-engine docker.io # Step ...
- 『玩具装箱TOY 斜率优化DP』
玩具装箱TOY(HNOI2008) Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊 ...