公司移动端商城使用前后分离方案,前台nginx静态文件,js使用requirejs模式,使用gulp压缩添加版本号时发现问题,

问题1、在公共的js配置中,引用的路径是写死的,缓存会一直存在。

解决方案是添加 urlArgs

构建时用shell脚本替换 'ttversion'为一个随机数值,我用的是当前时间。

问题2、其他模块引用的是common,那common.js不变的话,缓存会一直存在。

解决方案:还是用shell脚本,首先更改common.js为common_随机数.js,再更改所有引用了common.js的文件为新的名字common_随机数。

以上是针对requirejs的缓存更新,因为是每次构建都会生成新的文件名和版本号,所以这些资源是每次发版本都会更新的。

shell脚本:

DATE=$(date +%Y%m%d%s)
# 将common*.js中urlArgs 的版本变更
sed -i "s/ttversion/$DATE/g" common*.js #这里不要带后缀名
NEW_COMMON_JS_NAME=common_$DATE
# 将common.js更名
mv common*.js $NEW_COMMON_JS_NAME.js # 执行gulp 压缩js和html
cd /root/xxx/xxx/gulptask
rm -r src/*
cp -r temp/front src
#执行完gulp任务后,更改所有引用了commonjs的文件里的路径名
gulp && sed -i "s/lib\/common/lib\/$NEW_COMMON_JS_NAME/g" `grep lib\/common -rl ./src/front`
 知识点:sed -i "s/oldString/newString/g" `grep oldString disDir`  替换disDir目录下所有文件中的oldString为newString
     sed -i "s/oldString/newString/g" filename 替换指定文件中的内容

gulpfile.js:

// 引入 gulp
var gulp = require('gulp'); // 引入组件
var jshint = require('gulp-jshint'),
sass = require('gulp-sass'),
runSequence = require('run-sequence'),
concat = require('gulp-concat'),
uglify = require('gulp-uglify'),
rename = require('gulp-rename'),
revCollector = require('gulp-rev-collector'),//替换路径
rev = require('gulp-rev'),//对文件计算md5并加在文件名后面,需要修改源码
gulpif = require('gulp-if'),
condition = true,
minifyHtml = require('gulp-minify-html'),
minifyCss = require('gulp-clean-css'),
gulpUtil = require('gulp-util');
//var distDir = '/xx/xxx/front';
var distDir = 'src/front'; // 检查脚本
gulp.task('lint', function() {
gulp.src('src/front/js/**/*.js')
.pipe(jshint())
.pipe(jshint.reporter('default'));
}); // 编译Sass
gulp.task('sass', function() {
gulp.src('./scss/*.scss')
.pipe(sass())
.pipe(gulp.dest('./css'));
}); // 合并,压缩文件js
gulp.task('miniJs', function() {
var lastStream = null;
return gulp.src('src/front/js/**/*.js')
.pipe(uglify().on('error', gulpUtil.log))//压缩
.pipe(rev())//计算md5
.pipe(gulp.dest(distDir+'/js'))//输出压缩后的
.pipe(rev.manifest())
.pipe(gulp.dest('rev/js'))//生成rev-mainfest.json
// .on('end',function(){//一定要在压缩js执行完成后执行html压缩,否则会出现rev-mainfest.json还没生成,html却已经压缩完,导致js路径没替换
// lastStream = gulp.src(['rev/**/*.json','src/front/**/*.html'])
// .pipe(revCollector())
// .pipe(gulpif(
// condition, minifyHtml({
// empty: true,
// spare: true,
// quotes: true
// })
// ))
// .pipe(gulp.dest(distDir));
// })
}); gulp.task('miniHtml', function () {
return gulp.src(['rev/**/*.json', 'src/front/**/*.html'])//读取rev目录下的版本映射文件并替换html中的路径
.pipe(revCollector())
.pipe(gulpif(
condition, minifyHtml({
empty: true,
spare: true,
quotes: true
})//压缩
))
.pipe(gulp.dest(distDir));//输出
}); //压缩CSS/生成版本号
gulp.task('miniCss', function(){
return gulp.src('src/front/themes/**/*.css')
.pipe(gulpif(
condition, minifyCss({
compatibility: 'ie7'
})
))
.pipe(rev())
.pipe(gulp.dest(distDir+'/themes'))
.pipe(rev.manifest())
.pipe(gulp.dest('./rev/css'));//生成.json文件
});
//图片处理
gulp.task('revImg', function(){
return gulp.src('src/front/themes/**/*.{png,jpg,jpeg,gif,ico}')//知识点:匹配多个后缀
.pipe(rev())
.pipe(gulp.dest(distDir+'/themes'))
.pipe(rev.manifest())
.pipe(gulp.dest('./rev/img'));
}); // 默认任务,使用runSequence保证任务按顺序执行,miniJs和miniCss是并行执行的,miniHtml是在前两个任务执行完后再执行
gulp.task('default', function (done) {
runSequence(
['miniJs','miniCss'],
'miniHtml',
done);
})

参考:http://www.tuicool.com/articles/UbaqyyJ

