如何搭建一个前端脚手架

超详细的前端脚手架入门篇 超详细的前端脚手架入门篇,通过本文,你将学会如何开始搭建前端脚手架。 阅读详情

为什么我们需要脚手架?

  • 对于前端来说,从零开始建立一个项目是复杂的
  • 完成新项目的启动和搭建,能够帮助开发者提升效率和开发体验

前置准备

  • inquirer、enquirer、prompts:可以处理复杂的用户输入,完成命令行输入交互。
  • chalk:使终端可以输出彩色信息文案。
  • arg:可以进行基础的命令行参数解析。
  • commander、yargs:可以进行更加复杂的命令行参数解析。

项目创建过程

创建初始化项目
mkdir cli && cd cli
npm init --yes
创建cli函数

创建src目录及src/cli.js文件,cli.js文件内容如下

export function cli(args) {
 console.log(args);
}
创建入口文件

创建src/bin/index.js,为了能够正常使用esm 模块,我们需要先安装,执行npm install esm

#!/usr/bin/env node

require = require('esm')(module /*, options*/);

require('../src/cli').cli(process.argv);
此时使用npm link就能在终端使用xbc执行脚本啦
{
 "name": "xbc-cli",
 "version": "1.0.0",
 "main": "src/index.js",
 "bin": {
   "xbc": "bin/index.js"
 },
 "dependencies": {
   "esm": "^3.2.18"
 }
}
解析处理命令行输入

在解析处理命令行输入之前,我们需要设计命令行支持的几个选项,如下。

  • [template]:支持默认的几种模板类型,用户可以通过 select 进行选择。
  • --git:等同于git init去创建一个新的 Git 项目。
  • --install:支持自动下载项目依赖。
  • --yes:跳过命令行交互,直接使用默认配置。
npm install inquirer arg

编写命令行参数解析逻辑,在cli.js中添加:

import arg from 'arg';
// 解析命令行参数为 options
function parseArgumentsIntoOptions(rawArgs) {
    // 使用 arg 进行解析
    const args = arg({
        '--git': Boolean,
        '--yes': Boolean,
        '--install': Boolean,
        '-g': '--git',
        '-y': '--yes',
        '-i': '--install',
    }, {
        argv: rawArgs.slice(2),
    });
    return {
        skipPrompts: args['--yes'] || false,
        git: args['--git'] || false,
        template: args._[0],
        runInstall: args['--install'] || false,
    }
}
export function cli(args) {
    // 获取命令行配置
    let options = parseArgumentsIntoOptions(args);
    console.log(options);
}

实现使用默认配置和交互式配置选择逻辑,如下代码:

import arg from 'arg';
import inquirer from 'inquirer';

function parseArgumentsIntoOptions(rawArgs) {
    // ...
}
async function promptForMissingOptions(options) {
    // 默认使用名为 JavaScript 的模板
    const defaultTemplate = 'JavaScript';
    // 使用默认模板则直接返回
    if (options.skipPrompts) {
        return {...options,
            template: options.template || defaultTemplate,
        };
    }
    // 准备交互式问题 
    const questions = [];
    if (!options.template) {
        questions.push({
            type: 'list',
            name: 'template',
            message: 'Please choose which project template to use',
            choices: ['JavaScript', 'TypeScript'],
            default: defaultTemplate,
        });
    }
    if (!options.git) {
        questions.push({
            type: 'confirm',
            name: 'git',
            message: 'Initialize a git repository?',
            default: false,
        });
    }
    // 使用 inquirer 进行交互式查询,并获取用户答案选项
    const answers = await inquirer.prompt(questions);
    return {...options,
        template: options.template || answers.template,
        git: options.git || answers.git,
    };
}
export async function cli(args) {
    let options = parseArgumentsIntoOptions(args);
    options = await promptForMissingOptions(options);
    console.log(options);
}

下面我们需要完成下载模板到本地的逻辑,我们事先准备好两种名为typescript和javascript的模板,并将相关的模板存储在项目的根目录中

我们使用ncp包实现跨平台递归拷贝文件,使用chalk做个性化输出。安装相关依赖如下:

npm install ncp chalk

在src/目录下,创建新的文件main.js,代码如下:


import chalk from 'chalk';
import fs from 'fs';
import ncp from 'ncp';
import path from 'path';
import {
    promisify
}
from 'util';
const access = promisify(fs.access);
const copy = promisify(ncp);
// 递归拷贝文件
async function copyTemplateFiles(options) {
    return copy(options.templateDirectory, options.targetDirectory, {
        clobber: false,
    });
}
// 创建项目
export async function createProject(options) {
    options = {...options,
        targetDirectory: options.targetDirectory || process.cwd(),
    };
    const currentFileUrl = import.meta.url;
    const templateDir = path.resolve(new URL(currentFileUrl).pathname, '../../templates', options.template.toLowerCase());
    options.templateDirectory = templateDir;
    try {
        // 判断模板是否存在
        await access(templateDir, fs.constants.R_OK);
    } catch (err) {
        // 模板不存在 
        console.error('%s Invalid template name', chalk.red.bold('ERROR'));
        process.exit(1);
    }
    // 拷贝模板
    await copyTemplateFiles(options);
    console.log('%s Project ready', chalk.green.bold('DONE'));
    return true;
}

