最近写项目开发新模块的时候,每次写新模块的时候须要建立一个组件的时候(包含组件css,index.js,组件js),就只能会拷贝其余组件修更名称 ,可是写了1-2个后发现效率过低了,并且极容易出错,因此本身写一个npm包来减小工做量,下面就一步一步来建立一个属于本身的npm仓库css
首先第一步建立一个package.json
文件,打开终端,输入如下命令:node
npm init
而后会依次提示项目名称、版本、项目描述、入口文件...一直回车,直到出现Is this ok? (yes)
,而后输入yes
,建立一个package.json
文件就完成了,接下来在根目录建立一个index.js
文件,文件内容为:react
#!/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:git
cnpm i -d commander
接下来咱们就能够看看效果,安装执行github
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
,增长如下代码:npm
"bin": { "temp": "index.js" },
到这里咱们第一步就算完成了,怎么发布npm包呢?流程以下:json
[npm官网][1]
中注册帐号(若有忽略)npm adduser
依次输入账号,密码,邮箱,npm version patch
npm publish
就能够提交了npm发布流程踩过的坑redux
npm version patch
发布成功后,咱们全局安装,刚刚我提交的项目名称为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咱们能够作不少不少的事情,之后开发新模块的时候就能够偷懒了!纯手打给个赞可好?
https://github.com/NewPrototy...