手把手带你开发你的第一个前端脚手架

news2024/11/29 14:55:34

开发一个简单的脚手架

1.创建 npm 项目

首先创建一个文件夹,然后进入到该文件夹目录下,执行

npm init -y 

2.创建脚手架入口文件bin/index.js,在index.js中添加如下代码

#!/usr/bin/env node

console.log('hello cli') 

3.配置 package.json,添加 bin 属性

{"name": "yj-study-create-cli","version": "1.0.1","description": "","bin": {"yj-study-create-cli": "bin/index.js"},"main": "index.js",...
} 

4.将脚手架发布到 npm

npm publish 

当发布到npm之后,通过全局安装来使用下我们上面创建的脚手架:

npm install -g yj-study-create-cli 

此时我们会在/**/.nvm/versions/node/v16.14.0/bin下看到该脚手架对应的可执行文件,这个文件就软链接到我们开发的bin/index.js文件。

在命令行输入yj-study-create-cli之后,就会打印出hello cli

这样我们就完成了一个简单脚手架的开发,是不是非常简单。

脚手架的调试

当我修改了脚手架内容之后,每次都要通过npm publish上传到npm上面,然后在npm install才能看到效果,这样非常繁琐和不方便,那怎么调试脚手架呢?我们可以通过npm link把本地脚手架文件通过软链接的形式链接到全局。

首先进入到脚手架目录,执行:

npm link 

可以发现在node/bin目录下面建立了一个可执行文件yj-study-create-cli,它指向了lib/node_modules/bin/index.js

我们进入到这个bin/index.js看下:

发现,它不是一个文件,它也是一个软链接,这个软链接指向了本地脚手架文件。

这样当我修改本地脚手架之后,在命令行输入yj-study-create-cli就能看到修改的效果。这样就完成了本地脚手架的调试。

脚手架引入本地库文件

我们知道脚手架开发过程中肯定会引入其他的库文件,如果这个库文件不是npm上的包,而是本地开发的,那如何引入呢?以及引入后如何调试呢?

首先我们新建一个本地库文件,执行npm init -y,然后新建一个lib/index.js,在里面写一个函数:

module.exports = {sum(a, b) {return a + b}
} 

然后修改package.jsonmain.js字段:

"main": "lib/index.js", 

最后执行npm link

我们可以发现在node/v16.14.0/lib/node_modules/下存在一个yj-study-create-lib的软链接,它指向本地的库文件。

我们知道node/v16.14.0/lib/node_modules/是全局安装npm包的位置,现在库文件也被安装在这里,说明这个库文件被全局安装了,那么就可以在任何工程中可以引用。

现在脚手架工程需要引入这个包,首先进入到脚手架工程目录中,然后执行npm link yj-study-create-lib,它会在这个工程下安装yj-study-create-lib这个包:

同时,需要手动的在package.json中添加:

"dependencies": {"yj-study-create-lib": "^1.0.0"
} 

然后在脚手架中使用这个库文件:

#!/usr/bin/env node

const lib = require('yj-study-create-lib')

console.log(lib.sum(1, 2)) 

最后,在命令行中输入yj-study-create-cli,就能获得正确的结果。

npm link的理解

库文件 如果你开发的某个库,当你执行npm link时,就相当于在本地全局安装了这个库。

然后在使用这个库的工程中,执行npm link lib-name,就会在工程下的node_modules安装这个库文件,这样就可以使用这个库了。

如果你在工程中不想引用这个库了,执行npm unlink lib-name即可。如果出现报错,可以直接rm -rf node_modules,然后再重新安装npm install

如果想解除库文件链接到全局的node_modules,执行npm unlink,如果报错Must provide a package name to remove,则执行npm unlink -g即可。

脚手架文件

如果你开发的是一个脚手架,当你执行npm link时,会在node/bin下面创建一个可执行文件,这个可执行文件软链接到node/lib/node_modules所对应的文件,同时这个文件又软链接到本地的脚手架工程文件,这样当你修改脚手架逻辑时,在本地就能看到修改后的效果。

