前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【React 实战教程】从0到1 构建 github star管理工具

【React 实战教程】从0到1 构建 github star管理工具

作者头像
用户2356368
发布于 2019-04-03 08:06:55
发布于 2019-04-03 08:06:55
1.3K00
代码可运行
举报
文章被收录于专栏:薄荷前端薄荷前端
运行总次数:0
代码可运行

前言

在日常使用github中,除了利用git进行项目版本控制之外,最多的用处就是游览各式的项目,在看到一些有趣或者有用的项目之后,我们通常就会顺手star,目的是日后再看。但是当我们star了许多项目之后,回过头想找一个的项目就会发现,很难在短时间内找到它,官方也并没有提供很好的管理我们的star项目的功能,因此在市面上也出现了一些对star进行管理的工具,比如说 astralapp,Star Order等等,其实github的接口api都是开放的,我们完全可以自己构建一个属于自己的项目管理工具。公司的前端技术栈是React,而笔者之前使用的是Vue,因此正好想利用github的open api 自己构建个react的github star管理项目来加深react的使用。而大体功能我们就模仿astralapp。

github open api

官方文档有v3和v4,2个版本,v3是Restful,v4是GraphQL,在这里我们使用的是v3版

v3

使用的是restful 协议

服务器地址

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://api.github.com
复制代码

在无token情况下使用github的api,每分钟限制是60次请求,考虑到想完整的使用github的api,因此选择构建一个web application,授权OAuth应用程序的流程可以参照官方文档。在这里,就简单的说一下这个流程。

授权OAuth2.0 的流程

github OAuth的授权模式为授权码模式,对OAuth不了解的同学可以具体看阮一峰老师的理解OAuth 2.0

要做的流程主要分为3步

  • 获取code
  • 通过code获取token
  • 在请求时携带token
获取code

首先需要跳转到这个地址

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://github.com/login/oauth/authorize
复制代码

需要有以下参数

参数名

类型

描述

client_id

string

必选 client_id是在注册github application后可以看到

redirect_uri

string

可选 授权成功后跳转的地址,这里的这个跳转地址也可以在后台进行设置

scope

string

可选 权限范围,具体的权限可以参照,具体传值格式以及需要哪些范围可以参照官方文档

allow_signup

string

可选 是否允许为注册的用户注册,默认为true

跳转至目标地址后,会有个授权界面,当用户点击授权之后会重新跳转到我们自己设定的redirect_uri并携带一个code,就像这样

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<redirect_url>?code=1928596028123
复制代码
通过code获取token

在获取code之后,请求用于获取token

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST https://github.com/login/oauth/access_token
复制代码

参数名

类型

描述

client_id

string

必填 client_id是在注册github application后可以看到 必填

client_secret

string

必填 该参数是在同client_id一样,也是在注册application后可以看到

code

string

必填 通过第一步获取

redirect_uri

string

可选

state

string

可选 随机数

token的默认返回格式为字符串

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
access_token=e72e16c7e42f292c6912e7710c838347ae178b4a&token_type=bearer
复制代码

可以通过更改头部接受格式进行返回格式变更

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Accept: application/json
{"access_token":"e72e16c7e42f292c6912e7710c838347ae178b4a", "scope":"repo,gist", "token_type":"bearer"}

Accept: application/xml
<OAuth>
  <token_type>bearer</token_type>
  <scope>repo,gist</scope>
  <access_token>e72e16c7e42f292c6912e7710c838347ae178b4a</access_token>
</OAuth>
复制代码
在请求时携带token

携带token有2种方式 一种是永远跟在url的后面作为params

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET https://api.github.com/user?access_token=...
复制代码

另外一种是放在请求头中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Authorization: token 获取到的token
复制代码

接口请求

在项目里运用到的github 接口 目前有三个

  • 用户信息接口
  • 当前用户star的项目
  • 获取项目Readme接口

