node搭建一个简单的脚手架

news2024/11/22 19:46:12

一、什么是脚手架

脚手架Scaffold)是指在软件开发过程中为提高开发效率而提供的一套基础代码结构、组织规范、开发工具和工程化配置的工具。脚手架可以帮助开发团队快速搭建项目的基础框架,规范项目的开发流程,并提供一些常用的功能和工具。

脚手架通常包含以下几个主要组成部分

  1. 代码结构:脚手架提供了一个标准的项目代码结构,包括目录结构、文件命名规范等。这样可以在团队开发中统一代码组织方式,提高代码可读性和维护性。

  2. 组织规范:脚手架定义了一套开发规范,包括代码风格、命名规范、注释规范等。通过规范化的开发方式,可以提高团队协作效率,降低沟通成本。

  3. 开发工具:脚手架集成了一些常用的开发工具,如代码打包工具、构建工具、自动化测试工具等。这些工具可以帮助开发者更高效地进行开发、测试和部署。

  4. 工程化配置:脚手架包含了一系列的工程化配置,如webpack配置、babel配置等。这些配置可以帮助开发者快速搭建开发环境,解决一些常见的配置问题,提高开发效率。

脚手架的作用帮助开发团队快速搭建项目的基础框架,减少重复劳动,提高开发效率。通过使用脚手架,开发者可以遵循统一的开发规范,减少错误和bug的产生。同时,脚手架也可以帮助提供一些常用的功能和工具,简化开发过程,使开发者专注于业务逻辑的实现。总而言之,脚手架是一种提高开发效率、统一开发规范、简化开发过程的工具

二、脚手架的基本能力有哪些

脚手架是一个用于快速创建项目的工具,它具备以下基本能力

  1. 初始化项目:脚手架可以创建一个新的项目结构,包括配置文件、目录结构和基本文件。

  2. 模板支持:脚手架可以使用预定义的模板来生成项目代码,这些模板包括了一些常用的文件和功能,帮助开发者快速启动项目。

  3. 依赖管理:脚手架可以帮助开发者自动管理项目依赖,通过配置文件或者命令行参数指定所需的依赖包,然后自动下载和安装。

  4. 构建工具集成:脚手架可以集成常用的构建工具,如 webpack、Rollup 等,配置文件中可以设置构建过程的相关参数,方便开发者进行构建和打包。

现以 vite@latest 脚手架为例来分析说明其基本能力:

vite 是一个基于原生 ES 模块的前端构建工具和开发服务器,用于快速启动现代化的前端项目。以下是 vite@latest 的基本能力:

  1. 快速启动:vite 脚手架可以通过一条命令快速创建一个新的项目结构,以提供一个现代化的开发环境。

  2. 模板支持:vite 内置了常见的项目模板,包括 Vue、React、Preact 等,可以根据项目需求选择相应的模板。

  3. 开发服务器:vite 提供了一个快速的开发服务器,使用浏览器原生的 ES 模块支持加载依赖,实现了按需编译和按需导入,大大提高了开发效率。

  4. 构建工具集成:vite 能够集成 Rollup 构建工具,通过配置文件可以设置构建过程的相关参数,包括代码压缩、打包优化等。

  5. 热模块替换:vite 支持热模块替换(HMR),在开发过程中修改代码后能够实时更新页面,无需手动刷新。

  6. ESNext 支持:vite 支持使用最新的 JavaScript 语法,包括异步模块加载、装饰器等,提供了更好的开发体验。

通过上述基本能力,vite@latest 脚手架可以帮助开发者快速搭建现代化的前端项目,提高开发效率和开发体验。
如下:
使用

npm init vite@latest

就可以使用vite脚手架为我们创建一个基本的前端项目架构。
在这里插入图片描述
在这里插入图片描述
基于脚手架为我们创建的项目,我们可以直接开发,它里面集成了eslint规范、hmr热更新、tree Sharking等等一系列有利于提高开发效率插件和规范。

三、实现一个自己的脚手架

1. 创建自定义全局命令

(1) 创建入口文件

新建一个文件夹,文件夹下面创建bin/cli.js
在这里插入图片描述

