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

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

准备工作

在开始搭建前,确保本机安装了node,为避免奇奇怪怪的问题 建议node版本16以上

搭建脚手架

使用过vue ,react,angular的同学都知道 ,应该对脚手架有一定的理解,比如vue-cli的 vue create myApp ,其中vue 就是vue-cli声明的一个命令,下来我们创建一个项目并声明自己的命令。

创建项目

创建一个空的文件夹 demo,并在demo下初始化npm, 其中 -y 表示都采用默认值,执行成功后会在该目录下 生成package.json文件

 npm init -y 

声明命令

1.在package.json中 添加 “bin” 字段,来声明命令,其中 create-demo 就是我们本次声明的命令,./bin/index.js 是我们运行 create 后执行的文件路径。

	"bin" :{
		"create-demo" : "./bin/index.js"	
	}
  1. 创建 bin/index.js , 在根目录下 创建bin 目录 ,并且创建index.js, 创建后的内容如下
	#!/usr/bin/env node
	console.log('简易脚手架demo')

#!/usr/bin/env node 其中 #! 代表标注文件可以当做脚本运行 /usr/bin/env 代表绝对地址 node 代表需要使用的执行器类型

搭建本地调式环境

创建完成后,我们不能直接执行create-demo命令,需要搭建一个本地调式的环境,这部分最简单的就是 npm link, 这个命令就是将本地的项目链接到全局,等同于 npm i -g xxx.

	npm link 

执行后如下

前端如何搭建脚手架并在本地运行,脚手架搭建,前端,node.js,前端框架

npm link 后不生效问题
这个问题是一般都是因为环境变量没有配置正确导致的 ,我们先检查下 当前npm 的配置 npm config list --global 找到 prefix 的配置路径,将其添加在本机的 环境变量中

这时候代表我们已经初始化成功,这个时候再去调用 create-demo,这个时候就可以看到之前在 bin 目录下打印的内容

前端如何搭建脚手架并在本地运行,脚手架搭建,前端,node.js,前端框架

校验node版本

刚开始我们说了,为避免不必要的麻烦,尽量要求用户nodejs版本16以上,这里我们可以用 semver 这个来做个校验。
创建util文件夹,这里文件夹主要放我们封装的一些工具函数, 创建 index.js

	const semver = require('semver');
	/**
	 * 检测nodejs版本 是否大于16
 	*/
	function checkNodeVersion() {
    	const   unSupportedVer = semver.lt(process.version, 'v16.0.0');
    	console.log(`当前node版本${process.version}`);
    	if(unSupportedVer){
        	throw new Error('Node.js 版本过低,推荐升级 Node.js 至 v16.0.0+')
    	}
	}
	
	module.exports = {
    	checkNodeVersion
	}

然后在 /bin/index.js 中添加

const { checkNodeVersion } = require('../util/index');

console.log('简易脚手架demo');
checkNodeVersion();
	

到这里我们一个简易的脚手架就搭建成功了,当然一个脚手架不止这些内容,比如与用户的交互,下载依赖等等,下面将一一讲述。

与用户的交互

命令参数的获取

Node.js 中的 process 模块提供了当前 Node.js 进程相关的全局环境信息。其中process.argv 表示用户输入的 命令行信息,我们可以简单打印下。

	console.log(process.argv)

打印结果如下
前端如何搭建脚手架并在本地运行,脚手架搭建,前端,node.js,前端框架
可以看到 其中 myApp 就是本次输入的内容,当然参数还有多种情况输入 比如下面这两种

	create-demo --name=myApp
	create-demo --name myApp

这个时候我们打印出来的信息也不同,意味这我们需要处理参数的多种情况,这里推荐一个插件minimist,来处理。

	npm  install minimist

通过上面的打印我们注意到,用户输入的从数组的第二个开始,这里我们处理下

	#!/usr/bin/env node
	const minimist = require('minimist');
	const { checkNodeVersion } = require('../util/index');

	console.log('简易脚手架demo');
	checkNodeVersion();
	console.log(minimist(process.argv.slice(2)))

使用结果如下,这样我们就处理了命令参数这块。
前端如何搭建脚手架并在本地运行,脚手架搭建,前端,node.js,前端框架
这里添加几个简单的命令 --h,--v 对应help和version,以及init,添加后的代码如下

在 bin/index.js 中

#!/usr/bin/env node
const minimist = require('minimist');
const { checkNodeVersion , getPkgVersion  } = require('../util/index');

function run (){
    checkNodeVersion();
    parseArgs();
}

