gulp静态资源构建、压缩、版本号添加

公司移动端商城使用前后分离方案,前台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‘),
  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);
})
时间: 2024-12-14 22:25:43

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

仿淘宝 css,js 等静态资源合并压缩输出的 jsp 脚本 combo.jsp

原文:仿淘宝 css,js 等静态资源合并压缩输出的 jsp 脚本 combo.jsp 源代码下载地址:http://www.zuidaima.com/share/1550463482612736.htm 仿淘宝 css,js 等静态资源合并压缩输出的 jsp 脚本 自己在项目中有用到,用于脚本合并输出 , 使用示例: <link rel="stylesheet" type="text/css" href="http://www.zuidaima.c

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

为了防止客户端的静态资源缓存,我们需要每次更新css或js的时候,通过md5或时间戳等方式重新命名静态资源: 然后涉及到的html模板里的src也要做相应的修改,静态资源需要优化(压缩) 文件目录结构 html模板文件 <html> <head> <link rel="stylesheet" href="../styles/one.css"> <link rel="stylesheet" href=&qu

gulp 静态资源版本控制

1:安装nodejs2:npm install --save-dev gulp npm install --save-dev gulp-rev npm install --save-dev gulp-rev-collector npm install --save-dev gulp-asset-rev npm install --save-dev run-sequence 3:在项目根目录下创建gulpfile.js(配置如下) gulpfile.js 配置 //引入gulp和gulp插件 va

使用gulp自动化打包合并前端静态资源(CSS、JS文件压缩、添加版本号)

现在正在做的项目更新迭代比较频繁,会经常对前端代码打包部署,手动整合代码文件很麻烦并且浪费时间,所以决定使用gulp来代替手工完成这项工作. 前端静态资源在发版更新时会面临客户端浏览器缓存的问题(可参考这篇文章),解决这个问题可以采用两类方法:覆盖方法(引用资源时加版本号,不修改资源文件名).非覆盖方法(修改资源文件名),本篇文章主要采用的是第一种加版本号的方式,主要用gulp给静态资源自动加版本号和压缩CSS.JS. 原理:通过对JS,CSS文件内容进行Hash运算,生成一个文件的唯一Hash

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

一.前言 目前的转转app是一个典型的hybrid app,采用的是业内主流的做法: 客户端内有大量业务页面使用webview内加载h5页面承载. 其优点是显而易见的,即:web页面上线频度满足快速迭代的业务需求,不受客户端审核和发版的时间限制,也可以将各个业务线的开发工作分摊到各个业务的fe团队上,使得个业务线可以并行开发. 而缺点,则不言而喻的在于客户端内webview加载h5页面,准确来说是web应用的性能和体验,是肯定不及客户端的.本篇文章中,笔者将会梳理立足于本团队内,根据团队的特点和

vue打包后出现静态资源|(图片,json数据)找不到路径

最近在学习Vue是如何编写项目的,在踩了许多坑后,终于要到了最后一步npm run build了,很开心的等待奇迹,然后打包后出现了找不到图片路径的问题. 解决办法:1.将图片或者json数据文件夹放到static的文件夹中,这样打包后webpack会自动打包 2.在build的文件夹下找到utils.js的文件,修改打包后静态资源的路径,添加 publicPath: '../../' 原文地址:https://www.cnblogs.com/klkitty/p/9099472.html

使用node搭建静态资源服务器(2)

在上一篇使用node搭建静态资源服务器(1)中,我们已经实现了基本的功能,下面继续实现进阶功能. 静态资源的压缩 //compress.js module.exports = (rs,req,res) => { const acceptEncoding = req.headers['accept-encoding']; if(!acceptEncoding || !acceptEncoding.match(/\b(gzip|defalte)\b/)) { return rs; }else if(

gulp教程之静态资源压缩

1 创建项目 安装nodejs/全局安装gulp/本地安装gulp/创建package.json和gulpfile.js文件,项目目录如下: 2 压缩插件简介 gulp-useref 合并html里面的js/css gulp-concat用于合并文件,把也就是多个文件合并到一个文件中,以节省存储空间 gulp.spritesmith 图片合并成雪碧图 3 本地安装插件 安装gulp-useref npm install gulp-useref --save-dev 安装gulp-concat n

gulp之静态资源的版本控制

最近,因为校友网项目开始有些规模了.开始就要考虑对静态资源进行工程自动化的管理.一讲到前端的自动化工具,大家或许都会想到Grunt,Gulp,或者百度的FIS.这三个都有各自的特点,大家可以依据自己的喜好,选择工具.至于为什么选择Gulp,因为Grunt的gruntfile配置真的很头大好吗!简直看到头晕晕,但是还是有不少人喜欢这种方式的.然后FIS真心很强大,你所需要的,基本它都提供了,并且做得很好很简单,如果你急于马上使用可以赶紧去看看.而我为什么不用呢,感觉可能是因为,有点黑盒子?哈哈哈.