(2) 初始化项目

在createcli目录下使用

npm init

初始化项目

在这里插入图片描述

(3) 当前的命令挂载到全局的命令行中

在项目根目录使用

npm link

将当前的命令挂载到全局的命令行中

在这里插入图片描述

npm link指令介绍

npm link指令用于在本地开发和测试模块时,将一个本地模块链接到一个全局的可执行命令的包。该指令使用场景如下:

  1. 在开发过程中,如果你正在同时开发多个相关的npm包,且这些包之间存在依赖关系,可以使用npm link将它们链接在一起,方便调试和测试。

  2. 当你希望在全局范围内安装和使用一个本地开发中的模块时,可以使用npm link将其链接到全局目录,从而可以在命令行中直接运行该模块的可执行命令。

使用步骤如下:

  1. 进入待链接的本地模块的根目录,执行npm link命令,这将会在全局目录下创建一个指向该模块的符号链接。

  2. 进入需要使用该模块的项目根目录,执行npm link moduleName命令,这将会在该项目的node_modules目录下创建一个指向全局模块的符号链接。

  3. 接下来就可以在该项目中像使用普通的npm模块一样使用该本地模块了。

需要注意的是,使用npm link会修改全局环境,因此仅在开发和测试阶段使用,不应在生产环境中使用。同时,在一些特殊情况下,可能需要使用管理员权限来执行npm link命令

(4) 编写指令

在命令的入口文件bin/cli.js中编写指令, 使用操作系统下的环境变量中的node来运行这段代码

  • cli.js
#! /usr/bin/env node
console.log('我的第一个脚手架')

#! /usr/bin/env node
这句代码是一个Shebang(注释)声明,用于告诉操作系统该脚本需要使用哪个解释器来执行。

具体含义是使用/usr/bin/env作为解释器来执行该脚本。"/usr/bin/env"是一个在Unix和Linux系统中常用的工具,它会在环境变量$PATH所指定的目录中查找解释器,从而实现通用执行。"node"指定了要使用Node.js作为解释器来执行该脚本。

这样一来,当通过命令行执行xx.js时,系统会根据Shebang声明自动调用Node.js解释器来执行该脚本,而不需要显式地指定解释器

(5) 执行自定义命令

使用

myclil

执行我们的第一个自定义命令
在这里插入图片描述
可以看到控制台打印了cli.js中的log,说明我们自定义的全局命令生效了

提醒
在执行mycli时有可能会报错
在这里插入图片描述
这时我们把集成终端换成bash就可以执行了。cmd和powershall都不行

2.命令参数接收处理

例如nvm --help
在这里插入图片描述
当我们输入这个nvm指令再带上--help指令时,它会给我们一些关于使用nvm的常用命令介绍。那么哦我们自己创建的mycli指令也要实现这个功能,该如何实现呢?

1. commander命令参数处理工具

我们需要借助一个工具,commander命令参数处理工具
commander是一个用于处理命令行参数的工具,可以帮助开发者快速构建命令行界面。
commander官网https://www.npmjs.com/package/commander
在这里插入图片描述

2. --help选项参数处理

  1. 首先,使用npm安装commander模块:

npm install commander

在这里插入图片描述

  1. cli.js脚本中引入commander模块:
const { program } = require('commander');
  1. 使用program对象定义命令和参数选项:
const { program } = require('commander');
program.parse(process.argv);

到这里我们再使用

mycli --help

在这里插入图片描述
可以看到commander已经默认给我集成了一个–help的参数选项说明

  1. 添加options选项
const { program } = require('commander');
program.option('-p, --peppers', 'Add peppers');
program.parse(process.argv);

在这里插入图片描述

3. 处理自定义命令参数

例如:

mycli init xxx

我们需要通过mycli init xxx指令来创建一个项目,这就需要自定义init指令。

  • cli.js
#! /usr/bin/env node
const { program } = require('commander');
program.option('-p, --peppers', 'Add peppers');
program
    .command('init <name> [other...]') // 自定义init指令 <name> 必填参数 [other...] 可选参数
    .alias('i') // 指令别名
    .description('init project') // 指令描述
    .action((name, args) => { // 指令执行的操作
    console.log(name, args);
});
program.parse(process.argv);

