从0开发一个高性能前端脚手架-第六篇-脚手架准备阶段实现(2)

324 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情

image.png

上篇文章讲解了检查版本号和自定义log,接着下面按照这个图来实现准备阶段

检查node版本

因为很多库node版本不一样,所以需要设置一个node最低的版本

  1. 首先定义一个最低的node版本
  2. 通过process.version获取当前的node版本
  3. 通过第三方库 semver 来比较当前node版本和设置的最低node版本
  4. 如果当前node版本小于设置的最低node版本,就抛出异常,提示用户 安装 最低版本及以上的node版本
const { LOWEST_NODE_VERSION } = require('./const')

function core() {
    // 使用try...catch来捕获错误信息,不显示出堆栈错误
    try{
        checkPkgVersion()
        checkNodeVersion()
    }catch(e){
        log.error(e.message)
    }
}

// 检查node版本
function checkNodeVersion(){
    // 1.获取当前node版本
    const currentVersion = process.version;
    // 2.获取最低版本
    const lowestVersion = LOWEST_NODE_VERSION;
    // 3.比对,使用semver库
    if(!semver.gte(currentVersion, lowestVersion)){
        throw new Error(colors.red(`rd-cli 需要安装 v${lowestVersion} 以上版本的 Node.js`))
    }
}   

使用第三方库

semver: 版本比对

colors: 命令行带颜色

效果

当前node版本是v12,设置最低版本是v13

将最低版本改成v12,则不会出现提示

检查root启动

可以通过process.getuid()来获取当前是否是root账户

如果是0,则表示是root账户,如果是501,则表示非root账户

下面是打印的getuid

console.log(process.geteuid()) // 501

sudo  console.log(process.geteuid()) // 0 root账户

当用户使用的是root账户是,我们在脚手架中实现自动降级,这里使用第三方库 root-check

只要调一下,root-check会自动帮我们降级

root-check

 const checkRoot = require('root-check');
    checkRoot()
  sudo  console.log(process.geteuid()) // 501,使用root-check自动降级了

下面贴一下 root-check的源码

root-check源码

'use strict';
var downgradeRoot = require('downgrade-root');
var sudoBlock = require('sudo-block');

module.exports = function () {
	try {
		downgradeRoot();
	} catch (err) {}

	sudoBlock.apply(null, arguments);
};

// downgrade-root
'use strict';
var isRoot = require('is-root');
var defaultUid = require('default-uid');

module.exports = function () {
	if (isRoot()) {
		// setgid needs to happen before setuid to avoid EPERM
		if (process.setgid) {
			var gid = parseInt(process.env.SUDO_GID, 10);
			if (gid && gid > 0) {
				process.setgid(gid);
			}
		}
		if (process.setuid) {
			var uid = parseInt(process.env.SUDO_UID, 10) || defaultUid();
			if (uid && uid > 0) {
				process.setuid(uid);
			}
		}
	}
};

// isRoot:重点
export default function isRoot() {
	return process.getuid && process.getuid() === 0;
}


// defaultUid,mac是501
var DEFAULT_UIDS = {
	darwin: 501,
	freebsd: 1000,
	linux: 1000,
	sunos: 100
};
module.exports = function (platform) {
	return DEFAULT_UIDS[platform || process.platform];
};