故事背景

身为一个入门前端七个月的小菜鸡,在我入门前端的第一天就接触到了vue,并且死皮赖脸的跟他打了这么久的交到,还记得第一次用vue init webpack 这句命令一下生成一个模板的时候那种心情,当时我就想,要是自己也能写一个的话,那会是灰常吃鸡的吧 o( ̄▽ ̄)ブ,所以说今天我们也要简单实现一个自己的脚手架

认识bin

bin的作用

首先我们先来了解一下这个bin ,这个bin和我们最开始用的vue init webpack 这个命令是息息相关的

还记得我们在最开始安装vue-cli的时候嘛

    npm install vue-cli -g
  • 这条命令的意思是把vue-cli 安装到全局 ,以至于你再任何一个地方打开cmd 的时候都能够使用 vue init webpack

vue init webpack 这条命令实际上是执行的vue-cli 里边 package.json 里边的bin属性下的命令

这个文件大概位置如下

这个路径里边有隐藏的路径,在查找的时候记得打开隐藏目录可见

这个bin里边大概长成这个样子

由图中可见,这里边有三个命令

    vue vue-init  vue-list
  • 这个三个命令的意思是执行对应的文件,Npm会在node_modules/.bin/目录下建立符号链接。又因为node_modules/.bin/目录会在运行时加入系统的PATH变量,因此在运行npm时,就可以不带路径,直接通过命令来调用这些文件。

bin所执行的文件和参数

那么说到这里你肯定会好奇这个文件是怎么做到生成模板的对吧,那么我们就来看一下被执行的这个文件到底是何方神圣

    #!/usr/bin/env node

    const program = require('commander')

    program
.version(require('../package').version)
.usage('<command> [options]')
.command('init', 'generate a new project from a template')
.command('list', 'list available official templates')
.command('build', 'prototype a new project')
.command('create', '(for v3 warning only)') program.parse(process.argv)

上边这一坨代码就是 执行vue init webpack 的文件所有内容

首先最重要的一点就是 第一句 #!/usr/bin/env node

这句代码不可以没有, #! 指明这个脚本文件的解释程序,然后这个/usr/bin/env 是说在系统的PATH目录中查找

这句话整体的意思就是说会有一个新的shell执行指定的脚本,执行这个脚本的解释程序是node

如果不加这句代码的话是会报错的

然后下边这个引入了一个commander 包 这是一个很牛逼的大佬写的一个关于命令行一些操作的包,command 里边的是定义一些子命令,然后后边在跟的参数,这里暂且不深扒了,附上中文文档

commander中文文档

写一个自定义命令

好,那么我们现在了解了bin的基本概念和大致流程,下面我们来写一个自己的命令

首先新建一个文件夹, 在package.json里边加上这么一句代码

 "bin": {
"zjs-cli": "main.js"
},

和新建一个main.js的文件

然后莫慌,我们还需要再执行一个命令就是

npm link

我们之前全局安装的都会默认在npm的node_modules目录下,这个命令可以简单的理解为在npm的node_modules创建了一个快捷方式

到此为止我们得自定义命令算是走通了,接下来我们说一说文件里边得内容

搭建脚手架

脚手架得工作流程

上边我们知道了bin得作用并且,把我们得自定义命令和文件关联了起来,那么脚手架具体是怎么操作的呢,大概步骤如下

  • 进入文件,根据指定的地址和编译器,执行我们的js

  • 从命令行接受参数,执行对应的操作

  • 交互性的询问问题,根据配置选择拉取的模板

  • 从git拉取模板

我们之前用的vue的脚手架大概的流程就是这样的

安装依赖

在进入文件之后,为了能够得到命令行的操作我们就要安装一些依赖了比如说commander的这个包

    npm install commander

然后命令行默认的字体颜色是黑白色的,我们可以引入一些命令行交互的包,不得不说这些写包的大佬是真牛逼,啥都能写

    npm install chalk

vue 有一个 init 子命令 , 那我们也叫init好了

    const cmd = require("commander");
const chalk = require('chalk') cmd.command('init').description('初始化模板').action(async (args) => {
// 。。。
}) cmd.parse(process.argv)
  • 其中command 是添加子命令的

  • description是描述

  • action 是执行这个命令的回调

  • parse 是解析你命令行里边传进来的参数 比如 你写了一个 zjs-cli init demo , 那么这个时候 回调里边的args的值就是demo这个字符串

然后需要注意process上的是argv , 里边用的是args ,这里不是笔误,当时我刚开始玩的时候纳闷了好半天