使用mycli i xx
在这里插入图片描述

mycli --help
在这里插入图片描述

3.终端交互

1. 命令行交互工具inquirer的基本使用

inquirer是一个基于Node.js的命令行交互工具,它可以方便地创建交互式命令行界面。
inquirer官网:https://www.npmjs.com/package/inquirer
在这里插入图片描述

1.安装inquirer

npm install --save inquirer@^8.0.0

在这里插入图片描述

2. 引入

安装完成后,你可以在代码中引入inquirer模块:

const inquirer = require("inquirer");

注意
在这里插入图片描述
官网这里说:Inquirer v9 及更高版本是原生 esm 模块,这意味着您不能再使用 commonjs 语法 require(‘inquirer’)。如果您想了解有关在 Node 中使用本机 esm 的更多信息,我建议您阅读以下指南。或者,在准备好升级环境之前,您可以依赖旧版本

然后,你可以使用inquirer的各种方法创建交互式界面。下面是一些常用的方法示例:

3. 设置问题获取答案

  1. 提问单个问题并获取回答:
inquirer
  .prompt([
    {
      type: 'input',
      name: 'name',
      message: 'What is your name?',
    },
  ])
  .then((answers) => {
    console.log('Hello ' + answers.name);
  });

4. 执行inquirer文件

然后我们使用node xxx.js来执行这里新建的测试inquirer文件,执行过程如下
在这里插入图片描述
命令行中会询问你设置的message

5. 为mycli配置问答,选择框架

在这里插入图片描述

const inquirer = require("inquirer");
const config = require("../../config.js");
const myaction = (name, args) => {
  // 指令执行的操作
  console.log("init project", name, args);
  // console.log("init project", inquirer);
  inquirer
    .prompt([
      {
        type: "list",
        name: "framework",
        choices: config.framwork,
        message: "Please select the framework you want to use?",
      },
    ])
    .then((answers) => {
      console.log(answers.name);
    });
};

module.exports = myaction;

然后我们再执行

mycli init xxx

如图:终端中就会提示你需要选择哪个框架
在这里插入图片描述

4. 下载远程项目代码

要下载远程项目代码需要借助download-git-repo工具
download-git-repo官网:https://www.npmjs.com/package/download-git-repo
在这里插入图片描述

1. download-git-repo基本使用介绍

要使用download-git-repo工具,您需要先安装Node.js和npm(Node包管理器)。以下是使用download-git-repo工具的步骤:

  1. 首先,通过运行以下命令全局安装download-git-repo工具:
npm install download-git-repo
  1. 在您的代码中,导入download-git-repo模块:
const download = require('download-git-repo');
  1. 使用download函数下载Git仓库。它接受三个参数:Git仓库地址,本地目标路径和可选的配置对象。以下是一个使用download函数的示例:
const download = require('download-git-repo');
download('direct:https://gitee.com/chengxigitee/express-template.git', 'test/tmp', { clone: true }, function (err) {
  console.log(err ? 'Error' : 'Success')
})

这段代码使用了一个名为download的JavaScript库,它的作用是从Git仓库中下载代码。代码中的download函数接受三个参数:仓库地址、下载目标路径和一个配置对象。

仓库地址:direct:https://gitee.com/chengxigitee/express-template.git是指向一个Git仓库的直接链接。

下载目标路径:test/tmp指定了下载后代码存放的文件夹路径。

配置对象:{ clone: true }用于配置下载过程中的一些选项,这里clone被设置为true表示下载整个仓库的内容。

回调函数:最后一个参数是一个回调函数,当下载完成时会调用该回调函数,通过判断参数err是否存在来确定下载是否成功,成功执行console.log('Success'),失败则执行console.log('Error')

这段代码的作用是从指定Git仓库中下载代码到指定的目标路径,并根据下载的成功与否打印相应的信息。
这是我的远程项目
在这里插入图片描述
这是下载下来的项目结构:
在这里插入图片描述

