前端架构师-week5-脚手架下载升级项目模版功能开发

文章详细介绍了如何开发脚手架的项目模板下载功能,通过npm模块处理并利用spinner实现命令行加载效果。在下载模板时,如果模板已存在,则进行更新操作。同时,文章提到了使用cli-spinner库创建命令行loading效果,并在代码中展示了其用法。最后,提到了项目模板更新功能的调试过程。
摘要由CSDN通过智能技术生成

目录

脚手架下载项目模版功能开发

通过 spinner 实现命令行 loading 效果

项目模版更新功能调试


脚手架下载项目模版功能开发

  当作 npm 模块来处理,尝试对它进行下载。

  commands/init/ 的 package.json 中注册 models/package/,并在命令行中执行 npm install。

lerna add user-home commands/init/
# core/cli 命令行中执行
npm link
// commands/init/lib/index.js 部分内容
'use strict';

const path = require('path');
const userHome = require('user-home');
const Package = require('@imooc-cli-dev/package');

  ......
  async exec() {
    try {
      // 1. 准备阶段
      const projectInfo = await this.prepare();
      if (projectInfo) {
        // 2. 下载模板
        log.verbose('projectInfo', projectInfo);
        this.projectInfo = projectInfo;
        await this.downloadTemplate();
        // 3. 安装模板
      }
    } catch (e) {
      log.error(e.message);
    }
  }  
  ......
  async downloadTemplate() {
    const { projectTemplate } = this.projectInfo;
    const templateInfo = this.template.find(item => item.npmName === projectTemplate);
    const targetPath = path.resolve(userHome, '.imooc-cli-dev', 'template');
    const storeDir = path.resolve(userHome, '.imooc-cli-dev', 'template', 'node_modules');
    const { npmName, version } = templateInfo;
    this.templateInfo = templateInfo;
    const templateNpm = new Package({
      targetPath,
      storeDir,
      packageName: npmName,
      packageVersion: version,
    });
    if (!await templateNpm.exists()) {
      const spinner = spinnerStart('正在下载模板...');
      await sleep();
      try {
        await templateNpm.install();
      } catch (e) {
        throw e;
      } finally {
        spinner.stop(true);
        if (await templateNpm.exists()) {
          log.success('下载模板成功');
          this.templateNpm = templateNpm;
        }
      }
    } else {
      const spinner = spinnerStart('正在更新模板...');
      await sleep();
      try {
        await templateNpm.update();
      } catch (e) {
        throw e;
      } finally {
        spinner.stop(true);
        if (await templateNpm.exists()) {
          log.success('更新模板成功');
          this.templateNpm = templateNpm;
        }
      }
    }
  }
  ......

通过 spinner 实现命令行 loading 效果

cli-spinner 库作用:

        a simple spinner for node cli

// Usage:

npm install cli-spinner

(async function() {
  const Spinner = require('cli-spinner').Spinner
  const spinner = new Spinner('processing.. %s') // %s 占位符
  spinner.setSpinnerString('|/-\\') // 会形成动画
  spinner.start()
  await new Promise((resolve) => { setTimeout(resolve, 1000)) // sleep 1s
  spinner.stop(true)
})()

项目中使用:

lerna add cli-spinner utils/utils/
// utils/utils/lib/index.js 部分内容

function spinnerStart(msg, spinnerString = '|/-\\') {
  const Spinner = require('cli-spinner').Spinner;
  const spinner = new Spinner(msg + ' %s');
  spinner.setSpinnerString(spinnerString);
  spinner.start();
  return spinner;
}

function sleep(timeout = 1000) {
  return new Promise(resolve => setTimeout(resolve, timeout));
}

  commands/init/ 的 package.json 中注册 utils/utils,并在命令行中执行 npm install。

"dependencies": {
    "@imooc-cli-dev/utils": "file:../../utils/utils",
    "ejs": "^3.1.5",
}

  使用 spinnerStart 的代码在上节中。 

项目模版更新功能调试

  升级的代码在上上节中。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chengbo_eva

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值