如果脚手架开发完了,可以通过npm remove -g cli-name去除对本地脚手架的软链接。

脚手架命令注册与参数解析

使用脚手架一般会跟上命令和相应的参数,比如:

yj-study-create-cli init --name 

我们可以通过process.argv拿到这些参数:

获取到这些参数之后,就可以执行对应的逻辑,比如:

const argv = process.argv
// 获取命令
const command = argv[2]
// 获取命令的参数
const options = argv.slice(3)
let [option, param] = options
option = option.replace('--', '')

// 命令对应的逻辑
const actions = {init({ option, param }) {console.log('执行init流程', option, param)}
}

// 根据命令执行对应的逻辑
if (commands[command]) {commands[command]({ option, param })
} else {console.log('请输入正确的命令')
} 

这样就完成了脚手架命令注册和参数解析。命令对应的逻辑,可以采用分包策略,单独用一个库lib来管理。

当然,一个出色脚手架不可能这么简单,下面我们来看看一个优秀的脚手架包括那些内容。

优秀的脚手架包括哪些内容?

1. 命令注册

以vue脚手架为例,它可以注册很多命令,每个命令所对应的逻辑都可以用一个单独的包来管理,这样就将复杂的系统拆分成若干个模块。

vue create
vue add
vue invoke 

2. 参数解析

vue command [options] <params> 
  • options全称:--version--help
  • options简写:-V-h
  • 带params的options:--path /Users/sam/Desktop/vue-test

3. 帮助文档

一个清晰的帮助文档,能方便开发者更好的使用脚手架成功。

帮助文档分为全局的帮助文档,和各个命令对应的帮助文档。

vue脚手架对应的全局的帮助文档:

  • Usage
  • Commands
  • Options
Usage: vue <command> [options]

Options:-V, --versionoutput the version number-h, --help output usage information

Commands:create [options] <app-name>create a new project powered by vue-cli-serviceadd [options] <plugin> [pluginOptions] install a plugin and invoke its generator in an already created projectinvoke [options] <plugin> [pluginOptions]invoke the generator of a plugin in an already created projectinspect [options] [paths...] inspect the webpack config in a project with vue-cli-serviceserve [options] [entry]serve a .js or .vue file in development mode with zero configbuild [options] [entry]build a .js or .vue file in production mode with zero configui [options] start and open the vue-cli uiinit [options] <template> <app-name> generate a project from a remote template (legacy API, requires @vue/cli-init)config [options] [value] inspect and modify the configoutdated [options] (experimental) check for outdated vue cli service / pluginsupgrade [options] [plugin-name](experimental) upgrade vue cli service / pluginsmigrate [options] [plugin-name](experimental) run migrator for an already-installed cli plugininfo print debugging information about your environmentRun vue <command> --help for detailed usage of given command. 

各个命令对应的帮助文档:

  • Usage
  • Options
Usage: create [options] <app-name>

create a new project powered by vue-cli-service

Options:-p, --preset <presetName> Skip prompts and use saved or remote preset-d, --default Skip prompts and use default preset-i, --inlinePreset <json> Skip prompts and use inline JSON string as preset-m, --packageManager <command>Use specified npm client when installing dependencies-r, --registry <url>Use specified npm registry when installing dependencies (only for npm)-g, --git [message] Force git initialization with initial commit message-n, --no-gitSkip git initialization-f, --force Overwrite target directory if it exists--merge Merge target directory if it exists-c, --clone Use git clone when fetching remote preset-x, --proxy <proxyUrl>Use specified proxy when creating project-b, --bareScaffold project without beginner instructions--skipGetStartedSkip displaying "Get started" instructions-h, --helpoutput usage information 

还有很多,比如:

  • 命令行交互
  • 日志打印
  • 命令行文字变色
  • 网络通信:HTTP/WebSocket
  • 文件处理

