Gulp 定制专属提速“外挂”(下)

Posted 码匠与HTML5学堂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gulp 定制专属提速“外挂”(下)相关的知识,希望对你有一定的参考价值。


友情提示:推荐阅读时间10分钟 + 练习时间10分钟

上一期给大家分享了Gulp插件的安装与使用,只要掌握了Gulp插件安装的流程与配置,对于其他Gulp插件的使用基本上就没有太大的问题。毕竟Gulp的插件太丰富了,大家也没有太多的精力把所有的插件都去研究一遍。当一个网站进行改版升级的时候,会遇到静态资源版本更新的问题,那么对于前端开发工程师来说,该如何解决这个问题?所以今天要和大家一起探讨如何解决静态资源版本更新的问题和package.json的作用。

本文内容概要

  • Gulp解决静态资源版本更新的问题

  • package.json的作用

  • Gulp的小结

静态资源缓存更新的问题

为静态资源请求添加Query

这个理解起来比较简单,就是在静态资源请求后面添加参数,这个参数的值是时间戳和版本号的结合,当然也可以使用其它方式来计算该参数的值。

修改前

  1. <!-- 代表结构 -->

  2. <h2>梦幻雪冰</h2>


  3. <!-- 代表静态资源 -->

  4. <script type="text/javascript" charset="utf-8"></script>

  5. <script type="text/javascript" charset="utf-8"></script>

  6. <script type="text/javascript" charset="utf-8"></script>

修改后

  1. <!-- 代表结构 -->

  2. <h2>html5学堂 - 码匠</h2>


  3. <!-- 代表静态资源 -->

  4. <script type="text/javascript" charset="utf-8"></script>

  5. <script type="text/javascript" charset="utf-8"></script>

  6. <script type="text/javascript" charset="utf-8"></script>

这样看起来好像是可以解决掉静态资源缓存的问题,因为静态资源请求发生了变化。但是又出现了一个新问题,修改前后的静态资源文件名都是没有变化的,当开发人员把线下(本地)的文件覆盖掉线上(服务器)的文件,会出现一定的问题。因为在覆盖的过程中,静态资源和页面文件的部署有一定的时间间隔,对于一个大型网站来说即使时间间隔很小,都有可能出现新的用户访问。那在这个时间间隔内,用户访问网站会发生什么情况呢?

1、如果先覆盖index.html,后覆盖index.js,用户在这个时间间隔访问,会得到新的index.html引用旧的index.js的情况,从而出现错误的页面。

2、如果先覆盖index.js,后覆盖index.html,用户在这个时间间隔访问,会得到旧的index.html引用新的index.js的情况,从而也出现了错误的页面。

这也是一些互联网公司选择半夜这段时间等待访问低峰期再上线的原因之一。

基于文件内容的hash版本控制

对于静态资源缓存更新的问题,目前来说最优方案就是基于文件内容的hash版本控制了。

项目源代码

  1. <!-- 代表结构 -->

  2. <h2>梦幻雪冰</h2>


  3. <!-- 代表静态资源 -->

  4. <script type="text/javascript" charset="utf-8"></script>

  5. <script type="text/javascript" charset="utf-8"></script>

  6. <script type="text/javascript" charset="utf-8"></script>

发布的代码

  1. <!-- 代表结构 -->

  2. <h2>HTML5学堂 - 码匠</h2>


  3. <!-- 代表静态资源 -->

  4. <script type="text/javascript" charset="utf-8"></script>

  5. <script type="text/javascript" charset="utf-8"></script>

  6. <script type="text/javascript" charset="utf-8"></script>

发布出来后JS被修改了文件名,产生了一个新文件,并不是覆盖已有的文件。其中“46a6d95”这串字符是根据js的文件内容进行hash计算出来的,只有文件内容发生变化了才会更改。由于这种不是采用同名文件覆盖,因此不存在上述说的那些问题。

因为它无法通过手工的形式来进行维护,所以需要借助工具来处理,在这边我们采用Gulp的插件来做处理。

使用Gulp对静态资源的处理

安装:gulp-asset-rev和gulp-rev插件

命令行:cnpm install gulp-asset-rev和cnpm install gulp-rev

提醒:gulp-asset-rev用于更改HTML文件引用静态资源的路径;gulp-rev用于修改静态资源的文件名。

Gulp 定制专属提速“外挂”(下)

在gulpfile.js中引入gulp-asset-rev和gulp-rev插件

  1. var assetRev = require('gulp-asset-rev');

  2. var rev = require('gulp-rev');

