gulp自动化打包及静态文件自动添加版本号

前端自动化打包发布已是一种常态,尤其在移动端,测试过程中静态资源的缓存是件很头疼的事情,有时候明明处理的bug测试还是存在,其实就是缓存惹的祸,手机不比pc浏览器,清理缓存还是有点麻烦的。所以自动化实现静态资源的版本更新才是正道。

实际开发过程中,我们常用到的功能包括:

1、目标路径的清除;

2、静态资源复制到目标路径;

3、css文件的合并与压缩;

4、js文件的合并与压缩;

5、根据文件的变化添加版本号;

第1、2、3、4几个功能倒是很好解决,今天主要说说gulp实现静态资源自动添加版本号;

搜了不少资料,发现都不是想要的,我希望实现的效果是:

<script type="text/javascript" src="../../scripts/app_common.js?v=51921f3"></script>

但是大部分插件实现的效果类似下面,而且看起来很麻烦

<script type="text/javascript" src="../../scripts/app_common-51921f3.js"></script>

这样会导致一个问题,每次都会生成新的文件,而且必须同时修改html的引用。

下面说说我的解决方案:

这是目录结构,不同的结构可能在处理上会有些不同。

用到的gulp插件是:gulp-asset-rev

先下载插件: npm install --save-dev gulp-asset-rev

Example:

var gulp = require(‘gulp‘);
var assetRev = require(‘gulp-asset-rev‘);

gulp.task(‘rev‘,[‘revCss‘],function() {
    gulp.src("./test/test.html")
        .pipe(assetRev())
        .pipe(gulp.dest(‘./dest‘));
});

gulp.task(‘revCss‘,function () {
    return gulp.src(‘./test/styles/test.css‘)
        .pipe(assetRev())
        .pipe(gulp.dest(‘./dest/styles/‘))
});
gulp.task(‘default‘,[‘rev‘]);

使用前:

<html lang="en">
<head>
    <meta charset="utf-8"/>
    <title></title>
    <link rel="stylesheet" href="./styles/test.css" type="text/css" />
</head>
<body>
    <div>
        <img src="./images/test.png" />
    </div>
    <script src="./scripts/test.js" type="text/javascript"></script>
</body>
</html>

使用后:

<html lang="en">
<head>
    <meta charset="utf-8"/>
    <title></title>
    <link rel="stylesheet" href="./styles/test_0ede2cf.css" type="text/css" />
</head>
<body>
    <div>
        <img src="./images/test_25cf2b4.png" />
    </div>
    <script src="./scripts/test_8ced4e6.js" type="text/javascript"></script>
</body>
</html>

很显然它把整个文件名都给改了,不符合我们之前只在文件后面添加版本号参数的需求。我们可以在源文件中做点手脚。

找到node_modules --> gulp-assets-rev -->index.js 修改为如下代码:

var verStr = (options.verConnecter || "") + md5;
    src=src+"?v="+verStr;

实际上MD5人家都已经算好了,最后只是拼凑了显示方式,所以我们可以按照自己的需求去组合就行了。so easy~

完整配置如下:

package.json

