实现一个简单的前端脚手架

这篇具有很好参考价值的文章主要介绍了实现一个简单的前端脚手架。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

核心要点

  • 前端脚手架概念
  • 实现前端脚手架

什么是前端脚手架?

随着前端工程化的概念越来越深入人心,脚手架应运而生。简单来说,「前端脚手架」就是指通过选择几个选项快速搭建项目基础代码的工具

前端脚手架可帮我们做什么?

  • 可以帮助我们快速生成项目的基础代码
  • 脚手架工具的项目模板经过了开发者的提炼和检验,一定程度上代表了某类项目的最佳实践
  • 脚手架工具支持使用自定义模板,我们可以根据不同的项目进行“定制”

我为什么要搭建一个前端脚手架?

主要在开发过程中,要做的项目很多,有涉及到vue2、vue3、react、uniapp、小程序等等,然后又有PC端、移动端;针对这些端的项目,我搭建好了基础的开发模板,但是呢,感觉每次新建一个项目,都需要从仓库中下载,感觉总少了点什么。于是想到了像vue-cli一样,搭建一个脚手架来创建项目行不行呢?
所以,我的目标很明确,我的脚手架的功能就是通过命令的方式,下载不同的项目模板,然后供所有项目组人员快速建立项目模板。

实现前端脚手架

1、安装前端脚手架制作所需要的一些插件
npm install chalk@4.0.0 commander@9.4.1 download-git-repo@3.0.2 fs-extra@11.1.0 inquirer@8.0.0 log-symbols@4.0.0 ora@5.0.0 path@0.12.7 update-notifier@4.0.0
"chalk": "^4.0.0", //用于修改终端(terminal)输出的字符串样式,包括字体色、背景色、字体样式
"commander": "^9.4.1", //是 node.js 命令行解决方案
"download-git-repo": "^3.0.2", //主要用来从一个代码仓库中下载文件的到目标文件夹
"fs-extra": "^11.1.0", //加强版的 fs(node 文件系统模块),主要用于操作文件
"inquirer": "^8.0.0", //inquirer.js 是一个用来实现命令行交互式界面的工具集合,它帮助我们实现与用户的交互式交流
"log-symbols": "^4.0.0", //为各种日志级别提供着色的符号
"ora": "^5.0.0", //主要用于创建和展示终端加载动画
"path": "^0.12.7", //主要用于格式化或拼接完整路径
"update-notifier": "^4.0.0" //检测 npm 包是否更新
2、文件结构如下,创建相应的文件,配置 package.json文件

实现一个简单的前端脚手架

3、编写 /bin/index.js,主要是编写交互的命令以及对应执行的操作
#!/usr/bin/env node

// 请求 commander 库
const program = require('commander')

// 从 package.json 文件中请求 version 字段的值,-v和--version是参数
program.version(require('../package.json').version, '-v, --version')


// 请求 lib/update.js
const updateChk = require('../lib/update')

// upgrade 检测更新
program
    .command('upgrade')
    .description("Check the mtt-cli version.")
    .action(() => {
      updateChk()
    });

// 请求 lib/init.js
const initProject = require('../lib/create')

// init 初始化项目
program
    .name('mtt-cli')
    .usage('<commands> [options]')
    .command('create <project_name>')
    .description('create a new project')
    .action(project => {
      initProject(project)
    })

// 解析命令行参数
program.parse(process.argv)

4、编写 /lib/create.js,主要的操作将会在这里完成
// 请求 fs-extra 库,用于文件操作
const fse = require('fs-extra');
// 请求 ora 库,用于初始化项目时等待动画
const ora = require('ora');
// 请求 chalk 库
const chalk = require('chalk');
// 请求 log-symbols 库
const symbols = require('log-symbols');
// 请求 inquirer 库,用于控制台交互
const inquirer = require('inquirer');

const path = require('path');

// 请求 download.js 文件,模板不在本地时执行该操作
const dlTemplate = require('./download');

// prompt文件
const promptProjectCover = require('./promptModules/projectCover');
const promptProjectSelect = require('./promptModules/projectSelect');

// 初始化项目
async function initProject(projectName) {
  try {
    const targetDir = path.join(process.cwd(), projectName);
    if (fse.existsSync(targetDir)) {
      // 项目重名时提醒用户
      inquirer.prompt(promptProjectCover).then((answers) => {
        if (answers.projectCover) {
          createProject(targetDir, true);
        } else {
          console.log(symbols.error, chalk.red(`项目名称已存在,请重新设置!`));
          process.exit();
        }
      }).catch((error) => {
        console.log(symbols.error, chalk.red(`error:${error}`));
        process.exit();
      });
    } else {
      createProject(targetDir);
    }
  } catch (err) {
    console.error(err);
    process.exit();
  }
}