gulp静态资源构建、压缩、版本号添加的更多相关文章

  1. Gulp:静态资源(css,js)版本控制

    为了防止客户端的静态资源缓存,我们需要每次更新css或js的时候,通过md5或时间戳等方式重新命名静态资源: 然后涉及到的html模板里的src也要做相应的修改,静态资源需要优化(压缩合并) 文件目录 ...

  2. Asp.Net静态资源动态压缩之WebOptimization

    一.Asp.Net中对Css/Js的动态压缩工具 WebOptimization 在Asp.NetMVC自带的模板项目中自动引入了当前WebOptimization工具.如果使用的空模板Nuget命令 ...

  3. gulp 静态资源版本控制

    package.json { "name": "gulp", "version": "0.0.1", "des ...

  4. gulp 自动化构建网站(版本号静态资源)

    前言 新的一年啦,感觉总是静不下心,用了一天的时间吧,算是对gulp 这个前端打包工具入门了,自己也写了demo,表示对这个稍微理解了吧, 当然还是有差距的啦,下面讲讲怎么用吧: 如何用 当然先去官网 ...

  5. SpringMVC+FreeMarker实现静态资源文件自动添加版本号(md5)

    近日切换java开发,开始学习springframework.在实现静态资源文件自动计算版本号的实例时,因为不熟悉框架,走了不少弯路,好在最终解决了问题.这里写篇文章记录一下实现,也希望对大家有些用处 ...

  6. Hexo瞎折腾系列(5) - 使用hexo-neat插件压缩页面静态资源

    为什么要压缩页面静态资源 对于个人博客来说,优化页面的访问速度是很有必要的,如果打开你的个人站点,加载个首页就要十几秒,页面长时间处于空白状态,想必没什么人能够忍受得了吧.我个人觉得,如果能把页面的加 ...

  7. 静态资源压缩(GZIP) 专题

    1.开GZIP有什么好处?答:Gzip开启以后会将输出到用户浏览器的数据进行压缩的处理,这样就会减小通过网络传输的数据量,提高浏览的速度.Tips:如果网站的用户分布比较分散,并且静态文件过大,可以将 ...

  8. 转转hybrid app web静态资源离线系统实践

    一.前言 目前的转转app是一个典型的hybrid app,采用的是业内主流的做法: 客户端内有大量业务页面使用webview内加载h5页面承载. 其优点是显而易见的,即:web页面上线频度满足快速迭 ...

  9. 【asp.net core 系列】5 布局页和静态资源

    0. 前言 在之前的4篇的内容里,我们较为详细的介绍了路由以及控制器还有视图之间的关系.也就是说,系统如何从用户的HTTP请求解析到控制器里,然后在控制器里处理数据,并返回给视图,在视图中显示出来.这 ...

随机推荐

  1. C++ STL快速入门

    在数月之前的机试中第一次体验到STL的威力,因为自己本来一直在用C语言做开发,很多数据结构都是自己造的,比如链表.队列等,第一次接触C++ STL后发现这些数据结构都已经给我提供好了,我直接拿去调用就 ...

  2. Winform调用WebKitBrowser,基于chrome内核WebKit的浏览器控件

    在C#中,默认的WebBrowser控件默认使用的是IE的core,而IE的种种遭人吐槽的诟病使我不敢轻易使用WebBrowser,因此,打算使用Chrome的内核替换IE.Chrome的内核使用的是 ...

  3. sql备份(.bak文件备份)

    第一步: 右键需要备份的数据库(这里以 MyDB 为例)-->任务-->备份

  4. cpp(第六章)

    1. #include <iostream> #include <limits> int main() { ; ) { std::cout<<"enter ...

  5. thphp5.0学习笔记(一)

    1.目录结构: 其中thinkphp子目录是框架核心目录 thinkphp结构: 2.入口文件 默认自带的入口文件位于public/index.php 应用目录为application,其结构: in ...

  6. nginx之 nginx + tomcat + redis 负载均衡且session一致性

    说明: 本文描述的是 nginx + tomcat + redis 实现应用负载均衡且满足session一致性,从安装到配置的全部过程,供大家学习!nginx 代理服务器ip: 10.219.24.2 ...

  7. Spring事务隔离级别

    REQUIRED:业务方法需要在一个容器里运行.如果方法运行时,已经处在一个事务中,那么加入到这个事务,否则自己新建一个新的事务. NOT_SUPPORTED:声明方法不需要事务.如果方法没有关联到一 ...

  8. IIS虚拟目录与UNC路径权限初探

    最近在一个项目中涉及到了虚拟目录与UNC路径的问题,总结出来分享给大家. 问题描述 某客户定制化项目(官网),有一个图片上传的功能.客户的Web机器有10台,通过F5负载均衡分摊请求. 假设这10台机 ...

  9. vue组件(Vue+webpack项目实战系列之三)

    组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.特别对于大型应用开发来说,尽量组件化,并且先造好轮子库,不要重复去写组件,这会显著提升项目 ...

  10. c++,函数名不要和某个类名相同 (syntax error : missing ';' before identifier....)

    直接上代码: // outside.h class Outside { private: class Inner { public: Inner(Outside& out) : out_(ou ...