打造本身的 Create-React-App

做爲前端開發者,如今已經有足夠多的腳手架可供選擇。官方的有 create-react-app, vue-cli, @angular/cli 等,老牌腳手架工具 Yeoman,各開發者定製腳手架更是不勝枚舉。但每一個人、每一個團隊使用的技術棧並不徹底相同,所以市面上的腳手架大抵分兩類:要麼只包含基本功能,要麼就大而全。想找到徹底適合的腳手架並不容易。javascript

前幾天看到一篇文章說,要成爲中高級前端就要學會定製本身的腳手架工具。我十分贊成,特別是做爲 Leader,爲團隊定製合理的模板能夠有效提升團隊的工做效率。html

若是你使用過 create-react-app,你可能會注意到 react-scripts 這個工具,它負責處理編譯打包相關工做。你沒必要再關注如何編寫 webpack.config.js 或者 .babelrc。但 create-react-app 甚至連路由庫都沒預置,所以項目建立後你仍要配置一大堆依賴。前端

對開發者而言,技術棧的變更一般不太頻繁。我但願制定模板的同時,能夠像 react-scripts 同樣忽略打包細節。現有的腳手架方案都不太知足個人要求,因而我寫了 Tacervue

按本身的技術棧,我寫了 4 個模板:java

  • react: React + TypeScript + Jest + styled-components
  • koa: Koa + TypeScript + Jest
  • lib: A library template for published to npmjs
  • bin: A binary template

只須要運行 npx tacer <template-name> [project-path] 就能夠快速搭建項目。node

建立模板

這些模板僅針對我我的喜愛定製,我依然相信量身定製纔是好的方案(就像定製耳機老是比公模耳機要舒服同樣)。react

爲方便自定義模板,Tacer 提供了一個模板的模板,Seed(種子)。下文假設咱們要定製一個使用 Electron 的模板。webpack

建立腳手架

npx tacer seed tacer-template-electron
# 你也能夠全局安裝 tacer
npm install -g tacer
tacer seed tacer-template-electron
複製代碼

tacer 支持兩種模板來源:git

  • 公共來源:以 tacer-template- 爲前綴的 npm 包,可被全部人訪問
  • 私有來源:Github, GitLab 及其它自建私有 Git 倉庫,其可見性由倉庫類型決定

所以,使用 react 模板建立項目,可使用兩種方式:github

npx tacer react project-path
npx tacer https://github.com/IdanLoo/tacer-template-react project-path
複製代碼

不管如何,命令執行完以後,咱們已經能夠看到 tacer-tepmlate-electron 的目錄結構了。

- bin
    - script.js # tacer-script 所在路徑,通常無需更改
- scripts # tacer-script 運行的命令
    - build.js # tacer-script build
    - start.js # tacer-script start
    - ... # 能夠在此處添加其它命令
- template # 模板所在路徑,需本身建立
複製代碼

命令

rollup 爲例,講解一下如何編寫 scripts。

// build.js
const rollup = require('rollup')
const autoExternal = require('rollup-plugin-auto-external') // 處理外部依賴
const typescript = require('rollup-plugin-typescript2') // 處理 TypeScript
const { terser } = require('rollup-plugin-terser') // 代碼壓縮
const { resolve } = require("path")

const workdir = process.cwd() // 工做目錄,即運行 tacer-script 的目錄,通常爲目標項目的根目錄
const entrypoint = resolve(workdir, 'src', 'index.js') // 項目入口,<workdir>/src/index.js
const output = resolve(workdir, 'dist', 'index.js') // 打包路徑, <workdir>/dist/index.js
// 緩存路徑,<workdir>/node_modules/tacer-template-electron/.cache
const cacheRoot = resolve(__dirname, '..', '.cache')

// 沒有參數
function build() {
    // 返回 Promise 對象以供其它命令調用
    return rollup({
        input: entrypoint,
        plugins: [
            autoExternal(),
            typescript({ cacheRoot }),
            terser()
        ]
    }).then(bundle => bundle.write({ file: output, format: 'cjs' }))
}

// 按 CommonJS 規範導出函數,以供 tacer-script 調用
module.exports = build
複製代碼

注意tacer-script 在調用時沒有參數傳遞,咱們建議爲不一樣的命令編寫不一樣的文件,即便是 test:unittest:e2e 這樣同屬於測試的命令,也應當編寫 test:unit.jstest:e2e.js 兩個文件。

注意:爲了保持精簡,咱們並未內置 Babel。所以在 ES Module 足夠流行以前,仍應使用 CommonJS 規範導出函數。

注意:你能夠須要閱讀打包工具的 JS API 以瞭解它們如何被 JavaScript 調用。這須要一點耐心。若是你使用的工具未提供 JS API(如 Jest)或者你更喜歡命令行調用形式,請使用 Spawn

編寫模板

你能夠在腳手架目錄中新建一個 template 文件夾,從頭開始配置你的模板,也能夠複製任何現有的項目到腳手架目錄中並重命爲 template。按照你的喜愛,配置一個最小可運行的模板。

鏈接模板與腳手架

在模板目錄中執行

npm install --save-dev file:..
# or
yarn add -D file:..
複製代碼

腳手架會做爲 devDependency 安裝到 template/package.json 中。修改 package.jsonscripts 屬性

{
    // ...
    "scripts": {
        "build": "tacer-script build",
        "start": "tacer-script start",
        // ... 其它你在腳手架中定義的命令
    },
    // ...
    "devDependencies": {
        "tacer-template-electron": "file:.." // 這個依賴在 tacer 運行時會自動處理成版本號或 Git 倉庫地址
    }
}
複製代碼

嘗試一下 npm start 是否是能正常運行吧!

注意file:.. 應始終做爲 devDependency 安裝。若是安裝至 dependencies,tacer 將不能正確處理這個依賴。

注意tacer 運行時,會要求用戶輸入如下字段,並自動替換 package.json 中的值

  • name
  • version
  • description
  • repository: 若是值不爲空,會自動初始化 Git,並設置 origin remote
  • keywords
  • author
  • license

打包

模板須要被打包爲 template.zip 文件才能被 tacer 正確解析。tacer-template-seed 已經提供了 build 命令,只需運行 npm run build 就能夠將 template 目錄打包。

在模板目錄咱們經常會有一些不但願被打包的文件或目錄(如 node_modules/, dist/),爲此可以使用 .tacerignore 文件忽略某些文件。

注意:打包工具只會查看 template 目錄中的內容,所以 .tacerignore 文件需置於 template/.tacerignore

注意.tacerignore 的匹配規則與 .gitignore 基本一致,但有一點不一樣。爲了實現更簡單,.tacerignore 匹配目錄時需寫成 node_modules/** 而不是像 .gitignore 同樣寫成 node_modules/

發佈

如今你能夠把你的腳手架發佈到 npmjs 或 Git 倉庫了。盡情享受定製腳手架帶來的便捷吧。

相關文章
相關標籤/搜索