gulp

53 阅读11分钟

5.1.什么是gulp

  • 前端自动化打包工具

  • 运行需要依赖node环境

    • 自动化打包,不需要手动做事,但是需要你手动编辑好一个步骤
    • 打包:就是把零散的东西给你结合在一起,对代码进行压缩/混淆/合并
    • 工具:就是帮我们完成这个事情的东西
  • 5.2.安装gulp
    • npm install --global gulp(简写:npm i -g gulp
      • 安装gulp指令
    • npm uninstall --global gulp(简写:npm un -g gulp
      • 卸载gulp指令
    • npm cache clear -f
      • 清除缓存
  • gulp配置打包
    • 需要手动写一个配置文件,告诉gulp按照我们的这个配置文件来打包

    • 每一个项目一个配置文件,每个项目打包的时候使用的都是当前的项目文件

    • gulp使用之前

        1. 先准备一个项目文件夹--------------------我的整个项目文件夹

          -src/ -------------------------我的所有原始代码

          ​ +pages/ ----------------------放我所有的html文件

          ​ +css/ -----------------------放我所有的css文件

          ​ +js/ -----------------------放我所有的js文件

          ​ +images/ -----------------------放我所有的图片

          ​ +lib/ -------------------------放我所有的第三方 文件 (比如jquery swiper)

          -package.json -------------------------用来记录我项目信息的描述的文件

        2. 使用 npm init初始化一下项目

          ​ +因为我们的项目一定会用到很多第三方工具

          ​ +我就用npm下载第三方工具

          ​ +最好就是使用npm init 给我生成一个package.json文件来记录一下我用了哪些包

          ​ +顺便也记录一下自己的项目

        ​ 3.自己手在项目的根目录创建一个叫gulpfile.js的文件

        ​ +名字必须是gulpfile.js

        ​ +这个文件里就用来书写我们项目的打包规则(也就是这个项目打包的配置文件 )

        ​ +使用gulp的时候会默认读取gulpfile.js的打包配置文件

    • gulpfile.js的打包配置文件规则

    • 借助一些gulp的API方法来帮助我们打包,所以先在项目文件夹里安装一个gulp,作为开发依赖

    • 项目里安装的gulp和node 全局安装的gulp区别

      • 项目里面安装的gulp(npm install gulp简写npm i gulp
        1. 一个第三方依赖包
        2. 也是一个node的第三方模块
        3. 也是也别人写好的一堆方法,放在了里面
        4. 用来给我提供一些API使用的
      • 全局安装的gulp(npm install --golbal gulp简写npm i -g gulp
        1. 是为我们的电脑增加一个可以使用gulp的能力
        2. 也就是可以再命令行gulp xx的指令,一台电脑安装一次,可以以后一直使用
    • gulpfile.js文件

    //1.导入gulp这个第三方模块的时候,会优先去内置模块寻找,如果内置模块里没有,那么就会自动去node-modules的文件里面查找,导入这个gulp以后,就可以使用gulp.xxx()的各种方法了
    const gulp =require('gulp')
    //2.导入gulp-cssmin这个第三方模块
    const cssmin = require('gulp-cssmin')
    //3.先写一个打包css的方法
    const cssHandler=()=>{
        //找到src目录下对的css目录下的所有后缀为.css的文件
        return gulp.src('./src/css/*.css')
        			//压缩css代码
        			.pipe(cssmin())
        			//压缩完毕的css代码放在dist文件夹里
        			.pipe(gulp.dest('./dist/css')) 
    }
    //4.最后导出我准备好的这个方法
    module.exports.css=cssHandler
    
    • gulp里面的一些方法

      • src()
        1. 用来找到你要打包的文件的
        2. src('你要打包的文件的地址’)
        3. 返回值是一个二进制流,就可以继续去调用别的方法
      • pipe()
        1. 用来帮你做事情的
        2. pipe('你要做的事情')
        3. 返回值:又是一个二进制流,又可以接着调用别的方法
      • dest()
        1. 用来写入文件的
        2. dest('你要放的文件夹')
        3. 你要把你已经压缩好的代码放在哪一个文件夹里
        4. 如果没有指定文件夹,会自动创建一个文件夹 放进去
    • parallel()

      1. 用来并行多个任务的
      2. gulp.parallel(你定义的任务1,你定义的任务2,...)
      3. 他会把几个任务都给你执行了
      4. 只要这个返回值一执行,就能把你准备好的几个任务同时开始执行
      • series()
        1. 用来逐个执行多个任务的
        2. gulp.series(你定义的任务1,你定义的任务2,...)
      1. 只要这个返回值一执行,就能把你准备好的几个任务逐个开始执行
      • watch()
      1. 监控src文件夹下的文件,只要已修改就执行对应的任务
      2. gulp.watchr(你要监控的文件目录,你要执行的任务)
    • 执行各种压缩代码的方法,都是第三方依赖包

      • 一个小问题

        1. 当我在项目文件夹里安装gulp以后,package.json文件就会记录我下载了gulp包
      1. 当我在项目文件夹里安装jQuery以后,也会在package.json文件记录我下载了jQuery包

      2. 但是我下载gulp仅仅是为了打包项目使用,打包完成后就不用了了;jQuery是我在项目里一直使用的第三方,

      3. 既然有区别,那就记录的时候分开记录,现在都是记录在dependencies里面

      4. 我们安装一些上线不需要的包的时候,就使用另外一套指令

      • npm install --save-dev 包名的指令(简写:npm i -D 包名

        1. npm install 包名的下载没有任何区别
      1. 唯一的区别就是在package.json里面的记录位置不一样了,现在记录在devdependencies里面
    • gulp-cssmin专门用来压缩css文件的,你需要下载导入

      1. 下载指令 npm install --save-dev gulp-cssmin(简写: npm i -D gulp-cssmin

      2. 导入第三方模块: const cssmin = require('gulp-cssmin')

      3. 导出这个方法:module.exports.css=cssHandler

      4. cmd命令行 执行 gulp css,就会执行压缩

      • gulp-autoprefixer第三方模块是专门用来加前缀,解决浏览器兼容问题

        1. 下载指令 npm install --save-dev gulp-autoprefixer(简写: npm i -D gulp-autoprefixer

        2. 导入第三方模块: const autoprefixer = require('gulp-autoprefixer')

        3. //1.导入gulp这个第三方模块的时候,会优先去内置模块寻找,如果内置模块里没有,那么就会自动去node-modules的文件里面查找,导入这个gulp以后,就可以使用gulp.xxx()的各种方法了
          const gulp =require('gulp')
          //2.导入gulp-cssmin这个第三方模块
          const cssmin = require('gulp-cssmin')
          //3.导入gulp-autoprefixer`这个第三方模块
           const  autoprefixer = require('gulp-autoprefixer')
          //4.先写一个打包css的方法
          const cssHandler=()=>{
              //找到src目录下对的css目录下的所有后缀为.css的文件
              return gulp.src('./src/css/*.css')
              			//给css代码加前缀
              			.pipe(autoprefixer({
          				browsers:['last 2 versions']
              			}))
              			//压缩css代码
              			.pipe(cssmin())
              			//压缩完毕的css代码放在dist文件夹里
              			.pipe(gulp.dest('./dist/css')) 
          }
          //5.最后导出我准备好的这个方法
          module.exports.css=cssHandler
          
      • gulp-uglify第三方模块是专门用来压缩js的

        1. 下载指令 npm install --save-dev gulp-uglify(简写: npm i -D gulp-uglify
        2. 导入第三方模块: const uglify = require('gulp-uglify')
        3. 导出这个方法:module.exports.js=jsHandler
        4. 这个安装包不认识es6的语法,所以要用gulp-bable先把es6语法转换成es5语法
      • gulp-bable 这个第三方模块是专门用来把es6语法转换成es5的语法

        1. 这个第三方包还依赖了另外两个第三方包@babel/core和@babel/preset-env

        2. 下载的时候需要下载三个包,导入的时候只要导入一个gulp-babel就可以了

        3. 下载指令 npm install --save-dev gulp-bable @babel/core babel/preset-env

        4. 导入第三方模块: const bable = require('gulp-bable')

        5. //1.导入gulp这个第三方模块的时候,会优先去内置模块寻找,如果内置模块里没有,那么就会自动去node-modules的文件里面查找,导入这个gulp以后,就可以使用gulp.xxx()的各种方法了
          const gulp =require('gulp')
          //3.导入gulp-uglify这个第三方模块
          const  uglify = require('gulp-uglify')
          //4.先写一个打包js的方法
          const jsHandler=()=>{
              //找到src目录下对的js目录下的所有后缀为.js的文件
              return gulp.src('./src/js/*.js')
              			//es6转es5
              			.pipe(babel({
                  		prests:['@bable/env']
              			}))
              			.pipe(uglify())
              			//压缩完毕的js代码放在dist文件夹里
              			.pipe(gulp.dest('./dist/js')) 
          }
          //5.最后导出我准备好的这个方法
          module.exports.js=jsHandler
          
        6. cmd命令行 执行 gulp js,就会执行压缩

      • gulp-htmlmin专门用来压缩html文件的,你需要下载导入

        1. 下载指令 npm install --save-dev gulp-htmlmin(简写: npm i -D gulp-htmlmin

        2. 导入第三方模块: const htmlmin = require('gulp-htmlmin')

        3. 导出这个方法:module.exports.html=htmlHandler

        4. cmd命令行 执行 gulp html,就会执行压缩

        5. //1.导入gulp这个第三方模块的时候,会优先去内置模块寻找,如果内置模块里没有,那么就会自动去node-modules的文件里面查找,导入这个gulp以后,就可以使用gulp.xxx()的各种方法了
          const gulp =require('gulp')
          //3.导入gulp-uglify这个第三方模块
          const  htmlmin = require('gulp-htmlmin')
          //4.先写一个打包js的方法
          const htmlHandler=()=>{
              //找到src目录下对的pages目录下的所有后缀为.html的文件
              return gulp.src('./src/html/*.html')
              			.pipe(htmlmin({
                  		removeAttributeQuotes:ture,//移除属性上的双引号
                  		removeComments:ture,//移除注释
                  		collapseBooleanAttributes:ture,//把值为布尔的属性简写
                  		collapseWhitespace:ture,//移除所有空格
                  		minifyCSS:true,//style里的css样式给去空格
                  		minifyJS:true,//script里的JS样式给去空格
              			}))
              			//压缩完毕的js代码放在dist文件夹里
              			.pipe(gulp.dest('./dist/js')) 
          }
          //5.最后导出我准备好的这个方法
          module.exports.html=htmlHandler
          
      • 书写一个移动img文件的方法

        1. 图片我们尽量不压缩,设计师给图片的时候是已经压缩好的

        2. 我们再压缩的话,图片就会在失帧的基础上压缩

        3. const imgHandler=()=>{
              //找到src目录下对的images目录下的所有后缀为**的文件
              return gulp.src('./src/images/**')
              			.pipe(gulp.dest('./dist/images')) 
          }
          //5.最后导出我准备好的这个方法
          module.exports.img=imgHandler
          
      • 书写一个移动lib文件夹的方法

        1. 第三方插件/框架放在lib文件夹下,不需要压缩 只需要移动就好了

        2. const libHandler=()=>{
              //找到src目录下对的lib目录下的所有后缀为**的文件
              return gulp.src('./src/lib/**')
              			.pipe(gulp.dest('./dist/lib')) 
          }
          //5.最后导出我准备好的这个方法
          module.exports.lib=libHandler
          
      • ​ 导出一个默认任务

        1. 当你在执行gulp default的时候,可以不写default
        2. 你在执行gulp这个指令,就是在执行default
        //第一种:导出默认任务,这个parallel是同时执行
        module.exports.default = gulp.parallel(cssHandler,jsHandler,htmlHandler,imgHandler,libHandler )
        //第二种:导出默认任务,这个series是逐个执行,在这里是先执行删除delHandler,再同时执行parallel()
        module.exports.default = gulp.series(
        	delHandler,
            gulp.parallel(cssHandler,jsHandler,htmlHandler,imgHandler,libHandler ),
            serverHandler,
            watchHandler
        )
        
        
      • 再书写一个任务自动删除dist文件夹里的东西

        1. 下载指令 npm install --save-dev del(简写: npm i -D del

        2. const delHandler=()=>{
              //这个函数的目的是为了删除dist目录里的东西
              return del(['./dist'])
          }
          //5.最后导出我准备好的这个方法
          module.exports.del=delHandler
          
      • 在书写一个配置服务器的任务

        1. 下载指令 npm install --save-dev gulp-webserver(简写: npm i -D gulp-webserver

        2. 这个是专门用来配置node服务器的

        3. 导入第三方模块: const webserver = require('gulp-webserver')

        4. 配置代理---webserver可以配置代理

          1. 直接在webserver的时候 添加一个配置项
        5. const  webserver = require('gulp-webserver')
          const serverHandler=()=>{
          	//要把页面在服务器上打开
              //打开的是dist目录里面我已经压缩好的页面
              //找到我要打开的页面的文件夹,把这个文件夹当做网站根目录
              return gulp.src('./dist')
              			.pipe(webserver({
                  		//需要一些配置项
                  		host:'localhost',//域名
                  		port:8080,//端口号
                  		open:'./pages/index.html',//默认打开的页面
                  		livereload:true,//-热重启-当dist里面的东西改变就自动刷新浏览器
                  		//所有的代理配置都是在proxies里面
                  		proxies:[
                  			{
                  			source:'/gx'//源 代理标识符
                  			target:'http//127.0.0.1/test.php'//目标地址
          					}
                          ]
             	 			}))
          }
          //5.最后导出我准备好的这个方法
          module.exports.server=serveHandler
          
        6. 自定义域名

          1. 如果你想要自定义域名,前提:建议别使用已经存在的域名
          2. 修改一下你电脑里的hosts文件
            1. window-我的电脑--C--windows --system32--drivers --etc--hosts

            2. 在最后添加 127.0.0.1 你自己定义的域名

      • 书写一个自动监控文件的任务

        const watchHandler=()=>{
            //这个函数的目的是为了监控src里的东西
            gulp.watch('./src/css/*.css',cssHandler)
            gulp.watch('./src/js/*.js',jsHandler)
            gulp.watch('./src/pages/*.html',htmlsHandler)
            gulp.watch('./src/images/**',imgHandler)
            gulp.watch('./src/lib/**',libHandler)
            
        }
        //5.最后导出我准备好的这个方法
        module.exports.watch=watchHandler
        
  • nodejs端口被占用的原因及处理问题

    • 首先打开cmd命令窗口,输入

      netstat -ano|findstr 8080
      
    • 此时可以获取8080端口对应的tcp信息,如下,TCP号是15528

    • 在cmd 输入 taskkill /f /t /im 15528 号,来关掉被占用的端口;此时可正常使用访问 8080 端口

      taskkill /f /t /im 15528