然后做一些交互,让我们得脚手架看起来更顺溜一些

npm install inquirer

npm install ora

上边这两个分别是加载动画和回答问题得,比如vue在新建模板得时候问你的一些列问题,还有那个下载中等待得loading动画

不要问我怎么能记住这么多得包名字,因为我是看的vue-cli源码认识得。。。。

拉取git

这里单独把拉取git拿出来说,虽所内容不多,但毕竟也是今天的主角 o( ̄▽ ̄)ブ

那么问题来了,怎么下载模板呢?很简单,当然还是npm包。。。。

npm install download-git-repo

这个包是可以从github上边下载包的

比如说我之前写的一个demo他叫zjs-template,那么拉取的路径就是我得git路径加项目名称

let url = 'zhou1591/zjs-template'

// 然后第二个参数是拉取下来后的名称

// 这里我选择用命令行里边传过来的参数做名字

let  name = 'args'

然后根据api拉取模板,关闭

let downGit = (name) => {
downLoad(url, name, {
clone
}, err => {
process.exit(1)
})
}

完整代码如下

// git包
const downLoad = require('download-git-repo')
// 动画
const ora = require('ora') let url = 'zhou1591/zjs-template'
let clone = false
let downGit = (name) => {
const spinner = ora('正在拉取模板...')
spinner.start()
downLoad(url, name, {
clone
}, err => {
spinner.stop()
console.log(err?err:"项目创建成功")
process.exit(1)
}) }
module.exports = downGit

引到main.js里边跑起来就好了,到此为止一个简单的脚手架已经ok了,就差了最后一步

发布脚手架

创建npm账号并发布

我们写完了一个自己的脚手架之后,当然是想迫不及待的体验一番的

首先我们创建一个npm的账号npm官网

之后在我们刚才的项目里边

  • npm login 输入你的账号密码邮箱

  • 然后登陆成功后 npm publish 推送

  • package.json 里边的name 是你的npm包发布的名称

  • keywords 是搜索你的包的关键字

  • description是你的包描述

  • version 是你的版本号

第一次发布npm包可能会遇到的问题

这个是说已经有重复名字的包了 你没有权限去推

这个是说第一次发布的时候 说你需要验证邮箱,在你登陆的最上方

  • 每次发布的时候需要更改你的版本号

  • 还有一个比较重要的npm ERR! no_perms Private mode enable, only admin can publish this module:

这个是说你没有在npm最开始的源上边,你可能切换比如淘宝等等其他的源,当时我就是因为用了公司的源,怎么登陆都登陆不上去,很蛋疼

完美撒花

好了,到这里我们的第一个脚手架就算是完事了, 运行一下

// 全局安装一下
npm install zjs-template -g
// 按照之前的命令
zjs-cli init myDemo

我得zjs-cli的git地址 https://github.com/zhou1591/zjs-cli/

我得zjs-template的git地址 https://github.com/zhou1591/zjs-template

希望我们每一个前端都喜欢前端,都能够在学习中不断充实自己 o( ̄▽ ̄)ブ

下一篇我会简单实现一个vuex , 喜欢的请点个赞吧~

