如何手写一个react项目生成工具,并发布到npm官网

摘要:
/usr/bin/envnodeconstfs=require('fs');Dst){letpaths=fs.readdirSync(src);//同步读取当前目录路径。forEach(asyncfunction(path){const_src=src+'/'+路径;const_Dst=Dst+'/'+路径;

前言

  • 基于前面自己手动搭建的React项目,我把项目分成了四种,一种什么都不带的空项目,一种带多级路由的空项目,一种带状态管理的空项目,一种带多级路由以及状态管理的空项目。这样的话每次用的时候根据需要去获取自己想要的模板,但是往往还要去github上去拷贝,感觉很不方便,所以就想到了要做一个自动生成对应的空项目的cli工具。

准备工作

  • 文件目录结构

根路径

bin

index.js

template

base项目模板
route项目模板
redux项目模板
route-redux项目模板

.gitignore
.npmignore
README.md

  • 项目模板没啥好讲的,都是之前的博客里写过了如何去手动搭建一个React项目,有兴趣的可以去看看之前的博客。这里主要看一下如何去编写这个cli工具。

原理

  • package.json文件中配置了bin的属性时,就会出现类似命令行工具的东西,当你安装过后系统会自动运行你的bin对应的文件。

步骤

  1. package.json中添加一个bin属性,指向./bin/index.js
{
    ...
    "bin": "./bin/index.js"
    ...
}
  1. 编写bin/index.js文件。第一行的注释一定要写,这个指明了你这个bin文件需要通过什么环境去执行,通常情况下,我们是通过node来执行我们的js文件的。
#! /usr/bin/env node
const fs = require('fs');
const path = require('path');

// 当你的bin被执行时,process前面的两个参数一定是node,bin/index.js这个两个参数,所以模板的参数如果传递了就是第三个参数。
const list = process.argv;
const type = list[2] || 'base';
const p = path.resolve(__dirname, `../template/${type}`); // 获取到相对应的模板路径

// 遍历文件夹下的所有目录,如果是文件夹继续走对比文件夹的方法,如果是文件就直接copy
const copy = function (src, dst) {
  let paths = fs.readdirSync(src); //同步读取当前目录
  paths.forEach(async function (path) {
    const _src = src + '/' + path;
    const _dst = dst + '/' + path;
    await fs.stat(_src, async function (err, stats) { //stats 该对象 包含文件属性
      if (err) throw err;
      if (stats.isFile()) { //如果是个文件则拷贝
        let readable = fs.createReadStream(_src);//创建读取流
        let writable = fs.createWriteStream(_dst);//创建写入流
        await readable.pipe(writable);
        console.log(`${path} 写入完成`)
      } else if (stats.isDirectory() && path !=='node_modules') { //是目录则 递归
        await checkDirectory(_src, _dst, copy);
      }
    });
  });
}

// 检查文件夹,当目标地址不存在文件夹时,为目标文件夹生成一个新的文件夹
const checkDirectory = function (src, dst, callback) {
  fs.access(dst, fs.constants.F_OK, async (err) => {
    if (err) {
      await fs.mkdirSync(dst);
      callback(src, dst);
    } else {
      callback(src, dst);
    }
  });
};


function consoleCommon() {
    console.log('暂时没有该类型的模板');
    console.log('当前支持模板如下');
    console.log('base: 基本的空项目');
    console.log('route: 带router的空项目');
    console.log('redux: 带redux的空项目');
    console.log('route-redux: 带redux和router的空项目');
}

fs.stat(p, (err, stats) => {
  if (err) {
    consoleCommon();
    return;
  }
  if (stats.isDirectory()) {
    checkDirectory(p, './', copy);
  } else {
    consoleCommon();
  }
})
  1. 测试
  • 由于不能保证自己写的bin一定没有问题,所以必要的测试时不可少的,当你实现了cli的逻辑之后,可以在当前项目路径下,直接npm install . -g,这样就会将本地的cli安装到全局。然后找一个空的文件夹,在里面去执行该cli命令,如果结果符合你的期望,那么恭喜你,你的cli工具基本就大功告成了。
  1. 发布
  • 接下来就是发布npm包这个操作了,首先在自己的node环境下去登录自己的npm账号,没有就去注册一个,然后记得把仓库切换回npm官方仓库,如果仓库地址是镜像地址,会不能发布成功的。再在项目目录下执行npm publish命令,就可以发布了,每次更新发布时,一定要记得改项目的版本号,不然就会发布不通过。

小结

  • 看过别人有一种去链接线上项目地址然后下载拷贝的实现思路,但是感觉cli工具如果能安装过后能不依赖网络去生成空的项目可能体验会更好一点,毕竟大多时候都是链接的github的地址,一旦这个网站抽筋,就下载的很慢,急死人。相对应的缺点就是这个cli工具如果出现了线上模板的更新,就需要同步去更新cli的版本才可以获取最新的包。有利就有弊吧我感觉,完全看个人喜好。
  • 我这个工具的包地址是:https://www.npmjs.com/package/create-react-auto,安装命令:npm i create-react-auto -g
  • 项目代码地址:https://github.com/810307015/react-demo-cli
  • 有兴趣的可以支持支持

免责声明:文章转载自《如何手写一个react项目生成工具,并发布到npm官网》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Python数据可视化--matplotlib802.1帧格式、帧类型详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

借助Proxifier实现内网访问

实验室中有一台电脑可以通过公网ip进行ssh登录,因为服务器只将ssh端口暴露出来所以无法通过ss等需要开放其他端口的方式来构建代理服务器, 本文将利用ssh隧道建立的代理服务器,无需其他软件上的配置,将内网访问请求通过代理服务器进行转发。 Requirements Proxifier Win/Mac 内网中拥有公网ip的服务器账号 原理 利用ss...

文档格式转换:mobi、epub、pdf、word互转

一、在线转换 1、进入网站:http://cn.epubee.com/ 2、选择需要转换的文档格式   3、点击Browse File上传文件  4、点击download下载 二、利用工具转换 1、工具名称: Neat Converter(官网链接:https://www.neat-reader.cn/downloads/converter) 2、作...

前端嵌入视频直播和聊天支持.m3u8格式

1、安装vue-video-player npm install vue-video-player --save 2、在main.js中引入vue-video-player import VideoPlayer from 'vue-video-player' require('video.js/dist/video-js.css') require('vu...

django项目搭建及Session使用

django+session+中间件 一、使用命令行创建django项目 在指定路径下创建django项目 django-admin startproject djangocommon   在项目目录下  创建app cd djangocommon python manage.py startapp commoncore(django-admin sta...

【IDEA】项目中引入Spring MVC

一、原文说明: IntelliJ idea创建Spring MVC的Maven项目 - winner_0715 - 博客园 https://images2015.cnblogs.com/blog/824490/201703/824490-20170305211140532-283571118.png 注:自己的实操源码全在 https://github.c...

通过配置tomcat在浏览器访问非项目中的文件

    本人做接口项目时遇到的问题,当我把业务数据通过接口上传给对方后,对方会异步一个反馈数据。 反馈是一个html的静态文件,我可以通过些文件查看上传数据情况,为了查询方便,决定做个查询功能来访问 但我不可能把这么多的反馈文件放到自已的项目目录下,只能放在某个磁盘里,但tomcat是访问不到的,我设了快捷文件夹到我项目中还是没用。     最后在serv...