`

用gulp做一个略完整的前端打包工作

阅读更多

我们的官网要改版,会从以前的单一产品变成系列产品的官网,也就是现在的官网会是之后官网的一个子模块。

趁着这个机会,正好重新梳理了一下结构。加上罪恶之主管的一些要求,具体的需求如下:

分模块,每个模块都有独立的页面和静态文件,并将所有静态文件打在一个文件夹下,

一些常用变量可以进行替换,并可进行简单的页面动态生成,

生产环境打包与线上环境打包分开进行,

静态文件进行压缩合并,加md5以及cdn,

wap的静态文件与web端分离,wap的页面文件没有的继承web端的页面文件,有的要用它本身。

打包由grunt换成gulp。

 

整体的路径要像这样:

 

好了,那我们开始,首先当然是要安装gulp

npm install gulp --save-dev

然后你需要在你的环境里加一个gulpfile.js的文件。

然后我们为了高大上一点,给弄个简易的手册出来:

直接console.log输出就好了···

  1. // 说明
  2.  
  3. gulp.task('help',function(){
  4.  
  5. console.log(' gulp build 文件打包');
  6.  
  7. console.log(' gulp watch 文件监控打包');
  8.  
  9. console.log(' gulp help gulp参数说明');
  10.  
  11. console.log(' gulp server 测试server');
  12.  
  13. console.log(' gulp -p 生产环境(默认生产环境)');
  14.  
  15. console.log(' gulp -d 开发环境');
  16.  
  17. console.log(' gulp -m <module> 部分模块打包(默认全部打包)');
  18.  
  19. });
  20.  
  21. /* 默认 */
  22.  
  23. gulp.task('default',function(){
  24.  
  25. gulp.start('help');
  26.  
  27. });
 

 

然后在你的控制台输入 gulp help或者 gulp build 就可以看到效果啦

然后我们要建立我们的build任务啦~

首先我们需要接收参数判断是开发打包还是生产打包。这里需要一个插件-- yargs,以及我们以后需要用到的工具类的插件:lodash(用于操作数组,当然它不仅仅是有这样的用处)和 path(用于写路径),用npm像上面那样加到你的环境中,

并且在你的gulpfile文件中声明它们:

  1. /* 载入工具 */
  2.  
  3. var argv =require('yargs').argv,
  4.  
  5. _ =require('lodash'),
  6.  
  7. path =require('path');
 

 

记得之后载入的插件都需要这样声明。

我们新建一个叫build的task

//创建任务

  1. gulp.task('build',function(){
  2.  
  3.  
  4. });
 

 

在里面获取一下控制台输入的参数:

var evr = argv.p || !argv.d; //生产环境为true,开发环境为false,默认为true

var mod = argv.m || 'all';//模块明,默认为全部

 

这样你在控制台输入 gulp build -p 或者 gulp build -p -m t1这样就可以在里面获得参数啦。

 

然后我们需要进行一些打包的配置,先在写一个叫FileConfig的js文件,在里面写我们需要的文件配置信息:

  1. "use strict";
  2.  
  3. var path =require('path');
  4.  
  5. /* 环境信息 */
  6.  
  7. var source ='source',
  8.  
  9. develop ='develop',
  10.  
  11. production ='production';
  12.  
  13.  
  14. /* src路径 */
  15.  
  16. var src ={
  17.  
  18. tpl:'tpl/**',
  19.  
  20. css:'styles/**/*.less',
  21.  
  22. js:'lib/**/*.js',
  23.  
  24. html:'/**.html',
  25.  
  26. img:'images/**'
  27.  
  28. }
  29.  
  30. /* 模块信息 */
  31.  
  32. var modules ={
  33.  
  34. "t1":{
  35.  
  36. src:'t1',
  37.  
  38. dest:'t1',
  39.  
  40. name:'t1',
  41.  
  42. css_files:'styles/app.less'
  43.  
  44. },
  45.  
  46. "t2":{
  47.  
  48. src:'t2',
  49.  
  50. dest:'t2',
  51.  
  52. name:'t2'
  53.  
  54. },
  55.  
  56. "index":{
  57.  
  58. src:'index',
  59.  
  60. dest:'index',
  61.  
  62. name:'index'
  63.  
  64. },
  65.  
  66. "common":{
  67.  
  68. src:'common',
  69.  
  70. dest:'common',
  71.  
  72. name:'common'
  73.  
  74. }
  75.  
  76. };
 

 

然后在下面写个方法:

var FileConfig  = function () {

};

为了省事儿,直接在exports的时候就new了它···

module.exports = new FileConfig();

之后我们的一些配置信息全部从FileConfig这个方法里取,比如要模块信息的话:

FileConfig.prototype.modules = function () {

return modules;

};

之后的具体实现就不再啰嗦啦。

然后我们回到gulpfile.js文件下,声明他,之后会用到。

然后我们就要对html,css,js,img进行处理啦,这里会用到很多插件,一次性的列举出来,用法我在后面的注释中写了:

  1. // 载入外挂
  2.  
  3. var gulp =require('gulp'),
  4.  
  5. browserify =require('browserify'),//这里用不上,管理js依赖的
  6.  
  7. source =require('vinyl-source-stream'),//同样这里用不上,和上面那个一起的
  8.  
  9. uglify =require('gulp-uglify'),//混淆js
  10.  
  11. clean =require('gulp-clean'),//清理文件
  12.  
  13. notify =require('gulp-notify'),//加控制台文字描述用的
  14.  
  15. buffer =require('vinyl-buffer'),
  16.  
  17. less =require('gulp-less'),//转换less用的
  18.  
  19. autoprefixer =require('gulp-autoprefixer'),//增加私有变量前缀
  20.  
  21. minifycss =require('gulp-minify-css'),//压缩
  22.  
  23. concat =require('gulp-concat'),//合并
  24.  
  25. fileinclude =require('gulp-file-include'),// include 文件用
  26.  
  27. template=require('gulp-template'),//替换变量以及动态html用
  28.  
  29. rename =require('gulp-rename'),//重命名
  30.  
  31. webserver =require('gulp-webserver'),//一个简单的server,用python的SimpleHttpServer会锁文件夹
  32.  
  33. imagemin =require('gulp-imagemin'),//图片压缩
  34.  
  35. gulpif =require('gulp-if'),//if判断,用来区别生产环境还是开发环境的
  36.  
  37. rev =require('gulp-rev'),//加MD5后缀
  38.  
  39. revReplace =require('gulp-rev-replace'),//替换引用的加了md5后缀的文件名,修改过,用来加cdn前缀
  40.  
  41. addsrc =require('gulp-add-src'),//pipeline中途添加文件夹,这里没有用到
  42.  
  43. del=require('del'),//也是个删除···
  44.  
  45. vinylPaths =require('vinyl-paths'),//操作pipe中文件路径的,加md5的时候用到了
  46.  
  47. runSequence =require('run-sequence');//控制task顺序
 

 

好啦,为了省事儿,写个对象字面量的方法集:

  1. /* 打包方法 */
  2.  
  3. var teemoGulp ={
  4.  
  5. /* html打包 */
  6.  
  7. buildHtml :function(){},
  8.  
  9. /* css 打包 */
  10.  
  11. buildCss :function(){},
  12.  
  13. /* js打包 */
  14.  
  15. buildJs :function(){},
  16.  
  17. /* img打包 */
  18.  
  19. buildImg:function(){},
  20.  
  21. /* md5打包 */
  22.  
  23. buildMd5:function(){}
  24.  
  25. }
 

 

然后我们先说简单的,js打包,只需要初始路径和打包后路径就好啦:

  1. /* js打包 */
  2.  
  3. buildJs :function(){
  4.  
  5. var src = arguments[0],dest = arguments[1], flag = arguments[2]
  6.  
  7. return gulp.src(src)
  8.  
  9. .pipe(gulp.dest(dest))
  10.  
  11.  
  12. .pipe(uglify())
  13.  
  14. .pipe(rename({ suffix:'.min'}))
  15.  
  16. .pipe(gulp.dest(dest));
  17.  
  18. }
 

 

其中flag是之前的这个var evr = argv.p || !argv.d; //生产环境为true,开发环境为false,默认为true,这个比较简单,先把原始文件拷贝一份,在混淆压缩加.min后缀存一份。

img打包也很简单

  1. /* img打包 */
  2.  
  3. buildImg:function(){
  4.  
  5. var src = arguments[0],dest = arguments[1], flag = arguments[2]
  6.  
  7. return gulp.src(src)
  8.  
  9. .pipe(gulpif(flag, imagemin()))
  10.  
  11. .pipe(gulp.dest(dest));
  12.  
  13. },
 

 

这里注意一下用到了 gulpif  根据环境来判定是否需要做 图片的压缩操作,因为这项操作比较费时间,开发环境下就不进行了。

 

css打包和html打包需要用到一些存好的变量,比如,如果我们需要每个页面的keywords是一样的:

<meta name="keywords" content="<%- keywords  %>"> 

我们就需要给这些变量一个配置的地方,这个和fileconfig是一样的,就不再说了。然后替换这些变量我们要用到 gulp-template,他继承了lodash的template的用法,也就是说,他可以识别js代码以及lodash的一些用法。

而当我们想增加一些文件时,就要用到gulp-file-include,或者你直接改lodash,让他支持html代码也可以,不过我不赞成这样做。

他的用法类似这样:

@@include('t1/tpl/menu.html')

整体的html打包代码是这样:

  1. /* html打包 */
  2.  
  3. buildHtml :function(){
  4.  
  5. var src = arguments[0],dest = arguments[1], flag = arguments[2], options = arguments[3];
  6.  
  7. return gulp.src(src)
  8.  
  9. .pipe(fileinclude({
  10.  
  11. basepath:basePath.source
  12.  
  13. }))
  14.  
  15. .pipe(template(options,{
  16.  
  17. //interpolate: /\{-([\s\S]+?)-\}/g
  18.  
  19. }))
  20.  
  21. .pipe(gulp.dest(dest))
  22.  
  23. },
 

 

template默认的包裹变量的标示是 <%-%>当然你可以用 interpolate去配置这些。

好啦,方法我们写好了,下面是引用他们,我们需要在写一个方法,

  1. var build = funciton (){
  2.  
  3. }
 

 

然后获取参数信息,并进行必要的配置,让他们可以按照我们想要的方式输出。

  1. var evr = options.evr,mod = options.mod;
  2.  
  3. if(!modules[mod]) mod ='all';
  4.  
  5. /* 路径初始化 */
  6.  
  7. fileConfig.init(evr);
  8.  
  9. gulp.task('clean',function(){
  10.  
  11. if(mod ==='all'){
  12.  
  13. var clean_path = path.join( evr&& basePath.production || basePath.develop,'/');
  14.  
  15. return gulp.src([clean_path],{read:false})
  16.  
  17. .pipe(clean());
  18.  
  19. }
  20.  
  21. });
  22.  
  23. /* 获取要build的模块 */
  24.  
  25. var parts =[];
  26.  
  27. if(mod ==='all'){
  28.  
  29. parts = modules;
  30.  
  31. }else{
  32.  
  33. parts = _.pick(modules,mod);
  34.  
  35. }
 

 

之后我们循环遍历modules,建立相应的task

  1. /* 分别对模块进行建立 */
  2.  
  3. var list =[];
  4.  
  5. for(var key in parts){
  6.  
  7. (function(key){//闭个包
  8.  
  9. var options = fileConfig.getModule(parts[key]);
  10.  
  11. /* js建立 */
  12.  
  13. gulp.task(key+'_js',function(){
  14.  
  15. return teemoGulp.buildJs(options.js.src,options.js.dest,evr);
  16.  
  17. });
  18.  
  19.  
  20. /* css建立 */
  21.  
  22. gulp.task(key+'_css',function(){
  23.  
  24. return teemoGulp.buildCss(options.css.src,options.css.dest,evr, teemoConfig, options.css.filename);
  25.  
  26. });
  27.  
  28.  
  29. /* html建立 */
  30.  
  31. gulp.task(key+'_html',function(){
  32.  
  33. return teemoGulp.buildHtml(options.html.src,options.html.dest,evr, teemoConfig);
  34.  
  35. });
  36.  
  37.  
  38. /* img建立 */
  39.  
  40. gulp.task(key+'_img',function(){
  41.  
  42. return teemoGulp.buildImg(options.img.src,options.img.dest,evr);
  43.  
  44. });
  45.  
  46.  
  47. /* 模块建立 */
  48.  
  49. gulp.task(key+'_module',function(cb){
  50.  
  51. runSequence(
  52.  
  53. [key+'_html',key+'_css',key+'_js',key+'_img'],
  54.  
  55. cb
  56.  
  57. );
  58.  
  59. });
  60.  
  61. })(key);
  62.  
  63. list.push(key+'_module');
  64.  
  65. }
 
 

 

这里用到了runSequence,它制定了task的执行顺序,因为如果不这样做,gulp默认是尽可能的并发执行,就有可能出现 clean没执行完,后续就开始执行的结果,这里注意吧task的回调放在runSequence的最后,保证内部的task执行完,再执行完本身。

当然如果比较简单的,你可以用task的第二个参数来控制task的执行顺序,这里不啰嗦啦。

然后把list返还给你最初的 build

  1. var list =Build({
  2.  
  3. evr: evr,
  4.  
  5. mod: mod
  6.  
  7. });
  8.  
  9. var md5 = evr&&'md5'||[];
  10.  
  11. runSequence(
  12.  
  13. 'clean',list,'md5',cb
  14.  
  15. );
 

 

然后顺序执行即可。

之后到了md5的阶段,md5打包用rev插件即可,但是他默认的md5码是10个,你可以去修改gulp-rev\node_modules\rev-hash路径下的index.js文件,或者干脆做个变量在你的filegulp里配置,单我觉得没必要,就偷懒这里改一下啦。我喜欢用16位

在之后需要把这些加了md5的文件名字换给你引用这些文件的地方,就用到了 rev-replace。

rev在改路径时候会生成一个映射表,你用rev.manifest()即可储存在相应的目录里,然后rev-replace用这个文件替换掉你目标文件的路径即可。

至于cdn,也可以用revReplace里的prefix属性去加前缀,不过他只支持字符串,如果我们是有多个cdn域名的话,返回给他的可能是一个方法,所以这里我们需要改一下rep-replace文件。

找到gulp-rev-replace下的index.js文件。

在第36行加一句

var prefix = typeof options.prefix === 'function' ? options['prefix'](path.basename(file.path)) : options.prefix;

用prefix替换掉一下用到options.prefix的地方。你需要在第60行左右做同样的事情:

 

  1. if(options.manifest){
  2.  
  3. // Read manifest file for the list of renames.
  4.  
  5. options.manifest.on('data',function(file){
  6.  
  7. var manifest = JSON.parse(file.contents.toString());
  8.  
  9. Object.keys(manifest).forEach(function(srcFile){
  10.  
  11. var prefix =typeof options.prefix ==='function'? options['prefix'](path.basename(srcFile)): options.prefix;//这句是加的
  12.  
  13. renames.push({
  14.  
  15. unreved: canonicalizeUri(srcFile),
  16.  
  17. reved: prefix + canonicalizeUri(manifest[srcFile]),
  18.  
  19. prefix: prefix //这句也是后加的
  20.  
  21. });
  22.  
  23. });
  24.  
  25. });
  26.  
  27. options.manifest.on('end', replaceContents);
  28.  
  29. }
  30.  
  31. else{
  32.  
  33. replaceContents();
  34.  
  35. }
 
 

 

而且你会发现在之后替换的时候也用到了这个,所以你要他当局部变量传进renames里去。想上面写的那样,因为下面一句用到了他:

  1. if(rename.prefix){
  2.  
  3. contents = contents.split('/'+ rename.prefix).join(rename.prefix +'/');//这句也改了
  4.  
  5. }
 

 

它这替换方式也挺丧良心的···

这样,我们就可以往里面传方法了~

网上找个算cdn域名的方法:

  1. /*生成hash */
  2.  
  3. hashFnv32a :function(str, asString, seed){
  4.  
  5. /*jshint bitwise:false */
  6.  
  7. var i, l,
  8.  
  9. hval =(seed ===undefined)?0x811c9dc5: seed;
  10.  
  11.  
  12.  
  13. for(i =0, l = str.length; i < l; i++){
  14.  
  15. hval ^= str.charCodeAt(i);
  16.  
  17. hval +=(hval <<1)+(hval <<4)+(hval <<7)+(hval <<8)+(hval <<24);
  18.  
  19. }
  20.  
  21. if( asString ){
  22.  
  23. // Convert to 8 digit hex string
  24.  
  25. return("0000000"+(hval >>>0).toString(16)).substr(-8);
  26.  
  27. }
  28.  
  29. return hval >>>0;
  30.  
  31. }
 

 

然后我们就可以进行md5加cdn的打包操作了:

  1. /* md5打包 */
  2.  
  3. buildMd5:function(){
  4.  
  5. var vp = vinylPaths();
  6.  
  7. return gulp.src(path.join(basePath.production,'/**/{images,lib,styles}/**/*.*'))
  8.  
  9. .pipe(vp)
  10.  
  11. .pipe(rev())
  12.  
  13. .pipe(gulp.dest(basePath.production))
  14.  
  15. .pipe(rev.manifest())
  16.  
  17. .pipe(gulp.dest(basePath.production))
  18.  
  19. .on('end',function(){
  20.  
  21. var manifest = gulp.src(path.join(basePath.production,"/rev-manifest.json"));
  22.  
  23. gulp.src(path.join(basePath.production,'/**/*.{css,html}'))
  24.  
  25. .pipe(revReplace({
  26.  
  27. manifest: manifest,
  28.  
  29. prefix:function(f){
  30.  
  31. //cdn域名
  32.  
  33. var cdns =["s1","s2","s3","s4"];
  34.  
  35.  
  36. var fileHashCode = teemoGulp.hashFnv32a(f);
  37.  
  38. if(fileHashCode <0){
  39.  
  40. fileHashCode =0;
  41.  
  42. }
  43.  
  44. var cdn = cdns[fileHashCode % cdns.length];
  45.  
  46. return'http://'+cdn+'.tm.sogoucdn.com/w/20141209'
  47.  
  48. }
  49.  
  50. }))
  51.  
  52. .pipe(gulp.dest(basePath.production))
  53.  
  54. .on('end',function(){
  55.  
  56. del(vp.paths);
  57.  
  58. del(path.join(basePath.production,"/rev-manifest.json"));
  59.  
  60. })
  61.  
  62.  
  63. })
  64.  
  65. },
 

 

这样,整个的打包就完成了啦,压缩混淆合并加md5加cdn就全都搞定了。

至于加wap的文件夹,就在做一遍之前的操作即可,记得html要在做一遍覆盖操作,也就是三遍。

需要注意的是你改过的插件需要自己存到特定的包管理的地方去,或者存到自己的github上也行,配好ssh就能下。

最后你需要一个 测试的server,这个很好配:

  1. /* server */
  2.  
  3. gulp.task('server',function(){
  4.  
  5. var evr = argv.p ||!argv.d;
  6.  
  7. gulp.src(evr?basePath.production:basePath.develop)
  8.  
  9. .pipe(webserver({
  10.  
  11. livereload:true,
  12.  
  13. directoryListing:true,
  14.  
  15. open:true
  16.  
  17. }));
  18.  
  19. });
 

 

不过如果你要测试cdn的话,就只能自己配nginx了,gulp-server上倒是能配代理,不过我没用过,应该也好用。

这样,所有的工作就完成了,这样做还是很方便的,比如,主管要求生产环境和开发环境的路径上要在家 一层路径,那么我们直接修改fileConfig里面的配置就可以:

  1. /* 环境信息 */
  2.  
  3. var source ='source',
  4.  
  5. develop ='build/develop',
  6.  
  7. production ='build/production';
分享到:
评论

相关推荐

    一个基于Gulp高效可定制的Web前端工作流

    【标题】:“一个基于Gulp高效可定制的Web前端工作流” 在Web开发领域,构建自动化工具是提高效率的关键。Gulp作为一个流行的JavaScript任务运行器,因其灵活性和高性能,被广泛应用在前端工作流程中。本项目是基于...

    gulp打包项目案例代码

    【gulp打包项目案例代码】是一个面向初学者的实践教程,旨在教授如何利用Gulp.js工具进行项目的构建与打包。Gulp.js是一个自动化任务管理器,它允许开发者通过编写JavaScript任务来自动化前端开发流程,如编译Sass到...

    gulp打包及发布静态资源流程

    `gulp-package-hugin-demo-master`项目就是一个很好的学习案例,通过阅读和实践,你可以更好地掌握`gulp`的工作原理和使用方法。在实际项目中,根据需求灵活配置和扩展`gulp`任务,可以极大地提高开发效率和代码质量...

    gulp打包js,min.js,d.ts

    Gulp是一个基于Node.js的自动化任务运行器,它可以极大提高前端开发效率,通过编写简单的任务脚本,实现对代码的编译、压缩、合并等一系列操作。 首先,`gulpfile.js`是Gulp的核心配置文件,它定义了Gulp的任务和...

    gulp自动打包工具

    以上只是`gulp`使用的一个基础示例,实际上,`gulp`可以与各种插件配合,实现更复杂的构建流程,如自动刷新浏览器(`browser-sync`)、图片优化(`gulp-imagemin`)、代码质量检查(`gulp-eslint`)等。此外,还可以...

    基于gulp打包的vue单页

    Vue.js 是一个流行的前端JavaScript框架,用于构建用户界面。它以组件化、易用性和高性能著称。在基于Gulp的Vue单页应用(SPA)中,Gulp是一个自动化任务管理工具,它可以帮助开发者实现诸如编译Sass、压缩...

    使用gulp和requirejs快速构建一个前端项目

    `gulp` 是一个基于流的构建系统,它允许开发者定义一系列的任务来自动化常见的前端工作,如编译 SASS 或 LESS,压缩 JavaScript 和 CSS,合并文件,以及自动刷新浏览器等。`gulp` 的核心在于其强大的插件系统,通过...

    基于layui框架使用gulp工具搭建的后台模板

    而gulp则是一个自动化构建工具,它可以极大地提高开发效率,通过预处理、编译、合并、压缩等任务来简化工作流程。现在我们来详细探讨如何基于layui和gulp来搭建一个后台模板。 首先,layui框架的核心特点是简洁、...

    gulp4.0.2 前端构建脚手架

    `gulp` 是一个流行的JavaScript任务运行器,用于自动化前端开发过程,如编译Sass、压缩JavaScript、合并CSS、图像优化等。版本4.0.2是其一个重要版本,带来了更稳定和高效的性能。在前端开发中,构建脚手架扮演着...

    前端自动化工具gulp.zip

    虽然Webpack是当前最流行的前端构建工具,但Gulp同样是一个非常实用且易上手的选择。它以其简洁的语法和强大的功能,深受许多开发者喜爱。 **标签**: Gulp, 前端自动化工具, 前端 **压缩包文件名称列表**: 1. ...

    前端开源库-gulp-decompress

    **正文** ...总之,`gulp-decompress`是前端开发中的一个重要工具,它帮助开发者处理各种压缩文件,提高了工作效率。了解并熟练掌握`gulp-decompress`的使用,可以让你在前端项目管理中游刃有余。

    gulp搭建前端框架

    本篇文章将深入探讨如何使用`gulp`来搭建一个完善的前端开发框架。 首先,我们要了解`gulp`的基本概念。`gulp`允许开发者定义一系列任务,这些任务可以包括编译Less/Sass到CSS,合并JavaScript文件,压缩图片,甚至...

    前端开源库-gulp-bro

    【gulp-bro】是一个前端开发中的重要工具,它基于Browserify构建,并且具有增量构建功能。Browserify是一款流行的JavaScript模块打包工具,它使得在浏览器环境中可以使用Node.js风格的require()来管理模块依赖。而...

    使用gulp解决requireJs项目前端缓存问题

    gulp是一个强大的自动化构建工具,它可以帮助我们执行一系列任务,例如文件的复制、合并、压缩、重命名等。在requireJs项目中,我们可以通过gulp实现以下目标: 1. **文件指纹(Fingerprinting)**:一种常用的防止...

    gulp打包项目,css、js自动添加版本号,防止缓存,代理

    `gulp`是一个流行的JavaScript任务运行器,它可以帮助开发者自动化各种重复性的构建任务,如编译Sass到CSS,压缩JavaScript,或者像在这个场景下,自动为CSS和JS文件添加版本号以避免浏览器缓存问题。这里我们将深入...

    前端开源库-gulp-envify

    在实际项目中,可以结合其他 `gulp` 插件如 `babelify`(用于 Babel 转换)和 `browserify`(用于模块打包)一起使用,构建出高效的前端工作流。总之,`gulp-envify` 是一个值得前端开发者掌握的工具,它有助于提升...

    前端开源库-gulp-qunit-harness

    总的来说,`gulp-qunit-harness` 是一个高效且实用的工具,它将 `QUnit` 的强大测试能力与 `gulp` 的自动化任务执行能力相结合,为前端开发者提供了优质的测试体验,有助于提高项目的质量和稳定性。在实际开发中,...

    使用gulp添加时间戳,压缩css、js

    首先,`gulp`是一个基于Node.js的工具,开发者可以通过安装`gulp-cli`全局命令行工具来快速初始化一个新的`gulpfile.js`,这是`gulp`的核心配置文件。在这个文件中,我们可以定义一系列的任务(tasks)。 对于"使用...

    前端开源库-gulp-amd-bundler

    **gulp-amd-bundler** 是一个前端开发中的开源库,主要功能是将遵循AMD(Asynchronous Module Definition)规范的模块及其依赖打包成单个文件。这个工具基于Gulp,一个流行的JavaScript任务运行器,用于自动化构建...

    前端开源库-gulp-pluck

    【gulp-pluck】是一个在前端开发中常用的开源库,它主要与`gulp`这个构建工具配合使用。`gulp`是一个基于流的自动化任务管理器,它允许开发者定义一系列任务来处理项目中的静态资源,如HTML、CSS、JavaScript等。而`...

Global site tag (gtag.js) - Google Analytics