// 处理用户命令行输入信息
function parseArgs(){
    const args = minimist(process.argv.slice(2),{
        alias :{
            version: "v",
            help: ["h"],
        }
    });
    // 这里指的是 用户输入的第二个命令  比如 vue create-app 中的 create-app
    const command = args._[0];
    if(command){
        switch (command) {
            case 'init':
                console.log('创建简易脚手架demo');
                break;
        
            default:
                break;
        }
    } else {
        if (args.h) {
            console.log('Usage: create-demo <command> [options]')
            console.log()
            console.log('Options:')
            console.log('  -v, --version       查看当前版本')
            console.log('  -h, --help          查看帮助')
            console.log()
            console.log('Commands:')
            console.log('  init                创建一个新的项目')
        } else if (args.v) {
          console.log(getPkgVersion());
        } 
    
    }
}

run();

在 util/index.js 中

const semver = require("semver");
const path = require('path');
/**
 * 检测nodejs版本 是否大于16
 */
function checkNodeVersion() {
  const unSupportedVer = semver.lt(process.version, "v16.0.0");
  console.log(`当前node版本${process.version}`);
  if (unSupportedVer) {
    throw new Error("Node.js 版本过低,推荐升级 Node.js 至 v16.0.0+");
  }
}

/**
 * 获取根目录
 */
function getRootPath() {
  return path.resolve(__dirname, "../");
}

/**
 * 查看当前版本信息
 */
function getPkgVersion(){
  return require(path.join(getRootPath(), 'package.json')).version
}

module.exports = {
    checkNodeVersion,
    getPkgVersion
}

来看下 输出结果

前端如何搭建脚手架并在本地运行,脚手架搭建,前端,node.js,前端框架
此时整个目录结构如下

  • demo
    • bin
      • index.js
    • util
      • index.js
    • package.json

询问式交互

一个好的脚手架,与用户的交互是少不了的,这里我们采用询问式交互, 一问一答的来收集用户选择的信息。比如npm init 通过询问式的交互来完成package.json 内容。

这里推荐使用 inquirer库来完成,这个相对来说功能比较齐全,比如对值的一些校验,过滤不必要的值等等。

npm i inquirer

我们这里 主要是通过 inquirer.prompt 来完成,prompt接收一个数组,其中每一项都是一个问题对象,每一项下面简单描述下问题对象参数的含义

参数名称 值的含义 类型
type 问题的类型 input | confirm | list | checkbox
name 问题答案的变量 string
message 问题描述 string
default 默认值 any
choices 列表选项 any[]
validate 对当前值的校验 Function
filter 过滤所选值 Fucnton

下来我们直接在刚刚的init里面,添加让用户输入项目名称的问题。

	        case 'init':
                console.log('创建简易脚手架demo');
                inquirer.prompt([{
                    type: "input",
                    name: "projectName",
                    message: "请输入项目名称!",
                }])
            break;

这个时候我们再去终端查看
前端如何搭建脚手架并在本地运行,脚手架搭建,前端,node.js,前端框架
当然一般创建项目肯定不止一个问题 ,下面我们完善下代码

把 问题部分抽离出成一个ask.js, 并添加其余情况的处理,该文件位于 bin 目录下
bin/ask.js

const inquirer = require("inquirer");
const fs = require("fs");

async function init(cb) {
  try {
    const answer = await ask();
    console.log(answer);
    cb(answer);
  } catch (err) {
    console.log(chalk.red("项目创建失败:", err));
  }
}
/**
 * 询问式收集信息
 * @returns 用户的答案信息
 */
async function ask() {
  let prompts = [];
  let ans = {};
  // 每一个问题一个函数
  askProjectName(ans, prompts);

  const answer = await inquirer.prompt(prompts);
  return answer;
}

/**
 * 创建的项目名称
 * @param {*} ans  答案信息
 * @param {*} prompts 问题对象
 */
function askProjectName(ans, prompts) {
  if (typeof ans.projectName !== "string") {
    prompts.push({
      type: "input",
      name: "projectName",
      message: "请输入项目名称!",
      validate(input) {
        if (!input) {
          return "项目名不能为空!";
        }
        if (fs.existsSync(input)) {
          return "当前目录已经存在同名项目,请换一个项目名!";
        }
        return true;
      },
    });
  } else if (fs.existsSync(ans.projectName)) {
    prompts.push({
      type: "input",
      name: "projectName",
      message: "当前目录已经存在同名项目,请换一个项目名!",
      validate(input) {
        if (!input) {
          return "项目名不能为空!";
        }
        if (fs.existsSync(input)) {
          return "项目名依然重复!";
        }
        return true;
      },
    });
  }
}

module.exports = {
	askInit
};

同时创建init.js,预留后续会有新的命令出现,这里把之前校验node版本的也放进来

bin/init.js

const { askInit  } = require('./ask');
const { checkNodeVersion  } = require('../util/index');

// 执行 init 命令后的处理
async function init(){
  	checkNodeVersion();
    await askInit();
}

