Yeoman(3) 跟用户的交互

跟用户的交互

你的generator会跟最终的用户进行大量的交互.默认的,yeoman是跑在命令行的,但是它也提供的不同的工具来支持特制的用户界面.举例来说,yeoman完全可以跑在一个图形界面或者一个标准程序里

为了让它具备这样扩展性,yeoman提供了一组抽象的用户界面元素.当你跟你的用户交互的时候,你有责任使用这些抽象元素,如果使用其他的方式,可能使得你的generator不能正确运行

举例来说,不要使用console.log()process.stdout.write()来输出内容.因为如果用户不是用命令行模式,那么输出就看不到了.相应的,应该使用generator.log()来输出,这里的generator是你当前generator的上下文

用户交互

Prompts

Prompts是主要的跟用户交互的方式,它由Inquirer.js模块来提供,你应该查阅它的api来看下可用的选项.

prompt方法是异步的,并且返回一个promise. 你必须在你的任务中返回这个promise,以此保证它的完成之后,才进行下一个任务.

module.exports = generators.Base.extend({
  prompting: function () {
    return this.prompt([{
      type    : 'input',
      name    : 'name',
      message : 'Your project name',
      default : this.appname // Default to current folder name
    }, {
      type    : 'confirm',
      name    : 'cool',
      message : 'Would you like to enable the Cool feature?'
    }]).then(function (answers) {
      this.log('app name', answers.name);
      this.log('cool feature', answers.cool);
    }.bind(this));
  }
})

注意,这里我们使用prompt队列来询问用户,从而得到来自他们的反馈

记住用户的选择

用户在每次使用你的generator的时候,可能给出的选择是一样的.对于这些问题,你或许应该记住用户上次的选择来作为这些问题的默认的新的答案

yeoman通过增加一个store属性到question对象中来扩展 **Inquirer.js**api,来完成上面说的要求

this.prompt({
  type    : 'input',
  name    : 'username',
  message : 'What\'s your Github username',
  store   : true
});

注意:提供一个默认值会阻止用户选择空值
如果你不想用prompt,只在意”store”保存的值,你需要去看看Yeoman storage documentation

命令行参数

直接传在命令行的参数:

yo webapp my-project

在这里,”my-project”是第一个参数

我们使用generator.argument()来告诉系统,我们想要得到一个参数.这个方法的签名是一个表示name的string类型参数,和一个可选的关于选项的对象参数

name以后可以被作为一个getter用,generator[‘name’]
关于选项的对象参数可以接受多个键值对

  • desc 对于参数的描述
  • required 是否必须
  • optional 是否是可选项
  • type 类型
  • defaults 默认参数

这个方法必须在constructor函数中调用.否则,当用户使用”yo webapp –help”的命令的时候,就得不到相关的帮助信息了

var _ = require('lodash');

module.exports = generators.Base.extend({
  // note: arguments and options should be defined in the constructor.
  constructor: function () {
    generators.Base.apply(this, arguments);

    // This makes `appname` a required argument.
    this.argument('appname', { type: String, required: true });
    // And you can then access it later on this way; e.g. CamelCased
    this.appname = _.camelCase(this.appname);
  }
});

命令行选项参数

命令行参数书写格式上要带上”–”

比如:
yo webapp –coffee

我们使用generator.option()来告诉系统,我们想要得到一个选项参数.这个方法的签名是一个表示name的string类型参数,和一个可选的关于选项的对象参数

name用来搜索在generator.options里的参数
命令行选项参数对象可以接受多个键值对

  • desc 描述
  • alias 别名,简称
  • type 类型
  • defaults 默认值
  • hide 是否隐藏help信息
module.exports = generators.Base.extend({
  // note: arguments and options should be defined in the constructor.
  constructor: function () {
    generators.Base.apply(this, arguments);

    // This method adds support for a `--coffee` flag
    this.option('coffee');
    // And you can then access it later on this way; e.g.
    this.scriptSuffix = (this.options.coffee ? ".coffee": ".js");
  }
});

输出信息

信息输出是通过generator.log模块来处理的

主要的方法很简单,就是generator.log

generator.log('Hey! Welcome to my awesome generator')

它接受一个字符串,并且输出给用户
在命令行上下文中,它基本就是console.log

module.exports = generators.Base.extend({
  myAction: function () {
    this.log('Something has gone wrong!');
  }
});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值