1. 程式人生 > >手撕vue-cli配置文件——check-versions.js篇

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

pac 更多 分代 常用 改變 engines shell. 檢測 emp

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。

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