module.exports = {
    init
}

bin/index.js中,引入init 在用户输入init后执行

	///...
	const { init } = require('./init');
	///...
	case 'init':
       init();
     break;

弄完我们试验下
前端如何搭建脚手架并在本地运行,脚手架搭建,前端,node.js,前端框架
到这里我们与用户交互大致就完成了。下来我们来创建项目。

创建项目

创建项目这里大部分都是复制文件去生成,但是因为我们搭建的是一个简易的脚手架,没有要生成的目录,所以这里我们直接去git上去 克隆一个项目来生成自己的项目。

这里我们直接 在终端输入 git clone 你的项目地址来完成克隆。这里 我们先用 child_process中的 exec 来实现

child_process 为node 内置的模块 ,无需额外下载 。 具体使用参考官网 https://nodejs.org/api/child_process.html

bin/init.js

const {askInit} = require("./ask");
const {checkNodeVersion} = require("../util/index");
const {exec} = require("child_process");
const chalk = require('chalk');

// 执行 init 命令后的处理
async function init() {
  checkNodeVersion();
  await askInit(createProject);
}

/**
 * 创建项目
 */
function createProject(answer) {
  const {projectName} = answer;
  exec(`git clone 你的项目地址 ${projectName}`, (err) => {
    if (err) {
      console.log(chalk.red(err));
    } else {
      console.log(chalk.green("项目创建成功,即将安装依赖"));
      // 安装依赖

    }
  });
}

module.exports = {
  init,
};

此时我们去一个新的目录打开终端,并输入 create-demo init,结果如下
前端如何搭建脚手架并在本地运行,脚手架搭建,前端,node.js,前端框架
这个时候项目已经创建成功了。下面将安装依赖

chalk : 命令行输出美化工具 这里我使用的是 3.0.0版本的

安装依赖

基于克隆项目,安装依赖这里就相对比较简单了,也是直接去掉终端。

/**
 * 创建项目
 */
function createProject(answer) {
  const {projectName} = answer;
  exec(`git clone git@gitee.com:leadersir/resume.git ${projectName}`, (err) => {
    if (err) {
      console.log(chalk.red(err));
    } else {
      console.log(chalk.green("项目创建成功,即将安装依赖"));
      // 安装依赖
      const command = `cd ${process.cwd()}/${projectName} && yarn`;
      install(command);
    }
  });
}

/**
 * 下载依赖
 */
function install(command) {
      const child = exec(command,(err)=>{
        if(err){
            console.log(chalk.red('安装项目依赖失败,请自行重新安装!'))
        } else {
            console.log(chalk.gray('安装成功'))
        }
    });
     // 输出安装的信息
    child.stdout.on('data',(data)=>{
        console.log(data);
    })
    // 输出安装的信息
    chalk.stderr.on('data',(data)=>{
        console.log(data);
    })
}

此时我们运行,就可以正常安装依赖了。当然安装依赖这里我们可以加个loading,让用户更直观的感受到,这里推荐使用开源库ora来实现加载动画。

	npm i ora@5.0.0

优化后代码如下

function install(command) {
    const installSpinner = ora(`正在安装依赖, 请耐心等待...`).start()
    const child = exec(command,(err)=>{
        if(err){
            installSpinner.fail(chalk.red('安装项目依赖失败,请自行重新安装!'))
        } else {
            installSpinner.succeed(chalk.gray('安装成功'));
        }
    });
    child.stdout.on('data',(data)=>{
        installSpinner.stop()
        console.log(data.replace(/\n$/, ''))
        installSpinner.start()
    })
    child.stderr.on('data',(data)=>{
        console.log(data.replace(/\n$/, ''))
        installSpinner.start()
    })
}

前端如何搭建脚手架并在本地运行,脚手架搭建,前端,node.js,前端框架
最后我们再给用户一个提示 说明项目已经创建成功了 ,可以开发了。

/**
 * 创建项目成功回调
 */
function callSuccess() {
  console.log(chalk.green(`创建项目成功!`));
  console.log(chalk.green(` 开始工作吧!😝`));
}

添加到依赖下载成功这里

	installSpinner.succeed(chalk.gray("安装成功"));
    callSuccess();

此时执行完成后 结果如下
前端如何搭建脚手架并在本地运行,脚手架搭建,前端,node.js,前端框架
到这里我们的脚手架就搭建成功了,最后我们发布到github 上

	npm publish

项目目录&依赖版本信息

前端如何搭建脚手架并在本地运行,脚手架搭建,前端,node.js,前端框架

常用依赖包

  • chalk : 命令行美化工具
  • inquirer : 命令行交互工具
  • minimist : 命令行处理工具
  • ora : 命令行加载美化工具
  • semver : 版本比较工具
  • request : 处理请求

