ES6 - gulp 构建运行环境 - 最详细篇章一

这篇文章主要讲解--构建脚本编码:

由于简书不能发布篇幅特别长的文章, 所以这里分为两部分来发布, 大家见谅。

首先我们下来看下配置文件的整体目录: 配置文件一共是 9 个。 各个文件所对应的功能下面有具体且详细的解释 。

如下图所示:


02-02.png

1. 定义参数: 对命令行参数解析

1.1 配置文件在 tasks/util/args.js 文件中

1. 引入 'yargs'
   1. 处理命令行参数 npm 包: import yargs from 'yargs'
   2. 为了识别在命令行输入的 命令。

2. 定义基本参数:
   1. 区分开发环境与线上环境
      1. option: 用来配置参数, 用来区分命令行输入的是否有这个参数, 进而用来区分线上与开发环境 。
      

1.2 代码如下:

/**
定义参数: 对命令行参数解析
1. 区分开发环境和线上环境
 */

import yargs from 'yargs';
const args = yargs
// option: 用来配置参数, 用来区分命令行输入的是否有这个参数, 进而用来区分线上环境与开发环境 。
  .option('production', {
    boolean: true,    // 说明这个 production 选项是 bool 类型
    default: false,   // 设置 production 选项的默认值 (也就是命令行中没有输入 production 这个选项, 默认为 false, 开发环境 。 )
    describe: '信息描述'  // 描述信息, 机器一般不会去识别
  }) // 我们敲命令行时, 会有选项部分: gulp -production -> -production 就是他的选项部分 。
  // 输入的参数, 是否用来监听开发环境中文件的修改, 并自动编译。
  .option('watch', {
    boolean: true,
    default: false,
    describe: '信息描述'
  })
  // 是否要详细的输出命令行执行的日志
  .option('verbos', {
    boolean: true,
    default: false,
    describe: '信息描述: 日志输出'
  })
  // 关于映射的内容
  .option('sourcemaps', {
    describe: '信息描述: 强制生成 sourcemaps'
  })
  // 启动服务器的端口号设置
  .option('port', {
    string: true,   // 默认是字符串类型
    default: 8080,  // 默认端口号
    describe: '信息描述: 设置端口号'
  })

  .argv // 标识对输入的命令行内容以字符串的形式解析

  export default args

2. 对 .JS 做处理 (tasks/scripts.js)

1. 需要引入的包:
   1. 'gulp'   // gulp 处理的都是文件流, 它是基于 stream 的 。
   2. 'gulp-if' // gulpif 是在 gulp 的语句做 if 判断的 。
   3. 'gulp-concat'  // 在 gulp 语句中处理文件拼接的 。
   4. 'webpack'  // 项目打包的过程是用的是 webpack 。
   5. "webpack-stream"; // webpack 的处理是结合 webpack-stream 一起来做处理的 。
   6. 'vinyl-named'  // 对文件重命名的做标志的
   7. gulp-livereload // 热更新包
   8. gulp-plumber // 处理文件信息流的包
   9. gulp-rename // 文件重命名的包
   9. gulp-uglify // 处理 JS / CSS 压缩的一个包
   10. gulp-util // 在命令行工具输出的包 
   11. args.js // 上面写好的对命令行参数解析

2. 安装上面所需的包 <如果自己配置时, 注意插件版本>
   1. cnpm install gulp@3.9.1 gulp-if@2.0.2 gulp-concat@2.6.1 webpack@2.2.1 webpack-stream@3.2.0 vinyl-named@1.1.0 gulp-livereload@3.8.1 gulp-plumber@1.1.0 gulp-rename@1.1.0 gulp-uglify@2.1.0 gulp-util@3.0.8 yargs@7.0.2 --save-dev
      1. --save-dev: 表示除了需要将这些包安装以外, 还要在 package.json 这个文件中创建一个安装包依赖的一些字段 。
      

代码如下:

// 创建构建脚本: 对 JS 做处理 。

