zoukankan      html  css  js  c++  java
  • Gulp与Rollup的简单介绍

    Gulp

    gulp是基于流的任务化构建工具,读取源文件后在管道中通过一系列插件进行压缩、处理然后输出到目标地址。

    1.使用

    需要node环境,先全局安装gulp-cli

    1 npm install --global gulp-cli

    cmd进入项目目录,分别输入

    1 npm init
    2 npm i gulp -D

    根目录下创建gulpfile.js文件,在该文件中配置gulp任务,下面以压缩html文件为例介绍:

     1 const gulp = require('gulp')  // 引入gulp
     2 
     3 const htmlmin = require('gulp-htmlmin') // 引入压缩HTML的插件
     4 
     5 gulp.task('html', function () { // 创建一个名为gulp的任务
     6   return gulp
     7     .src('./src/index.html') // 读取源文件到流
     8     .pipe(                         // pipe管道中对读取的流进行处理
     9       htmlmin({                 // 执行压缩
    10         collapseWhitespace: true, // 去掉空格
    11         removeAttributeQuotes: true // 删除属性的引号
    12       })
    13     )
    14     .pipe(gulp.dest('dist/')) // 输出到目标地址
    15 })

    因为用到了html压缩插件需要先安装npm i gulp-htmlmin -D

    在命令行中输入gulp 任务名即可,如:

    1 gulp html

    此时查看dist目录,已经生成了压缩好的html:

    <!DOCTYPE html><html lang=en><head><meta charset=UTF-8><meta name=viewport content="width=device-width,initial-scale=1"><title>Sass</title></head><body><div class=container>Lorem ipsum dolor sit amet consectetur adipisicing elit. Magni, consectetur eos possimus optio corrupti at. Alias voluptatem ut ducimus aspernatur totam harum magni quidem odio adipisci. Eum consequuntur explicabo non.</div></body></html>

    gulp的使用大抵如此,src读取源文件,pipe中利用插件(如gulp-htmlmin)进行处理,再由dest输出到目标位置。

    2.主要功能

    gulp的强大之处在于可以使用各种插件进行处理,常用有:压缩htmlcssjs及静态图片,转译sass、es6+语法;监听文件改动,自动将压缩后的css及js注入html文件;启动开发服务器,实时刷新等。

    // 常用插件
    // gulp-htmlmin 压缩html
    // gulp-sass 编译sass
    // gulp-cssmin 压缩css
    // gulp-babel 转译es6+语法
    // gulp-concat  js / css 合并
    // gulp-uglify  压缩js
    // gulp-rename 重命名
    // gulp-less 编译less
    // gulp-inject 把压缩后的css和js注入到html中
    // gulp-connect 开发服务器、实时自动编译刷新
    // open 打开浏览器
    // browser-sync 创建开发服务器并同步浏览器 推荐
     
    // 重要API
    // src 源文件夹
    // dest 目标文件夹
    // task 注册任务
    // pipe 流管道
    // watch 监听文件
     
    注:
    gulp4.0版本以后不能使用数组放依赖的任务了,gulp.task没有了以往的三参数,可以用gulp.parallel和gulp.series来随意嵌套并行及串行任务,任务依赖需要放到series里面,在该函数的回调里面执行后续任务。
    gulp组合任务时异步任务可以通过return保证任务已完成。

    3.案例

    gulp 3.9.1案例

      1 const gulp = require('gulp')
      2 
      3 // 0.任务前先清除目录
      4 const del = require('del')
      5 gulp.task('clean', function (cb) {
      6   return del(['./dist'], cb)
      7 })
      8 
      9 // 注意:
     10 // 每个任务都返回一个stream, 将会保证clean在任一个任务开始之前完成
     11 // clean并不会被执行两次,尽管它被作为依赖调用了两次
     12 
     13 // 1.html
     14 const htmlmin = require('gulp-htmlmin')
     15 gulp.task('html', function () {
     16   return gulp
     17     .src('./src/index.html')
     18     .pipe(
     19       htmlmin({
     20         // collapseWhitespace: true, // 去掉空格
     21         removeAttributeQuotes: true // 删除属性的引号
     22       })
     23     )
     24     .pipe(gulp.dest('dist/'))
     25     .pipe(connect.reload())
     26 })
     27 
     28 // 2.静态文件
     29 gulp.task('images', function () {
     30   return gulp
     31     .src('./srcimg/**/*.*')
     32     .pipe(gulp.dest('dist/images'))
     33     .pipe(connect.reload())
     34 })
     35 
     36 // 3.copy多个文件到一个目录
     37 // ! 可以排除一些文件
     38 gulp.task('data', function () {
     39   return gulp
     40     .src(['./src/json/*.json', './src/xml/*.xml', '!./src/xml/old.xml'])
     41     .pipe(gulp.dest('dist/data/'))
     42     .pipe(connect.reload())
     43 })
     44 
     45 // 4.添加插件  sass
     46 const sass = require('gulp-sass')
     47 sass.compiler = require('node-sass')
     48 
     49 gulp.task('sass', function () {
     50   return gulp
     51     .src('./src/style/**/*.scss')
     52     .pipe(sass().on('error', sass.logError))
     53     .pipe(gulp.dest('./src/css/'))
     54     .pipe(connect.reload())
     55 })
     56 
     57 // 5.压缩css插件 及重命名
     58 var cssmin = require('gulp-cssmin')
     59 var rename = require('gulp-rename')
     60 
     61 gulp.task('cssmin', ['sass'], function () {
     62   return gulp
     63     .src('./src/css/*.css')
     64     .pipe(concat('index.css'))
     65     .pipe(cssmin())
     66     .pipe(rename({ suffix: '.min' }))
     67     .pipe(gulp.dest('dist/css/'))
     68     .pipe(connect.reload())
     69 })
     70 
     71 // 6.处理js文件
     72 // 合并文件 压缩js文件
     73 const concat = require('gulp-concat')
     74 const babel = require('gulp-babel')
     75 const uglify = require('gulp-uglify')
     76 
     77 gulp.task('js', function () {
     78   return gulp
     79     .src('./src/scripts/*.js')
     80     .pipe(concat('index.js'))
     81     .pipe(
     82       babel({
     83         presets: ['@babel/env']
     84       })
     85     )
     86     .pipe(gulp.dest('dist/js/'))
     87     .pipe(uglify())
     88     .pipe(rename('index.min.js'))
     89     .pipe(gulp.dest('dist/js/'))
     90     .pipe(connect.reload())
     91 })
     92 
     93 // 7.inject 把压缩后的css和js注入到html中
     94 var inject = require('gulp-inject')
     95 gulp.task(
     96   'inject', ['html', 'images', 'data', 'cssmin', 'js'],
     97   function () {
     98     return gulp
     99       .src('./dist/index.html') // 获取该文件的数据
    100       .pipe(
    101         inject(
    102           gulp.src(['./dist/js/index.min.js', './dist/css/index.min.css'], {
    103             // 让获取的流被 inject 操作一次:把指定文件注入到流文件中
    104             read: false // 该参数默认为ture,此处fasle也就是并不会去读取文件
    105           }),
    106           {
    107             relative: true // Injecting files relative to target files
    108           }
    109         )
    110       )
    111       .pipe(gulp.dest('./dist/'))
    112       .pipe(connect.reload())
    113   }
    114 )
    115 
    116 // inject说明:
    117 // 1.在html中需要标记插入位及文件类型
    118 //   < !--inject: css-- >
    119 //   <!-- endinject-->
    120 
    121 // default 默认任务
    122 gulp.task(
    123   'default', ['inject'],
    124   function () {
    125     return gulp.src('./dist/**/*.*')
    126   }
    127 )
    128 
    129 // default 默认任务
    130 gulp.task('build', ['clean', 'default'], function () {
    131   console.info('build done!')
    132 })
    133 
    134 // 8.任务监听
    135 // 启动服务器
    136 const connect = require('gulp-connect')
    137 const open = require('open')
    138 gulp.task('server', ['default'], function () {
    139   connect.server({
    140     root: 'dist/',
    141     port: 9001,
    142     livereload: true // 实时刷新
    143   })
    144   // 注意:需要在各个子任务中添加connect配合
    145 
    146   // 打开浏览器
    147   open('http://localhost:9001/')
    148 
    149   // 监听文件
    150   gulp.watch('./src/index.html', ['html'])
    151   gulp.watch('./src/style/**/*.scss', ['sass', 'cssmin'])
    152   gulp.watch('./src/img/**/*', ['images'])
    153   gulp.watch(['./src/json/*.json', './src/xml/*.xml', '!./src/xml/old.xml'], ['data'])
    154   gulp.watch('./src/scripts/*.js', ['js'])
    155 })
    156 
    157 // 使用时在命令行输入gulp taskname即可,直接输入gulp则运行默认任务
    View Code

     gulp 4.0.2案例

     1 const gulp = require('gulp')
     2 
     3 // 1.处理html
     4 const htmlmin = require('gulp-htmlmin')
     5 gulp.task('html', () => {
     6   return gulp.src('./index.html')
     7     .pipe(htmlmin({
     8       // collapseWhitespace: true, // 去除空格
     9       removeAttributeQuotes: true // 删除属性的引号
    10     }))
    11     .pipe(gulp.dest('./dist/'))
    12     .pipe(reload({ stream: true }))
    13 })
    14 
    15 // 2.处理sass
    16 const sass = require('gulp-sass')
    17 sass.compiler = require('node-sass')
    18 gulp.task('sass', () => {
    19   return gulp.src('./style/*.scss')
    20     .pipe(sass().on('error', sass.logError))
    21     .pipe(gulp.dest('./css/'))
    22     .pipe(reload({ stream: true }))
    23 })
    24 
    25 // 3.处理css
    26 const cssmin = require('gulp-cssmin')
    27 const rename = require('gulp-rename')
    28 const concat = require('gulp-concat')
    29 gulp.task('css', () => {
    30   return gulp.src('./css/*.css')
    31     .pipe(concat('index.css'))
    32     .pipe(cssmin())
    33     .pipe(rename({ suffix: '.min' }))
    34     .pipe(gulp.dest('./dist/css/'))
    35     .pipe(reload({ stream: true }))
    36 })
    37 
    38 // 4.把压缩后的css和js注入到html中
    39 const inject = require('gulp-inject')
    40 // inject 注入
    41 gulp.task('inject', () => {
    42   return gulp.src('./dist/index.html')
    43     .pipe(inject(gulp.src(['./dist/css/*.css'], { read: false }), { relative: true }))
    44     .pipe(gulp.dest('./dist/'))
    45     .pipe(reload({ stream: true }))
    46 })
    47 
    48 // 5.任务监听
    49 const browserSync = require('browser-sync')
    50 const reload = browserSync.reload
    51 gulp.task('default', gulp.series([gulp.parallel([gulp.series('sass', 'css'), 'html']), 'inject'], () => {
    52   browserSync({
    53     port: 9001,
    54     server: {
    55       baseDir: './dist'
    56     }
    57   })
    58 
    59   // 监控文件变化
    60   // 需要在子任务中添加reload来配合 .pipe(reload({ stream: true }))
    61   gulp.watch('./style/*.scss', gulp.series('sass'))
    62   gulp.watch('./css/*.css', gulp.series('css'))
    63   gulp.watch('./index.html', gulp.series('html'))
    64 }))
    65 
    66 // 6.或者这样来写server
    67 const connect = require('gulp-connect')
    68 const open = require('open')
    69 gulp.task('server', gulp.series([gulp.parallel([gulp.series('sass', 'css'), 'html']), 'inject'], () => {
    70   const config = {
    71     root: './dist',
    72     host: '127.0.1.1',
    73     port: 9002
    74   }
    75   connect.server({
    76     ...config,
    77     livereload: true
    78   })
    79   open('http://' + config.host + ':' + config.port)
    80   // 监控文件变化
    81   // 需要在各子任务中使用.pipe(connect.reload())配合,代码中使用的是和5中配合的browserSync.reload
    82   gulp.watch('./style/*.scss', gulp.series('sass'))
    83   gulp.watch('./css/*.css', gulp.series('css'))
    84   gulp.watch('./index.html', gulp.series('html'))
    85 }))
    View Code

     Rollup

    Rollup 是一个 JavaScript 模块打包器,可以将小块代码编译成大块复杂的代码,相比gulp更适合打包供调用的lib。

    1.安装

    命令行:

    1 npm i rollup -g

    2.使用

    2.1先创建项目,分别创建src/main.js和src/foo.js文件,

     // main.js
    2 import foo from './foo.js';
    3 export default function () {
    4   console.log(foo);
    5 }
    1 // foo.js
    2 export default 'HelloWorld'

    2.2命令行运行

    不输出到文件,结果直接在cmd中打印 。-f 参数输出的文件类型 (amd, cjs, esm, iife, umd)
    1 rollup src/main.js -f cjs

    -o参数表示输出位置

    1 rollup src/main.js -o bundle.js -f cjs

    会看到生成bundle.js文件,其内容为:

    1 'use strict';
    2 
    3 function main () {
    4   console.log(foo);
    5 }
    6 
    7 module.exports = main;

    2.3使用配置文件

    命令行直接传参的方式不够方便,可以在项目根目录下创建rollup.config.js做为配置文件:

    1 export default {
    2   input: 'src/main.js',
    3   output: {
    4     file: 'bundle.js',
    5     format: 'cjs'
    6   }
    7 }

    这样在命令行中只需要rollup -c即可,-c表明使用配置文件(默认名称rollup.config.js)。

    也可以把该命令结合package.json使用:

     2.4使用插件

    rollup的一些功能需要借助插件,下面rollup-plugin-json为例介绍:

    安装:

    1 npm install --save-dev rollup-plugin-json
    在rollup.config.js中引入插件并放入plugins配置项中:
    1 export default {
    2   input: 'src/main.js',
    3   output: {
    4     file: 'bundle.js',
    5     format: 'cjs'
    6   },
    7   plugins: [json()]
    8 }
    这样在main中就可以直接从json文件中导入数据了:
    1 // main.js
    2 import foo from './foo.js';
    3 import {version} from '../package.json'
    4 export default function () {
    5   console.log(foo);
    6   console.info('version:' + version)
    7 }

    运行rollup后bundle.js文件为:

     1 'use strict';
     2 
     3 var foo = 'HelloWorld';
     4 
     5 var version = "1.0.0";
     6 
     7 function main () {
     8   console.log(foo);
     9   console.info('version:' + version);
    10 }
    11 
    12 module.exports = main;
    发现只出现了version变量,而没有导入package.json中没有用到的内容,这说明rollup在打包过程中有很好的tree-shaking作用。

    总结

    gulp适合用未使用脚手架的项目打包,rollup具备tree-shaking且能输出不同模块类型的更适用于js库的打包,如果是vue或react脚手架项目那么首选应是webpack了。
     
  • 相关阅读:
    写了一个自动打包并发布到tomcat的脚本
    查看并更改mysql编码
    MyBatis无法根据中文条件查询出结果
    服务器端PHP多进程编程
    PHP-popen()&nbsp;函数打开进程文件指针
    php并发处理
    PHP能得到你是从什么页面过来的,r…
    PHP如何解决网站大流量与高并发的…
    基于PHP的cURL快速入门
    Mysql内存表的用处
  • 原文地址:https://www.cnblogs.com/jyughynj/p/11227321.html
Copyright © 2011-2022 走看看