前端开发前端开发那些事儿

自动化构建和构建工具Gulp

2021-01-22  本文已影响0人  Aaron胖虎

自动化构建

什么是构建
为什么构建
什么是自动化构建
npm scripts
{
  "scripts": {
    // 命令名称: 任务
    "foo": "node bar.js"
  }
}
# `scripts` 字段是一个对象。它的每一个属性,对应一段脚本。比如,`foo` 命令对应的脚本是`node bar.js`。

# 命令行下使用 npm run <命令>,就可以执行这段脚本。
$ npm run foo
# 等同于执行
$ node bar.js
"style": "lessc *.less"
"style": "lessc **/*.less"

* 表示任意文件名,** 表示任意一层子目录

{
  "scripts": {
    "parallel": "node task1.js & node task2.js & node task3.js"
  }
}

如果是串行执行(前一个任务成功后,才执行下一个任务),可以使用 && 符号

{
  "scripts": {
    "series": "node task1.js && node task2.js && node task3.js"
  }
}

但是,& 符号在 Windows 操作系统下不起作用。此时,我们可以借助插件,在 Windows 下实现并行操作:npm-run-all

构建样式文件
# 安装 babel核心,Babel客户端
npm i -g babel-core babel-cli

# 安装转码规则
npm i -g babel-preset-env

# 在项目根目录下,新建 .babelrc 文件(注意文件名前有一个点),并添加转换规则
{
    "presets": [
      "env"
    ],
}

# 通过 babel 编译单个 j s文件
babel input.js --out-file output.js
# 或者
babel input.js -o output.js
    
# 通过 babel 编译整个目录
babel js --out-dir scripts
# 或者
babel js -d scripts

# 在 package.json 中,添加 babel 解析命令
"scripts": {
    "script": "babel js -d scripts",
}

# 执行命令(自动编译)
npm run script

# 如果 Babel 是局部安装。则babel 的可执行路径是:./node_modules/.bin/babel命令需要做相应的调整
# babel js -d scripts    ===>   ./node_modules/.bin/babel js -d scripts
# 在 package.json 中,添加 babel 解析和压缩命令
"scripts": {
    "script": "babel js -d scripts && minify scripts/main.js > scripts/script.min.js",
}
代码格式校验

使用 ESLint 来检测 JavaScript 代码

# 配置检测规则
{
    "env": {
        "browser": true,
        "commonjs": true,
        "es2021": true
    },
    "extends": "eslint:recommended",
    "parserOptions": {
        "ecmaVersion": 12
    },
    "rules": {
        "indent": [ "error", 2 ],       # 使用两个空格缩进
        "quotes": [ "error", "double" ] # 使用双引号包裹字符串
    }
}
StyleLint

StyleLint 是检测 CSS 代码格式的插件
官网:https://stylelint.io/

{
  "extends": "stylelint-config-standard",
  "rules": {
    # 除了使用 stylelint-config-standard,我们还可以在 rules 字段中自定义校验规则
    "block-no-empty": true # 代码块不能为空
  }
}

自动化构建工具Gulp

自动化构建工具,可以帮我们又快又好的完成自动化构建任务。相比有 npm scripts,自动化构建工具,功能更为强大。更简单易学

Gulp

Gulp 是基于 的自动化构建系统。

Gulp 使用
  1. 使用 Gulp 之前,先在全局安装 gulp-cli
    命令:npm i -g gulp-cli
  2. 初始化项目
    npm init --yes
  3. 安装 Gulp 包
# 安装 gulp 包,作为开发时依赖项
npm i gulp -D
  1. 创建 gulpfile 文件
    gulpfile 文件是项目根目录下的 gulpfile.js在运行 gulp 命令时会被自动加载。在这个文件中,你经常会看到类似 src()dest()series()parallel() 函数之类的 Gulp API,除此之外,纯 JavaScript 代码或 Node.js 模块也会被使用。任何导出( exports )的函数都将注册到 Gulp 的任务(task)系统中

报错:The following tasks did not complete: task
Did you forget to signal async completion?
解释:在最新的 Gulp 中,取消了同步代码模式。约定每个任务都必须是一个异步任务
解决:再函数参数中,设定回调函数(回调函数是异步操作)

  1. 在 gulpfile.js 中注册 Gulp 任务

  2. 运行 Gulp 任务

