前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >前端脚手架构建实践

前端脚手架构建实践

作者头像
河马嘴不大
发布于 2022-12-24 04:20:26
发布于 2022-12-24 04:20:26
1.1K00
代码可运行
举报
运行总次数:0
代码可运行
前面的话

在前端工程化过程中,为了解决多项目中,相似度高的工作,便诞生许多前端脚手架,这里记录下自己实现一个简易前端脚手架过程的实践。主要是解决多个页面相似内容的复制粘贴问题,功能类似于Webstorm的Live template,或者Vscode的Snippets。

思路
  • 预先配置页面模板,预留关键字变量
  • 用户填写关键字变量,生成页面模板,输出到制定目录
用到的包
  • fs 读写文件模块,这里主要用于读入用户配置文件,输出模板到文件
  • commander NodeJs命令行工具,提供了用户命令行输入和参数解析,用户解析用户输入
  • inquirer NodeJs交互式命令行工具,询问操作者问题,获取用户输入,校验回答的合法性
  • metalsmith 文件处理,读写操作
  • handlebars 将模板中的变量替换为用户输入,编译模板,类似框架如:artTemplate,Jade
  • path NodeJs的路径操作库,如合并路径
  • chalk 命令行输出样式美化
具体实现
  1. 首先在一个新的文件夹,如xxx-tools下 npm init 创建一个node项目,因为是要做成一个npm包的脚手架,所以在包的取名上一定要唯一,即package.jsonname字段,避免在发包的时候和网上已经存在的npm包重名,报403没有权限的错。
  2. 在xxx-tools文件夹下创建bin文件夹,同时在bin文件夹下创建脚本tempTool文件,内容如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env node

console.log('Hello World');

注意哦,#!/usr/bin/env node 这个是Linux规范,用来指明了这个执行脚本的解释程序,要是没有这一行,默认用当前Shell去解释这个脚本

  1. package.json中增加bin配置:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"bin": {
   "tempTool": "./bin/tempTool"
 },
  1. 到目前为止,一个简单的前端脚手架实现了,在npm官网注册,在项目里执行npm login登录,之后npm publish如果一切顺利,npm包提交完毕,可以在其它项目中执行npm i -g xxx-tools,安装这个包,执行xxx-tools命令,输出 Hello World,脚手架开发过程中,也涉及到在本地调试,可以直执行node ./bin/xxx-tools
  2. 现在来加入具体的开发流程,用户的输入,输入信息的读取等等,bin文件修改如下
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env node

const program = require('commander');
const chalk = require('chalk');
const { loadTemplate } = require('../src/lib/writeTemp');

const log = data => console.log(chalk.green(data));

log('初始化模板配置');

program
  .command('create')
  .description('create template')
  .option('-d')
  .action(async function () {
    const result = await loadTemplate();
    result ? null : log('配置完毕');
  });

program.parse(process.argv);

用户执行create命令,在这里调用了loadTemplate函数,看一下这个函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 把模板中的变量替换为用户输入的变量,输出模板到制定文件夹
const Metalsmith = require('metalsmith');
const Handlebars = require('handlebars');
const path = require('path');
const fs = require('fs');
const { askQuestion } = require('./askQuestion');

const loadTemplate = async () => {
  // 从toolrc.json文件读取配置
  const dirPath = process.cwd();
  if (!fs.existsSync('toolrc.json')) {
    throw new Error('toolrc.json配置文件不存在');
  }
  const configJson = path.join(dirPath, 'toolrc.json');
  const config = fs.readFileSync(configJson);
  const { source, dist, questionConfig } = JSON.parse(config);
  const answer = await askQuestion(questionConfig);
  const metalsmith = Metalsmith(__dirname);

  metalsmith
    .metadata(answer)
    .source(path.join(dirPath, source))
    .destination(path.join(dirPath, dist))
    .use(function (files, metalsmith, done) {
      //遍历替换模板
      Object.keys(files).forEach(fileName => {
        const fileContentsString = files[fileName].contents.toString();
        //Handlebar compile 前需要转换为字符串
        files[fileName].contents = new Buffer(Handlebars.compile(fileContentsString)(metalsmith.metadata()));
      });
      done();
    }).build(function (err) {
    if (err) throw err;
  });
};

module.exports.loadTemplate = loadTemplate;

