create-react-app 進階功能: Custom Templates

March 28, 2020

之前提到 create-react-app 可以幫助開發者快速產生一個 React 專案,而 Custom Templates 功能可以根據樣板讓新的專案長出你希望的架構,同時安裝好你指定的相依性套件。雖然不是常常有機會開發新專案,但是如果能馬上產生立即可以開發的專案,花點時間寫 template 是很有幫助的。

Get Start!

首先這個功能從 react-scripts@3.3.0 以後才有,所以使用前請先注意你的 create-react-app 版本(如果是直接用 npx 執行就不用煩惱這個問題)。

當我們在執行 npx create-react-app my-app 時,其實是用官方預設的 template 去產生專案。官方的 template 有以下這兩個:

你可以參考官方的 template 去建構出自己的 template 。

Structure

template 基本架構如下:

cra-template-[template-name]/
  README.md (for npm)
  template.json
  package.json
  template/
    README.md (for projects created from this template)
    gitignore
    public/
      index.html
    src/
      index.js (or index.tsx)

其中最重要的有 template.json 檔案跟 template 資料夾:

template 資料夾

在這邊放的檔案和資料夾會在執行 npx create-react-app my-app 的過程中複製到 my-app 專案。這個功能相當好用,我可以不用事後花老半天新增資料夾和檔案。例如我習慣將 .jsx 根據他是 container component 還是 presentational component 分別放在 src/containerssrc/components ,然後 components 又可以根據該 component 的顆粒度分別放在 elementsblockssegmentslayoutspages 等。還有一些基本的設定檔案等等我都可以放在 template 資料夾。以下是我的範例 template 資料夾目錄:

template
├── README.md
├── deploy.sh
├── gitignore
├── jsconfig.json
├── public
│   ├── favicon.ico
│   ├── index.html
│   ├── logo192.png
│   ├── manifest.json
│   └── robots.txt
└── src
    ├── components
    │   ├── blocks
    │   ├── elements
    │   ├── layouts
    │   ├── pages
    │   └── segments
    ├── config
    │   ├── base.js
    │   ├── development.js
    │   ├── index.js
    │   ├── production.js
    │   └── stage.js
    ├── constants
    ├── containers
    │   └── application
    │       ├── App.css
    │       ├── index.jsx
    │       ├── index.test.js
    │       ├── logic.js
    │       ├── selector.js
    │       └── slice.js
    ├── images
    │   ├── logo.svg
    ├── index.js
    ├── reducers.js
    ├── routes.js
    ├── serviceWorker.js
    ├── setupTests.js
    ├── store.js
    └── utils

template.json

template 的設定檔。目前只支援 package 這個 key ,在 package 底下可以寫任何你想要加到新專案底下的 package.json 的設定,比方說 dependencies 或是 scripts 等等。 而且 dependenciesdevDependencies 的套件會在你初始化專案的時候一並安裝。以下是我的範例 template.json :

{
  "package": {
    "dependencies": {
      "@testing-library/react": "^9.3.2",
      "@testing-library/jest-dom": "^4.2.4",
      "@testing-library/user-event": "^7.1.2",
      "@reduxjs/toolkit": "^1.2.1",
      "axios": "^0.19.0",
      "prettier": "^1.19.1",
      "react-router-dom": "^5.1.2",
      "react-redux": "^7.1.3",
      "redux": "^4.0.5",
      "redux-thunk": "^2.3.0",
      "reselect": "^4.0.0"
    },
    "scripts": {
      "lint": "eslint ./src",
     "prettier": "prettier --check src/**/*.{js,jsx,ts,tsx,json,css,scss,md}"
    },
    "eslintConfig": {
      "extends": "react-app"
    },
    "husky": {
      "hooks": {
        "pre-commit": "lint-staged"
      }
    },
    "lint-staged": {
      "src/**/*.{js,jsx,ts,tsx,json,css,scss,md}": "prettier --write",
      "src/**/*.{js,jsx,ts,tsx}": "eslint ./src --fix-dry-run"
    },
    "devDependencies": {
      "chai": "^4.2.0",
      "eslint": "^6.8.0",
      "eslint-config-prettier": "^6.10.1",
      "eslint-plugin-prettier": "^3.1.2",
      "eslint-plugin-react": "^7.19.0",
      "husky": "^4.2.3",
      "lint-staged": "^10.0.9",
      "pre-commit": "^1.2.2",
      "redux-devtools": "^3.5.0"
    }
  }
}

以上簡單安裝了 redux 、 axios 、 prettier 、 eslint 等等,以及我希望所有開發者在 commit 前可以自動先將 code format 過一次,以及進行 eslint 檢查,這樣我們的 coding style 才會一致。

Create Project from Custom Templates

執行以下指令就能使用你的 custom template 產生新專案:

npx create-react-app my-app --template file:/path/to/your/template

如果你的 custom template 有上傳到 npm ,可以改用以下指令:

npx create-react-app my-app --template [template-name]

Reference


Written by Zhang Wuxian 下輩子我不當工程師了