本文档仅作为如何将 create-react-app 迁移到 umi 的基础指引。真实项目的迁移,你可能还需要阅读我们的文档,了解更多关于插件和配置的相关信息。
其实将一个 create-react-app 项目迁移到 umi 是一件比较容易的事情。主要需要注意几个默认行为的差异。接下来,我们通过以下步骤,将 create-react-app 的初始项目迁移到 umi。
在 package.json 中修改依赖并修改项目启动命令,更多 umi cli 的信息,可以查看我们的文档。
{"scripts": {- "start": "react-scripts start",+ "start": "umi dev",- "build": "react-scripts build",+ "build": "umi build",- "test": "react-scripts test",+ "test": "umi-test"- "eject": "react-scripts eject"},"dependencies": {- "react-scripts": "3.4.2"+ "umi": "^3.2.14"},+ "devDependencies": {+ "@umijs/test": "^3.2.14"+ }}
create-react-app 的入口是 src/index,在 umi 中并没有真实的暴露程序的主入口,但是我们可以在 layouts 中执行同样的操作。
将 src/index 中的逻辑转移到 src/layouts/index 中,操作完成你的代码应该看起来像:
import React from 'react';import './index.css';export default ({ children }) => (<React.StrictMode>{children}</React.StrictMode>);
将页面组件转移到 src/pages 目录下面。
这里我们期望通过路由
/访问 App 文件,因此我们如下修改文件名,并修改内部引用。

将 public/index.html 中的内容,转移到 src/pages/document.ejs。
create-react-app 中通过 %PUBLIC_URL% 取得部署路径,而 umi 中需要通过 context 取值。
- <link rel="icon" href="%PUBLIC_URL%/favicon.ico" />+ <link rel="icon" href="<%= context.config.publicPath +'favicon.ico'%>" />
将 package.json 中的 eslint 配置,转移到 .eslintrc.js。在 umi 项目中我们推荐你使用 @umijs/fabric。当然,你可以使用你熟悉的任意配置。
{"devDependencies": {+ "@umijs/fabric": "^2.2.2",}- "eslintConfig": {- "extends": "react-app"- }}
module.exports = {extends: [require.resolve('@umijs/fabric/dist/eslint')],};
新建配置文件 jest.config.js,编写如下配置:
module.exports = {"setupFilesAfterEnv": ["<rootDir>/src/setupTests.js"]}
umi-test 替代 react-scripts test相关修改可以查看上文中提到的依赖处理,如果你刚才没有留意,你可以返回去查看。
执行 umi-test:
$ umi-testPASS src/pages/index.test.js (11.765s)✓ renders learn react link (31ms)Test Suites: 1 passed, 1 totalTests: 1 passed, 1 totalSnapshots: 0 totalTime: 12.594sRan all test suites.✨ Done in 13.83s.
执行 umi dev,项目将会在 http://localhost:8000/ 上启动,如果你习惯使用 3000 端口,你可以通过环境变量来设置。现在项目看起来应该与迁移之前的效果一致。
完整的迁移操作,可以查看这一次提交。