// 开始创建项目
async function createProject(targetDir, removeDir) {
  // 执行控制台交互
  inquirer.prompt(promptProjectSelect).then(async (answers) => {
    // 获取选择的模板
    const projectSelect = answers.projectSelect;

    // Spinner 初始设置
    const initSpinner = ora(chalk.cyan('创建目录...'));
    // 开始执行等待动画
    initSpinner.start();

    // 移除已有项目
    if(removeDir){
      try {
        await fse.remove(targetDir)
      } catch (err) {
        // 如果出错,Spinner 就改变文字信息
        initSpinner.text = chalk.red(`移除原有目录失败: ${err}`);
        // 终止等待动画并显示 X 标志
        initSpinner.fail();
        // 退出进程
        process.exit();
      }
    }
    //判断目录是否存在,不存在则创建
    fse.ensureDir(targetDir);

    // 开始下载模板
    try {
      initSpinner.text = `下载模板...`;
      await dlTemplate(targetDir, projectSelect);
    }catch (e) {
      // 如果成功,Spinner 就改变文字信息
      initSpinner.text = chalk.red(e);
      // 终止等待动画并显示 ✔ 标志
      initSpinner.fail();
      // 退出进程
      process.exit();
    }
    // 如果成功,Spinner 就改变文字信息
    initSpinner.text = '初始化项目完成.';
    // 终止等待动画并显示 ✔ 标志
    initSpinner.succeed();

  }).catch((error) => {
    console.log(symbols.error, chalk.red(error));
  });
}

// 将上面的 initProject(projectName) 方法导出
module.exports = initProject;

5、编写 /lib/download.js,用于从指定仓库中下载文件模板
// 请求 download-git-repo 库,用于下载模板
const download = require('download-git-repo');
const path = require('path');

// 请求 mirror.js 文件
const dataMirror = require('./mirror');

async function dlTemplate(targetDir, projectSelect) {
  return new Promise(((resolve, reject) => {
    download(dataMirror[projectSelect], targetDir, {clone: true}, function (err) {
      if (err) {
        reject(`模板下载失败. ${err}`)
      } else {
        resolve(`模板下载完成`)
      }
    });
  }))
}

// 将上面的 dlTemplate() 方法导出
module.exports = dlTemplate;

6、编写 /lib/update.js,检测npm仓库中我们的脚手架插件是否有新的版本
// 引用 update-notifier 库,用于检查更新
const updateNotifier = require('update-notifier')
// 引用 chalk 库,用于控制台字符样式
const chalk = require('chalk')
// 引入 package.json 文件,用于 update-notifier 库读取相关信息
const pkg = require('../package.json')

// updateNotifier 是 update-notifier 的方法,其他方法可到 npmjs 查看
const notifier = updateNotifier({
  // 从 package.json 获取 name 和 version 进行查询
  pkg,
  // 设定检查更新周期,默认为 1000 * 60 * 60 * 24(1 天)
  // 这里设定为 1000 毫秒(1秒)
  updateCheckInterval: 1000,
})

function updateChk() {
  // 当检测到版本时,notifier.update 会返回 Object
  // 此时可以用 notifier.update.latest 获取最新版本号
  if (notifier.update) {
    console.log(`New version available: ${chalk.cyan(notifier.update.latest)}, it's recommended that you update before using.`)
    notifier.notify()
  } else {
    console.log('No new version is available.')
  }
}

// 将上面的 updateChk() 方法导出
module.exports = updateChk

7、编写 /lib/mirror.js,我的远程仓库地址,目前是固定写死的,这部分可以根据自身未来的项目需求,写成可以自动配置的方式
module.exports = {
  '0': 'direct:https://gitee.com/meme-project/m-template-vue2-mb.git',
  '1': 'direct:https://gitee.com/meme-project/m-template-vue2-pc.git',
  '2': 'direct:https://gitee.com/meme-project/m-template-vue3-mb.git',
  '3': 'direct:https://gitee.com/meme-project/m-template-vue3-pc.git',
  '4': 'direct:https://gitee.com/meme-project/m-template-wx.git',
};
8、编写/lib/promptModules/projectCover.js、/lib/promptModules/projectSelect.js,这个主要功能是编写inquirer终端命令行需要交互的命令
//projectSelect.js

module.exports = [{
  type: 'list',
  message: '请选择要创建的模板',
  name: 'projectSelect',
  default: 0,
  choices: [
    {value: 0, name: 'vue2 移动端模板'},
    {value: 1, name: 'vue2 PC端后台模板'},
    {value: 2, name: 'vue3 移动端模板'},
    {value: 3, name: 'vue3 PC端后台模板'},
    {value: 4, name: '微信小程序模板'}
  ]
}];
//projectCover.js

module.exports = [{
    type: 'confirm',
    message: '目录下存在相同名字的文件名称,是否覆盖?',
    name: 'projectCover',
    default: 'true'
}];

运行测试脚手架

1、以上把我要实现的整体的脚手架代码已经编写完成了,接下来我们测试下;首先通过npm link软连接的方式,在项目本地测试脚手架的功能,可以看到已经成功完成了我想要的功能

实现一个简单的前端脚手架

选择vue2 移动端模板进行下载

实现一个简单的前端脚手架
2、发布到npm仓库

通过 npm publish 命令,将当前脚手架发布到npm库