/**
1. 引入 npm 包
   1. gulp
 */
import gulp from 'gulp'   // gulp 处理的都是文件流, 它是基于 stream 的 。
import gulpif from 'gulp-if' // gulpif 是在 gulp 的语句做 if 判断的 。
import concat from 'gulp-concat'  // 在 gulp 语句中处理文件拼接的 。
import webpack from 'webpack'  // 项目打包的过程是用的是 webpack 。
import gulpwebpack from "webpack-stream"; // webpack 的处理是结合 webpack-stream 一起来做处理的 。
import named from 'vinyl-named'  // 对文件重命名的做标志的

/**
2. 浏览器在文件修改之后自动刷新的功能: 我们需要热更新的一个包
 */
import livereload from 'gulp-livereload'
/**
3. 处理文件信息流的包:
 */
import plumber from 'gulp-plumber'
/**
4. 对文件重命名的一个包
 */
import rename from 'gulp-rename'
/**
5. 压缩 JS 使用的包: 用来处理 JS / CSS 压缩的一个包
 */
import uglify from 'gulp-uglify'
/**
6. 在命令行工具输出的包:
 */
import {logo, colors} from 'gulp-util'
/**
7.
对命令行参数解析
 */
import args from './util/args.js'

/**
--save-dev: 标识文件除了安装以外, 还要在 package.json 文件中创建一个安装包依赖的一些字段
 */

/**
1. 创建 gulp 脚本编译任务
   1. task 是 gulp 的一个 API , 用来创建任务
   2. scripts 是 创建任务的名称

 */
gulp.task('scripts', () => {
  // 任务执行的主题
  return gulp.src(['app/js/index.js']) // app/js/index.js 打开当前目录
  // 改变默认处理错误的机制, 集中处理脚本编译过程中出现的错误 。
  .pipe(plumber({
    errorHandler:function() {

    }
  }))
  // 对文件重新命名
  .pipe(named())
  // 对 JS 进行编译 (这个时候借用 webpack 的功能)
  .pipe(gulpwebpack({
    // webpack-module: 模块
    module:{
      loaders: [{
        // 遇到 js 文件, 使用 babel 去处理
        test: /\.js$/,
        loader: 'babel'
      }]
    }
  }), null, (err, stats) => {
    log(`finihed '${colors.cyan('scripts')}'`, stats.toString({
      chunks: false
    }))
  })
  // 文件存放位置的设置 (将文件放入指定的路径) (问什么将文件放在 server 文件中: 因为 server 需要拿到最新的编译好的 js 文件才能够跑起来)
  .pipe(gulp.dest('server/public/js'))
  // 编译压缩的功能
  .pipe(rename({
    // 相当于将之前的文件复制了一份, 名字为: cp.min.js
    basename: 'cp',
    extname: '.min.js'
  }))
  .pipe(uglify({
    // 配置如何压缩
    compress: {
      properties: false
    },
    output: {
      'quote_keys': true
    }
  }))
  // 将文件真正的存储到某个地方去
  .pipe(gulp.dest('server/public/js'))
  // 监听文件: 使用 gulpif 去判断, 然后在执行 livereload
  .pipe(gulpif(args.watch, livereload()))

})

之前有整理过部分知识点, 现在将整理的相关内容, 验证之后慢慢分享给大家; 这个专题是 “前端ES6基础” 的相关专栏; 不积跬步,无以至千里, 戒焦戒躁 。

如果对你有所帮助,喜欢的可以点个关注; 文章会持续打磨 。
有什么想要了解的前端知识吗? 可以评论区留言, 会及时跟进分享所相关内容 。
整理知识点不易, 每次都是在工作繁忙之余夜深人静之时整理, 无论知识点是大是小, 都会验证后再分享, 以防自己发表的文章给大家造成误导 。如有问题还望不吝赐教,本人会及时更改 (本文原创, 如需转载,请注明出处) 。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容