Node Js开发环境的搭建

前言

通过自动化繁琐的设置和配置工作,帮助开发者快速启动新项目。常见的Node脚手架工具包括Yeoman、Express Generator、Create React App等。

一、什么是脚手架

1、什么是脚手架?

脚手架在软件开发中指的是一种自动化工具或脚本,用于快速创建和配置项目的基本结构和配置文件。脚手架工具可以帮助开发者快速启动新项目,减少手动配置和重复工作,提高开发效率。

  • 全局命令行工具
  • 创建项目初始化代码文件及目录

2、脚手架的基本能力

  1. 项目模板生成

根据预定义的模板生成项目的目录结构和初始文件

  1. 依赖管理

自动生成和更新项目的依赖文件(如package.json),并安装必要的依赖包

  1. 配置文件生成

创建项目所需的各种配置文件(如.eslintrc, .gitignore, webpack.config.js等)。

  1. 代码生成

自动生成常见的代码模块和样板代码,如路由、控制器、模型等。

  1. 交互式问答

通过交互式问答方式询问用户的偏好和需求,从而生成定制化的项目配置。

  1. 自动化脚本

提供一些预定义的NPM脚本或其他自动化脚本,用于常见的开发任务(如构建、测试、启动服务器等)。

二、搭建脚手架

1、如何实现一个自己的脚手架工具

  • 初始化一个vite项目
npm init vite@latest
  • 选择vue
? Select a framework: » - Use arrow-keys. Return to submit.Vanilla
>   VueReactPreactLitSvelteSolidQwikOthers
  • 选择JavaScript
? Select a variant: » - Use arrow-keys. Return to submit.TypeScript
>   JavaScriptCustomize with create-vue ↗Nuxt ↗
  • 通过以下命令运行项目
Done. Now run:cd vite-projectnpm installnpm run dev

2、创建自定义全局指令

  1. 新建一个nojs文件,然后创建bin/cli.js

  2. nojs文件下初始化一个项目,然后一路回车

npm init
  1. 在package.json中添加一个name
"name": "bincli",
  1. bin/cli.js中写入,

#! /usr/bin/env node的作用:告诉操作系统用什么解释器来执行文件。
#! 是 shebang 的标志,/usr/bin/env 是一个 Unix 程序,它可以找到并运行指定的程序,node 指定要使用 Node.js 解释器来执行脚本。
当在文件顶部加上这一行并使文件可执行,可以直接运行该文件,而无需在命令行中显式调用 node 命令。

#! /usr/bin/env nodeconsole.log("bincli");
  1. 创建自定义全局指令
npm link
bincli

image.png

  1. 修改cli.js文件
#! /usr/bin/env node// console.log("bincli");
console.log(process.argv);

获取bincli后面的参数--help

bincli --help

image.png

  1. 获取到cli.js中的命令参数
#! /usr/bin/env nodeif(process.argv[2]=='--help'){console.log("获取命令参数");
}

三、commander命令参数处理工具

1、安装commander包

commander包链接

  1. 安装commander
npm i commander
  1. cli.js文件内容修改
#! /usr/bin/env nodeconst { program } = require("commander");
program.parse(process.argv);
bincli --help

image.png

2、自定义命令参数处理

  1. 修改cli.js内容
#! /usr/bin/env nodeconst { program } = require("commander");
/*
使用 .option 方法定义一个命令行选项。
-f 是短选项,--framework 是长选项,<framework> 表示这个选项需要一个参数。
"设置框架" 是对这个选项的描述,用于帮助信息中显示。
*/
program.option("-f --framwork <framwork>", "设置框架");
// 解析传递给脚本的命令行参数
program.parse(process.argv);
console.log(`选定的框架是: ${program.framework}`);
  1. 执行bincli --help命令

image.png

3. create创建一个内容命令

  1. 修改cli.js
#! /usr/bin/env nodeconst { program } = require("commander");program.option("-f --framwork <framwork>", "设置框架");
program.command("create <project> [other...]").alias("crt").description("创建项目").action((project, args) => {console.log(project);console.log(args);});program.parse(process.argv);
  1. 执行bincli create xxx k gf l 命令

image.png

  1. 执行bincli --help命令

image.png

四、模块化拆分

1、代码封装

  1. lib/core/help.js
const myhelp = function (program) {program.option("-f --framwork <framwork>", "设置框架");
};
module.exports = myhelp;
  1. lib/core/mycommander.js
const myAction = require("./action");
const mycommander = function (program) {program.command("create <project> [other...]").alias("crt").description("创建项目").action(myAction);
};
module.exports = mycommander;
  1. lib/core/action.js
const myAction = (project, args) => {console.log(project);console.log(args);
};
module.exports = myAction;
  1. bin/cli.js
#! /usr/bin/env nodeconst { program } = require("commander");
const myhelp = require("../lib/core/help");
myhelp(program);const mycommander = require("../lib/core/mycommander");
mycommander(program);
program.parse(process.argv);
  1. 执行bincli命令
