function bundleClient (hoodieClientPath, bundleTargetPath, options, callback) {
  var pluginPaths = options.plugins.map(function (pluginName) {
    return pluginName + '/hoodie/client'
  })

  var plugins = [path.resolve('hoodie/client')]
    .concat(pluginPaths)
    .map(p => p.replace(/\\/g, '/')) // fix backslashes in Windows paths
    .filter(checkModule)

  var getPluginsModifiedTimes = plugins.map(function (pluginPath) {
    return getModifiedTime.bind(null, requireResolve(pluginPath))
  })

  parallel(getPluginsModifiedTimes.concat([
    getModifiedTime.bind(null, hoodieClientPath),
    getModifiedTime.bind(null, bundleTargetPath)
  ]), function (error, results) {
    /* istanbul ignore if */
    if (error) {
      return callback(error)
    }

    var targetTime = results.pop()
    var sourceTime = Math.max.apply(null, results)
    var hasUpdate = sourceTime > targetTime

    var get = hasUpdate ? buildBundle.bind(null, options, plugins) : fs.readFile.bind(null, bundleTargetPath)

    get(function (error, buffer) {
      if (error) {
        return callback(error)
      }

      callback(null, buffer, hasUpdate)
    })
  })
}
we compare the mtime (modified time) for the last modified dependency of the
Hoodie client and the target bundle file. If the latter does not exist or
any dependency was modified more recently, we read out the client and add
the `new Hoodie()` init code, otherwise we simply read out the bundle file.

This optimisation is in preparation for plugins. Plugins can extend the
client, so we need to browserify on-the-fly to avoid dependency duplication,
and avoiding unneeded bundling with browserify saves a significant time.