百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Gulp,手把手教你搭建前端自动化平台

toyiye 2024-06-06 22:12 15 浏览 0 评论

前端的发展真的是快,前几年还是刀耕火种的开个编辑器,几行html和js代码就能上浏览器跑了。现在呢?各种包,各种库,各种框架,各种编程范式。究其原因,就是我们高中社会课本中那句话

人民日益增长的文质文化需求,同落后的社会生产之间的矛盾

想想也是,以前刀耕火种的编写页面效率非常低,而我国到目前为止网民的数量已经超过7亿了,可想而知对网页数量和多样化的需求巨大,那有什么方法来提高页面的生产效率呢?这就是我今天要讲的基于gulp平台的自动化生产平台。gulp是啥?官方的解释是基于流的自动化构建工具。好,那什么是流呢?这个流是从英语单词stream翻译过来的,不过还是不好理解。其实可以这么理解,流就是工厂的一个生产车间生产出来的半成品,一个个半成品在输送带上送往下一个加工车间的过程。把运动的半成品看成是数据,那么流动的数据就是流。唉!好难解释啊!还是看代码吧。我已经把代码上传到github了,需要的同学自取,麻烦点个小星星 https://github.com/NicknameID...

1.依赖npm

由于npm在国内比较慢,所以推荐大家使用淘宝的cnpm,在国内访问比较快(搞不懂国家为什么立堵墙,难受)。

2.cnpm init 初始化package.json文件

  • -y的作用可以跳过询问步骤直接生成默认的package.json文件

3.安装依赖包

由于依赖包太多了,就不一个一个写了 主要通过 cnpm install --save-dev 包的名字的方式来安装的,下图所列的就是自动化工具要用的包,我已经上传到github上了点击这里获取,下载后只要 cnpm install就可以了,就会根据package.json里的依赖去下载安装

在package.json中添加gulp字段方便调用本地安装的gulp命令,到这里package.json配置好了