注意:download-git-repo工具还支持其他一些配置选项,例如克隆特定分支、下载特定目录等。您可以在GitHub的download-git-repo页面上找到更多信息和示例:https://github.com/flipxfx/download-git-repo

2. 为下载配置loading

还是老套路,需要借助工具ora命令行等待交互工具
ora官网https://www.npmjs.com/package/ora
在这里插入图片描述
下载安装

npm i ora@5

这里下载安装的时候也是和inquirer 工具一样,ora是在6.0版本之后就不支持commonJs规范了,所以如果要使用commonJs规范开发的话,咱要下载6.0以下的版本。

新建一个ora.js

const ora = require('ora');
const spinner = ora().start();
spinner.text = 'Loading......';
setTimeout(() => {
    spinner.succeed('Loading succeed');
}, 3000);

使用

node ora.js

执行这个文件
在这里插入图片描述
可以看到终端中已经有了这个loading…的等待效果。
等待3s之后,会给出结束的提示信息
在这里插入图片描述
3. 在项目中配置使用:

  • download.js
const download = require("download-git-repo");
const ora = require("ora");

const downloadFun = (url, projectName) => { // url: 下载地址,projectName: 项目名称
  const spinner = ora().start(); // 开始loading
  spinner.text = "Loading......";
  download(url, projectName, { clone: true }, function (err) {
    if (!err) { // 如果没有错误
      spinner.succeed("Loading succeed"); // 结束loading
      console.log("download success! you can run :cd " + projectName)
      console.log("'npm install' to install dependencies")
      console.log("'npm run dev' to start the project")
    } else {
      spinner.fail("Loading failed"); // 结束loading
    }
  });
};

module.exports = downloadFun;

在这里插入图片描述

3. 为命令行提示信息添加样式

需要借助chalk命令行样式工具
chalk官网:https://www.npmjs.com/package/chalk
在这里插入图片描述
下载安装

npm i chalk@4

这里下载安装的时候也是和inquirer 工具一样,chalk是在5.0版本之后就不支持commonJs规范了,所以如果要使用commonJs规范开发的话,咱要下载5.0以下的版本。

基本使用

  • chalk.js
const chalk = require('chalk');
console.log(chalk.red('Hello', chalk.underline.bgBlue('world') + '!'));
console.log(chalk.blue('Hello', chalk.underline.bgRed('world') + '!'));
console.log(chalk.green('Hello', chalk.underline.bgYellow('world') + '!'));
console.log(chalk.yellow('Hello', chalk.underline.bgGreen('world') + '!'));
console.log(chalk.white('Hello', chalk.underline.bgMagenta('world') + '!'));
console.log(chalk.magenta('Hello', chalk.underline.bgWhite('world') + '!'));
console.log(chalk.cyan('Hello', chalk.underline.bgCyan('world') + '!'));
console.log(chalk.gray('Hello', chalk.underline.bgGray('world') + '!'));
// console.log(chalk.black('Hello', chalk.underline.bgBlack('world') + '!'));
console.log(chalk.rgb(255, 136, 0).underline('Hello', chalk.bgRgb(15, 100, 204)('world') + '!'));
console.log(chalk.hex('#FF8800').underline('Hello', chalk.bgHex('#0F64CC')('world') + '!'));
console.log(chalk.bold('Hello world!'));

使用

node chalk.js

效果如下:
在这里插入图片描述

在项目中使用:

  • download.js
const download = require("download-git-repo");
const ora = require("ora");
const chalk = require("chalk");

const downloadFun = (url, projectName) => {
  // url: 下载地址,projectName: 项目名称
  const spinner = ora().start(); // 开始loading
  spinner.text = "Loading......";
  download(url, projectName, { clone: true }, function (err) {
    if (!err) {
      // 如果没有错误
      spinner.succeed("Loading succeed"); // 结束loading
      console.log(chalk.green("download success!") + "you can run :" + chalk.yellow("cd: ") + projectName);
      console.log(chalk.yellow("npm install") + " to install dependencies");
      console.log(chalk.yellow("npm run dev") + " to start the project");
    } else {
      spinner.fail("Loading failed"); // 结束loading
    }
  });
};

