gulp 的使用(三):处理 js

936 阅读3分钟

这是我参与更文挑战的第16天,活动详情查看: 更文挑战

前言

在上一篇 gulp 的使用(二):处理 html 文章里介绍了 gulp 如何处理 html。

在这篇文章里将介绍 gulp 如何处理 js。

压缩 js

gulp-uglify 是一个用于压缩 js 的插件,下面我们安装这个插件来压缩 js。

安装

npm i -D gulp-uglify

在 src 目录里新建一个 js 文件夹,里面新建一个 index.js,在 index.js 里写以下测试代码。

function print() {
  console.log('测试')
}

print()

index.html 里引用 index.js。

<script src="./js/index.js"></script>

在 gulpfile.js 进行配置。

const uglify = require('gulp-uglify')

function js() {
  return src(['src/js/**/*.js'])
    .pipe(changed('dist/js/**/'))
    .pipe(uglify())
    .pipe(dest('dist/js'))
}

function watcher() {
  watch('src/**/*.html', series(html)).on('unlink', function (path) {
    del('dist/**/' + Path.basename(path))
  })
  watch('src/js/**/*.js', series(js)).on('unlink', function (path) {
    del('dist/js/**/' + Path.basename(path))
  })
}

exports.default = series(clean, html, js, devServer, watcher)
exports.build = series(clean, html, js)

记得也要配置 watch,监听 js 目录的变化。

我们打开 dist/js/index.js,可以看到 index.js 里面的代码被压缩了。

image.png

区分 js 开发源码和 js 库

我们经常会引入一些库,如:jq,这些库通常都不需要 gulp 额外处理,比如:压缩 js,一般的第三方库都会有压缩 js 版本,它自身已经是完整的,一般不需要被构建工具再进行加工。

我们在 src 新建一个 lib 目录,lib 目录作为存放 js 第三方库的目录,里面粘贴下载好的 jq.js。

image.png

在 gulpfile.js 设置新的任务 libJs,并写上监听和写入执行任务队列。

function libJs() {
  return src(['src/lib/**/*.js'])
    .pipe(changed('dist/lib/**/'))
    .pipe(dest('dist/lib'))
}

function watcher() {
  watch('src/**/*.html', series(html)).on('unlink', function (path) {
    del('dist/**/' + Path.basename(path))
  })
  watch('src/js/**/*.js', series(js)).on('unlink', function (path) {
    del('dist/js/**/' + Path.basename(path))
  })
  watch('src/lib/**/*.js', series(libJs)).on('unlink', function (path) {
    del('dist/lib/**/' + Path.basename(path))
  })
}

exports.default = series(clean, html, libJs, js, devServer, watcher)
exports.build = series(clean, html, libJs, js)

执行 npm run dev,我们可以发现 dist 也输出了 lib 目录,里面有个 jq.js。

防止编译出错导致进程退出

gulp-plumber 是一个可以防止编译出错导致进程退出的插件,如果程序出错,它会将异常抛到终端上,并且防止进程退出。

安装

npm i -D gulp-plumber

我们在 html 任务、js 任务、libJs 任务添加上 pipe(plumber())

gulpfile.js

const plumber = require('gulp-plumber')

function html() {
  return src(['src/**/*.html', '!src/include/**.html'])
    .pipe(changed('dist'))
    .pipe(plumber())
    .pipe(fileinclude({
      prefix: '@@', //引用符号
      basepath: './src/include', //引用文件路径
    }))
    .pipe(htmlmin({
      removeComments: true, //清除HTML注释
      collapseWhitespace: true, //压缩HTML
      collapseBooleanAttributes: true, //省略布尔属性的值 <input checked="true"/> ==> <input />
      removeEmptyAttributes: true, //删除所有空格作属性值 <input id="" /> ==> <input />
      removeScriptTypeAttributes: true, //删除<script>的type="text/javascript"
      removeStyleLinkTypeAttributes: true, //删除<style>和<link>的type="text/css"
      minifyJS: true, //压缩页面JS
      minifyCSS: true //压缩页面CSS
    }))
    .pipe(dest('dist'))
}

function js() {
  return src(['src/js/**/*.js'])
    .pipe(changed('dist/js/**/'))
    .pipe(plumber())
    .pipe(uglify())
    .pipe(dest('dist/js'))
}

function libJs() {
  return src(['src/lib/**/*.js'])
    .pipe(changed('dist/lib/**/'))
    .pipe(plumber())
    .pipe(dest('dist/lib'))
}

完整项目

2021.8.30,我重新整理了一遍项目,已放到 gitee 上,大家可以 clone 下来直接用,代码的提交记录顺序和我这个系列文章教程顺序是一致的,大家看到哪一篇文章时,就回滚代码到哪一个版本,这样看项目代码会更直观。

gitee 库链接:gitee.com/only1zhuo/g…

image.png

“gulp 的使用”系列文章