接下来,我们需要完成git的初始化以及依赖安装工作,这时候需要用到以下内容。

  • execa:允许开发中使用类似git的外部命令。

  • pkg-install:使用yarn install或npm install安装依赖。

  • listr:给出当前进度 progress。

npm install execa pkg-install listr

更新main.js

const { projectInstall } = require('pkg-install');
const { access } = require('fs/promises');
const chalk = require('chalk');
const fs = require('fs');
const path = require('path');
const execa = require('execa');
const Listr = require('listr');
const util = require('util');
const ncp = require('ncp');
const copy = util.promisify(ncp);

// 拷贝模板
async function copyTemplateFiles(options) {
  return copy(options.templateDirectory, options.targetDirectory, {
    clobber: false,
  });
}

// 初始化 git
async function initGit(options) {
  // 执行 git init
  const result = await execa('git', ['init'], {
    cwd: options.targetDirectory,
  });

  if (result.failed) {
    return Promise.reject(new Error('Failed to initialize git'));
  }
  return;
}

// 创建项目
export async function createProject(options) {
  options = {
    ...options,
    targetDirectory: options.targetDirectory || process.cwd()

  };

  const templateDir = path.resolve(
    __dirname,
    '../templates',
    options.template
  );

  options.templateDirectory = templateDir;

  try {
    console.log(templateDir);

    // 判断模板是否存在
    await access(templateDir, fs.constants.R_OK);
  } catch (err) {
    console.error('%s Invalid template name', chalk.red.bold('ERROR'));
    process.exit(1);
  }

  // 声明 tasks

  const tasks = new Listr([
    {
      title: 'Copy project files',
      task: () => copyTemplateFiles(options),
    },
    {
      title: 'Initialize git',
      task: () => initGit(options),
      enabled: () => options.git,
    },
    {
      title: 'Install dependencies',
      task: () =>
        projectInstall({
          cwd: options.targetDirectory,
        }),
      skip: () =>
        !options.runInstall
          ? 'Pass --install to automatically install dependencies'
          : undefined,
    },
  ]);

  // 并行执行 tasks
  await tasks.run();
  console.log('%s Project ready', chalk.green.bold('DONE'));
  return true;
}

总结

此时一个简单的脚手架已经完成,文件模板和cli命令根据实际需求自行配置扩展

源码地址

github

从0搭建前端脚手架详解(小白也可以搭建) 先来看一眼实现的效果。从图上来看这个脚手架的功能非常的简单只有一个创建的命令,其他都是帮助和显示版本号的。也就是上图这句,创建一个新项目,只需要输入create 项目名便可使用,在创建时执行了一系列的操作,这一块的思路很简单,就是将git仓库中的项目模板拷贝下来再依据使用者的不同操作对复制下来的模板的部分文件进行修改就可以了,大致思路便介绍到这里,接下来我们便来详细的讲讲如何实现,以及会用到的依赖。脚手架就是在启动的时候询问一些简单的问题,并且通过用户回答的结果去渲染对应的模板文件,我们接下来的流程亦是如此 阅读详情

相关推荐

从0-1逐步搭建一个前端脚手架工具并发布到npm

本文介绍的案例已同步到github,github地址。vue-cli 和 create-react-app 等 cli 脚手架工具用于快速搭建应用,无需手动配置复杂的构建环境。本文介绍如何使用 rollup 搭建一个脚手架工具。脚手架工具的工作流程简言为:提供远端仓库各种模版 => 用户通过命令选择模版 => 拉取仓库代码配置打包命令配置命令行交互,如 create、-v 等,其中 create 是核心逻辑,用于根据用户的选择拉取远程仓库中相应的初始代码。发布至 npm查看。

m0_74824755的博客 1212

搭建前端脚手架

1.什么是脚手架 脚手架用于快速生成新项目的目录模板,并集成一系列体系化工具的安装,无需自己从零开始一步步配置,减少copy操作,有效提升开发体验和效率,尽管这些脚手架非常优秀,但是未必是符合我们的实际应用的,所以我们可以定制一个属于自己的脚手架,来提升自己的开发效率。平时我们在开发React-Native的时候就会使用到raect-native-cli这个脚手架为我们创建项目 脚手架的作用 减少重复性的工作,不需要复制其他项目再删除无关代码,或者从零创建一个项目和文件。 可...

大灰狼的小绵羊哥哥的博客 996