module.exports = downloadFun;

效果如下:
在这里插入图片描述
为我们的download success, cd, npm install, npm run dev加上了颜色。

四、总结

好拉,以上就是如何使用node创建一个自己使用的简单的脚手架工具的介绍拉。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/725774.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

指针函数与函数指针

指针函数 指针函数&#xff1a;指针函数是一个函数&#xff0c;返回值是一个指针。 int *fun; //fun是指针变量 int *fun(x,y); //fun是指针函数; #include<iostream> using namespace std;char* day_name() {return("Monday"); //返回地址 }int main() {char…

堆排序选择排序

选择排序 选择排序&#xff08;Selection sort&#xff09;是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小&#xff08;大&#xff09;元素&#xff0c;存放到排序序列的起始位置&#xff0c;然后&#xff0c;再从剩余未排序元素中继续寻找最小&…

Linux系统下 - [linux命令]查找包含指定内容的文件

格式1&#xff1a;grep -r “指定内容” 目录 eg:输出包含"指定内容"的文件列表以及简要信息 查找当前目录下的 CONFIG_ESP_SMARTCONFIG_TYPE grep -r "CONFIG_ESP_SMARTCONFIG_TYPE" .格式2&#xff1a;grep -r -l “指定内容” 目录 eg:仅输出包含&q…

模拟Toast 自定义提示框

模拟Toast 自定义提示框 前言 为满足产品需求&#xff0c;发现现在的ToastUtils不是太重就是不太满足需求&#xff0c;这边写个简单易用的工具&#xff0c;几十行代码解决的问题,还要啥轮子。 功能如下&#xff1a; 自动消失相对锚点位置 可配置&#xff0c;正中间&#x…

刷题日记06《回溯算法》

问题描述 力扣https://leetcode.cn/problems/Ygoe9J/ 给定一个无重复元素的正整数数组 candidates 和一个正整数 target &#xff0c;找出 candidates 中所有可以使数字和为目标数 target 的唯一组合。 candidates 中的数字可以无限制重复被选取。如果至少一个所选数字数量不同…

计算机体系结构基础知识介绍之缓存性能的十大进阶优化之非阻塞缓存(四)

优化四&#xff1a;非阻塞缓存&#xff0c;提高缓存带宽 对于允许乱序执行的流水线计算机&#xff0c;处理器不需要因数据高速缓存未命中而停止。 例如&#xff0c;处理器可以继续从指令高速缓存获取指令&#xff0c;同时等待数据高速缓存返回丢失的数据。 非阻塞高速缓存或无…

23家企业推出昇腾AI系列新品 覆盖云、边、端智能硬件

