资讯专栏INFORMATION COLUMN

从零开始写一个npm包,一键生成react组件(偷懒==提高效率)

Labradors / 3205人阅读

摘要:后言有了我们可以做很多很多的事情以后开发新模块的时候就可以偷懒了纯手打给个赞可好模版

前言

最近写项目开发新模块的时候,每次写新模块的时候需要创建一个组件的时候(包含组件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 ")
       .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 

代码正常运行,接下来修改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 ")
  .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 {
                    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://www.ucloud.cn/yun/96793.html

相关文章

  • 从0开始使用webpack搭建react工作流

    摘要:另外一方面,即使不是想搭建自己的工作流,而是使用现成的脚手架,大家都会用。显然,彻底掌握如何从零开始搭建一个能够贴近实际项目的工作流,是一个想要满足工作最基本要求的人必备的技能。 很多人想搭建一套属于自己的前端工作流,最开始的时候我们的工作流萌芽是从写一个项目的时候,拷贝以前写过的一个项目文件夹改完直接使用开始的,后来使用了grunt和gulp,再到webpack,每一个前端人员想掌握...

    bingchen 评论0 收藏0
  • Vue.js最佳实践(五招让你成为Vue.js大师)

    摘要:但如果你想更加高效地使用来开发,成为大师,那下面我要传授的这五招你一定得认真学习一下了。虽然损失了一丢丢性能,但避免了无限的。所以我们需要设置,这些默认行为将会被去掉以上两点的优化才能成功。陆续可能还会更新一些别的招数,敬请期待。 本文面向对象是有一定Vue.js编程经验的开发者。如果有人需要Vue.js入门系列的文章可以在评论区告诉我,有空就给你们写。 对大部分人来说,掌握Vue.j...

    CocoaChina 评论0 收藏0
  • 从零开始搭建一个React项目

    摘要:优化代码拆分从入口文件开始,递归地构建了整个应用的模块依赖图表,然后通常会将所有的模块打包成一个。 如果你还不知道什么是React,请点击这里github源码 安装Node.js 如果你还不知道什么是ECMAScript,请点击这里 如果你还不知道什么是Node.js,请点击这里 下载Node.js并安装;接着打开windows命令行窗口分别输入node -v及npm -v如下图所示,...

    HollisChuang 评论0 收藏0
  • 通过create-react-app从零搭建react环境

    摘要:通过文件可以对图标名称等信息进行配置。注意,注册的只在生产环境中生效,并且该功能只有在下才能有效果该文件是过滤文件配置该文件是描述文件定义了项目所需要的各种模块,以及项目的配置信息比如名称版本许可证等元数据。 一、 快速开始: 全局安装脚手架: $ npm install -g create-react-app 通过脚手架搭建项目: $ create-react-app 开始项目: ...

    Cympros 评论0 收藏0
  • 通过create-react-app从零搭建react环境

    摘要:通过文件可以对图标名称等信息进行配置。注意,注册的只在生产环境中生效,并且该功能只有在下才能有效果该文件是过滤文件配置该文件是描述文件定义了项目所需要的各种模块,以及项目的配置信息比如名称版本许可证等元数据。 一、 快速开始: 全局安装脚手架: $ npm install -g create-react-app 通过脚手架搭建项目: $ create-react-app 开始项目: ...

    CoyPan 评论0 收藏0

发表评论

0条评论

Labradors

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<