前端工程化实战:从零搭建一个迷你脚手架(含UmiJS对比)

本文通过从零搭建一个迷你脚手架,深入解析前端工程化的核心流程,涵盖命令解析、交互询问、模板生成与依赖安装。通过与UmiJS等企业级方案的对比,探讨了在控制力与开发效率之间的权衡,为不同场景下的技术选型与团队工具链定制提供实践指导。

weixin_28835789的博客 394

前端从零搭建自己的脚手架

Webpack脚手架是一个工具,用于快速搭建基于Webpack的项目结构。它通常包括了一些预设的配置和插件,以便用户可以快速开始一个新的项目,而不必从头开始配置Webpack。这些脚手架可以帮助开发人员自动处理诸如打包、代码转译、资源管理等繁琐的任务,从而让他们更专注于项目的逻辑实现。

mengxiaodi的博客 5269

Vue-Cli3 - 从安装 nodejs 配置环境 ~ 搭建 cli 脚手架项目全过程

以下过程凡是涉及到终端的使用,一定都要使用 管理员 方式打开!

CYK_byte的博客 3441

图像去雾常见数据集

上述数据集涵盖了室内、室外、真实和合成等多种场景,可以满足不同研究需求。在选择数据集时,建议根据具体任务的应用场景和目标选择合适的数据集,例如真实雾天图像适合模型的实际应用验证,而合成数据则适合模型的快速迭代和训练。希望本文能为从事图像去雾研究的朋友提供一些帮助!

m0_68604571的博客 6334

我搭建了一个前端脚手架

theme: juejin 作为前端的我们,脚手架肯定也是经常使用;但是每次使用的时候都需要去配置基础设施,比如:axios、less、生产环境和开发环境、以及各种UI框架一类的,如果是移动端可能配置的东西就要更多一点了。那么我们就想弄一些模板啥的。我需要什么类型的项目就直接拿来用,那岂不是很方便。尤其是公司 最开始的想法是直接在GitHub上传一个初始化项目,然后想要的时候自己去...

weixin_50307964的博客 102

从工艺文件到寄生分析:手把手教你用华大九天RCExplorer做版图预检(附ITF文件解析)

本文详细介绍了华大九天RCExplorer工具在模拟IC和版图设计中的应用,从工艺文件解析到寄生参数提取的全流程。通过ITF文件的深度解析和实战案例,帮助工程师掌握金属层、介质层及通孔参数的关键影响,提升设计效率与准确性。文章还提供了与StarRC工作流集成的实用技巧,是国产EDA工具应用的权威指南。

weixin_42522552的博客 407

前端如何搭建一个简单的脚手架

前言 这里先简单了解一下基础知识,接下来会基于typescript和rollup参考写一个较为完整的脚手架(动态模板),以下只能拉取较为简单的静态模板。 基础 脚手架发布和安装 这里假设我们的脚手架名字是ds-cli,以下都用这个名字。我们在命令行使用脚手架命令为ds 我们怎么样让用户通过npm或者yarn全局安装ds-cli之后,在终端能执行ds命令呢?答案就在package.json的b...

weixin_33835103的博客 1168

荔枝派Lichee Nano全志F1C100s烧录避坑指南:从Fel模式到SPI Flash完整流程

本文详细介绍了荔枝派Lichee Nano基于全志F1C100s芯片的SPI Flash烧录完整流程,从FEL模式进入技巧到定制化sunxi-tools编译,再到分区策略与实战烧录步骤。针对开发者常见的烧录程序问题提供了专业解决方案,帮助用户高效完成嵌入式系统部署。

tea88的博客 788

GT-Power柴油机瞬态性能仿真与优化——基于EGR-VGT耦合控制策略【附案例】

本文探讨了GT-Power在柴油机瞬态性能仿真与优化中的应用,重点分析了EGR-VGT耦合控制策略的实际效果。通过案例研究展示了如何通过仿真优化提升柴油机的动力响应速度和排放性能,为车辆工程领域的工程师提供了实用的技术参考。

green的博客 763

前端如何搭建一个成熟的脚手架

前言 有了之前的基础(前端如何搭建一个简单的脚手架),我们现在可以讲讲一个成熟的脚手架是怎么做了。 这里我们参考vue-cli的源码,基于rollup和typescript一步步搭建。vue-cli作为vue的脚手架,给如此多的前端开发者使用,已经算是成熟了吧。 开始 以下我们的命令仍然是ds~,模板是ds-cli-lib-template 目录结构 ├─ bin # 打...

weixin_33766805的博客 1049

Kaamel白皮书:IoT设备安全隐私评估实践

明确评估的目的和预期结果。

kaamelai的博客 1317

如何搭建一个简单的前端脚手架