为了方便用户配置,需要用户自行配置一个toolrc.json文件,指明模板文件的输入输出目录,和需要用到的 询问变量,示例配置如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "source": "/src/template",
  "dist": "/build",
  "questionConfig": {
    "name": {
      "type": "string",
      "required": true,
      "label": "Module name"
    },
    "description": {
      "type": "string",
      "required": true,
      "label": "Module description"
    },
    "namespace": {
      "type": "string",
      "required": true,
      "label": "dva model namespace"
    }
  }
}

source配置了模板文件的位置,dist为输出文件的位置,questionConfig为模板中的关键字,需要用户在交互的命令行中输入,下面这段为利用inquirer包,实现命令行交互。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 遍历问题模板,输出提问

const inquirer = require('inquirer');

const askQuestion =  async (prompts)=> {
  let promptsArr = Object.keys(prompts).map(key => ({
    name: key,
    ...prompts[key]
  }));
  return inquirer.prompt(promptsArr);
}

module.exports.askQuestion = askQuestion

效果如下:

因为用了handlebars包,模板的定义需要符合其规范,模板文件如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React, { Component } from 'react';
import { connect } from 'dva';
import './style.less';

@connect(state => ({ loading: state.loading }))
class {{name}} extends React.Component {
  state = {};

  componentWillReceiveProps = (nextProps) => {

  };

  render() {
    return ();
  }

}

export default {{name}};

最终输出到 dist 目录的文件,会替换其中双括号里的内容

结束的话