根据vue-cli手摸手实现一个自己的脚手架的更多相关文章

  1. 【转】手摸手,带你用vue撸后台 系列四(vueAdmin 一个极简的后台基础模板)

    前言 做这个 vueAdmin-template 的主要原因是: vue-element-admin 这个项目的初衷是一个vue的管理后台集成方案,把平时用到的一些组件或者经验分享给大家,同时它也在不 ...

  2. 【转】手摸手,带你用vue撸后台 系列二(登录权限篇)

    前言 拖更有点严重,过了半个月才写了第二篇教程.无奈自己是一个业务猿,每天被我司的产品虐的死去活来,之前又病了一下休息了几天,大家见谅. 进入正题,做后台项目区别于做其它的项目,权限验证与安全性是非常 ...

  3. 【转】手摸手,带你用vue撸后台 系列三(实战篇)

    前言 在前面两篇文章中已经把基础工作环境构建完成,也已经把后台核心的登录和权限完成了,现在手摸手,一起进入实操. Element 去年十月份开始用vue做管理后台的时候毫不犹豫的就选择了Elemen, ...

  4. 【转】手摸手,带你用vue撸后台 系列一

    前言 说好的教程终于来了,第一篇文章主要来说一说在开始写业务代码前的一些准备工作吧,但这里不会教你webpack的基础配置,热更新怎么做,webpack速度优化等等,有需求的请自行google. 目录 ...

  5. 手摸手带你理解Vue的Computed原理

    前言 computed 在 Vue 中是很常用的属性配置,它能够随着依赖属性的变化而变化,为我们带来很大便利.那么本文就来带大家全面理解 computed 的内部原理以及工作流程. 在这之前,希望你能 ...

  6. 手摸手带你理解Vue的Watch原理

    前言 watch 是由用户定义的数据监听,当监听的属性发生改变就会触发回调,这项配置在业务中是很常用.在面试时,也是必问知识点,一般会用作和 computed 进行比较. 那么本文就来带大家从源码理解 ...

  7. 【手摸手,带你搭建前后端分离商城系统】01 搭建基本代码框架、生成一个基本API

    [手摸手,带你搭建前后端分离商城系统]01 搭建基本代码框架.生成一个基本API 通过本教程的学习,将带你从零搭建一个商城系统. 当然,这个商城涵盖了很多流行的知识点和技术核心 我可以学习到什么? S ...

  8. 浅谈Java中的Condition条件队列,手摸手带你实现一个阻塞队列!

    条件队列是什么?可能很多人和我一样答不出来,不过今天终于搞清楚了! 什么是条件队列 条件队列:当某个线程调用了wait方法,或者通过Condition对象调用了await相关方法,线程就会进入阻塞状态 ...

  9. 【手摸手,带你搭建前后端分离商城系统】02 VUE-CLI 脚手架生成基本项目,axios配置请求、解决跨域问题

    [手摸手,带你搭建前后端分离商城系统]02 VUE-CLI 脚手架生成基本项目,axios配置请求.解决跨域问题. 回顾一下上一节我们学习到的内容.已经将一个 usm_admin 后台用户 表的基本增 ...

  10. 【手摸手,带你搭建前后端分离商城系统】03 整合Spring Security token 实现方案,完成主业务登录

    [手摸手,带你搭建前后端分离商城系统]03 整合Spring Security token 实现方案,完成主业务登录 上节里面,我们已经将基本的前端 VUE + Element UI 整合到了一起.并 ...

随机推荐

  1. iOS8 新特性

    iOS8新特性主要体现在4方面 1.UIAlertController 对alert&actionSheet的封装 UIAlertController.h 提示框按钮的选择 typedef N ...

  2. visual studio code 应用到.net core 实战

    鉴于visual studio 2019 近期动不动卡顿与切分支后F12等功能失效的问题,开始考虑用visual studio code 代替他,对,你没有看错,就是代替visual studio 这 ...

  3. 2019NC#1

    LINK B Integration 题意: 给定$a_1,a_2,...,a_n$, 计算 $$\frac{1}{π}\int_{0}^{\infty}\frac{1}{\prod\limits_{ ...

  4. 牛客2018多校第五场E-room 最小费用最大流

    题意:有n个寝室,每个寝室4个人,现在在搞搬寝室的活动,告诉你每个寝室之前的人员名单,和之后的人员名单,问最少需要几个人要搬寝室. 思路: 转化为最小费用最大流解决的二分图问题,对每个去年的宿舍,向每 ...

  5. lightoj 1036 - A Refining Company(简单dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1036 题解:设dp[i][j]表示处理到(i,j)点时的最大值然后转移显然是 ...

  6. codeforces 768 D. Jon and Orbs(概率dp)

    题目链接:http://codeforces.com/contest/768/problem/D 题意:一共有k种球,要得到k种不同的球至少一个,q个提问每次提问给出一个数pi,问概率大小大于等于pi ...

  7. 【Offer】[58-1] 【翻转单词顺序】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母样处理.例如输入字符串"I am ...

  8. 使用Idea第一次创建一个Mavne工程时没有src目录

    在使用idea创建一个maven工程时没有src目录,可能出现的问题很多,我先把我自己的问题分享上来 因为没有src,可能是因为maven插件还没下载到本地仓库.maven插件的版本和jdk版本冲突或 ...

  9. (转)为什么HashMap中链表长度超过8会转换成红黑树

    原博地址:https://blog.csdn.net/xingfei_work/article/details/79637878 HashMap在jdk1.8之后引入了红黑树的概念,表示若桶中链表元素 ...

  10. Spring Boot 入门之整合 log4jdbc 篇(六)

    博客地址:http://www.moonxy.com 一.前言 Spring Data JPA 默认采用 Hibernate 实现.Hibernate 的 showSql 配置只打印 SQL,但并不打 ...