需要注意的是这些接口由于服务端实现了CORS,因此是不存在跨域问题,但是,考虑到本身这个项目的功能情况,之后我们会自己建立服务端进行请求。

用户信息接口
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET https://api.github.com/user
复制代码
当前用户star的项目
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET https://api.github.com/user/starred
复制代码

可选的请求参数

参数名

类型

描述

page

string

sort

string

排序条件 有2种created updated,默认为created

direction

string

升序还是倒序 asc desc,默认为``desc

获取仓库Readme接口
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET https://api.github.com/repos/:username/:repo/readme
复制代码

针对一些文件接口,github提供了头部类型的选择,可以返回不同的文件类型,比如raw等,具体可以参考官方文档中的Custom media types

在这里我们需要的是html格式,因此 我们在头部当中设置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"Accept": "application/vnd.github.v3.html"
复制代码

这样ReadMe返回的是html代码,我们根据html代码直接显示即可。

目录结构

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
├── config  // webpack相关文件
├── public  // 公用文件
├── scripts // 脚本文件 build,start,test文件都在里面
├── src
    ├── assets  // 自己放置的资源文件
    ├── components  // 公用组件
    ├── pages   // 页面文件
    ├── utils   // 公用方法文
    App.css
    App.scss
    App.jsx
    index.css
    index.js
    logo.svg    
    reset.css   // 重置样式
    variable.css
    variable.scss   // 公用变量文件
├── package.json
├── .editorconfig   // 编辑器配置
├── .gitignore // git 忽略文件
复制代码

构建

create-react-app

构建React项目首先第一个想到的是用脚手架工具,Vue当中有Vue-cli,自带webpack,vue-router,vuex,而React对应的是create-react-app

当我们初始化完成项目之后,我们会发现webpack的配置文件找不到,我们需要运行以下命令将wepack配置显示出来

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm run eject
复制代码

scss

这个方法参照的是create-react-app中的说明adding-a-css-preprocessor-sass-less-etc

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install --save node-sass-chokidar
复制代码

