• 手撕vue-cli配置文件——check-versions.js篇


    check-versions.js,vue-cli中检查版本的js文件。

    'use strict'
    const chalk = require('chalk')
    const semver = require('semver')
    const packageConfig = require('../package.json')
    const shell = require('shelljs')
    function exec (cmd) {
      return require('child_process').execSync(cmd).toString().trim()
    }
    
    const versionRequirements = [
      {
        name: 'node',
        currentVersion: semver.clean(process.version),
        versionRequirement: packageConfig.engines.node
      }
    ]
    
    if (shell.which('npm')) {
      versionRequirements.push({
        name: 'npm',
        currentVersion: exec('npm --version'),
        versionRequirement: packageConfig.engines.npm
      })
    }
    
    module.exports = function () {
      const warnings = []
      for (let i = 0; i < versionRequirements.length; i++) {
        const mod = versionRequirements[i]
        if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
          warnings.push(mod.name + ': ' +
            chalk.red(mod.currentVersion) + ' should be ' +
            chalk.green(mod.versionRequirement)
          )
        }
      }
    
      if (warnings.length) {
        console.log('')
        console.log(chalk.yellow('To use this template, you must update following to modules:'))
        console.log()
        for (let i = 0; i < warnings.length; i++) {
          const warning = warnings[i]
          console.log('  ' + warning)
        }
        console.log()
        process.exit(1)
      }
    }
     
    const chalk = require('chalk'):引入的是一个用来在命令行输出不同颜色文字的模块,通过chalk.yellow("想添加颜色的文字......")来实现改变文字颜色的;
     
    const semver = require('semver'):引入的是一个语义化版本文件的npm包,其实它就是用来控制版本的。“semver”的常用方法如下:
     
    semver.valid('1.2.3') // '1.2.3',返回符合版本格式的版本
    semver.valid('a.b.c') // null,如果不符合版本返回null
    semver.clean('  =v1.2.3   ') // '1.2.3',返回一个标准的版本号,且去掉两边的空格
    semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true,第一个参数是测试的版本号,第二个参数是匹配的版本,如果匹配则返回true
    semver.gt('1.2.3', '9.8.7') // false,第一个参数的版本是否比第二个大
    semver.lt('1.2.3', '9.8.7') // true ,第一个参数的版本您是否比第二个小
    
    
    参考:https://npm.taobao.org/package/semver
     
    const packageConfig = require('../package.json'):引入package.json,用来获取版本。
     
    const shell = require('shelljs'):用来执行unix命令的包。
     
    //这块儿不太熟,大致意思是用js代码同步执行一个cmd的命令,并且对返回的结果执行toString()和trim()方法
    function exec (cmd) {
      return require('child_process').execSync(cmd).toString().trim()
    }
    const versionRequirements = [
      {
        name: 'node',
        currentVersion: semver.clean(process.version),
        versionRequirement: packageConfig.engines.node
      }
    ]
     
    semver.clean(process.version)上面介绍过,返回的是一个版本信息,
    packageConfig.engines.node是在package.json中了,指的是>=4.0.0
     
    if (shell.which('npm')) {
      versionRequirements.push({
        name: 'npm',
        currentVersion: exec('npm --version'),
        versionRequirement: packageConfig.engines.npm
      })
    }

    shelljs的which方法是去系统的路径(system's PATH)中寻找命令,shell.which('npm')就是寻找npm命令,exec()方法就是上面说的执行一个命令(在这里是执行npm --version),返回版本信息的函数。关于shelljs更多的东西可以看这里:

    http://www.ruanyifeng.com/blog/2015/05/command-line-with-node.html

    https://www.npmjs.com/package/shelljs

    module.exports = function () {
      const warnings = []
      for (let i = 0; i < versionRequirements.length; i++) {
        const mod = versionRequirements[i]
        if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
          warnings.push(mod.name + ': ' +
            chalk.red(mod.currentVersion) + ' should be ' +
            chalk.green(mod.versionRequirement)
          )
        }
      }
    
      if (warnings.length) {
        console.log('')
        console.log(chalk.yellow('To use this template, you must update following to modules:'))
        console.log()
        for (let i = 0; i < warnings.length; i++) {
          const warning = warnings[i]
          console.log('  ' + warning)
        }
        console.log()
        process.exit(1)
      }
    }

    这部分代码就很好理解了,分别检测当前的npm和node版本是不是符合package.json中定义的,如果不符合就提示wraning。

  • 相关阅读:
    进入全屏 nodejs+express+mysql实现restful风格的增删改查示例
    WebAPI 实现前后端分离
    android 集成支付宝app支付(原生态)-包括android前端与java后台
    Windows 64 位系统下 Python 环境的搭建
    Es6主要特征详解
    js上传图片
    Python socket
    设置windows开机自启某个软件
    oracle导入导出数据
    mysql触发器,答题记录表同步教学跟踪(用户列表)
  • 原文地址:https://www.cnblogs.com/caideyipi/p/8245620.html
Copyright © 2020-2023  润新知