# 运行 foo 任务
# 如需运行多个任务(task),可以执行 gulp <task> <othertask>
gulp foo
  1. 创建默认任务
# 默认任务的名称是 default
exports.default = cb => {
    console.log('default task is running')
    
    cb()
}

# 运行默认任务, gulp 后无需指定任务名称
gulp # 效果等同于 gulp default
组合任务
const gulp = require('gulp')
# 串行方式执行任务,先执行task1, 然后执行task2, 然后执行task3
exports.foo = gulp.series(task1, task2, task3)

# 并行方式执行任务,同时执行task1,task2,task3
exports.bar = gulp.parallel(task1, task2, task3)

# 执行命令
gulp foo # 串行执行
gulp bar # 并行执行
文件操作

gulp 暴露了 src()dest() 方法用于处理计算机上存放的文件。在代码构建过程中,需要将源文件,写入到目标目录。

# 通过 解构 的方式引入 gulp 中的函数
const { src, dest } = require('gulp')

exports.default = () => {
  // 文件操作
  // 将 src/styles 目录下的 main.css 文件,复制到 dist/styles 目录下
  return src('src/styles/main.less', { base: 'src' }).pipe(dest('dist'))
}

# 执行命令
gulp default
# 或直接执行
gulp

样式文件构建

脚本文件构建

页面模板构建

# 引入 parallel 函数
const { src, dest, parallel } = require('gulp')

// 任务的并行执行
const build = parallel(style, script, html)

module.exports = {
  build
}

# 运行命令
gulp build

图片(字体)文件转换

报错处理:
gulp-imagemin: Couldn't load default plugin "gifsicle"
gulp-imagemin: Couldn't load default plugin "optipng"
原因:npm 安装依赖失败
解决:
1. 配置 hosts
2. 重新安装 npm i gulp-imagemin -D

文件清除

开发服务器

# 安装 browser-sync 插件
npm i browser-sync -D

# 在 gulpfile.js 中添加开发服务器的内容
const browserSync = require('browser-sync')
const bs = browserSync.create()

// 声明 web 服务构建任务
const serve = () => {
  bs.init({
    server: {
      baseDir: './dist' // 指定服务启动的目录
      routes: {
        '/node_modules': 'node_modules' // 引入 Bootstrap 是设置路径映射
      }
    }
  })
}

module.exports = {
  clean,
  build,
  serve
}

# 运行命令,然后在浏览器查看效果
gulp serve
  1. 下载插件
# 因为 Bootstrap 和 jQuery 上线之后还要使用,所以,采用 -S 参数(上线依赖)
npm i bootstrap@3.4.1 jquery -S
  1. 引入文件
    Bootstrap 和 jQuery 下载后,文件位于当前目录的 node_modules 下
# 在 HTML 中引入
<link rel="stylesheet" href="/node_modules/bootstrap/dist/css/bootstrap.min.css">
......
<script src="/node_modules/jquery/dist/jquery.min.js"></script>
<script src="/node_modules/bootstrap/dist/js/bootstrap.min.js"></script>
  1. 使用 Bootstrap

监视变化(热更新)

最终的代码如下:

# 在 gulpfile.js 中添加监视文件变化的代码
const serve = () => {
  // watch(被监视的文件,对应的任务)
  watch('src/index.html', html)
  watch('src/styles/*.less', style)
  watch('src/js/*.js', script)
  watch('src/images/**', image)

  // 初始化服务
  bs.init({
    notify: false,      // 禁用浏览器右上角的 browserSync connected 提示框
    files: 'dist/**',   // 监视 dist 下 文件的变化,然后在浏览器上实时更新
    server: {
      baseDir: './dist', // 指定服务启动的目录
      routes: {
        '/node_modules': 'node_modules'
      }
    }
  })
}

// 组合任务
const build = parallel(style, script, html, image)
const dev = series(clean, build, serve)

// 导出任务
module.exports = {
  build,
  dev,
  serve
}

# 运行命令,更新代码文件,查看页面变化
gulp dev

此时,不管是 dist 目录下,还是 src 目录下。只要代码发生变化,我们就可以在浏览器上实时看到效果。

上一篇下一篇

猜你喜欢

热点阅读