一 安装node 官网下载 二 初始化项目 1、创建文件夹firstSca,在终端打开 2、初始化项目,终端输入命令npm init -y(-y表示所有选项都选yes) 初始化完成后项目中会出现package.json文件 三 简单配置 新建bin/index.js文件 index.js #!/usr/bin/env node //#!/usr/bin/env node 表示进入直接执行node+当前文件 console.log("hello myfirstsca!")p

xdididi的博客 1029

自私兽群优化器(SHO)详解:从生物本能到智能优化

自私兽群优化器(SHO)是一种受动物群体自私行为启发的智能优化算法。该算法模拟动物在捕食威胁下的两种行为:聚集行为(全局搜索)和自私行为(局部搜索),将优化问题的解空间映射为生存环境,候选解视为猎物个体。SHO通过安全性评估将猎物分为安全、危险和高危三类,分别采用不同的位置更新策略,并引入捕食者角色增加选择压力。相比传统优化算法,SHO具有无需梯度信息、自适应平衡探索与开发、参数简单等优势,特别适合高维复杂和多模态优化问题。算法通过马尔可夫链理论保证收敛性,已在工程设计和数据挖掘等领域展现出良好性能。

qq_42212808的博客 196

node运行项目-Network: unavailable-没有ip地址

vscode运行vue项目后发现Network: unavailable 是什么情况呢?可能有一下三种情况:1.多个网卡原因:打开网络共享中心,把多余的网络禁用掉,只留一个2.在中配置host及public3.系统环境变量问题。

JackieDYH的博客 7539

前端工程化---脚手架构建 (搭建一个自己的脚手架)

Powered by Node.js 厥功至伟的Node.js node.js就是前端的工业革命!!!!!!!!!!!!!! 前端工程化 脚手架工具开发 自动化构建系统 模块化打包 项目代码规范化 自动化部署 脚手架工具概要 脚手架的本质作用:创建项目基础结构、提供项目规范和约定 常用的脚手架工具 React项目------create-react-app Vue.js项目------vue-cli Angular项目 -------- angular-cli 通用型项目脚手架工具 Yeoman Plo

weixin_42499553的博客 969

华为OD机试:使用Ascend C语言实现Matmul与LeakyReLU融合算子的全流程设计与优化解析

通过本文的详细解析,相信你已经对华为OD机试中基于Ascend C语言的Matmul+LeakyReLU融合算子的设计与实现有了深入的理解。我们不仅从理论上探讨了融合算子的核心优势,还通过实际的代码示例演示了如何一步步完成算子的实现与优化。融合算子在AI算子开发中的应用,尤其是在处理大规模矩阵计算的场景中,能够显著提升计算效率,优化内存占用,并减少数据传输的开销。通过合理的Tiling策略设计,我们还能够充分利用多核处理器的算力,进一步提升AI模型的训练与推理性能。

qq_38334677的博客 661

前端 搭建一个简单的脚手架

为了好管理 这个是统一处理文件,定制化需求代码都按照后面的 create 文件 参照即可。创建 command/index.js 统一导出。创建 command/create.js。2 修改package.json中文件。新建 bin/cli.js。

With__Hope的博客 364

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

搭建一个nodejs前端脚手架的方法步骤

前言 像我们熟悉的 vue-cli,taro-cli 等脚手架,只需要输入简单的命令 taro init project ,即可快速帮我们生成一个初始项目。在日常开发中,有一个脚手架工具可以用来提高工作效率。 搭建前准备 第三方工具 commander.js ,可以自动的解析命令和参数,用于处理用户输入的命令。 download-git-repo ,下载并提取 git 仓库,用于下载项目模板。 ...

Mo_Luffy的博客 1593

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

前端工程师: 我用gup4.0搭建一个前端脚手架

冬至时节, 程序员加油!本文将会介绍如何使用gulp4来搭建项目脚手架,如果您还在使用gulp3或更老的版本,您也以通过本文的一些思想将之前的项目进行完善,更新。如果gulp不是你们团队...

趣谈前端 562

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

从零开始搭建一个自己的前端脚手架(一):基础篇

文章目录一、前期基础知识1.1 脚手架本质1.2 脚手架工作流程1.3 依赖工具库二、实现输入命令解析三、实现从输入到下载模板的过程四、实现模板替换 一、前期基础知识 1.1 脚手架本质 1.2 脚手架工作流程 解析用户命令—》 commander 根据用户输入替换内容 —》 metalsmith, handlebars 模板 拉取远端模板 —》 download-git-repo 文件操作 —》增删改 fs-extra 结束初始化 1.3 依赖工具库 commander 用于帮助快速

Sophie_U的博客 5907

从0搭建vue3组件库: 如何完整搭建一个前端脚手架?

开发组件库CLI工具

随便写写 1142
上一篇: PIXI+GSAP 防刹车动效
下一篇: 使用lerna搭建monorep
一号小白
博客等级 码龄9年 13粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值