创建自定义CRA模版

2022年12月10日 ... ☕️ 2 min read

当脚手架类的项目做到一定阶段,会有一个比较稳定的版本,可以从这个版本生成目标项目,这时候通常有几种方法,比如创建一个目录,copy并修改关键配置,或者写一个脚本来完成这些copy操作。使用的CRA模版工具就属于这种类型。

目前需要的功能点:

  • 根据projectName,copy模版文件到指定目录;
  • 修改package.json信息;
  • 执行install并启动项目

模版的目录,以下面格式划分

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

本地测试模版,用以下命令

npx create-react-app my-app --template file:../path/to/your/template/cra-template-[template-name]

template目录会直接复制到app目录,gitignore会被重命名为.gitignore

最后生成的目录结构

my-app/
  README.md
  node_modules/
  package.json
  public/
    index.html
    favicon.ico
  src/
    App.css
    App.js
    App.test.js
    index.css
    index.js
    logo.svg

像普通的app一样,直接进入my-app目录,执行npm/yarn start即可启动。

流程

命令 创建使用的命令行,需要指定项目名称和目标目录。

cross-env PROJECT_NAME=@some/proj DIR=path/to/proj ts-node ./scripts/createProject.ts

copy文件

  
  const projectRoot = 'root/to/projects/'
  const dir = process.env['DIR'] || ''
  const templateDirName = 'path/to/template'

  shell.rm('-rf', `${projectRoot}${dir}`)
  shell.mkdir('-p', `${projectRoot}${dir}`)
  shell.cp(
    '-Rf',
    templateDirName,
    `${path.resolve('./', projectRoot, dir)}`
  )

修改package.json 由于package.json本质上是个json文件,所以直接requrie即可以得到json格式的数据。之后根据key和value做修改即可以。

  const packageJson = require(pkgPath)
  // 添加name和lint-staged属性
  packageJson['name'] = opts['name']

  packageJson['lint-staged'] = {
    '*.{js,ts,tsx,jsx}': ['eslint'],
    '*.{json,md,html,js,jsx,ts,tsx}': ['prettier --write'],
  }
  fs.writeFileSync(pkgPath, JSON.stringify(packageJson))
  // prettify文件
  shell.exec(`cd ${dir} && pnpm run prettify -- package.json`, { silent: true })

执行构建并运行

  shell.exec(`cd ${dir} && pnpm install && pnpm start`, { silent: false })

更多配置:https://create-react-app.dev/docs/advanced-configuration

#react

SideEffect is a blog for front-end web development.
Code by Axiu / rss