这里只是简单的例子,可以沉淀一些业务场景的模板,通过命令行的方式快速的创建,避免复制粘贴,其实本意是学习一下Node的脚手架工具的实现,有兴趣的同学可以看看babel-cli的源码。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-05-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
自制前端脚手架
摘要总结:本文主要介绍了一种基于Node.js的脚手架框架,该框架可以快速生成项目结构,并支持自定义模板,具有易用性好、可扩展性强、可维护性好的特点。同时,本文还介绍了一种基于Node.js的脚手架框架生成方法,该方法可以快速生成项目结构,并支持自定义模板,具有易用性好、可扩展性强、可维护性好的特点。
IMWeb前端团队
2017/12/29
1.4K0
自制前端脚手架
从零撸一个CLI命令行脚手架工具
我想大部分同学肯定都是这样回答的:现在社区都有开箱即用的脚手架,像vue-cli、create-react-app这种,我们直接用脚手架来创建项目就可以了啊。
前端森林
2021/02/03
1.1K0
从零撸一个CLI命令行脚手架工具
中秋节最后一天,手撸一个自己的前端脚手架
“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第3篇文章,点击查看活动详情”
用户6256742
2024/07/31
1220
从0开始搭建优雅的前端脚手架工具
在日常开发中,我们经常会使用到各种脚手架工具(cli): vue-create-app,ng 包括 npm。它们极大简化了开发人员对于项目结构和文件创建的工作,让我们可以把精力专心在业务实现上。 对于某些项目而言 cli还可以封装一些脚本,用来处理项目中的一些特殊场景。
用户8738532
2022/12/05
6630
开发一个简单的脚手架工具
像我们熟悉的 vue-cli,create-react-app 等脚手架,只需要输入简单的命令 vue init webpack project,即可快速帮我们生成一个初始项目。在实际工作中,我们可以定制一个属于自己的脚手架,来提高自己的工作效率。
小皮咖
2019/11/15
1.7K0
《前端那些事》从0到1开发简单脚手架
上一篇树酱讲《前端工程化那些事》,聊到脚手架,不过时间比较仓促,导致内容较少,而在我实践开发中,随着新项目愈来愈多,脚手架工具就起到提高效能的作用,借此机会跟小伙伴们分享下我是如何从0到1开发一个简单脚手架
树酱
2020/07/03
1.6K0
《前端那些事》从0到1开发简单脚手架
Vue-cli原理分析
在平时工作中会有遇到许多以相同模板定制的小程序,因此想自己建立一个生成模板的脚手架工具,以模板为基础构建对应的小程序,而平时的小程序都是用mpvue框架来写的,因此首先先参考一下Vue-cli的原理。知道原理之后,再定制自己的模板脚手架肯定是事半功倍的。
用户2356368
2024/02/04
1700
Vue-cli原理分析
开源了一个小的前端脚手架(队内分享)
这个是我开源的第二个项目,第一个开源项目是一个 okr 的树形图,目前有 349 个star,地址如下: https://github.com/qq449245884/vue-okr-tree,精力有限,近期维护的比较少,如果有兴趣的小伙伴可以加入一直维护。
前端小智@大迁世界
2022/06/15
5480
开源了一个小的前端脚手架(队内分享)
浅入vue脚手架 手把手教你撸一个简单脚手架
整个vue init大致流程如我上图所示,应该还是比较好理解的。这里我大致阐述一下大致的流程。
饼干_
2022/08/07
1.5K0
浅入vue脚手架 手把手教你撸一个简单脚手架
Vue-cli 原理分析
在平时工作中会有遇到许多以相同模板定制的小程序,因此想自己建立一个生成模板的脚手架工具,以模板为基础构建对应的小程序,而平时的小程序都是用mpvue框架来写的,因此首先先参考一下Vue-cli的原理。知道原理之后,再定制自己的模板脚手架肯定是事半功倍的。
grain先森
2019/03/29
1.3K0
Vue-cli 原理分析
Vue-cli原理分析
在平时工作中会有遇到许多以相同模板定制的小程序,因此想自己建立一个生成模板的脚手架工具,以模板为基础构建对应的小程序,而平时的小程序都是用mpvue框架来写的,因此首先先参考一下Vue-cli的原理。知道原理之后,再定制自己的模板脚手架肯定是事半功倍的。
用户2356368
2019/04/03
9600
Vue-cli原理分析
前端工程化-打造企业通用脚手架
随着前端工程化的概念越来越深入FEer心,前端开发过程的技术选型、代码规范、构建发布等流程的规范化、标准化是需要工具来保驾护航的,而不是每次都对重复工作进行手动复制粘贴。脚手架则可作为工程化的辅助工具,从很大程度上为前端研发提效。
Careteen
2022/02/14
8470
前端工程化-打造企业通用脚手架
前端脚手架开发指南
脚手架本质上是一个工具,使用脚手架的目的就是摆脱构建工程时重复性的工作,尤其是当一个工程具有一定通用性时,工程脚手架的意义就更为突出。它可以让我们只需要一行命令,就可以初始化好一项工程。
牛老师讲GIS
2023/02/27
7740
前端脚手架开发指南
《前端那些事》从0到1开发简单脚手架
当我要开启一个新项目的开发,可以快速生成新项目的目录模板,而这个目录结构是每个项目统一个模版规范(目录规范),同时也设定了通用的配置包括如下
树酱
2020/10/15
6740
用 nodejs 搭建脚手架
像我们熟悉的 vue-cli,taro-cli 等脚手架,只需要输入简单的命令 taro init project,即可快速帮我们生成一个初始项目。在日常开发中,有一个脚手架工具可以用来提高工作效率。
coder2028
2022/09/28
4900
前端脚手架开发入门
为什么需要脚手架 脚手架本质上是一个工具,使用脚手架的目的就是摆脱构建工程时重复性的工作,尤其是当一个工程具有一定通用性时,工程脚手架的意义就更为突出。它可以让我们只需要一行命令,就可以初始化好一项工程,而不用费心费力的去做配置环境,安装依赖,解决依赖冲突这样的支线任务,可以直奔主线任务,早早下班~~ 概览 开发一个的脚手架,通常需要如下npm包: commander: 强大的node命令行处理工具。能轻松的获取命令行的参数。 inquirer: 命令行交互工具,让你能以“问答”的交互方式来完成一系列的命
腾讯VTeam技术团队
2020/12/14
7690
如何开发一个极简的前端脚手架
功能上,要满足登录,权限管理,菜单配置,用户管理,字典管理,角色管理等后台管理系统的常规功能,
虎妞先生
2023/10/16
4030
如何开发一个极简的前端脚手架
yyds,这可能是你第一个自定义的脚手架
哈喽大咖好,我是Johnny,这次给大家重新缕一缕如何用typescript配合周边插件做一个易用的脚手架管理工具。
南山种子外卖跑手
2022/09/09
9270
yyds,这可能是你第一个自定义的脚手架
(满满干货)从零实现命令行脚手架工具——自动初始化项目工程以及发布到NPM
这篇文章将带你从零实现一款命令行脚手架工具用于初始化项目以及如何发布到NPM。首先,我们所熟知的VueCLI就是采用命令行工具快速生成项目工程目录的,这样,我们每次开发项目前只需要在命令行中输入命令,然后就可以快速生成项目工程,非常方便。那么,这么方便的命令行工具是怎么实现的呢?下面我们就开始进入实战环节。
Vam的金豆之路
2021/12/01
6250
前端工程化之脚手架( ? )
那我今天的想法呢,就是紧赶着搭一个自己的脚手架出来,别整得我每次搭建项目都心态爆炸
源心锁
2022/08/01
6170
前端工程化之脚手架( ? )
相关推荐
自制前端脚手架
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档