{"id":23494785,"url":"https://github.com/yinguangyao/tinger","last_synced_at":"2025-04-15T11:48:40.008Z","repository":{"id":42376100,"uuid":"316277702","full_name":"yinguangyao/tinger","owner":"yinguangyao","description":"MonoRepo React Application","archived":false,"fork":false,"pushed_at":"2020-12-02T04:57:36.000Z","size":2570,"stargazers_count":10,"open_issues_count":0,"forks_count":3,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-28T19:44:39.557Z","etag":null,"topics":["create-react-app","lerna","monorepo","yarn-workspaces"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yinguangyao.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-11-26T16:00:53.000Z","updated_at":"2024-01-11T09:28:57.000Z","dependencies_parsed_at":"2022-08-28T21:21:45.270Z","dependency_job_id":null,"html_url":"https://github.com/yinguangyao/tinger","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yinguangyao%2Ftinger","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yinguangyao%2Ftinger/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yinguangyao%2Ftinger/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yinguangyao%2Ftinger/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yinguangyao","download_url":"https://codeload.github.com/yinguangyao/tinger/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249066521,"owners_count":21207392,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["create-react-app","lerna","monorepo","yarn-workspaces"],"created_at":"2024-12-25T03:12:44.196Z","updated_at":"2025-04-15T11:48:39.988Z","avatar_url":"https://github.com/yinguangyao.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# tinger\n这是一个基于 monorepo 的 React 项目，包含了 React、TypeScript、Eslint、Prettier、Commitlint 等等工具。\n项目使用 lerna 和 yarn workspace 来管理。\n## monorepo\nmonorepo 和 multirepo 是相对概念。\n\n通常情况下，我们一个 git 仓库里面只会放一个项目，这种是 multirepo。而一个 git 仓库有多个项目，这个就叫 monorepo。\n\n在开发中，我们可能经常遇到做一些分散的 H5 活动页的情况下，它们一个页面就是一个项目，并且是独立部署的。\n\n如果我们对每个页面都新开一个 React 项目，基础配置一模一样，然后每个项目都放到一个新的 git 仓库，往往效率低下。\n\n如果你有脚手架，那么创建新项目还比较简单。如果没有脚手架，就需要把之前项目配置拷贝过来做修改，影响效率。\n\n这里使用了 lerna 和 yarn workspace，可以将公共依赖都安装到顶部，节省了资源开销。\n\n所有项目通用一份 webpack 构建配置，不必针对每个项目都配置一下。\n\n### yarn workspace\nyarn workspace 是 yarn 区别于 npm 的一个重要特征，你需要在 package.json 里面设置 private 为 true，然后设置 workspaces 属性。\n\n这样你每次新建一个项目，安装依赖的时候，多个项目通用的 node_modules 都会装到项目根目录里面，无须为每个项目都安装一遍。\n## 一些命令\n### 创建一个子项目\n这里编写了一个 NodeJS 脚本，可以把 packages/example 的文件拷贝到其他目录下面，实现生成新项目的效果。\n\n运行 `yarn run create --p \u003cproject name\u003e`\n\n如果你对 React 脚手架感兴趣，也可以使用我的 `generator-react-kit` 脚手架。使用命令很简单。\n```\nyarn global add generator-react-kit\nyo react-kit\n```\n### 运行一个子项目\n`yarn workspace \u003cproject name\u003e run start`\n### 安装依赖到子项目\n`yarn workspace \u003cproject name\u003e add xxx`\n### 安装依赖到根目录\n`yarn add -W- D add xxx`\n### 给所有项目安装\n`yarn workspaces add xxx`\n### 构建\n运行 `yarn workspace \u003cproject name\u003e run build` 来构建。\n## 项目配置\n### commitlint\n使用了 commitlint 来规范团队提交记录，只允许你使用 `feat\\fix\\chore\\doc\\refactor` 等等开头的提交。\n### eslint + prettier\n这里使用了 jsx-a11y 来对代码规范做校验，用 prettier 统一代码格式，保证每个人写出来的代码风格一致。\n### husky + lint-staged\n用 husky 设置 commit 的时候做 eslint 和 prettier 代码格式校验，在 push 之前进行一次构建，以便于检查出来一些报错。\n### typescript\n支持用 typescript 来编写 react 代码。\n### webpack\n使用 create-react-app 创建的项目，已经将 webpack 配置 eject 了出来，支持自己定制。\n## 部署\n现在都是对每个项目单独构建，配置 nginx 转发到不同的域名。目前已经有了两个项目：\n1. [sakura](http://sakura.gyyin.top)\n2. [flower](http://flower.gyyin.top)\n\n另附教程：\n1. [画一朵樱花](https://github.com/yinguangyao/blog/issues/48)\n2. [落樱效果](https://github.com/yinguangyao/tinger/blob/master/packages/sakura/README.md)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyinguangyao%2Ftinger","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyinguangyao%2Ftinger","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyinguangyao%2Ftinger/lists"}