这个函数不理解

这个函数不理解

class Package {
  constructor(options) {
    if (!options) {
      throw new Error('Package类的参数不能为空')
    }
    if (!isObject(options)) {
      throw new Error('Package类的参数不是一个对象')
    }
    // 包的路径
    this.targetPath = options.targetPath // 包的路径
    this.storeDir = options.storeDir // 缓存包的路径
    this.packageName = options.packageName // 包的名称
    this.packageVersion = options.packageVersion // 包的版本
  }

  // 判断当前包是否存在
  exists() {
    if (this.storeDir) { // 这个if什么时候会进来

    } else {
      return pathExists(this.targetPath)
    }
  }

  // 安装包
  install() {
    return npminstall({
      root: this.targetPath,
      storeDir: this.storeDir,
      registry: getDefaultRegistry(),
      pkgs: [
        { name: this.packageName, version: this.packageVersion }
      ]
    })
  }

  // 更新Package
  update() { }

  // 获取入口文件的路径
  getRootFilePath() {
    // 获取package.json所有目录
    const dir = pkgDir(this.targetPath)
    if (dir) {
      // 读取 package.json
      const pkgFile = require(path.resolve(dir, 'package.json'))
      if (pkgFile && pkgFile.main) {
        return path.resolve(dir, pkgFile.main)
      }
    }
    return null
  }
}
async function exec(...args) {

  // C:\\Users\\xiebenyin\\Desktop\\mk-lg\\xiebenyin-cli-dev\\xiebenyin-cli-dev\\commands\\init
  let targetPath = process.env.CLI_TARGET_PATH
  let storeDir = '' // 包下载的实际路径
  let pkg;
  const homePath = process.env.CLI_HOME_PATH
  log.verbose('targetPath包的路径', targetPath)
  log.verbose('homePath缓存路径', homePath)

  const cmdObj = args[args.length - 1]
  const cmdName = cmdObj.name() // 命令的名字
  const packageName = SETTINGS[cmdName]
  const packageVersion = 'latest'
  if (!targetPath) {
    targetPath = path.resolve(homePath, CACHE_DIR) // 生成缓存路径
    storeDir = path.resolve(targetPath, 'node_modules')
    log.verbose('targetPath', targetPath)
    log.verbose('storeDir', storeDir)

    pkg = new Package({
      targetPath,
      storeDir,
      packageName,
      packageVersion,
    })
    if (pkg.exists()) {
      // 更新包
    } else {
      // 下载包
      await pkg.install()
    }
  } else {
    pkg = new Package({
      targetPath,     // 包的路径
      packageName,    // 包的名称
      packageVersion, // 包的版本
    })
  }
  console.log(pkg.exists())
  const rootFile = pkg.getRootFilePath()
  if (rootFile) {
    require(rootFile).apply(null, args)
  }

}

对函数 exec 里面的 if (pkg.exists())这块不理解

exists 函数在定义的时候判断 storeDir 是否存在来选择执行代码,可是在实例化pkg之前就已经初始化好了storeDir的值,

  exists() {
    if (this.storeDir) { 
  
    } else {
    // 这块永远都无法进来
      return pathExists(this.targetPath)
    }
  }


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
扬_灵 2022-06-06 18:08:08

同学你好,exists函数是判断init执行逻辑文件是否存在,当通过targetPath指定自定义init逻辑的时候,是没有传递storeDir变量的,这时就会走到this.storeDir不存在的条件里。

  • 提问者 慕粉3946981 #1

    没有 targetPath 不是会通过

    storeDir = path.resolve(targetPath, 'node_modules')

    给一个值吗?

    2022-06-06 21:28:27
  • 提问者 慕粉3946981 #2

    可是我在exec包里面只使用了一次 exists 函数,并且在使用这个 exists 函数之前就已经给 storeDir 赋值了

    2022-06-07 17:29:37
  • 扬_灵 回复 提问者 慕粉3946981 #3

    同学你好,关于这个情况在本节视频最开始1:10的时候就有了介绍,已经和sam老师进行确认该判断的实际应用场景了。

    2022-06-07 19:52:47
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师