还需要装 webpack watch

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   "scripts": {
+    "build-css": "node-sass-chokidar src/ -o src/",
+    "watch-css": "npm run build-css && node-sass-chokidar src/ -o src/ --watch --recursive",
     "start": "react-scripts start",
     "build": "react-scripts build",
     "test": "react-scripts test --env=jsdom",
复制代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install --save npm-run-all
复制代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 "scripts": {
     "build-css": "node-sass-chokidar src/ -o src/",
     "watch-css": "npm run build-css && node-sass-chokidar src/ -o src/ --watch --recursive",
-    "start": "react-scripts start",
-    "build": "react-scripts build",
+    "start-js": "react-scripts start",
+    "start": "npm-run-all -p watch-css start-js",
+    "build-js": "react-scripts build",
+    "build": "npm-run-all build-css build-js",
     "test": "react-scripts test --env=jsdom",
     "eject": "react-scripts eject"
   }
复制代码

安装好这些包之后,新建一个scss文件会自动生成css文件,我们在引用时直接引用css文件即可。

另外一种方法是参照medium的一篇文章CSS Modules & Sass in Create React App

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm i sass-loader node-sass --save or yarn add sass-loader node-sass
复制代码

随后更改webpack.config.dev.js文件的配置

需要注意的是loadersuse代替,随后在file-loader增加scss文件格式的匹配

跨域问题

跨域问题可以使用webpack自带的proxy进行配置,或者通过ngix进行代理

如果是webpack配置需要在package.json当中进行配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"proxy": {
    "/user": {
      "target": "https://api.github.com",
      "changeOrigin": true
    },
    "/user/star": {
      "target": "https://api.github.com",
      "changeOrigin": true
    },
    "/login": {
      "target": "https://github.com",
      "changeOrigin": true
    }
}
复制代码

svg

目前使用了svg-react-loader

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 /* eslint-disable */
 // 主要是这里 eslint会报错
import Refresh from '-!svg-react-loader!../../assets/img/refresh.svg';
/* eslint-enable */

class StarFilter extends Component {
  constructor(props) {
    super(props);
require.resolve('svg-react-loader');
    this.state = {
    };
  }

  componentDidMount() {
  }

  render() {
    return (
      <div className="star-filter">
        <div className="title-container">
          <h3 class="title-gray-dark">STARS</h3>
          <!--这样就可以使用了-->
          <Refresh className="icon-refresh text-grey" />
        </div>
      </div>
    );
  }
}

export default StarFilter;

复制代码
颜色

改变颜色要使用fill属性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.icon-refresh {
  width: 20px;
  height: 20px;
  fill: #606f7b;
}
复制代码
注意
  • 图片中自带的p-id元素在react中会自动变成pId,随后会被react输出警告日志,建议把pid 属性删除,这个属性不影响显示
  • 我们经常在iconfont上下载svg图片,但是有些svg图片内部默认设置了颜色,如果要让我们样式当中的颜色起作用,建议在下载完svg后,检查下默认的fill属性是否存在,如果有请先删除

引用本地图片

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import NoSelectedImg from '../../assets/img/not-selected.svg';

class ResInfo extends Component {
 // ..此处省略
  render() {
    <img
      alt="no-selected"
      src={NoSelectedImg}
      className="img-no-selected"
    />

  }
}

export default ResInfo;
复制代码

第二种方法是用require

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<img src={require('../../assets/img/status-spinner.svg')} alt="fetch" width="16" height="16"/>
复制代码

需要注意的是如果是要在img标签中使用svg图片,还需要在webpack当中进行配置,在webpack.config.dev.jswebpack.config.prod.js当中大致在133行左右的urlLoader增加svg文件的匹配

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    test: [/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/, /\.svg$/],
    loader: require.resolve('url-loader'),
    options: {
    limit: 10000,
    name: 'static/media/[name].[hash:8].[ext]',
}
复制代码

路由

使用react-router-dom进行路由的管理,和Vue-router一样,需要对要用到的路由级别组件进行注册。直接将组件写在router内部即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
render() {
    return (
      <div className="App">
        <BrowserRouter basename="/">
          <div>
            <Route exact path="/" component={Auth} />
            <Route path="/auth" component={Auth} />
            <Route path="/star" component={Star} />
          </div>
        </BrowserRouter>
      </div>
    )
  }
复制代码

Router中有BrowserRouter,HashRouter等,而这2种类似于Vue-router中的historyhash模式,需要注意的是,在我们这个项目当中必须使用BrowserRouter,如果使用HashRouter在github 授权重定向回我们页面时会出现问题。会出现code不在尾部的问题。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { Redirect } from 'react-router-dom'

class Auth extends Component {

 //省略...

  render() {
    // 如果isTokenError为true直接跳转至首页
    if (this.state.isTokenError) {
      return (
        <Redirect to="/"/>
      )
    }
    // 如果hasCode有值则跳转至star
    if (this.state.hasCode) {
      return (
        <Redirect to="/star" />
      )
    }
    return (
      <div className="Auth">
        <Button className="btn-auth" onClick={this.onClickAuth}>
          点击授权
        </Button>
      </div>
    )
  }
}

export default Auth

复制代码

同时它也支持api的跳转,当组件放置在router中,组件props内置会有一个histroy属性,即this.props.history,使用它就可以实现push,replace等跳转了功能了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  /**
   * 返回首页
   */
  go2home() {
    this.props.history.replace('/auth');
  }

  /**
   * 前往star界面
   */
  go2star() {
    this.props.history.push('/star');
  } 
复制代码

总结

我们大致了解了项目的概况,在开发项目的过程当中,官方文档是十分重要的,包括githubApi的使用,SCSS的使用,跨域问题等等,都能从官方文档当中得到解答。同时github提供的api也是十分丰富的,基本囊括了所有github的基础功能,在上述文章当中只是展示了它极少的功能,更多的功能大家可以自己来发掘。在接下来的文章当中,会为大家带来服务端开发篇,使用node进行服务端,数据库的一些操作。项目地址可以点我,项目还在初期开发中,就不要来star了=.=。

参考

广而告之

本文发布于薄荷前端周刊,欢迎Watch & Star ★,转载请注明出处。

欢迎讨论,点个赞再走吧 。◕‿◕。 ~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年11月09日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【React 实战教程】从0到1 构建 github star管理工具
在日常使用github中,除了利用git进行项目版本控制之外,最多的用处就是游览各式的项目,在看到一些有趣或者有用的项目之后,我们通常就会顺手star,目的是日后再看。但是当我们star了许多项目之后,回过头想找一个的项目就会发现,很难在短时间内找到它,官方也并没有提供很好的管理我们的star项目的功能,因此在市面上也出现了一些对star进行管理的工具,比如说 astralapp,Star Order等等,其实github的接口api都是开放的,我们完全可以自己构建一个属于自己的项目管理工具。公司的前端技术栈是React,而笔者之前使用的是Vue,因此正好想利用github的open api 自己构建个react的github star管理项目来加深react的使用。而大体功能我们就模仿astralapp。
用户2356368
2024/01/28
2320
【React 实战教程】从0到1 构建 github star管理工具
create-react-app入门教程
Create React App是FaceBook的React团队官方出的一个构建React单页面应用的脚手架工具。它本身集成了Webpack,并配置了一系列内置的loader和默认的npm的脚本,可以很轻松的实现零配置就可以快速开发React的应用。
老马
2019/05/25
2.5K0
【react】开发一款城市选择组件
想到做这个,是因为无意中在github上看到了这一个仓库https://github.com/lunlunshiwo/ChooseCity,做的就是一个城市选择控件,是用vue写的,说的是阿里的一道题
糊糊糊糊糊了
2018/07/04
4K0
在create-react-app中使用sass
不管你是刚使用Reactjs或者是Reactjs的老司机,你们一定都听说过create-react-app这个脚手架,而从create-react-app的官方文档中,我们可以看到他们暂时还不支持直接导入LESS或者Sass。但是通过一些配置,我们还是可以从官方脚手架中使用sass/scss/less的。
Originalee
2018/08/30
3K0
01-React搭建react环境及SCSS的配置
零、前言 关于React不做自我介绍了。 create-react-app 快速搭建React环境,自带热加载,服务器。 电脑与手机在同一wifi下可以通过ip访问项目,实现手机电脑同时预览
张风捷特烈
2018/09/29
2.3K0
01-React搭建react环境及SCSS的配置
使用 webpack 4 和 Babel 7 构建 React 应用及如何引入 Material Design
在过去的一年和一些人中,我一直在与 Creative Tim 合作。 我一直在使用 create-react-app 来开发一些不错的产品。 有很多客户询问如何在 Webpack 上迁移我们的产品模板。
前端小智@大迁世界
2019/03/15
9.6K0
使用 webpack 4 和 Babel 7 构建 React 应用及如何引入 Material Design
React环境创建
世间万物皆对象
2024/03/20
1280
如何用 esbuild 替换 Create React App 中的 Webpack
原文链接:https://devtails.xyz/how-to-replace-webpack-in-create-react-app-with-esbuild[1]
chuckQu
2022/08/19
2.9K0
如何用 esbuild 替换 Create React App 中的 Webpack
从零开始react实战:云书签-1 react环境搭建
本篇是实战系列的第一篇,主要是搭建 react 开发环境,在create-react-app的基础上加上如下功能:
用户2038589
2019/08/01
3.6K2
从零开始react实战:云书签-1 react环境搭建
webpack教程:如何从头开始设置 webpack 5
最近开源了一个 Vue 组件,还不够完善,欢迎大家来一起完善它,也希望大家能给个 star 支持一下,谢谢各位了。
前端小智@大迁世界
2020/11/24
2.4K0
webpack教程:如何从头开始设置 webpack 5
写给前端新人:从 0到1 搭建一个前端项目,都需要做什么?
本案例使用脚手架 create-react-app 初始化了项目。此脚手架有利有弊吧,项目目录结构简洁,不需要太关心 webpack 令人头疼的配置;弊端在于,脚手架确实有些庞大,构建时间在 4mins 左右。各位看官择优选择吧,也可以完全自己搭建一个项目。
zz_jesse
2021/06/01
5.3K0
创建 React 应用的 7 种方式,你用过几种?
首先,我们第一个是想到的是 react 官方团队提供的脚手架工具 Create React App(cra)
狂奔滴小马
2023/03/16
7.7K0
创建 React 应用的 7 种方式,你用过几种?
React.js基础知识总结一
React是FaceBook(脸书)公司研发的一款JS框架(MVC) React是一款框架:具备自己开发的独立思想(MVC:Model View Controller) -> 划分组件开发 -> 基于路由的SPA单页面开发 -> 基于ES6来编写代码(最后部署上线的时候,我们需要把ES6编译成ES5 =>基于Babel来完成编译) -> 可能用到Less/Sass等,我们也需要使用对应的插件把他们进行预编译 -> 最后为了优化性能(减少HTTP请求次数),我们需要把JS或者CSS进行合并压缩 -> webpack来完成以上页面组件合并、JS/CSS编译加合并等工作
用户6379025
2022/12/26
2K0
React.js基础知识总结一
【腾讯云 Cloud Studio实战训练营】深入解析CloudStudio—React 快速构建点餐页面
颜淡慕潇
2023/07/28
5320
【腾讯云 Cloud Studio实战训练营】深入解析CloudStudio—React 快速构建点餐页面
都 2022 年了,手动搭建 React 开发环境很难吗?
作为一名前端工程师,总是用一些脚手架来快速搭建新项目的基本结构,因此今天尝试着一步步搭建一个 React 的项目环境,看看需要处理哪些问题,查漏补缺!
小东同学
2022/07/29
4.8K0
都 2022 年了,手动搭建 React 开发环境很难吗?
kiali-ui的自定义UI开发
能搜到这篇文章的都是知道kiali是干啥的,所以我就不过多介绍了。想了解自己去百度吧。我懒得打字。
拿我格子衫来
2022/01/24
5050
kiali-ui的自定义UI开发
webpack + react + ts + semiDesign +electron
yarn add -D webpack webpack-cli 或者npm install -D webpack webpack-cli
用户4793865
2023/01/12
2.2K0
webpack + react + ts + semiDesign +electron
基于qiankun微前端实战 + 部署笔记
因业务需要,以下文字纯个人qiankun实战学习笔记,不谈原理只记操作过程,内容难免有纰漏部分,敬请不吝赐教批评指正。
同学小强
2022/08/24
1.4K0
基于qiankun微前端实战 + 部署笔记
如何解决React官方脚手架不支持Less的问题
create-react-app 是由 React 官方提供并推荐使用构建新的 React 单页面应用程序的最佳方式,不过目前版本(1.5.x)其构建的项目中默认是不支持动态样式语言 Less 的。如果我们的项目必须要使用 Less 呢,这就需要我们手动集成一下。本篇主要针对集成的过程做一个简要记录。
Esofar
2018/10/10
2K0
如何解决React官方脚手架不支持Less的问题
[译] 定制 create-react-app:如何制作自己的模版
原文:https://auth0.com/blog/how-to-configure-create-react-app/#Test-Your-Custom-Script
江米小枣
2020/06/15
1.4K0
推荐阅读
相关推荐
【React 实战教程】从0到1 构建 github star管理工具
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验