Taskr 使用教程 [ NextJs 构建工具 ]

1,841 阅读4分钟

Taskr 官方文档

Taskr 是一个类似 gulp 的高性能、轻量的自动化工具,且它支持并发。 Taskr 将所有的执行任务都是协程,而所有任务执行的操作函数都是插件,你可以轻松扩展,自由组合任务。

npm install --save-dev taskr

入口文件

入口文件 taskfile.js,同时加载插件(解析同级的package.json文件中的taskr依赖包作为插件)

taskfile.jspackage.json 路径可修改(最后的命令行配置)

  • 默认只支持 es5,支持 es6 必须安装依赖库 @taskr/esnext

taskr 任务起点 ( 什么是 task 任务 )

入口文件 taskfile 文件中所导出的每一个函数都是一个单独的任务,taskr 默认会执行 taskfile 文件中 default 导出的任务,然后安装 default 函数中安装 taskr 内置 API(串行|并行)执行的插件顺序依次执行

  • taskfile.js 文件中名为 default 的导出函数为执行启动函数,然后按照 task.start | serial | parallel 规定的顺序依次执行
// 下面的代码会依次执行 开始default -> taskone -> taskTwo -> myplugin -> taskThree -> 结束 default
export default async function (taskr) {
  await taskr.start("taskOne");
  await taskr.start("taskTwo");
}

export async function taskOne(taskr) {
  console.log("taskOne");
  // .....
}
export async function taskTwo(taskr) {
  console.log("taskTwo");
  // 调用外部或本地新加插件
  await taskr.myplugin().serial("taskThree");
  // .....
}
export async function taskThree(taskr) {
  console.log("taskThree");
  // .....
}

什么是插件

taskr 将所有在任务中执行的非 API 之外的操作代码都视作插件 plugin,因此,taskr 可以很方便的进行扩展,插件有三种类型

  • 外部插件、本地插件:都通过 task.plugin 初始化,只是文件存放地方不一样
  • 内联插件:通过 task.run 初始化

插件参数

所有的插件都支持 every files 参数

// 插件是否遍历所有文件
options.every: default true

// 是否接受taskr的路径匹配规则
options.files: default true

外部插件与本地插件 ( task.plugin 的使用 )

外部插件与本地插件在定义与使用方法上都是一致的,唯一的区别是:外部插件的包放置于 npm 上(如:@task/next ),是公开的;本地插件的代码则在本地通过 package.jsonoptionstaskr.requires 导入

// name: 插件名称
// pluginOptions: 插件配置信息
// (file, opt): file 当前文件信息 opt 插件的自定义传参

task.plugin(name, pluginOptions, (file, opt) => {
  // ...
});
// 在myplugin.js文件中定义名为myplugin的插件
module.exports = function (task, utils) {
  // promisify before running else repeats per execution
  const render = utils.promisify(function () {});
  // verbose API
  task.plugin("myplugin", { every: false }, function* (files, opts) {
    console.log("all my files: ", files); //=> Array
    console.log(this._.files === files); //=> true
    console.log(this instanceof Task); //=> true
    console.log("user options: ", opts);
    yield render(opts);
  });
  // or w/condensed API
  task.plugin({
    name: "myplugin",
    every: false,
    *func(files, opts) {
      // ...same
    },
  });
};

// taskFour 是task,直接通过task.myplugin 链式调用即可
exports.taskFour = function* (task) {
  yield task.source("src/*.js").myplugin({ foo: "bar" }).target("dist");
};
// 本地插件导入 package.json 示例
{
  "taskr": {
    "requires": [
      "./build/custom-plugin-one.js",
      "./build/custom-plugin-two.js"
    ]
  }
}
// 实例化传参
const Taskr = require('taskr')
const taskr = new Taskr({
  plugins: [
    require('./build/custom-plugin-one.js'),
    require('./build/custom-plugin-two.js'),
    require('@taskr/clear')
    {
      name: 'plugThree',
      every: false,
      files: false,
      *func(globs, opts) {
        // nifty, eh?
      }
    }
  ]
});

内联插件 ( task.run 的使用)

内联插件是指通过 taskr.run 方法只使用一次的插件,如果需要多次使用,可以提升到本地或外部插件

// pluginOptions: 插件配置信息
// (file, opt): file 当前文件信息 opt 插件的自定义传参

task.run(pluginOptions, (file, opt) => {
  // ...
});
// taskFIve 为taskfile中的task,在其中使用run执行的插件函数就是内联函数,只能执行一次,无法复用
exports.taskFIve = function* (task) {
  yield task
    .source("src/*.js")
    .run({
      every: false,
      *func(files) {
        Array.isArray(files); //=> true
        yield Promise.resolve("this will run once.");
      },
    })
    .target("dist");
};

主要 API

公共参数类型

{
  task: string; // task 任务:一般为内部插件的名称,表示执行当前插件
  tasks: task[]; // task数组
  options: object; // 配置项
}

taskr 文件 API

  • task.source(globs, [options]): 加载源文件
  • task.target(dirs, [options]):设置目标文件目录

Taskr 任务调度 API

主要执行 taskfile 注入的调度任务task

  • taskr.start(task, [options]):执行 task 任务
  • taskr.serial(tasks, [options]):串行执行
  • taskr.parallel(tasks, [options]):并行执行

Taskr 插件 API

  • taskr.plugin(name, pluginOptions, contentFn):创建本地或外部插件
  • taskr.run(pluginOptions, contentFn):创建内联插件

Taskr.root:工作目录

Taskr.$:内置的工具方法对象

Taskr._:任务内部状态,来自 taskr.source 方法注入

CLI 命令

默认为当前路径(-d),配置文件为taskfile.js,默认串行(-m)执行任务为导出为 default 的任务(task names),可以通过 options 配置指定修改

taskr [options] <task names>
Usage: taskr [options] [tasks]

Options
  -m  --mode=MODE   Run in 'parallel' or 'serial'. Default: 'serial'
  -d  --cwd=DIR     Set Taskr's home directory. Default: '.'
  -l  --list        Display all available tasks.
  -v  --version     Display Taskr's version.
  -h  --help        Display this help text.

Examples
  taskr -d=/demo
  taskr -m=parallel task1 task2
  taskr --mode=serial  task1 task2

相关库

  • mri:node 命令行参数解析工具,类似极简化的 yargs