配置插件的功能

  1. // 静态资源处理

  2. gulp.task('revJS', function() {

  3.     gulp.src('js/*.js') // 源文件下的所有js

  4.     .pipe(rev()) // 修改静态资源的文件名

  5.     .pipe(assetRev()) // 更改HTML文件引用静态资源的路径

  6.     .pipe(gulp.dest('dist/js'));// 复制到目标文件路径

  7. });


  8. gulp.task('rev',['revJS'],function() {

  9.     gulp.src("./**/*.html") // 源文件下的所有HTML

  10.     .pipe(assetRev()) // 更改HTML文件引用静态资源的路径

  11.     .pipe(gulp.dest('dist'));// 复制到目标文件路径

  12. });

完整的配置代码

  1. // 引入Gulp安装好的插件 require('模块名称')

  2. var gulp = require('gulp');

  3. var browserSync = require('browser-sync').create();

  4. var reload = browserSync.reload;

  5. var concat = require('gulp-concat');

  6. var cleanCSS = require('gulp-clean-css');

  7. var assetRev = require('gulp-asset-rev');

  8. var rev = require('gulp-rev');


  9. // 定义一个f5任务,名称自定义即可

  10. // 浏览器自动刷新

  11. gulp.task('f5', function(){

  12.     browserSync.init({

  13.         server:{

  14.             baseDir:'./'

  15.         }

  16.     });


  17.     gulp.watch(['./**/*.html']).on('change', reload);

  18. });


  19. // 文件合并

  20. gulp.task('concatFile', function () {

  21.     // 需要合并的文件

  22.     gulp.src('css/*.css')

  23.     //合并后的文件名

  24.     .pipe(concat('common.css'))

  25.     // 合并后的文件所在的文件夹

  26.     .pipe(gulp.dest('dist/css'));

  27. });


  28. // CSS文件压缩

  29. gulp.task('cssMin', function() {

  30.     // 需要压缩的CSS文件

  31.     gulp.src('css/*.css')

  32.     // CSS文件压缩

  33.     .pipe(cleanCSS())

  34.     // 压缩后的C文件所在的文件夹

  35.     .pipe(gulp.dest('dist/css'));

  36. });


  37. // 静态资源处理

  38. gulp.task('revJS', function() {

  39.     gulp.src('js/*.js') // 源文件下的所有js

  40.     .pipe(rev()) // 修改静态资源的文件名

  41.     .pipe(assetRev()) // 更改HTML文件引用静态资源的路径

  42.     .pipe(gulp.dest('dist/js'));// 复制到目标文件路径

  43. });


  44. gulp.task('rev',['revJS'],function() {

  45.     gulp.src("./**/*.html") // 源文件下的所有HTML

  46.     .pipe(assetRev()) // 更改HTML文件引用静态资源的路径

  47.     .pipe(gulp.dest('dist'));// 复制到目标文件路径

  48. });

查看处理效果

Gulp 定制专属提速“外挂”(下)



package.json的作用

安装插件的时候为何要将配置信息保存至package.json(package.json是nodejs项目配置文件)。

因为node插件包相对来说比较庞大,所以不加入版本管理,将配置信息写入package.json来进行版本管理,团队合作的时候方便成员下载所需要的包。(使用命令行:npm install,将会根据package.json下载所有需要的包)。另外,在其他项目也要使用Gulp的时候只要把gulpfile.js和package.json拷贝过去,再初始化Gulp就行了,而不用命令行来安装Gulp插件。

Gulp小结

到这边为止,对Gulp的分享算是告一段落了。合理的使用工具能够帮助我们提高开发效率,而不是把时间花在重复操作上面。最后,简单回顾Gulp的使用流程。

  1. ——>安装NodeJS

  2. ——>全局安装Gulp

  3. ——>项目安装Gulp

  4. ——>插件安装

  5. ——>配置gulpfile.js文件

  6. ——>运行Gulp任务

参考资料:

  • https://www.npmjs.com/package;

  • https://www.zhihu.com/question/28072766/answer/40642578


本文系HTML5学堂独家内容,转载请在文章开头显眼处注明作者和出处“HTML5学堂(http://www.h5course.com/)”



HTML5学堂

HTML5技术原创分享平台

加入HTML5学堂

原来技术可以通俗易懂

每一天 都在为未来积蓄力量

微信:HTML5_Course 微博:@前端技术分享网

以上是关于Gulp 定制专属提速“外挂”(下)的主要内容,如果未能解决你的问题,请参考以下文章

Dockerfile 定制专属镜像

专属定制:用Python简洁的二十行代码做一个专属你的动漫词云图

Dockerfile 定制专属镜像|果断收藏

Dockerfile 定制专属镜像|果断收藏

想要定制专属AI声音?这是一份来自微软的保姆级攻略

你的专属定制——JQuery自定义插件