从0到1学会开发前端脚手架

news2025/2/1 3:56:48

【课程简介】

在前端开发中经常会用到create-vue, create-react-app这类脚手架,它可以帮助我们快速生成一个配置化的项目,提高开发效率。现在很多大厂都有自己研发的脚手架,掌握脚手架的使用,并且自己能开发脚手架,能够让大家前端之路走得更远。本次课程将会解析脚手架实现原理,从0到1实现一个前端脚手架,让大家轻松掌握!

【主讲内容】

1. 脚手架实现原理思路解析

2.命令行开发常用第三方模块

3.从0到1码出一个前端脚手架

【教程推荐】从0到1开发前端脚手架

为什么需要脚手架?

脚手架本质就是一个工具,作用是能够让使用者专注于写代码,它可以让我们只用一个命令就生成一个已经配置好的项目,而不用我们再花时间去配置和安装相关依赖,可以在很大程度上提升我们的开发效率。比如我们常用的create-vuecreate-react-app就是脚手架,很多大厂也都有自己的脚手架。

一个脚手架应该具备哪些功能?

我们以vue官方的脚手架create-vue为例来分析下一个脚手架应该具备哪些功能?

1.运行命令创建项目

➜ npm create vue@latest

2.用户根据自己需要选择一些配置项

 3.根据选择的配置项会生成一个模版项目

通过分析create-vue,我们可以知道,一个脚手架如果想要创建一个项目,最少要有以下两点功能:

1.可以通过命令行和用户交互

2.根据交互的结果去生成对应的模版项目

脚手架实现

初始化项目

1.执行如下初始化命令

➜ mkdir kfc-vme50
➜ cd kfc-vme50
➜ npm init -y

2.在根目录下创建bin/index.js文件作为入口文件,并添加如下代码

#!/usr/bin/env node
console.log('肯德基疯狂星期四v我50')

3.在package.json中添加bin字段

"bin": {
  "kfc-vme50": "/bin/index.js"
}

4.在根目录下执行npm link将项目链接到本地环境,就可以实现kfc-vme50命令全局调用

5.运行kfc-vme50并查看控制台输出

相关依赖

实现一个脚手架,通常会用到以下依赖包

commander:命令行处理工具

chalk:命令行输出美化工具

inquirer:命令行交互工具

ora:终端loading美化工具

git-clone:下·载项目模版工具

figlet:终端生成艺术字

fs-extra:用来操作本地目录

talk is cheap, show me the code

#!/usr/bin/env node
const inquirer = require('inquirer');
const { program } = require('commander');
const figlet = require('figlet');
const fs = require('fs-extra');
const path = require('path');
const chalk = require('chalk');
const gitClone = require('git-clone');
const ora = require('ora');

const projectList = {
  'vue': 'git@github.com:kfc-vme50/vue-template.git',
  'react': 'git@github.com:kfc-vme50/react-template.git',
  'react&ts': 'git@github.com:kfc-vme50/react-template-ts.git',
  'vue&ts': 'git@github.com:kfc-vme50/vue-template-ts.git',
}

// 修改帮助信息的首行展示
program.usage('<command> [options]')
// 版本号
program.version(`v${require('../package.json').version}`)
// 艺术字展示
program.on('--help', function () {
  console.log(
    figlet.textSync('kfc vme50', {
      font: 'Ghost',
      horizontalLayout: 'default',
      verticalLayout: 'default',
      width: 100,
      whitespaceBreak: true
    })
  )
});

// 创建项目的命令
program
  .command('create <app-name>')
  .description('创建新项目')
  .option('-f, --force', '如果创建的目录存在则强制删除')
  .action(async function (name, option) {
    const cwd = process.cwd();
    const targetPath = path.join(cwd, name);
    // 如果文件夹存在
    if (fs.existsSync(targetPath)) {
      if (option.force) {
        fs.remove(targetPath)
      } else {
        const res = await inquirer.prompt([
          {
            name: 'action',
            type: 'list',
            message: '是否覆盖已有文件夹?',
            choices: [
              {
                name: 'YES',
                value: true
              },
              {
                name: 'NO',
                value: false
              }
            ]
          }
        ])
        if (!res.action) {
          return;
        } else {
          fs.remove(targetPath)
          console.log(chalk.red('已删除之前的文件夹'))
        }
      }
    }

    const res = await inquirer.prompt([
      {
        name: 'type',
        type: 'list',
        message: '请选择使用的框架',
        choices: [
          {
            name: 'Vue',
            value: 'vue'
          },
          {
            name: 'React',
            value: 'react'
          }
        ]
      },
      {
        name: 'ts',
        type: 'list',
        message: '是否使用ts项目',
        choices: [
          {
            name: 'YES',
            value: true
          },
          {
            name: 'NO',
            value: false
          }
        ]
      }
    ])
    const rep = res.type + (res.ts ? '&ts' : '');
    // 拉取项目模板
    const spinner = ora('正在加载项目模板...').start();
    gitClone(
      projectList[rep],
      targetPath,
      {
        checkout: 'main'
      },
      (err) => {
        if (!err) {
          fs.remove(path.resolve(targetPath, '.git'));
          spinner.succeed('项目模板加载完成!');
          console.log('now run:')
          console.log(chalk.green(`\n  cd ${name}`))
          console.log(chalk.green('  npm install'))
          console.log(chalk.green(`  npm run ${res.type === 'react' ? 'start' : 'dev'}\n`))
        } else {
          spinner.fail(chalk.red('项目模板加载失败,请重新获取!'));
        }
      }
    )
  })

