前端資源多個產品整站一鍵打包&包版本管理(四)—— js&css文件文件打包並生成哈希后綴,自動寫入路徑、解決資源緩存問題。


問題:

當我們版本更新的時候,我們都要清理緩存的js跟css,如何使得在網頁中不需要手動清理呢?

答案:

生成帶有哈希后綴的js跟css文件

 

1、文件路徑

 

 

路徑中的conf.js 是用於放置全局打包的公共方法的、

conf.team.json 則是用於放置 team 這個項目的打包路徑 、

gulpfile.team.js 用於寫 team 這個項目的打包、

打包前的文件放在build中、打包后的文件放在dist中

 

 

總的打包任務在webapp 根目錄下

 

 

 

 為什么要這樣放置目錄,請看 gulp分流

 

 

 

2、我們在conf.team.json 里面配置 css 里面的user 文件夾

 

 

{
  "cssUser":[
    "./build/team/stylesheets/user/**/*.css",
    "./build/team/stylesheets/user/*.css"
  ]
}

 

 

 

 有人會問:為什么使用"./build/team...  而不是使用 "./team 呢 我們可以看到 雖然 gulpfile.team.js  跟team 文件夾是同一級目錄的,

但是我們最終打包執行的文件是 gulpfile.js ,由 gulpfile.js  內部引用 gulpfile.team.js

而 gulpfile.js跟 build在同一個目錄 在webapp目錄下的

 

 

因此我們在引用路徑的時候,一切以 gulpfile.js 為主

 

3、打包 css 文件

 

下面實在 gulpfile.team.js 里面引入所需要的工具 下面工具我們將會一一講解

/**
 * Created by 何Mickey on 11/7/2016.
 */
"use strict";
const fs = require('fs');
const gulp = require('gulp');
const clean = require('gulp-clean');
const pump = require('pump');
const del = require('del');
const path = require('path');
const concat = require('gulp-concat');
const modify = require('gulp-modify');
const uglifyjs = require('uglify-js');
const minifier = require('gulp-uglify/minifier');
const less = require('gulp-less');
const cleanCSS = require('gulp-clean-css');
const rev = require('gulp-rev');
const sort = require('gulp-sort');
const sourcemaps = require('gulp-sourcemaps');
const csscomb = require('gulp-csscomb');
const rename = require('gulp-rename');
const strip = require('gulp-strip-comments');

const conf = require('./conf/conf.js');  //引入公共的函數
const jsonConf = require('./conf/conf.team.json');   //引入打包路徑

 

gulp.task('css-team-user',['less-team'],(cb) => {
    //清除上一版本的殘留
    del(['./dist/team/stylesheets/team-user-*.css']).then(paths => {  //del插件可以刪除給定鏈接的文件,這里我們要刪除上一次的哈希文件,
        pump([                                                        //如果不刪除,在下一次生成哈希文件的時候,會在原來的基礎上追加后綴,這是我們不希望看到的
            gulp.src(jsonConf.cssUser),
            modify({
                fileModifier: conf.clearCSSCharset  
            }),
            csscomb(),                  //gulp-csscomb 插件用於整理css格式
            cleanCSS(),                //gulp-clean-css用於壓縮css文件 
            concat('team-user.css'),   //壓縮到team-user.css文件里面
            gulp.dest('./dist/team/stylesheets/'),  //把壓縮好的文件放在改目錄下
        ],cb);
    });
});

在webapp目錄下執行

gulp css-team-user

就會在

生成一個打包好的css文件

 

 

4、生成帶哈希后綴的css文件

 

這里用到gulp-rev 插件,用於生成帶哈希后綴的文件 並把文件名寫入 json文件

 

gulp.task('team-resource',['css-team-user'],cb => {
    del(['./dist/team/manifest.json']).then(paths => {
        pump([
            gulp.src([
                './dist/team/stylesheets/*.css'
            ], {base: './dist/team'}),
            rev(),  //生成帶哈希后綴的文件
            gulp.dest('./dist/team'),
            rev.manifest('./dist/team/manifest.json', {  //並把源文件路徑 和 哈希文件路徑 以屬性值的方式寫在 manifest.json 里面
                base: './dist/team',
                merge: false
            }),
            gulp.dest('./dist/team'),
        ], cb);
    });
});

 

於是我們就可以看到

成功生成了一個哈希文件

並且生成了一個manifest.json 在目錄下,我們打開該文件 里面有:

 

{
  "javascripts/team-user.js": "javascripts/team-user-201ef04fd5.js",
}

 

這時 任務完成了?已經生成了哈希后綴的文件了,但是事情還沒結束,我們還能做得更好,如果我們每次都要把生成后的哈希值在代碼的資源引入里面修改,會很麻煩

而且線上打包也不允許我們這樣子做,那我們說好的一鍵打包呢? 接下來就是我們要做的了:

 

 5、把帶哈希后綴的文件鏈接寫入文件

 

let manifest = null;
let loadTeamMainfest = () => {
    if(!manifest) manifest = require('../dist/team/manifest.json');  //引入manifest.json 文件里面的屬性值對 
};

 引入對象

 

gulp.task('build-team',['team-resource'],cb => {
    //需要等待文件生成后再load
    loadTeamMainfest(); //
    let kv = {};
    for(let key of Object.keys(manifest)){
        kv[key] = '/dist/team/'+manifest[key];
    }
    let cssTeamUser = `<link type="text/css" rel="stylesheet" href="${kv['stylesheets/team-user.css']}">\n`
        
    fs.writeFile('./WEB-INF/templates/team/common/link/css_min.vm',cssTeamUser,'utf8');
    
});

 

這樣我們就可以打開

'./WEB-INF/templates/team/common/link/css_min.vm' 

<link type="text/css" rel="stylesheet" href="/dist/team/stylesheets/team-user-a1a05e86f5.css">

 

於是就成功滴引入了帶有哈希后綴的資源文件了、從此資源緩存都是浮雲了~

其實這個方法在線上還是會有問題的,在使用js帶哈希的文件的時候,通常一個網站的資源要部署到不同的機器上,而js的打包是一個不穩定的打包,這樣的版本會因為部署時間差,帶來困擾。
過幾天,我會給大家帶來另一個帶哈希的后綴的打包方法~~


如有不對之處,歡迎指出~~喵~~

夜深了、洗洗睡睡、敷面膜吧~~~



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM