研究vue-cli脚手架实现过程-自己写一个demo

本文详细介绍了如何使用Vue CLI初始化项目,包括安装、配置及运行项目。通过创建自定义命令,解释了命令行工具如何与Node.js脚本映射,演示了如何使用Commander.js模块处理命令行参数,下载并初始化项目模板。同时,展示了如何通过下载模板、用户交互和修改package.json文件来实现项目初始化。
摘要由CSDN通过智能技术生成

vue脚手架的使用过程如下:常用的命令 

 

1、安装vue脚手架vue-cli
  命令:npm install -g vue-cli

  安装成功后可以用 vue -V 查看vue版本
2、cd到对应的目录下初始化vue项目
  命令:vue init webpack my-project
      Project name 项目名 
      Project description 项目名描述 
      Author 作者邮箱 
      Use ESLint to lint your code? 是否需要ESlist语法检查 
      Setup unit tests with Karma + Mocha? 是否需要单元测试 
      Setup e2e tests with Nightwatch? Yes是否需要e2e测试 
3、package.json为项目依赖资源,如果要运行这个项目需要使用cnpm install 安装依赖项(直接在项目文件夹路径下执行)
4、使用命令cnpm run dev启动项目,浏览器会打开 http://localhost:8080/#/ 看到效果

 在node终端为啥输入了vue init webpack my-project 和vue -V能出来模板和对应的版本号呢?

 实际上是通过把node终端命令和脚本之间创建一个映射关系:之后操作vue的相关命令就是执行node的相关命令了

 来看一个例子吧:

执行自定义执行之后执行对用的脚本的一个操作过程:

新建文件夹:demoCli 在里面新建文件index.js内容如下:注意:使用node开发命令行工具所执行的js脚本必须在顶部加入 #!/usr/bin/env node 声明 

#!/usr/bin/env node
//使用node开发命令行工具所执行的js脚本必须在顶部加入 #!/usr/bin/env node 声明 
console.log('demo index.js执行了')

 之后执行:

npm init -y

 在当前文件夹下初始化项目生成package.json文件

{
  "name": "democli",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "bin": {
    "itRun": "index.js"
  }
}

 "bin": {
    "itRun": "index.js"
  }

这个是在后面新加的内容,意思是itRun指令对应 的是执行index.js文件操作 

 

接下来一个完整的例子:

package.json文件:

{
  "name": "democli",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "bin": {
    "itRun": "index.js"
  },
  "dependencies": {
    "chalk": "^5.0.0",
    "commander": "^9.0.0",
    "download-git-repo": "^3.0.2",
    "handlebars": "^4.7.7",
    "inquirer": "^8.2.0",
    "log-symbols": "^5.1.0",
    "ora": "^6.0.1"
  },
  "type": "module"
}

index.js文件:

#!/usr/bin/env node
//使用node开发命令行工具所执行的js脚本必须在顶部加入 #!/usr/bin/env node 声明
import {program} from "commander";//. 使用包 Commander.js 模块来获取处理命令行参数
import download from "download-git-repo";//使用 download-git-repo 下载 能够直接下载仓库内容的插件
import inquirer from "inquirer";//够与用户在命令行进行参数选择交互
import handlebars from "handlebars";//能够读取当前项目下的文件,并重新写入
import ora from "ora";//使用 ora 增加下载中 loading 效果
import fs from "fs";
import chalk from "chalk";//字体美化 chalk chalk 能够自定义使输出的命令行字体颜色
import logSymbols from "log-symbols";//日志符号 logSymbols logSymbols 能够在控制台输出指定的日志符号
console.log('demo index.js执行了')
//原生获取命令行参数的方法
// console.log(process.argv);
/* 
输入:itRun pro 
结果: 
[
  'C:\\Program Files\\nodejs\\node.exe',
  'C:\\Users\\dongxu.yang\\AppData\\Roaming\\npm\\node_modules\\democli\\index.js',
  'pro'
]
*/
const template = {
  "tpl-a": {
    "url": "https://github.com:15011164760/tpl-a#main",
    "description": "uni-shop_demo"
  },
  "tpl-b": {
    // 下载目标,格式为:仓库地址:用户名/仓库名字#分支
    "url": "https://github.com:15011164760/tpl-b#main",
    "description": "tpl-b==="
  },
  "tpl-c": {
    "url": "https://github.com:15011164760/tpl-c#main",
    "description": "sunhuapeng_2.0"
  },
}
program.version('0.1.0')
program
  .command('init <template> <project>')
  .description('初始化项目模板')
  .action((templateName, projectName) => {
    console.log(templateName, projectName);
    let { url } = template[templateName];
    console.log(url);
    // 初始化 ora
    const loading = ora("模板下载中...");
    loading.start();
    download(url, projectName, {
      // 以克隆形式下载
      clone: true,
      // 完成回调
    }, (err) => {
      if (err) {
        loading.fail();
        console.log('下载失败', err)
        // 输出红色警告字体告知用户模板下载失败
        console.log(logSymbols.error, chalk.red("模板下载失败!"));
        console.log("错误原因:", err);
      } else {
        loading.succeed("下载成功!");
        console.log('下载成功')
        // 以橙色字体提示用户模板已经下载完成
        const log = chalk.hex("#FFA500");
        // // 模板初始化成功后输出
        console.log(logSymbols.success, log("模板初始化成功!"))
        inquirer.prompt([
          {
            // 输入类型
            type: "input",
            // 字段名称
            name: "name",
            // 提示信息
            message: "请输入项目名称",
          },
          {
            // 输入类型
            type: "input",
            name: "description",
            message: "请输入项目简介",
          },
          {
            type: "input",
            name: "author",
            message: "请输入作者名称",
          },
        ])
          // 获取输入结果
          .then((answers) => {
            console.log(answers);
            // 把采集到的用户数据解析替换到 package.json 文件中
            // 保存下载下来的模板 package.json 配置文件路径
            const packagePath = `${projectName}/package.json`;
            // 使用 fs 获取下载到的模板中额 package.json 配置文件
            const packageContent = fs.readFileSync(
              `${projectName}/package.json`,
              "utf8"
            );
            // 使用 handlebars 编译这个文件为渲染函数
            const packageResult = handlebars.compile(packageContent)(answers);
            // 将修改后配置写入下载下来的模板中
            fs.writeFileSync(packagePath, packageResult);
            console.log("初始化模板成功!");
            console.log(packageResult);
          });
      }
    })
    // 使用 download-git-repo 下载模板
    /* 
    
    */
  })
program
  .command('list')
  .description('查看所用可用模板')
  .action((templateName, projectName) => {
    for (let key in template)
      console.log(`${key} ${template[key].description}`);
  }
  )
program.parse(process.argv);

在命令行输入:

itRun init tpl-c  tpl-c

就是下载模板了 

文章参考这个 更细节的看这个吧:揭秘 Vue Cli,打造属于自己的项目脚手架工具 · 语雀

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值