program.parse(process.argv)

  发布

1.注册npm账号

2.在本地登录并发布

# 登录刚注册的账号
➜ npm login
Username: 用户名
Password: 密码
Email: 注册邮箱
Enter one-time password: 一次性密码  邮箱会收到邮件

# 在我们脚手架的根目录下执行发布命令
➜ npm publish

注意:

1.登录和发包前一定要先查看npm的源,需要修改为https://registry.npmjs.org/

2.在发布时包名不能重复,所以可以先在线上搜索下看看有没有存在的包,如果出现403错误可能是包名和线上的包重复了,修改package.json中的name即可

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

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

相关文章

涵盖全场景构建方方面面!魅族2023-2025年产品矩阵曝光

在万物互联的时代大背景下&#xff0c;一众以智能手机闻名的科技厂商们开始了全场景概念上的推进构建&#xff0c;形如早前作为国产智能手机「领头羊」的老牌手机厂商魅族&#xff0c;就在近日公布了2023-2025年全场景多终端沉浸式的全方位产品矩阵。 从中可以看到&#xff0c…

解读最佳实践:倚天 710 ARM 芯片的 Python+AI 算力优化 | 龙蜥技术

编者按&#xff1a;在刚刚结束的 PyCon China 2022 大会上&#xff0c;龙蜥社区开发者朱宏林分享了主题为《ARM 芯片的 PythonAI 算力优化》的技术演讲。本次演讲&#xff0c;作者将向大家介绍他们在倚天 710 ARM 芯片上开展的 PythonAI 优化工作&#xff0c;以及在 ARM 云平台…

SCI 论文插图格式一般要求

插图是反映 SCI 文章品质的核心指标之一&#xff01;&#xff01;&#xff01; 图片格式要求:图片一般可以保存为TIFF、JPEG、EPS这三种常见格式,并存为独立文件。 二、图片色彩要求:一般要求为CMYK或RGB色彩。 1.尺寸符合杂志社的要求(宽度8.3~17.6厘米,高度一般不超过20厘米…

云服务下半场,企业增长的超级入口在哪?

随着数字技术的加速突破以及相关鼓励政策的出台&#xff0c;云服务市场正在进入爆发性增长阶段。 在市场、政策的双轮驱动下IT架构转型已是大势所向&#xff0c;而作为时代命题&#xff0c;传统厂商们如果还无法让市场看到转型的成果和信心&#xff0c;或将逐渐在市场端失去选…

专访实在智能孙林君:颠覆传统RPA的实在IPA模式,如何做到真正人人可用?

文/王吉伟 “RPA人人可用”这个愿景&#xff0c;在一线大厂提出后立即得到广大厂商的认同与推崇&#xff0c;之后它几乎成了所有厂商的“口头禅”。 如果RPA能够消除使用门槛实现真正人人可用&#xff0c;意味着每个组织都能通过引入RPA快速通过流程自动化快速实现增效降本。…

正大周二数据 产品介绍 主账户怎么拿到留4的条件?

《今日关注数据》 09:15 中国至12月20日一年期贷款市场报价利率 17:00 欧元区10月季调后经常帐(亿欧元) 21:30 加拿大10月零售销售月率 21:30 美国11月新屋开工总数年化(万户) 21:30 美国11月营建许可总数(万户) 美国银行在报告中指出&#xff0c;儘管美联准会 (Fed) 最近…

OLAP系统林林总总

大数据需求通常可分为三大类&#xff1a;离线数据统计&#xff0c;实时数据计算&#xff0c;即席查询。 离线数据统计&#xff0c;通常是T1出数&#xff0c;是最典型的数据仓库解决的问题。计算复杂性最高&#xff0c;所以是时间就不能要求太高&#xff0c;否则对资源的要求将…

【OpenFeign】【源码+图解】【三】FeignClient的配置信息

