zoukankan      html  css  js  c++  java
  • 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'),//对文件计算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

  • 相关阅读:
    转载 设计模式大集锦 程序员面试全攻略
    转载 如何给项目选择最合适的编程语言?
    python–ntohll和htonll的实现(转载)
    python 动态加载模块和类
    转载 推荐9个非常有用的开发技巧给Web开发者
    python PyDev统一编码
    mysql 设置编码
    Python MySQLdb.connect连接lampp中mysql服务器问题的解决
    转载 Python编码时的注意事项
    转载 Web前端:11个让你代码整洁的原则
  • 原文地址:https://www.cnblogs.com/oyx305/p/5823195.html
Copyright © 2011-2022 走看看