既然需要有这么多功能,业界肯定有成熟的第三方库来解决这些问题,在后面的文章中将会一一实现。

最后

整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。

有需要的小伙伴,可以点击文末卡片领取这份文档,无偿分享

部分文档展示:



文章篇幅有限,后面的内容就不一一展示了

有需要的小伙伴,可以点下方卡片免费领取

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

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

相关文章

YOLOv5如何训练自己的数据集

目录 一、标注 1.1 标注软件下载labelimg 下载地址&#xff1a;mirrors / tzutalin / labelimg GitCode 1.2 json转txt 1.3 xml转txt 二、修改配置文件 2.1 建立文件目录 2.2 修改wzry_parameter.yaml文件 三、开始训练 3.1 2.结果 四、识别检测detect.py 1.调参找…

Jetson NX系统烧录以及CUDA、cudnn、pytorch等环境的安装

安装虚拟机和Ubuntu18.04环境 这两步比较简单&#xff0c;所以略了。虚拟机的配置需要注意硬盘空间大一点&#xff0c;至少40G。 安装sdk-manager NVIDIA SDK Manager下载地址&#xff1a;https://developer.nvidia.com/drive/sdk-manager sudo dpkg -i sdkmanager_1.9.0-…

YOLOv5和YOLOv7环境(GPU)搭建测试成功

本来是用doc写的&#xff0c;直接复制到这里很多图片加载缓慢&#xff0c;我直接把doc上传到资源里面了&#xff0c;0积分下载&#xff1a; (10条消息) YOLOv5和YOLOv7开发环境搭建和demo运行-Python文档类资源-CSDN文库 一、环境搭建 1.1 环境搭建参考链接 YOLO实践应用之…

uni-app 超详细教程(一)(从菜鸟到大佬)

一&#xff0c;uni-app 介绍 &#xff1a; 官方网页 uni-app 是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;开发者编写一套代码&#xff0c;可发布到iOS、Android、Web&#xff08;响应式&#xff09;、以及各种小程序&#xff08;微信/支付宝/百度/头条/飞书/QQ/快手…

百度集团副总裁吴甜发布文心大模型最新升级,AI应用步入新阶段

11月30日&#xff0c;由深度学习技术与应用国家工程研究中心主办、百度飞桨承办的WAVE SUMMIT2022深度学习开发者峰会如期举行。百度集团副总裁、深度学习技术及应用国家工程研究中心副主任吴甜带来了文心大模型的最新升级&#xff0c;包括新增11个大模型&#xff0c;大模型总量…

PyQt5_寻找顶(底)背离并可视化

技术指标的背离是指技术指标曲线的波动方向与价格曲线的趋势方向不一致&#xff0c;是使用技术指标最为重要的一点。在股市中&#xff0c;常见的技术指标的背离分为两种常见的形式&#xff0c;即顶背离和底背离。背离是预示市场走势即将见顶或者见底的依据&#xff0c;在价格还…

计算机组成原理习题课第四章-1(唐朔飞)

计算机组成原理习题课第四章-1&#xff08;唐朔飞&#xff09; ✨欢迎关注&#x1f5b1;点赞&#x1f380;收藏⭐留言✒ &#x1f52e;本文由京与旧铺原创&#xff0c;csdn首发&#xff01; &#x1f618;系列专栏&#xff1a;java学习 &#x1f4bb;首发时间&#xff1a;&…

k8s部署手册

一、基础配置 1.修改主机名 hostnamectl set-hostname k8s-master01 hostnamectl set-hostname k8s-master02 hostnamectl set-hostname k8s-master03 hostnamectl set-hostname k8s-node01 hostnamectl set-hostname k8s-node022.添加 主机名与IP地址解析 cat > /etc/hos…

LINUX安装openssl

openssl 官网下载 https://www.openssl.org/source/old/ 1、解压openssl包&#xff1a; tar -xzf openssl-1.1.1n.tar.gz2、得到openssl-1.1.1n目录&#xff0c;然后进入openssl-1.1.1n目录中&#xff0c;安装openssl到 /usr/local/openssl 目录&#xff0c;安装之后&#xff…

[附源码]Python计算机毕业设计SSM联动共享汽车管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

如何在 SwiftUI 中创建条形图

条形图以矩形条的形式呈现数据的类别,其宽度和高度与它们表示的值成比例。本文将展示如何创建一个垂直条形图,其中矩形的高度将代表每个类别的值。 系列文章 如何在 SwiftUI 中创建条形图SwiftUI 中的水平条形图在 iOS 16 中用 SwiftUI Charts 创建一个折线图在 iOS16 中用 …

在 Node.js 中操作 Redis

在 Node.js 中操作 Redis Node.js 中可以操作 Redis 的软件包推荐列表&#xff1a;https://redis.io/clients#nodejs。 推荐下面两个&#xff1a; node-redisioredis 这里主要以 ioredis 为例。 ioredis 是功能强大的 Redis 客户端&#xff0c;已被世界上最大的在线商务公司…

MyBatis详解(一)

MyBatis简单介绍 【1】MyBatis是一个持久层的ORM框架【Object Relational Mapping&#xff0c;对象关系映射】&#xff0c;使用简单&#xff0c;学习成本较低。可以执行自己手写的SQL语句&#xff0c;比较灵活。但是MyBatis的自动化程度不高&#xff0c;移植性也不高&#xff…

数据库索引

目录 &#x1f407;今日良言:志在山顶的人&#xff0c;不会贪念山腰的风景。 &#x1f409;数据库索引 &#x1f433;1.概念 &#x1f433;2.使用 &#x1f433;3.在mysql中的数据结构 &#x1f407;今日良言:志在山顶的人&#xff0c;不会贪念山腰的风景。 &#x1f409…

Java基础

抽象类和普通类的区别抽象类不能被实例化。-- 抽象类只在分配了在栈中的引用&#xff0c;没有分配堆中的内存抽象类可以有构造函数&#xff0c;被继承时子类必须实现(调用)父类一个构造方法 — 《因为子类会继承父类的构造方法&#xff0c;如果父类方法中的构造函数是带有参数的…

乾元通多卡聚合路由设备海上通信应用解决方案

随着海上通信的发展&#xff0c;在各种应用需求的推动下&#xff0c;海上通信正在向着定制化的需求迈进。 海上通信通信建设目的是要构建一个战时、巡逻和应急情况下移动通信枢纽&#xff0c;为战时、巡逻和应急状态下提供多种通信保障手段。 乾元通智能融合通信设备可配合装…

Graalvm安装配置与springboot3.0尝鲜

Graalvm安装配置与springboot3.0尝鲜 Spring 团队一直致力于 Spring 应用程序的原生映像支持已有一段时间了。经过3 年的孵化春季原生Spring Boot 2 的实验性项目&#xff0c;原生支持将在 Spring Framework 6 和 Spring Boot 3 中正式发布&#xff01; 安装Graalvm 由于spri…

别再问我Python打包成exe了!(终极版)

那今天我就给大家全面总结一下&#xff1a;Python如何打包成exe&#xff0c;以及如何打得足够小。 一、标准打包 目前比较常见的打包exe方法都是通过Pyinstaller来实现的&#xff0c;本文也将使用这种常规方法。如果对这块已经很熟悉的小伙伴&#xff0c;可以直接下滑到本文下…

Javaweb的AJAX及Axios框架使用(封装AJAX)

概念: AJAX(Asynchronous JavaScript And XML):异步的JS和XML。 作用: 与服务器进行数据交换 :通过AJAX可以给服务器发送请求。使用AJAX和服务器进行通信&#xff0c;就可以使用HTMLAJAX来替换JSP页面。异步交互 :可以在不重新加载整个页面的情况下&#xff0c;与服务器交互…

[附源码]SSM计算机毕业设计学生宿舍管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…