1. .
  2. ├── mock
  3. ├── package.json
  4. ├── src
  5. ├── app.js
  6. ├── assets
  7. └── yay.jpg
  8. ├── global.css
  9. ├── layouts
  10. ├── index.css
  11. └── index.js
  12. ├── models
  13. └── pages
  14. ├── index.css
  15. └── index.js
  16. ├── .env
  17. └── .umirc.js

这里是我们当前项目的目录结构,使用 create-umi 创建的项目,是一个典型的 umi 项目结构,我们可以在 umi 约定使用的目录中,添加我们所需要的内容,达到快速实现功能需求的目的。


mock

约定 mock 目录里所有的 .js 文件会被解析为 mock 文件。比如,新建 mock/users.js,内容如下:

  1. export default {
  2. '/api/users': ['a', 'b'],
  3. }

然后在浏览器里访问 http://localhost:8000/api/users 就可以看到 ['a', 'b'] 了。

注意请求地址和mock里面的文件名无关,只和文件内部的定义相关。你可以取任意的命名,但为了更好的维护项目,你应该取一些语意化更好的名字


src

我们约定将项目的所有源码放在 src 目录,umi 项目的大部分的工作都将在这里进行。当我们运行 umi dev 或者 umi build 时,此目录下的代码会被转换成浏览器能够运行的正确的 JavaScript 版本,所以我们可以在这里使用 TypeScript 或者其他 JavaScript 新语法。

src/layouts/index.js

约定式的全局布局,实际上是在路由外面套了一层。比如,你的路由是:

  1. [
  2. {
  3. path: '/',
  4. component: './pages/index,
  5. },
  6. {
  7. path: '/users',
  8. component: './pages/users',
  9. },
  10. ]

如果有 layouts/index.js,那么路由则变为:

  1. [
  2. {
  3. path: '/',
  4. component: './layouts/index',
  5. routes: [
  6. {
  7. path: '/',
  8. component: './pages/index',
  9. },
  10. {
  11. path: '/users',
  12. component: './pages/users',
  13. },
  14. ],
  15. },
  16. ]

从组件角度可以简单的理解为如下关系:

  1. <layout>
  2. <page>1</page>
  3. <page>2</page>
  4. </layout>

只要存在 layouts/index.js就生效,如果你不需要这个,那你只能将它重命名为别的名字。

src/pages

约定 pages 下所有的 (j|t)sx? 文件即路由。在 umi 中可以使用约定式路由和配置式路由,在实际项目开发中,我个人偏向于使用,约定式路由。毕竟这是 umi 的主要特性之一。使用约定式路由,意味着不需要维护,可怕的路由配置文件。最常用的有基础路由和动态路由(用于详情页等,需要从 url 取参数的情况):

基础路由

假设 pages 目录结构如下:

  1. + pages/
  2. + users/
  3. - index.js
  4. - list.js
  5. - index.js

umi 将自动生成如下的路由配置:

  1. [
  2. {
  3. path: '/',
  4. component: './pages/index.js',
  5. },
  6. {
  7. path: '/users/',
  8. component: './pages/users/index.js',
  9. },
  10. {
  11. path: '/users/list',
  12. component: './pages/users/list.js',
  13. },
  14. ]

动态路由

umi 中约定,被 [] 包裹的目录或文件为动态路由。比如以下目录结构:

  1. + pages/
  2. + [post]/
  3. - index.js
  4. - comments.js
  5. + users/
  6. [id].js
  7. - index.js

会生成路由配置如下:

  1. [
  2. {
  3. path: '/',
  4. component: './pages/index.js',
  5. },
  6. {
  7. path: '/users/:id',
  8. component: './pages/users/$id.js',
  9. },
  10. {
  11. path: '/:post/',
  12. component: './pages/$post/index.js',
  13. },
  14. {
  15. path: '/:post/comments',
  16. component: './pages/$post/comments.js',
  17. },
  18. ]

src/pages/404.js

当访问的路由地址不存在时,会自动显示404 页面。只有build之后生效。调试的时候可以访问 /404

注意:开发模式下会使用内置 umi 提供的 404 提示页面。

src/pages/document.ejs

若此文件存在,则会覆盖默认的 HTML 模板。需至少包含以下代码,

  1. <div id="root"></div>

常用于需要设置网站名称,增加 meta,增加头部 js 等情况。

虽然上述这些功能都可以通过umi的配置或方法实现,但是,显示的在这个文件中维护,会更加清晰一些。

src/.umi/

这是 umi dev 时生产的临时目录,默认包含 umi.jsrouter.js,有些插件也会在这里生成一些其他临时文件。可以在这里做一些验证,但请不要直接在这里修改代码,umi 重启或者 pages 下的文件修改都会重新生成这个文件夹下的文件。

以上说明来自 umi 官网,如果你不理解,或者不想理解太多 umi 的细节,你可以不要理会这些文件。

src/.umi-production/

src/.umi,但是是在 umi build 时生成的,会在 umi build 执行完自动删除。

以上说明来自 umi 官网,如果你不理解,或者不想理解太多 umi 的细节,你可以不要理会这些文件。

src/*/.test.js & *.e2e.js

测试文件,umi test 会查找所有的 .(test|e2e).(j|t)s 文件跑测试。

src/global.(j|t)sx?

在入口文件最前面被自动引入,可以考虑在此加入 polyfill。umi 区别于其他前端框架,没有显示的程序主入口,如 src/app.jssrc/index.js,所以在引用某些模块的时候,如果模块功能要求在程序主入口添加代码时,你就可以写到这个文件。

src/global.(css|less|sass|scss)

这个文件不走 css modules,自动被引入,可以写一些全局样式,或者做一些样式覆盖。


.umirc.js 和 config/config.js

umi 的配置文件,二选一。当两者同时存在时,优先使用.umirc.js。


.env

环境变量,比如:

  1. BROWSER=none

参考文档:umi官网-目录及约定