bincli

image.png

2、命令行问答交互

  1. 安装inquirer
npm install inquirer
  1. 新建test/inquirer.js文件
var inquirer = require("inquirer");
// console.log(inquirer.default.prompt, "inquirer.prompt");
inquirer.default.prompt([{type: "input", // 可以输入的类型name: "username",message: "你的名字",},]).then((answer) => {console.log(answer);});
  1. 执行node test/inquirer.js命令
node test/inquirer.js

image.png

3、命令行自定义选择框架

  1. 修改lib/core/action.js文件
var inquirer = require("inquirer");const myAction = (project, args) => {// console.log(project);// console.log(args);inquirer.default.prompt([{type: "list",name: "framwork",choices: ["express", "koa", "egg"],message: "请选择你所使用的框架",},]).then((answer) => {console.log(answer, "answer");});
};
module.exports = myAction;
  1. 执行bincli create nodefm 命令
bincli create nodefm
  1. 通过上下箭头选择,空格进行确认

image.png

image.png

4、使用config.js来定义框架配置类型

使用config.js来定义框架配置类型,可以通过直接在config.js里修改来控制变量

  1. 新建config.js文件
module.exports = {framwork: ["express", "koa", "egg"],
};
  1. 修改lib/core/action.js文件引入config文件
var inquirer = require("inquirer");
var config = require("../../config");const myAction = (project, args) => {// console.log(project);// console.log(args);inquirer.default.prompt([{type: "list",name: "framwork",choices: config.framwork,message: "请选择你所使用的框架",},]).then((answer) => {console.log(answer, "answer");});
};
module.exports = myAction;

五、下载远程仓库代码

1、download-git-repo包使用

download-git-repo 是一个 Node.js 模块,用于从 Git 仓库中下载代码。通过命令行或者在 Node.js 代码中进行下载操作。

  1. 安装模块
npm install download-git-repo
  1. Node.js 脚本中引入 download-git-repo 模块,新建test/download.js
const download = require("download-git-repo");
download("direct:git@github.com:Muying-Zhao/MuYing-docs.git","./xxx",{ clone: true },function (err) {if (err) {console.error("下载失败", err);} else {console.log("下载成功");}}
);
  1. 执行node test/download.js命令
node test/download.js

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谷粒商城实战笔记-72-商品服务-API-属性分组-获取分类属性分组

文章目录 一&#xff0c;后端接口开发Controller层修改接口接口测试 二&#xff0c;前端开发 这一节的内容是开发获取分类属性分组的接口。 一&#xff0c;后端接口开发 Controller层修改接口 修改AttrGroupController接口。 RequestMapping("/list/{catelogId}")p…

【算法/训练】:动态规划(线性DP)

一、路径类 1. 字母收集 思路&#xff1a; 1、预处理 对输入的字符矩阵我们按照要求将其转换为数字分数&#xff0c;由于只能往下和往右走&#xff0c;因此走到&#xff08;i&#xff0c;j&#xff09;的位置要就是从&#xff08;i - 1&#xff0c; j&#xff09;往下走&#…

【Go系列】Go的UI框架Fyne

前言 总有人说Go语言是一门后端编程语言。 Go虽然能够很好地处理后端开发&#xff0c;但是者不代表它没有UI库&#xff0c;不能做GUI&#xff0c;我们一起来看看Go怎么来画UI吧。 正文 Go语言由于其简洁的语法、高效的性能和跨平台的编译能力&#xff0c;非常适合用于开发GUI…

鸿蒙应用框架开发【dlopen加载so库并获取Rawfile资源】 NDK

dlopen加载so库并获取Rawfile资源 介绍 本示例中主要介绍在TaskPool子线程中使用dlopen加载so库&#xff0c;以及如何使用Native Rawfile接口操作Rawfile目录和文件。功能包括文件列表遍历、文件打开、搜索、读取和关闭Rawfile。 效果预览 使用说明 应用界面中展示了Rawfil…

2024最新Uniapp的H5网页版添加谷歌授权验证

现在教程不少&#xff0c;但是自从谷歌升级验证之后&#xff0c;以前的老教程就失效了&#xff0c;现在写一个新教程以备不时之需。 由于众所周知的特殊原因&#xff0c;开发的时候一定注意网络环境&#xff0c;如果没有梯子是无法进行开发的哦~ clientID的申请方式我就不再进…

昇思MindSpore 应用学习-DCGAN生成漫画头像-CSDN

日期 心得 昇思MindSpore 应用学习-DCGAN生成漫画头像&#xff08;AI代码学习&#xff09; DCGAN生成漫画头像 在下面的教程中&#xff0c;我们将通过示例代码说明DCGAN网络如何设置网络、优化器、如何计算损失函数以及如何初始化模型权重。在本教程中&#xff0c;使用的动…

数据结构:二叉树(堆)的顺序存储

文章目录 1. 树1.1 树的概念和结构1.2 树的相关术语 2. 二叉树2.1 二叉树的概念和结构2.2 二叉树的特点2.3 特殊的二叉树2.3.1 满二叉树2.3.2 完全二叉树 2.4 二叉树的性质 3. 实现顺序结构二叉树3.1 堆的概念和结构3.2 初始化3.3 销毁3.4 插入数据3.5 向上调整算法3.6 删除数据…

如何查找下载安装安卓APK历史版本?

在安卓设备上&#xff0c;有时候我们可能希望安装某个软件的旧版本&#xff0c;可能是因为新版本不兼容、功能改变不符合需求或是其他原因。 安卓系统并不像iOS那样提供直观的历史版本下载界面。 不过&#xff0c;通过一些第三方市场和网站&#xff0c;我们仍然可以找到并安装…

【LLM】-08-搭建问答系统-语言模型,提问范式与 Token

目录 1、语言模型 1.1、训练过程&#xff1a; 1..2、大型语言模型分类&#xff1a; 1.3、指令微调模型训练过程&#xff1a; 2、Tokens 3、Helper function辅助函数 (提问范式) 4、计算token数量 1、语言模型 大语言模型&#xff08;LLM&#xff09;是通过预测下一个词…

【python】sklearn基础教程及示例

【python】sklearn基础教程及示例 Scikit-learn&#xff08;简称sklearn&#xff09;是一个非常流行的Python机器学习库&#xff0c;提供了许多常用的机器学习算法和工具。以下是一个基础教程的概述&#xff1a; 1. 安装scikit-learn 首先&#xff0c;确保你已经安装了Python和…

搜索引擎项目(四)

SearchEngine 王宇璇/submit - 码云 - 开源中国 (gitee.com) 基于Servlet完成前后端交互 WebServlet("/searcher") public class DocSearcherServlet extends HttpServlet {private static DocSearcher docSearcher new DocSearcher();private ObjectMapper obje…

Kettle下载安装

环境说明 虚拟机&#xff1a;Win7&#xff1b;MySql8.0 主机&#xff1a;Win11&#xff1b;JDK1.8&#xff1b;Kettle 9.4&#xff08;Pentaho Data Integration 9.4&#xff09;&#xff08;下载方式见文末&#xff09; 安装说明 【1】解压后运行Spoon.bat 【2】将jar包 复…

【Linux C | 网络编程】进程池退出的实现详解(五)

上一篇中讲解了在进程池文件传输的过程如何实现零拷贝&#xff0c;具体的方法包括使用mmap&#xff0c;sendfile&#xff0c;splice等等。 【Linux C | 网络编程】进程池零拷贝传输的实现详解&#xff08;四&#xff09; 这篇内容主要讲解进程池如何退出。 1.进程池的简单退…

聊聊基于Alink库的主成分分析(PCA)

概述 主成分分析&#xff08;Principal Component Analysis&#xff0c;PCA&#xff09;是一种常用的数据降维和特征提取技术&#xff0c;用于将高维数据转换为低维的特征空间。其目标是通过线性变换将原始特征转化为一组新的互相无关的变量&#xff0c;这些新变量称为主成分&…

7月24日JavaSE学习笔记

序列化版本控制 序列化&#xff1a;将内存对象转换成序列&#xff08;流&#xff09;的过程 反序列化&#xff1a;将对象序列读入程序&#xff0c;转换成对象的方式&#xff1b;反序列化的对象是一个新的对象。 serialVersionUID 是一个类的序列化版本号 private static fin…

算法通关:006_1二分查找

二分查找 查找一个数组里面是否存在num主要代码运行结果 详细写法自动生成数组和num&#xff0c;利用对数器查看二分代码是否正确 查找一个数组里面是否存在num 主要代码 /*** Author: ggdpzhk* CreateTime: 2024-07-27*/ public class cg {//二分查找public static boolean …

戴着苹果Vision Pro,如何吃花生米

6月底苹果Vision Pro国内开售&#xff0c;我早早到官网预订了一台。选择必要的配件&#xff0c;输入视力信息&#xff0c;定制符合自己视力的蔡司镜片。确实贵。把主要配件和镜片配齐&#xff0c;要3万6&#xff0c;比Pico、META的眼镜贵一个数量级。 Vision Pro出来后&#x…

C++的STL简介(一)

目录 1.什么是STL 2.STL的版本 3.STL的六大组件 4.string类 4.1为什么学习string类&#xff1f; 4.2string常见接口 4.2.1默认构造 ​编辑 4.2.2析构函数 Element access: 4.2.3 [] 4.2.4迭代器 ​编辑 auto 4.2.4.1 begin和end 4.2.4.2.regin和rend Capacity: 4.2.5…

Q238. 除自身以外数组的乘积

思路 一开始想到的是按位乘 看了题解&#xff0c;思路是存i左边的乘积和 与 i右边的乘积和 代码一&#xff1a; 需要三次循环,需要额外空间 left和right数组 代码&#xff1a; public int[] productExceptSelf(int[] nums) {int[] left new int[nums.length];int[] right …