code: function (path, params) {
    let existInHistory = -1
    if (this.launcherMode != 'normal' && this.history.length > 0) {
      for (let i=this.history.length-1; i>=0; i--) {
        if (path == this.history[i][1] && (!this.compareParam || (this.compareParam && (!params && !this.history[i][2] || equal(params, this.history[i][2]))))) {
          existInHistory = i
          break
        }
        if (this.launcherMode === 'singleTop') {
          break
        }
      }
    }
    if (existInHistory < 0) {
      this.rid++
      let historyId = this.rid + '_' + (+new Date)
      this.history.push([historyId, path, params && Object.keys(params).length > 0 ? params : null])
    } else {
      this.finishedHistoryIds.push('_')
      this.history = this.history.slice(0, existInHistory + 1)
      let currentEndRoute = this.currentRoute.slice(-1)[0]
      this.history.slice(-1)[0].push({reuse: currentEndRoute && currentEndRoute[1].meta && currentEndRoute[1].meta.reuse})
    }
    if (this.history.length > this.maxHistorySize) {
      this.finishedHistoryIds.push('_')
      this.history = this.history.slice(0-this.maxHistorySize)
    }
  }
docs: 1、normal：直接入栈
  2、single task：只维持一个实例，该实例之上的全部出栈
  3、single top：栈顶只维持一个实例
  4、single task with params
  5、single top with params