【OpenFeign】【源码图解】【二】注册OpenFeign接口的实例 目录4. FeignClient的配置信息4.1 FeignClientFactoryBean4.2 FeignClientFactoryBean.getObject()4.2.1 FeignContext4.2.2 Feign.Builder4.2.2.1 Bean的配置方式YMLFeignClient.configurationEnableFeignClients.def…

5.Node中的模块

目录 1 模块化 2 加载模块 3 模块作用域 4 module对象 4.1 初识module对象 4.2 module.exports 4.2.1 module.exports与require() 4.2.2 添加变量与方法 5 exports对象 5.1 初识exports对象 5.2 添加变量与方法 1 模块化 向我们之前引入的 fs,path,htt…

Baklib|为什么说企业需要重视客户体验?

数十年来&#xff0c;人们都在寻求使自己的品牌获得成功的秘密&#xff0c;企业和品牌也在不断地想着怎样在竞争中胜出&#xff0c;从而获得顾客的青睐。 有些公司已经竭尽全力争取顾客的信赖&#xff0c;并竭力争取更多的市场份额。 但是&#xff0c;即便那些著名的公司不会…

5G无线技术基础自学系列 | RF优化原理

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 RF优化主要是依据各种收集到的数据&…

C++ Primer 第五章 Statements

C Primer 第五章 Statements5.3. Conditional Statements5.3.2. The switch Statement5.4. Iterative Statements5.4.3. Range for Statement5.6. try Blocks and Exception Handling5.6.1. A throw Expression5.6.2. The try Block5.6.3. Standard Exceptions5.3. Conditional…

【传递窗】洁净区与非洁净室之间的传递

广州特耐苏净化设备有限公司详细介绍&#xff1a;传递窗分类及安装与使用方法 传递窗是一种洁净室的辅助设备&#xff0c;用于不同的洁净区之间&#xff0c;洁净区与非洁净区之间小物件的传递&#xff0c;具有气闸的作用&#xff0c;防止非洁净的空气进入洁净室。同时&#xf…

git cherry-pick 同步修改到另一个分支

我们在开发中有时会遇到&#xff0c;需要将另一个分支部分修改同步到当前分支。 如下图&#xff0c;想把 devA 分支中 commit E 和 F&#xff0c;同步到下面绿色的 devB 分支中。 这时候就可以使用 git cherry-pick 来完成这项任务。 &#xff08;cherry-pick 有筛选、精选的…

音视频开发——H265码流解析

概述 H.265技术的应用 编码技术主要运用于视频播放设备、软件应用以及拍摄、录制视频的设备。人们最熟悉的莫过于PPS网络视频播放器。在PC屏客户端产品上面&#xff0c;PPS已经于2013年初推出了基于H.265标准的高清视频&#xff0c;并命名“臻高清”为自己的高清品牌。同时 P…

极限一个月,突破Java高频面试题和核心技术,跳槽涨薪6K

前言 先说一下我的情况&#xff0c;双非本科毕业后就在几家小公司工作了3年&#xff0c;5月份的时候有去大厂面试过&#xff0c;结果都是凉凉&#xff0c;下面会跟大家分享一下我的经验以及建议。 有的朋友可能会认为学历是自己的问题&#xff0c;面试官连简历都不会看。其实…

Java Stream 编程

Java Stream 编程 教程&#xff1a;https://www.bilibili.com/video/BV1te411w722 1. 不可变集合 1.1 不可变集合应用场景 元数据&#xff0c;只允许查询的数据集合 1.2 创建不可变集合 List、Set、Map 接口中的静态方法 of() List<String> list List.of("张…

SpringCloud 2021版本教程:使用nacos作为注册中心和配置中心(2021版本+Boot2.7.6)

目录 前言 系列文章目录 一、什么是Nacos 1、nacos架构原理 2、nacos、eureka、zookeeper的区别 1、参考博客&#xff0c;写得很详细通俗易懂&#xff1a;一文说清eureka、zookepeer、nacos三者的关系 - 知乎 2、三者区别&#xff1a; 3、CAP原理&#xff1a; 二、项目…

MyBatis八股文

1、什么是MyBatis框架&#xff1f; MyBatis 是一款优秀的持久层框架&#xff0c;它支持定制化 SQL、存储过程以及高级映射&#xff0c;它内部封装了jdbc&#xff0c;不需要我们再写JDBC连接、使开发者只需要关注sql语句本身和业务&#xff0c;而不需要花费精力去处理加载驱动、…

【数据结构】基础:常见排序算法

【数据结构】基础&#xff1a;常见排序算法 摘要&#xff1a;本文将从排序的概念及其附属概念出发&#xff0c;再对排序算法进行分类&#xff0c;并对其思想与实现进行说明&#xff0c;最后对各个算法进行总结。 文章目录【数据结构】基础&#xff1a;常见排序算法一. 排序的概…