4.gulpfile.js文件的内容(重点

  • 功能1---自动化生成项目目录
//gulpfile.js
/*首先在全局上加载gulp,这个很重要*/
const gulp = require('gulp');
/*在全局上定义项目的目录结构,供应后面使用*/
const dirs = {
  dist:'./dist',
  src: './src',
  css: './src/css',
  less: './src/less',
  js: './src/js',
  img: './src/img',
};
gulp.task('create-directory', () => {
  const mkdirp = require('mkdirp'); //这里要依赖mkdirp这个包,通过cnpm 安装
  for (let i in dirs) {
    mkdirp(dirs[i], err => {
      err ? console.log(err) : console.log('mkdir-->' + dirs[i]);;
    });
  }
});
//在终端运行cnpm run gulp create-directory

生成需要生成的项目目录,再也不用每次都去手工创建了,幸福感爆棚有木有!!!

  • 功能2---编译less,并且实现less注入功能,热更新页面,方便开发时调试
    这个功能要依赖的插件有

1.gulp-less2.browser-sync3.gulp-notify4.gulp-plumber

/*全局定义要处理的文件*/
const files = {
  lessFiles: './src/less/go.less',
  cssFiles: './src/css/*.css',
  jsFiles: './src/js/*.js',
  imgFiles:'./src/img/*.*'
}
//编译less
gulp.task('compile-less', () => {
const less = require('gulp-less'); //依赖gulp-less的插件
const notify = require('gulp-notify'); 
const plumber = require('gulp-plumber');
const browserSync = require('browser-sync').create(); //browser-sync同步服务器
const reload = browserSync.reload; //将browser-sync的reload方法存起来,方便调用
  return gulp.src(files.lessFiles)
  .pipe(plumber({ errorHandler: notify.onError('Error: <%= error.message %>') })) //使用gulp-notify和gulp-plumber用来阻止因为less语法写错跳出监视程序发生
  .pipe(less())
  .pipe(gulp.dest(dirs.css + '/'))
  .pipe(reload({stream: true}));
});

// 本地服务器功能,自动刷新(开发环境)
gulp.task('server', ['compile-less'],()=>{
const browserSync = require('browser-sync').create();
const reload = browserSync.reload;
  browserSync.init({
    server: './'
  });
  gulp.watch(dirs.less+'/**/*.less', ['compile-less']); //监视less文件夹中的所有less文件,有改动就调用compile-less任务编译less
  gulp.watch('./*.html').on('change', reload); //监视html文件,有改动就刷新浏览器
  gulp.watch(dirs.js+'/**/*.js').on('change', reload); //监视所有js文件有改动就刷新浏览器
});
//在cmd运行cnpm run gulp server

可以看到程序正在后台运行,正在监听文件改动

这样就可以左边开着编辑器写代码,右边开着浏览器看效果了,有木有很爽,人生别无他求了(感动中!!!)

  • 功能3---添加浏览器私有前缀
    要用到的插件包

1.gulp-postcss2.gulp-sourcemaps3.autoprefixer

//添加浏览器私有前缀(生产环境)
gulp.task('autoprefixer', () => {
  const postcss = require('gulp-postcss');
  const sourcemaps = require('gulp-sourcemaps');
  const autoprefixer = require('autoprefixer');
  return gulp.src(files.cssFiles)
    .pipe(sourcemaps.init()) //添加sourcemap,方便调试
    .pipe(postcss([ autoprefixer() ])) //添加浏览器私有前缀,解决浏览器的兼容问题
    .pipe(sourcemaps.write('.'))
    .pipe(gulp.dest(dirs.css+'/'))
});
  • 功能4---压缩css
    要用到的插件包

1.gulp-minify-css2.gulp-rename

// 压缩css(生产环境)
gulp.task('minify-css', function () {
  const minifyCSS = require('gulp-minify-css');
  const rename = require("gulp-rename");
  return gulp.src(dirs.css+'/**/*.css')
    .pipe(minifyCSS({/*keepBreaks: true*/}))
    .pipe(rename(path=>path.basename += '.min')) //重命名文件输出后的样式为 原文件名.min.css
    .pipe(gulp.dest('./dist/css/'))
});
  • 功能5---合并压缩JavaScript文件
    要用到的插件包

1.gulp-concat2.gulp-uglify3.gulp-rename

// js文件--合并--压缩(生产环境)
gulp.task('js-concat-compress', (cb)=>{
  let name = ''; //先定义一个变量将用于后面存文件名
  const concat = require('gulp-concat');
  const uglify = require('gulp-uglify');
  const rename = require("gulp-rename");
  return gulp.src(dirs.js+'/**/*.js')
  .pipe(rename(path=>{path.basename += '';name=path.basename;}))
  .pipe(concat('bundle.js'))   //合并js文件
  .pipe(uglify())         //压缩js文件
  .pipe(rename(path=>{
    path.basename = name+'.'+path.basename+'.min';  //改文件名加上 .min
  }))
  .pipe(gulp.dest('dist/js/')); 
});
  • 功能6---图片无损压缩
    要用到的插件包

1.gulp-imagemin

// 图片无损压缩
gulp.task('img-handl',()=>{
  const imagemin = require('gulp-imagemin');
  return gulp.src(files.imgFiles)
    .pipe(imagemin())  //imagemin()里是可以写参数的,有需要的可以去github的页面看看
    .pipe(gulp.dest('./dist/img/'))
});
  • 功能7---项目的打包
    有时候我们做完东西需要打包,方便传输,而有些文件又是不需要打包进去的,比如说node_modules文件夹,一键打包的快感体验过绝对会爱上的

依赖的插件包1.gulp-zip

// 项目打包(生产环境)
gulp.task('zip',()=>{
  const zip = require('gulp-zip');
  return gulp.src(['./*.html','**/dist/**/*.*','!**/node_modules/**/*.*']) //这里需要注意的是,在写要打包的文件时,避免打包的文件不能写在开头,这里'!**/node_modules/**/*.*'放在了最后
  .pipe(zip('project.zip'))   //打包后的文件名,自己随意取
  .pipe(gulp.dest('./'))
});

5.整理任务执行,方便调用任务

因为gulp执行任务时是以最大的任务并发数同时进行的,所以有时候我们需要按步骤进行,就需要插件gulp-sequence,将任务按顺序写入,就会按顺序执行写了这么多功能模块,需要好好的整理一下,方便调用。我已经把完整的代码上传到github了,需要的同学自取,麻烦点个小星星 https://github.com/NicknameID...

// ------------------开发阶段命令----------------------------------------------------
gulp.task('start', ['create-directory']); //项目初始化的第一个命令
gulp.task('dev-watch', ['server']); //开始编写项目后开启服务器实时更新

// ------------------生产阶段命令------------------------------------------------------
gulp.task('prefixer', ['autoprefixer']); //给css文件添加浏览器私有前缀 files.cssFiles ==>> .src/css/
gulp.task('min-css', ['minify-css']); //压缩css文件 files.cssFiles ==>> dist/css/
gulp.task('js-handl', ['js-concat-compress']); //合js文件  dirs.js/**/*.js ==>> ./dist/js/concated.js
gulp.task('img-handl', ['img-handl']) //处理图片,对图片进行无损的压缩

//----------------一键生成项目文件命令-----------------------------------------------
       //因为gulp执行任务时是以最大的任务并发数同时进行的,所以有时候我们需要按步骤进行,就需要插件`gulp-sequence`,将任务按顺序写入,就会按顺序执行
const runSequence = require('gulp-sequence').use(gulp);
gulp.task('bunld-project',runSequence('clean-dist','compile-less','autoprefixer','minify-css','js-concat-compress','img-handl','zip'))

6.小结

看到没有,使用gulp其实并没有用到很多本身的API,都是通过不同的插件来实现的处理过程,所以gulp更加像一个处理平台,而非大包大揽的处理程序,他只负责数据的流向,从pipe(管道)的这头流向另外一头,剩下的事情就交给各个插件了,像不像现代社会的细化分工。分工明确才能提高效率,这是社会发展的经验总结。文章有点长,感谢看完的小伙伴!!!

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码