结语

上面主要是讲述如何搭建一个脚手架,比较简单,但这些方法都比较常用,是搭建脚手架的基本功,希望对你有所帮助。以上代码已上传至 gitee中 ,大家可以下载实践。文章来源地址https://www.toymoban.com/news/detail-828339.html

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

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

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

相关文章

  • 处理解决运行前端脚手架工程报错: ‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。附带 Linux

    处理解决运行前端脚手架工程报错: ‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。附带 Linux

    目录 一、场景介绍 二、处理方式         1、 如果 package.json 配置没有 vue-cli-server 那么就安装它即可,注意安装完毕需重启编辑器启动项目,避免依赖添加不生效问题         2、如果 package.json 配置有 vue-cli-server 或者安装了还是没好,可以看看 node_modules 工程模块是否存

    2024年02月22日
    浏览(35)
  • [npm]脚手架本地全局安装1

    [npm]脚手架本地全局安装1

    该文章是你的脚手架已经开发完成的前提下,你想要本地全局安装该脚手架,便于本地使用脚手架的命令的情况 如果本地开发的项目是个脚手架,只是个人使用,也并不需要上传到 npm 或者私库,如何安装本地的项目到包的全局位置,以便全局使用该脚手架? 可以在项目的根

    2024年02月07日
    浏览(8)
  • 实现一个简单的前端脚手架

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

    前端脚手架概念 实现前端脚手架 随着前端工程化的概念越来越深入人心,脚手架应运而生。简单来说,「前端脚手架」就是指通过选择几个选项快速搭建项目基础代码的工具 前端脚手架可帮我们做什么? 可以帮助我们快速生成项目的基础代码 脚手架工具的项目模板经过了

    2024年02月03日
    浏览(10)
  • Vue脚手架搭建项目

    Vue脚手架搭建项目

    一、 安装Node.js (一) 注意事项 1. 注意电脑系统版本以及位数,按照自己电脑的环境下载相应的Node.js安装包 2. 确定运行项目的Node.js版本和npm版本,避免后期因为版本不同而产生的一些差异问题 3. 在官网下载Node安装包时请下载稳定版(或不同版本的稳定版),正确区分稳定版

    2024年02月09日
    浏览(18)
  • VUE2 脚手架搭建

    VUE2 脚手架搭建

    M : Model 模型层(业务逻辑层)主要包含 JS 代码,用于管理业务逻辑的实现 V : View 视图层 主要包含 HTML/CSS 代码,用于管理 UI 的展示 VM : ViewModel (视图模型层)用于将 data 与视图层的 Dom 进行动态绑定 ①脚手架环境安装 制作web项目,从小作坊状态转向工程化开发的状态

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

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

    2024年02月20日
    浏览(8)
  • 从脚手架搭建到部署访问路程梳理

    1、vue-cli 起文件: 2、配置 webpack :打包配置等,env文件( 处理线上和测试的ip), https://www.ibashu.cn/news/show_377892.html 3、样式:封装 style :组件(element-ui) 其他类似的css js文件封装:(单位的处理,初始化参数的处理deepclone 等 4、模块组件:封装(传参的处理 5、数据请求:

    2024年02月17日
    浏览(4)
  • 11. 搭建较通用的GoWeb开发脚手架

    11. 搭建较通用的GoWeb开发脚手架

    代码地址:https://gitee.com/lymgoforIT/bluebell 有了前述知识的基础后,我们便可以开始搭建基本脚手架了。 脚手架应该包含如下信息: 较好的代码管理、即清晰的目录结构,层次分明。 配置文件管理和加载。 日志组件初始化和加载。 Redis 初始化和加载。 MySQL 初始化和加载。 路

    2024年03月14日
    浏览(9)
  • Vue3 脚手架搭建项目详细过程

    Vue3 脚手架搭建项目详细过程

    如果之前安装了2.0的脚手架,要先卸载掉,输入:npm uninstall vue-cli -g 进行全局卸载 然后重新安装:npm install @vue/cli -g 由于 git bash 来执行命令的时候无法使用键盘上下键来进行选项选择,所以我们要使用  cmd / powershell,这里使用 cmd 1.vue create + 项目名称  2.模板选择,通过键

    2024年02月06日
    浏览(37)
  • 和chatgpt学架构01-搭建项目脚手架

    今年3月份以来,chatgpt就热度不减。有了这种聊天机器人,就可以很方便的帮助我们提高。无论是我们独立创业还是做项目外包,拥有一套自己可以把握的脚手架还是必备的能力。 过去如果靠自己摸索,组装这么一套脚手架还是费事费力的。一个是涉及技术比较多,既要架构

    2024年02月16日
    浏览(11)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包