02.gulp+bundle+babel

312 阅读2分钟

1. Gulp

之前也提到了Gulp,其实Gulp更像是一个集成工具,Gulp提供了一套pipeline的工具集,然后也提供了一些列的支持Gulp标准的插件,然后Gulp可以将各个插件集成到Gulp的pipeline中执行。

像我们之前提到的bundleES6 -> ES5minifyuglify,以及文件的copy等等,都可以通过Gulp集成到一个任务序列中执行。

2. babel

babel用来进行从ES6 -> ES5的语言转化,因为不是现金所有的浏览器都支持ES6,所以如果需要考虑浏览器兼容性,在每一次进行js文件打包的时候都要做一次babel translation

3. bundle

我们之前也提到过,browserify用来做jsbundle,本例中,使用另一种工具做bundle -- merge-stream

而且在Gulp中,基本上每一个流行的工具,都能在npm中找到GulpPlugin

4. Demo

4.1 安装插件

# 在demo文件夹中执行
cd demo
# 创建npm项目
npm init
# 全局安装gulp,否则无法执行gulp命令
npm i -g gulp
# 安装gulp以及插件: 
# gulp: 用来创建gulp task
# gulp-copy: 用来copy文件
# gulp-order: 用来指定gulp中的执行文件顺序
# gulp-concat: 用来指定merge之后的文件名
# gulp-sourcemaps: 用来enable调试信息
# del: 用于删除文件及文件夹
# merge-stream: 用来bundle
# @babel/core: babelify的依赖项
# babelify: gulp中的babel插件,用于做ES6->ES5的translation
# @babel/preset-env: 用来设置要设置的babel之后的es版本
npm i -D gulp gulp-copy gulp-order gulp-concat gulp-sourcemaps del merge-stream @babel/core babelify @babel/preset-env

4.2 创建gulpfile.js

gulpfile.jsgulp项目的描述文件,当在项目文件夹中执行gulp命令时,gulp工具会自动扫描文件夹中的gulpfile.js文件,然后执行其中的task

var gulp = require('gulp');
var merge = require('merge-stream');
var order = require('gulp-order');
var del = require('del');
var babel = require('gulp-babel');
var concat = require('gulp-concat');
var sourcemaps = require('gulp-sourcemaps');

gulp.task('clean', function () {
    return del(['bundle.js']);
});

/**
 * 第一步,定义nerge-stream的文件集合
 * 第二步,初始化sourcemaps,enable js map
 * 第三步,定义bundle的顺序
 * 第四步,指定es标准
 * 第五步,指定输出文件名称
 * 第六步,enable debug
 * 第七步,定义输出路径
 * 
 * Note: 这里将bundle.js输出到当前文件夹,为了方便vscode调试,发现执行gulp的路径需要与bundle文件输出路径相同,否则vscode无法命中断点。
*/
gulp.task('bundle', function () {
    return  merge(gulp.src(['./init.js', './promiseEventloop.js'])//  merge(gulp.src(['./*.js', '!./gulpfile.js'])
        .pipe(sourcemaps.init())
        .pipe(order(['init.js', '*.js']))
        .pipe(babel({
            presets: ['@babel/env']
        }))
        .pipe(concat('bundle.js'))
        .pipe(sourcemaps.write({ includeContent: false, sourceRoot: './' })) // enable debugging
        .pipe(gulp.dest('./')));
});

exports.build = gulp.series('clean', 'bundle');
// package.json 配置babel的demo
"devDependencies": {
    "@babel/core": "^7.16.7",
    "@babel/preset-env": "^7.16.7",
    "del": "^6.0.0",
    "gulp": "^4.0.2",
    "gulp-babel": "^8.0.0",
    "gulp-concat": "^2.6.1",
    "gulp-copy": "^4.0.1",
    "gulp-order": "^1.2.0",
    "gulp-sourcemaps": "^3.0.0",
    "merge-stream": "^2.0.0"
    //.......
  },
  "babel": {
    "presets": [
      "@babel/preset-env"
    ]
  }

bundle.js文件中就输出了bundle过后的ES5js代码。