[中国&#xff0c;上海&#xff0c;2023年7月6日] 昇腾人工智能产业高峰论坛在上海举办。论坛现场&#xff0c;大模型联合创新启动&#xff0c;26家行业领军企业、科研院所与华为将共同基于昇腾AI进行基础大模型与行业大模型应用创新。同时&#xff0c;华为携手伙伴联合发布昇腾…

Java虚拟机(JVM)、垃圾回收器

一、Java简介 1、Java开发及运行版本 JRE(Java Runtime Environment&#xff0c;运行环境) 所有的程序都要在JRE下才能够运行。包括JVM和Java核心类库和支持文件。JDK(Java Development Kit&#xff0c;开发工具包) 用来编译、调试Java程序的开发工具包。包括Java工具(javac/…

【LNMP】架构及应用部署 搭建电影网站

准备环境 一台虚拟机192.168.108.67 关闭防火墙 systemctl stop firewalld iptables -F setenforce 0 检查光盘 查看yum仓库 安装nginx依赖 [rootlocalhost ~]# yum -y install pcre-devel zlib-devel 创建管理nginx用户&#xff08;用来运行nginx&#xff09; [rootlocalh…

picard安装时报错“Exception in thread “main“ java.lang.UnsupportedClassVersionError”

最近在通过GATK所介绍的best practice流程来call SNP流程 1.流程 1.1 BWA比对&#xff0c;获得sam文件 1.2 准备用picard来压缩排序sam文件为bam文件&#xff0c;并对bam文件进行去重复&#xff08;duplicates marking&#xff09; 这是就需要用到picard软件 按照教程网页上…

go-zero的rpc服务案例解析

go-zero的远程调用服务是基于gRpc的gRPC教程与应用。 zero使用使用gRpc需要安装protoc插件&#xff0c;因为gRpc基于protoc插件使用protocol buffers文件生成rpc服务器和api的代码的。 gRPC 的代码生成还依赖 protoc-gen-go&#xff0c;protoc-gen-go-grpc 插件来配合生成 Go…

机器学习笔记 - 局部敏感哈希简介

一、算法简述 局部敏感散列 (LSH) 技术,可显著加快对数据的邻居搜索或近似重复检测。例如,这些技术可用于以惊人的速度过滤掉抓取网页的重复项,或者从地理空间数据集中对附近点执行近恒定时间查找。 让我们快速回顾一下其他类型的哈希函数,哈希函数的传统用途是…

青岛大学_王卓老师【数据结构与算法】Week04_13_案例分析与实现3_学习笔记

本文是个人学习笔记&#xff0c;素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享&#xff0c;另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权&#xff0c;请留言作删文处理。 课程视频链接&#xff1a; 数据结构与算法基础–…

漏洞检测01:DNS域传送漏洞

DNS域传送漏洞 文章目录 DNS域传送漏洞漏洞描述检测方法修复建议 DNS域传送漏洞 该漏洞当下已经非常少了 DNS服务器分为&#xff1a;主服务器、备份服务器和缓存服务器。在主备服务器之间同步数据库&#xff0c;需要使用“DNS域传送”。域传送是指备份服务器从主服务器拷贝数…

多目标下改进NSGA-II算法并使用ZDT测试函数验证matlab

目标优化机械臂轨迹&#xff0c;不知道NSGA-II算法改进后到底有没有效果&#xff0c;需要用测试函数进行验证&#xff0c;附matlab代码 参考多目标优化NSGA-II的实现&#xff08;MATLAB完整代码&#xff09;_nsga2 matlab_羽丶千落的博客-CSDN博客 目录 1.复制所有matlab代码…

STM32速成笔记—低功耗模式

文章目录 一、STM32低功耗模式介绍二、睡眠模式2.1 进入睡眠模式2.2 退出睡眠模式 三、停止模式3.1 进入停止模式3.2 退出停止模式 四、待机模式五、程序设计 一、STM32低功耗模式介绍 STM32提供了一些低功耗模式。默认情况下&#xff0c;系统复位或上电复位后&#xff0c;微控…

html中表格

一、table标签 参数说明 实例 <body><table border"1" align"center" width"300" height"200" cellspacing"10"><tr><td>1.1</td><td>1.2</td><td>1.3</td></t…

把labelme得到的json文件转换成yolov8需要的格式,划分数据集

使用labelme打标&#xff0c;得到json文件把所有json文件放到一个单独的文件夹&#xff0c;里面只有json文件使用脚本&#xff0c;把json里面的label,标注框的中心坐标、宽、高提取出来&#xff0c;注意这里的4个值都按照图像大小压缩了。 脚本如下&#xff1a; import json…

【网页设计】基于HTML的湖南渔鼓文化宣传网页的设计

1.引言 随着文化交流的不断深入&#xff0c;湖南渔鼓文化作为湖南省的非物质文化遗产&#xff0c;逐渐引起了人们的关注和研究。为了更好地推广和宣传湖南渔鼓文化&#xff0c;我们设计了一款基于HTML的湖南渔鼓文化宣传网页。 该网页旨在向广大用户介绍湖南渔鼓文化的深厚底…

第四章:SSD网络详解

(目标检测篇&#xff09;系列文章目录 第一章:R-CNN网络详解 第二章:Fast R-CNN网络详解 第三章:Faster R-CNN网络详解 第四章:SSD网络详解 第五章:YOLO v1网络详解 第六章:YOLO v2网络详解 第七章:YOLO v3网络详解 文章目录 系列文章目录技术干货集锦前言一、摘要二、正…