node 构建脚手架

1、基本介绍

1、commander: 完整的 node.js 命令行解决方案。
2、download-git-repo:从节点下载并提取一个git存储库
3、figlet:制作欢迎页面
4、chalk:改变控制台输出的样式
5、clear:清除终端屏幕
6、handlebars: 可以高效地构建语义化模板
7、inquirer: 常见的交互式命令行用户界面的集合。
8、open: 打开诸如URL,文件,可执行文件之类的东西
9、ora:加载动画
10、runjs:运行脚本(新tasksfile

2.命令路口文件

"bin": {
    "ff": "./bin/ff.js"
  },

ff.js 使用 commander 来获取cmd命令,按模块将其指向不同的文件

list 是查看命令配置

#!/usr/bin/env node
const program = require('commander')
program.version(require('../package').version)
program
    .command('init <name>')
    .description('init project')
    .action(require('../lib/init.js'))

program
    .command('add <name>')
    .description('create File')
    .action(require('../lib/add.js'))

program
    .command('temp <name>')
    .description('create File')
    .action(require('../lib/temp.js'))

program
    .command('sentry')
    .description('create File')
    .action(require('../lib/sentry.js'))

program
    .command('qiankun')
    .description('create File')
    .action(require('../lib/qiankun.js'))


program
    .command('list')
    .description('list')
    .action(()=>{
        console.log(`
        init 初始化项目
        add  初始化增删改查文件
        temp 初始化基础文件
        sentry 接入sentry
        qiankun 接入微前端
        `)
    })


program.parse(process.argv)

3、初始化项目

项目架构是从git存储库拉取的。在这基础上在配置自己所需要的功能。
注意:clone('url') 必须要加上direct

module.exports = async name => {
    //打印页面
    clear()
    const data = await figlet('zonst welcome')
    log(data)
    log('🚀创建项目' + name)
    await clone('direct:https://git.xxxx/vue-admin-zonst#node-cli',name)
}

项目下载完成之后利用inquirer与用户进行交互,handlebars写入模板

 inquirer.prompt([{
            type: 'input',
            name: 'name',
            message: '请输入项目名称'
        },{
            type: 'input',
            name: 'description',
            message: '请输入项目简介'
        },{
            type: 'input',
            name: 'author',
            message: '请输入作者名称'
        }]).then((answers)=>{
            console.log(answers)
            const packagePath = `${desc}/package.json`
            const packageContent = fs.readFileSync(packagePath,'utf8')
            const packageResult =  handlebars.compile(packageContent)(answers)
            fs.writeFileSync(packagePath,packageResult)
        })

4.添加功能

思路:将模板文件读取,写入对应项目的文件中,使用runjs运行命令

run(`npm install`,{cwd:`${resolve('./')}/${desc}`})
run(`npm run lint:fix`,{cwd:`${resolve('./')}/${desc}`})
run(`npm run dev`,{cwd:`${resolve('./')}/${desc}`})
                  

读写文件流common.js

const {promisify} = require('util')
const fs = require('fs')
const {resolve} = require('path')
const path = require('path')

/**
 * 读取文件信息
 * @param path 文件路径
 * @returns {Promise<unknown>}
 */
function fscreateReadStream(path) {
    return new Promise((resolve, reject) => {
        const stream = fs.createReadStream(path,{encoding:"utf-8"})
        stream.on("data",chunk=>{
            resolve(chunk)
        })
    })
}

/**
 * 写入文件信息
 * @param path 文件路径
 * @param fileName  文件名
 * @param chunk  写入文件
 * @returns {Promise<unknown>}
 */
async function fscreateWriteStream(path,fileName,chunk) {
    await dirExists(path);
    return new Promise((resolve, reject) => {
        let ws=fs.createWriteStream(path+'/'+fileName,{
        });
        ws.write(chunk,err=>{
            resolve(err)
        });
    })
}

/**
 * 读取路径信息
 * @param {string} path 路径
 */
function getStat(path){
    return new Promise((resolve, reject) => {
        fs.stat(path, (err, stats) => {
            if(err){
                resolve(false);
            }else{
                resolve(stats);
            }
        })
    })
}

/**
 * 创建路径
 * @param {string} dir 路径
 */
function mkdir(dir){
    return new Promise((resolve, reject) => {
        fs.mkdir(dir, err => {
            if(err){
                resolve(false);
            }else{
                resolve(true);
            }
        })
    })
}

/**
 * 路径是否存在,不存在则创建
 * @param {string} dir 路径
 */
async function dirExists(dir){
    let isExists = await getStat(dir);
    //如果该路径且不是文件,返回true
    if(isExists && isExists.isDirectory()){
        return true;
    }else if(isExists){     //如果该路径存在但是文件,返回false
        return false;
    }
    //如果该路径不存在
    let tempDir = path.parse(dir).dir;      //拿到上级路径
    //递归判断,如果上级目录也不存在,则会代码会在此处继续循环执行,直到目录存在
    let status = await dirExists(tempDir);
    let mkdirStatus;
    if(status){
        mkdirStatus = await mkdir(dir);
    }
    return mkdirStatus;
}

module.exports = {
    fscreateReadStream,
    fscreateWriteStream
}

注意:如果是插入文件,那需要配置插入位置的标记

5 发布npm

1、进入npmjs.com官网
2、注册npm账号
3、在npm检索是否有重命名的包名
4、将package.json中的name修改为发布的npm上的包名。与项目名称无关
5、npm login (需要在npmjs的源上)
6、npm publish
7、npm unlink 去掉本地连接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容