{
  "name": "StagingFinancial",
  "version": "0.0.1",
  "description": "Pages for Staging Financial App",
  "devDependencies": {
    "browser-sync": "*",
    "del": "*",
    "gulp": "*",
    "gulp-asset-rev": "*",
    "gulp-concat": "*",
    "gulp-if": "*",
    "gulp-jshint": "*",
    "gulp-load-plugins": "*",
    "gulp-minify-css": "^*",
    "gulp-minify-html": "*",
    "gulp-sass": "*",
    "gulp-size": "*",
    "gulp-sourcemaps": "*",
    "gulp-uglify": "*",
    "gulp-useref": "*",
    "run-sequence": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "private": true
}

都是些常用的插件,gulp总共就5个API接口,但是插件是异常强大,可根据需求自己配置。

var gulp = require(‘gulp‘);
var $ = require(‘gulp-load-plugins‘)();
var del = require(‘del‘);
var runSequence = require(‘run-sequence‘);
var assetRev = require(‘gulp-asset-rev‘);

function gulpScripts(app_name) {
    return gulp.src([app_name + ‘/**/*.js‘]) //源文件下的所有js
        .pipe(assetRev())                    //配置版本号
        .pipe($.uglify())                    //进行压缩,如果需要合并也可加上合并的代码
        .pipe(gulp.dest(app_name + "_dist"));//复制到目标文件路径
}

function gulpStyles(app_name) {
    return gulp.src([app_name + ‘/**/*.css‘])
        .pipe(assetRev())
        .pipe($.minifyCss())
        .pipe(gulp.dest(app_name + "_dist"));
}

function gulpImages(app_name) {
    return gulp.src([app_name + ‘/**/images/*‘])
        .pipe(gulp.dest(app_name + "_dist"));   //复制所有图片到目标文件夹
}

function gulpRevHtml(app_name) {
    gulp.src([app_name + ‘/*.html‘, app_name + ‘/**/*.html‘])   //源文件下面是所有html
        .pipe(assetRev())                                       //配置引用的js和css文件,需要的话也可以用minifyHtml压缩html文件
        .pipe(gulp.dest(app_name + ‘_dist‘));                   //打包到目标文件夹路径下面
}

gulp.task(‘app_scripts‘, function(){
    gulpScripts("app");
});
gulp.task(‘app_styles‘, function(){
    gulpStyles("app");
});
gulp.task(‘app_images‘,function(){
     gulpImages("app");
});
gulp.task(‘app_rev‘, [‘app_styles‘, ‘app_scripts‘], function(){
    gulpRevHtml("app");
});
gulp.task(‘clean‘, del.bind(null, [‘app_dist‘], {
    force: true
}));
gulp.task("beike", function() {
    runSequence(‘clean‘, ["app_images", "app_rev"]);
});

因为同一个目录下有别的项目,所以这里写成了函数,输入不同名称打包到不同目标文件。

结果就是:

打包后引用的静态资源文件分别如下,如果修改了某个文件,参数会发生变化,如果没有修改,则不发生变化:

<link rel="stylesheet" type="text/css" href="../../styles/common.css?v=a8aacfb">
<script type="text/javascript" src="../../scripts/app_common.js?v=51921f3"></script>
background:url(../images/none.png?v=8f204d4)
时间: 2024-12-04 20:42:20

gulp自动化打包及静态文件自动添加版本号的相关文章

为js和css文件自动添加版本号

web应用必然要面对缓存问题,无论前台后台都会涉足缓存.特别是对于前端而言,缓存利用的是否得当直接关系到应用的性能. 通常情况下,我们会倾向于使用缓存,因为缓存一方面可以减少网络开销,一方面可以减轻服务器的压力. 但是有些时候缓存也会带来一些比较诡异的问题,呵呵.关于缓存的文章应该不在少数,不再讨论,本文的重点在于为js和css文件自动添加版本号. 这样做的原因是:首先对于js和css类型的静态文件设置了缓存机制,当文件被更新时,需要强迫浏览器下载修改后的新文件,也就是要更新缓存,而通过为js和

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

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

Gulp 给所有静态文件引用加版本号

在juqery和easyui 盛行的年代许多项目采用纯静态页面去构建前端框架从而实现前后端分离的目的.项目开发周期内往往会频繁修改更新某个文件,当你将文件更新到服务器后客户端由于缓存问题而出现显示异常的情况,这时候你会经常让客户清楚缓存,然后开始了漫长的教学过程,,, 我们也会尝试在静态资源后面加上 "index.html?v=" new Date().getTime(); 来解决这个问题,效果也颇为良好,但当项目为已有项目时会是个相当头疼的问题,这个时候我们就会希望有一个全局构建工具

sublime 设置新建文件自动添加author(作者)等文件头信息

很多时候, sublime 自带自动添加文件头信息, 但是并不是我们想要比如下面这样的:新建一个python文件 自动添加的author 信息== 上面并不是我想要的, 我想要下面这样的效果:== 这就需要我们设置插件来自定义化, 步骤1) 安装 file Header 插件 (一般默认已经安装)2) 设置变量 比如author 值, email 的值3) 修改语言 模板具体如下:第一步: 查看是否已安装 file Hdader 插件== 能找到 File Header 就说明已经安装, 如果没

用python给html里的css及js文件链接自动添加版本号

传统的给文件链接添加版本号的方法是使用gulp-rev,这里提出的解决方案是使用python来替代gulp-rev. import os import re import uuid import sys def file_extension(path): return os.path.splitext(path)[1] basePath = sys.argv[1] if len(sys.argv)==1: sys.exit() html_list = [] def find_html(path)

gulp教程之自动添加版本号

1 创建项目 安装nodejs/全局安装gulp/本地安装gulp/创建package.json和gulpfile.js文件,项目目录如下: 2 自动更改版本号插件简介 gulp-rev 为css文件中引入的图片或字体等添加hash编码 gulp-asset-rev为js/css文件生成hash编码并生成 rev-manifest.json文件名对照映射 gulp-rev-collector 为文件替换版本号 3 本地安装插件 安装gulp-rev npm install gulp-rev --

create-react-app 打包后静态文件过大 webpack优化

在最近的项目里,页面和静态文件并不是很多的情况下,打包后发现产出的静态资源却很大. 1.关掉sourcemap 在config/webpack.config.js文件里,大概30几行的位置添加这样一句代码,这样做的作用是防止线上生成环境将源码一起打包部署. 2.将一些公共的库(比如antd)做一个缓存 splitChunks: { chunks: 'all', name: "vender", cacheGroups: { vender: { name: "vendor&quo

linux 程序、动态库、静态库内部添加版本号和编译时间

给程序和库添加版本号和库,有利于维护和升级. 当然你可以在文件名上体现,比如有个程序叫 yun,文件名写为 yun_1.0.2,但这个需要每次手动维护,而且不能100%确保当前程序就是那个版本.所以,把版本号体现在程序内部,是一个不错的选择. -----------------------------------  我是做法分割线 o  ------------------------------------ 一.可执行程序 程序内部定义版本宏,然后 main 函数通过 -v 参数,打印版本号和

Gulp自动添加版本号

转载自:http://www.cnblogs.com/givebest/ 推荐使用gulp-rev + gulp-rev-collector是比较方便的方法,结果如下: "/css/style.css" => "/dist/css/style-1d87bebe.css" "/js/script1.js" => "/dist/script1-61e0be79.js" "cdn/image.gif"