之前在 create-react-app教程-使用篇 中介绍了create-react-app的基本使用,
为了便于理解一个脚手架脚本是如何运作的,现在来看一下 create-react-app v1.5.2 的源码
入口index.js
create-react-app 一般会作为全局命令,因为便于更新等原因,create-react-app 只会做初始化仓库 执行当前版本命令等操作。
找到 create-react-app
入口index文件:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 ;
var chalk = require('chalk');
// 返回Node版本信息,如果有多个版本返回多个版本
var currentNodeVersion = process.versions.node;
var semver = currentNodeVersion.split('.');
var major = semver[0];// 取出第一个Node版本信息
//小于 4.x的提示并终止程序
if (major < 4) {
console.error(
chalk.red(
'You are running Node ' +
currentNodeVersion +
'.\n' +
'Create React App requires Node 4 or higher. \n' +
'Please update your version of Node.'
)
);
process.exit(1);
}
// 没有小于4就引入以下文件继续执行
require('./createReactApp');
可以看到 index 文件没有做什么,只是做为一个入口文件判断一下 node版本,小于 4.x的提示并终止程序, 如果正常则加载 ./createReactApp 这个文件,主要的逻辑在该文件实现。
createReactApp.js
虽然 createReactApp.js 有751行,但是里面有一大半是注释和错误友好信息。
除了声明的依赖。跟着执行顺序先看到的是第56行 program
,
1 | const program = new commander.Command(packageJson.name) |
这里用到 commander
的依赖,这是 node.js 命令行接口的解决方案,正如我们所看到的 处理用户输入的参数,输出友好的提示信息等。
接着到了第109行:
1 | //没有输入projectName的话,输出一些提示信息就终止程序 |
这里的 projectName 就是我们要创建的web应用名称,如果没有输入的话,输出一些提示信息就终止程序。
createApp 检测判断
然后到了第148行 执行createApp
:
1 | createApp( |
可以了解到 createApp 主要做的事情就是做一些安全判断比如:检查项目名是否合法,检查新建的话是否安全,检查npm版本,处理react-script的版本兼容。然后看下在createApp
中用到的 checkAppName
checkAppName 检查项目名
1 | function checkAppName(appName) { |
run 安装依赖拷贝模版
在 createApp 方法体内调用了run方法,run方法体内完成主要的安装依赖 拷贝模板等功能。
1 | function run(root,appName,version,verbose,originalDirectory,template,useYarn) { |
可以猜到其中最重要的逻辑是 install
安装依赖和 init
拷贝模板。
install 安装依赖
install 方法体中是根据参数拼装命令行,然后用node去跑安装脚本 ,执行完成后返回一个 Promise
1 | function install(root, useYarn, dependencies, verbose, isOnline) { |
init
拷贝模板
init 方法默认是在 【当前web项目路径】/node_modules/react-scripts/script/init.js 中 :
1 | module.exports = function( |
简化一下逻辑这里的主要内容就是 修改package.json信息和拷贝模板文件
~END~