从零开始写一个npm包,一键生成react组件(偷懒==提高效率)
前言
最近写项目开发新模块的时候,每次写新模块的时候需要创建一个组件的时候(包含组件css,index.js,组件js),就只能会拷贝其他组件修改名称 ,但是写了1-2个后发现效率太低了,而且极容易出错,所以自己写一个npm包来减少工作量,下面就一步一步来创建一个属于自己的npm仓库
首先第一步创建一个package.json
文件,打开终端,输入以下命令:
npm init
然后会依次提示项目名称、版本、项目描述、入口文件...一直回车,直到出现Is this ok? (yes)
,然后输入yes
,创建一个package.json
文件就完成了,接下来在根目录创建一个index.js
文件,文件内容为:
#!/usr/bin/env node //告诉node使用终端运行
const fs = require('fs'); //文件系统
const program = require('commander'); //终端输入处理框架
const package = require('./package.json'); //获取版本信息
program.version(package.version, '-v,--version')
.command('init <name>')
.action(name=>{
console.log(name)
})
program.parse(process.argv);
安装commander:
cnpm i -d commander
接下来我们就可以看看效果,安装执行
node index.js -v
输出:1.0.0
node index.js init header
输出:header
node index.js -h
输出: Usage: index [options] [command]
Options:
-v,--version output the version number
-h, --help output usage information
Commands:
init <name>
代码正常运行,接下来修改package.json
里面bin
,增加以下代码:
"bin": {
"temp": "index.js"
},
到这里我们第一步就算完成了,怎么发布npm包呢?流程如下:
- 首先在
[npm官网][1]
中注册账号(如有忽略) - 注册完执行
npm adduser
依次输入帐号,密码,邮箱, npm version patch
npm publish
就可以提交了
npm发布流程踩过的坑
- 使用npm提交,不要使用cnpm
- 每次修改都需要修改版本号
npm version patch
- 项目名称 npm仓库是否有这个项目
发布成功后,我们全局安装,刚刚我提交的项目名称为template-react-cli
,所以执行全局安装,使用npm安装,cnpm会有短暂延迟
npm i template-react-cli -g
temp -v
输出:1.0.0
temp init footer
输出: footer
属于我们的npm可以正常使用了,接下来丰富我们的npm包,先安装依赖:
cnpm i -d download-git-repo handlebars inquirer log-symbols ora
安装完成后,丰富我们的功能index.js
文件如下:
#!/usr/bin/env node
const fs = require('fs');
const program = require('commander');
const download = require('download-git-repo'); //下载模版文件
const chalk = require('chalk'); //美化终端
const symbols = require('log-symbols'); //美化终端
const handlebars = require('handlebars'); //修改模版文件内容
const ora = require('ora'); //提示下载
var inquirer = require('inquirer'); //提示文本
const package = require('./../package.json'); //获取版本信息
const re = new RegExp("^[a-zA-Z]+$"); //检查文件名是否是英文,只支持英文
program
.version(package.version, '-v,--version')
.command('init <name>')
.action(name => {
if (!re.test(name)) { //检查文件名是否是英文
console.log(symbols.error, chalk.red('错误!请输入英文名称'));
return
}
if (!fs.existsSync(name)) { //检查项目中是否有该文件
inquirer
.prompt([
{
type: 'list',
name: 'type',
message: '请选择模版类型?',
choices: [
'react-component------ES6组件',
'react-function------函数组件',
'react-redux------ES6组件',
],
},
])
.then(answers => {
//用户选择后回调
console.log(symbols.success,chalk.green('开始创建..........,请稍候'));
const spinner = ora('正在下载模板...');
spinner.start();
const type = getType(answers)
download(`github:NewPrototype/template/#${type}`, name, err => {
if (err) {
spinner.fail();
} else {
spinner.succeed();
var files = fs.readdirSync(name);
for(let i=0;i<files.length;i++){ //修改文件内容
let fileName=`${name}/${files[i]}`;
if(fs.existsSync(`${name}/${files[i]}`)){
const content = fs.readFileSync(fileName).toString();
const result = handlebars.compile(content)({template:name,});
fs.writeFileSync(fileName, result);
}
}
let count = 0; //所有文件标题修改完成,提示
for (let i = 0; i < files.length; i++) {
if(files[i]=='index.js'||files[i]=='action.js'||files[i]=='reducer.js'||files[i]=='saga.js'){
continue
}
//获取文件列表
var index = files[i].indexOf('.');
fs.rename(
`${name}/${files[i]}`,
`${name}/${name}${files[i].substring(index)}`,
err => {
if (err) {
console.log('---错误');
}
count++;
if (count+1 == files.length) { //排除index.js文件
console.log(symbols.success, chalk.green('模版创建成功'));
}
}
);
}
}
});
});
} else {
console.log(symbols.error, chalk.red('有相同名称模版'));
}
});
program.parse(process.argv);
const getType = (type) => {
let str = 'master';
switch (type.type) {
case "react-component------ES6组件":
str = "component"
break;
case "react-function------函数组件":
str = "master"
break;
case "react-redux------ES6组件":
str = "redux"
break;
default:
break;
}
return str
}
然后重新提交文件到npm仓库,方法和上面发布流程一样,发布完成后:
npm i template-react-cli -g
先检查版本号
temp -v
输出:1.02
然后检查功能:
temp init header
输出:? 请选择模版类型? (Use arrow keys)
❯ react-component------ES6组件
react-function------函数组件
react-redux------ES6组件
选择想要的选项,回车
输出:✔ 开始创建..........,请稍候
⠏ 正在下载模板...
等待下载完成
输出:✔ 模版创建成功
可以看到当前目录下面创建了一个header文件夹,里面包含js文件和stylcss文件,到这里整个流程就完成了,这里是下载了模版文件模版地址,大家也可以写出符合自己风格的模版文件。
后言
有了node我们可以做很多很多的事情,以后开发新模块的时候就可以偷懒了!纯手打给个赞可好?
github
https://github.com/NewPrototy...
模版github
https://github.com/NewPrototy...
来源:https://segmentfault.com/a/1190000015957648
从零开始写一个npm包,一键生成react组件(偷懒==提高效率)的更多相关文章
- 从零开始写一个npm包及上传
最近刚好自己需要写公有npm包及上传,虽然百度上资料都能找到,但是都是比较零零碎碎的,个人就来整理下,如何从零开始写一个npm包及上传. 该篇文件只记录一个大概的流程,一些细节没有记录. tips: ...
- webpack创建library及从零开始发布一个npm包
最近公司有个需求,我们部门开发一个平台项目之后,其他兄弟部门开发出的插件我们可以拿来直接用,并且不需要我们再进行打包,只是做静态的文件引入,研究一波后发现,webpack创建library可以实现. ...
- 深入浅出React Native 3: 从零开始写一个Hello World
这是深入浅出React Native的第三篇文章. 1. 环境配置 2. 我的第一个应用 将index.ios.js中的代码全部删掉,为什么要删掉呢?因为我们准备从零开始写一个应用~学习技术最好的方式 ...
- spring boot开发,jar包一个一个来启动太麻烦了,写一个bat文件一键启动
spring boot开发,jar包一个一个来启动太麻烦了,写一个bat文件一键启动 @echo offcd D:\workProject\bushustart cmd /c "title ...
- 一起学习造轮子(二):从零开始写一个Redux
本文是一起学习造轮子系列的第二篇,本篇我们将从零开始写一个小巧完整的Redux,本系列文章将会选取一些前端比较经典的轮子进行源码分析,并且从零开始逐步实现,本系列将会学习Promises/A+,Red ...
- 一起学习造轮子(三):从零开始写一个React-Redux
本文是一起学习造轮子系列的第三篇,本篇我们将从零开始写一个React-Redux,本系列文章将会选取一些前端比较经典的轮子进行源码分析,并且从零开始逐步实现,本系列将会学习Promises/A+,Re ...
- 如何发布一个npm包(基于vue)
前言:工作的时候总是使用别人的npm包,然而我有时心底会好奇自己如何发布一个npm包呢,什么时候自己的包能够被很多人喜欢并使用呢...今天我终于迈出了第一步. 前提:会使用 npm,有 vue 基础, ...
- 从零开始写一个武侠冒险游戏-0-开发框架Codea简介
从零开始写一个武侠冒险游戏-0-开发框架Codea简介 作者:FreeBlues 修订记录 2016.06.21 初稿完成. 2016.08.03 增加对 XCode 项目文件的说明. 概述 本游戏全 ...
- 从0到1发布一个npm包
从0到1发布一个npm包 author: @TiffanysBear 最近在项目业务中有遇到一些问题,一些通用的方法或者封装的模块在PC.WAP甚至是APP中都需要使用,但是对于业务的PC.WAP.A ...
随机推荐
- FPFH+ICP点云配准
A, UniformSampling降噪 B, ISS计算关键点, FPFH特征 在FeatureCloud::setInputCloud中读入点云,并调用processInput进行处理: proc ...
- 11.Hibernate一对多关系
创建JavaBean 一方: Customer private long cust_id; private String cust_name; private long cust_user_id; p ...
- linux 显示ip地址小工具-nali
1.下载软件包 wget http://qqwry.googlecode.com/files/nali-0.1.tar.gz 2.安装 tar -zxvf nali-0.2.tar.gz cd nal ...
- [欧拉路]CF1152E Neko and Flashback
1152E - Neko and Flashback 题意:对于长为n的序列c和长为n - 1的排列p,我们可以按照如下方法得到长为n - 1的序列a,b,a',b'. ai = min(ci, ci ...
- 洛谷P2333 [SCOI2006]一孔之见
传送门 辣鸡题目毁我人生败我前程 50分代码 //Achen #include<algorithm> #include<iostream> #include<cstrin ...
- Joomla - akeeba backup(joomla网站备份、迁移扩展)
在所有 joomla 的网站中,如果只允许安装一个扩展,估计超过90%的人都会选择 akeeba backup,这基本是每个joomla都必备的一个扩展: akeeba backup 的更多资料可以到 ...
- 原声js实现nodejs中qs模块中的parse和stringfiy方法
function stringify(obj, sep, eq) { sep = sep || '&'; eq = eq || '='; let str = ""; for ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi2007代码---单例模式之ChocolateBoiler[转]
1 2{<HeadFirst设计模式>之单例模式 } 3{ 编译工具: Delphi2007 for win32 } 4{ E-Mail : guzh-0417@163.com ...
- 事务一致性理解 事务ACID特性的完全解答
A 原子性 事务管理者多个小操作,他们同时完成或者同时不完成就是原子性 C 一致性 一致性,是一个很相对的,很主观的概念, 一致性 描述的是 事务 从一个一致的状态变成 另一个一致的状态. 一致性需 ...
- 解决maven项目创建过慢的问题
关键就在这里:添加以下键值对 archetypeCataloginternal 之后点击Next,再单击Finish即可.