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,如果不符合版本返回nullsemver.clean(‘ ?=v1.2.3 ??‘) // ‘1.2.3‘,返回一个标准的版本号,且去掉两边的空格semver.satisfies(‘1.2.3‘, ‘1.x || >=2.5.0 || 5.0.0 - 7.2.3‘) // true,第一个参数是测试的版本号,第二个参数是匹配的版本,如果匹配则返回truesemver.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篇
原文地址:https://www.cnblogs.com/caideyipi/p/8245620.html