实现一个简单的前端脚手架

再次安装测试,得到一样的预期结果,完工,按照预期完成了自己想要的脚手架

实现一个简单的前端脚手架文章来源地址https://www.toymoban.com/news/detail-437979.html

到了这里,关于实现一个简单的前端脚手架的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端如何搭建脚手架并在本地运行

    在开始搭建前,确保本机安装了node,为避免奇奇怪怪的问题 建议node版本16以上 使用过vue ,react,angular的同学都知道 ,应该对脚手架有一定的理解,比如vue-cli的 vue create myApp ,其中vue 就是vue-cli声明的一个命令,下来我们创建一个项目并声明自己的命令。 创建一个空的文件夹

    2024年02月20日
    浏览(45)
  • Vue2向Vue3过度核心技术工程化开发和脚手架

    1.1 开发Vue的两种方式 核心包传统开发模式:基于html / css / js 文件,直接引入核心包,开发 Vue。 工程化开发模式:基于构建工具(例如:webpack)的环境中开发Vue。 工程化开发模式优点: 提高编码效率,比如使用JS新语法、Less/Sass、Typescript等通过webpack都可以编译成浏览器识

    2024年02月11日
    浏览(55)
  • 前端架构: 脚手架框架之yargs高级应用教程

    脚手架框架之yargs高级应用 1 )高级应用概述 现在还用 xyzcli 这个脚手架,继续在这个项目中来看yargs的高级用法 在 yargs 文档中, 给出了复杂应用的方式,这里做下详解 https://www.npmjs.com/package/yargs?activeTab=readme#complex-example 这里主要关注 ↓ command recommendCommands fail 2 )command 应用

    2024年02月20日
    浏览(54)
  • 【前端】Vue2 脚手架模块化开发 -快速入门

    🎄欢迎来到@边境矢梦°的csdn博文🎄  🎄本文主要梳理Vue2 脚手架模块化开发 🎄 🌈我是边境矢梦°,一个正在为秋招和算法竞赛做准备的学生🌈 🎆喜欢的朋友可以关注一下 🫰🫰🫰 ,下次更新不迷路🎆 Ps: 月亮越亮说明知识点越重要 (重要性或者难度越大)🌑🌒🌓🌔🌕

    2024年02月10日
    浏览(82)
  • go脚手架,可快速构建一个go小型项目

    1、项目技术使用 gin+sqlx+redis ,后续会引入需要的技术 2、项目目的 当我们有一个新的 idea 需要马上付出实践,用于构建小型项目,直接上手写接口即可,主要为了大学生可以快速完成作业,不需要搭建环境,本项目暂时完成不了复杂的业务哦~ 3、项目介绍 脚手架架构分为

    2024年02月09日
    浏览(61)
  • 创建一个vue2的脚手架项目(超详细)

    0.前言 在用npm安装vue脚手架之前需要安装node,前面博客有详细安装过程,请读者安装node之后再进行脚手架的安装 1 npm vue2的安装脚手架 2.创建vue2脚手架项目 3.开启服务器 4.在浏览器中输入端口地址 5.项目目录介绍

    2024年02月11日
    浏览(71)
  • 快速搭建一个go语言web后端服务脚手架

    快速搭建一个go语言web后端服务脚手架 源码:https://github.com/weloe/go-web-demo web框架使用gin,数据操作使用gorm,访问控制使用casbin 首先添加一下自定义的middleware recover_control.go ,统一处理panic error返回的信息 access_control.go 使用casbin进行访问控制的中间件 reader.go 读取yaml配置文件

    2023年04月12日
    浏览(72)
  • 前端架构师-week4-脚手架命令注册和执行过程开发

    基于 Commander 完成脚手架命令注册和命令执行过程开发 ·如何设计高性能脚手架(缓存 + 多进程 实现这一点) ·Node 多进程开发 ·javascript 面向对象的实战技巧(达到可扩展 高复用) ·图解高性能脚手架架构设计方法 ·封装通用的 Package 和 Command 类 ·基于缓存 + Node 多进程实现

    2024年02月01日
    浏览(56)
  • 使用vue脚手架搭建前端工程(附:搭配ElementUI来快速开发)

    目录 一、搭建过程 1. 全局安装webpack(打包工具) 2. 全局安装vue脚手架 3. 初始化vue项目 4. vue项目目录的简单介绍 二、执行流程分析 三、自己造一个组件案例 四、ElementUI的使用 1. 环境的引入 2. 一个简单使用 3. 使用它来快速搭建后台管理系统 五、总结 npm install webpack -g np

    2024年02月10日
    浏览(71)
  • 前端架构: 脚手架之Chalk和Chalk-CLI使用教程

    Chalk Chalk 是粉笔的意思, 它想表达的是,给我们的命令行中的文本添加颜色类似彩色粉笔的功能 在官方文档当中,它的 Highlights 核心特性 它的性能很高,没有三方依赖 它能够支持256以及真彩色的实现 也就是说这个库可以让你自己去定义它的色彩 并不是说命令行中当中的25

    2024年02月21日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包