目录规范
项目根目录
project/
├── dist/
├── public/
├── src/
│ └── ...
├── tests/
| ├── e2e/
│ └── unit/
├── .browserslistrc
├── .editorconfig
├── .env.development
├── .env.production
├── .eslintignore
├── .eslintrc.js
├── .gitignore
├── .gitlab-ci.yml
├── .lighthouserc.js
├── commitlint.config.js
├── jest.config.js
├── package.json
├── package-lock.json
├── stylelint.config.js
└── tsconfig.json
dist/:项目构建结果public/:静态文件,不受构建工具影响src/:项目源代码,见src目录tests/:测试源代码e2e/:E2E 测试代码unit/:单元测试代码
.browserslistrc:Browserslist 配置文件,配置浏览器兼容性.editorconfig:编辑器配置.env.development.env.production:环境配置.eslintignore:忽略不需要 ESLint 检查的目录或文件.eslintrc.js:ESLint 配置.gitignore:忽略不需要 Git 提交的目录或文件.gitlab-ci.yml:Gitlab CI 配置.lighthouserc.js:lighthouse 检查配置,在 CI 环境下运行commitlint.config.js:commitlint 配置lint-staged.config.js:lint-staged 配置jest.config.js:Jest 配置package.jsonpnpm-lock.yamlstylelint.config.js:stylelint 配置tsconfig.json:TypeScript 配置
src 目录
- React
- Next.js
- Vue
project/
└── src/
├── assets/
├── components/
├── hooks/
├── layouts/
├── service/
├── store/
├── utils/
├── pages/
├── App.tsx
├── main.tsx
└── react-env.d.ts
assets/:静态文件目录components/:项目公共组件hooks/:自定义 React Hookslayouts/:页面布局组件services/:HTTP 请求封装方法store/:Zustand 相关代码utils/:工具 JS 函数pages/:页面组件App.tsx:根组件main.tsx:页面入口文件react-env.d.ts:React Types 类型文件
project/
└── src/
├── app/
│ ├── page.tsx
│ ├── layout.tsx
│ ├── loading.tsx
│ ├── error.tsx
│ ├── error.tsx
│ └── .../
├── assets/
├── components/
├── hooks/
├── service/
└── utils/
app/:App Router 的根目录page.tsx- 定义路由的 UI,比如/app/dashboard/page.tsx对应/dashboard路由layout.tsx- 定义共享布局,嵌套在各级路由中loading.tsx- 路由加载状态error.tsx- 错误处理组件not-found.tsx- 404 页面
assets/:静态文件目录components/:项目公共组件hooks/:自定义 React Hooksservices/:HTTP 请求封装方法utils/:工具 JS 函数
project/
└── src/
├── assets/
├── components/
├── composables/
├── directives/
├── layouts/
├── plugins/
├── router/
├── service/
├── store/
├── utils/
├── views/
├── App.vue
├── main.ts
└── vite-env.d.ts
assets/:静态文件目录components/:项目公共组件composables/:项目 Composition APIdirectives/:项目公共指令layouts/:页面布局组件plugins/:Vue 全局插件router/:路由配置services/:HTTP 请求封装方法store/:Pinia 相关代码utils/:工具 JS 函数views/:页面组件App.vue:根组件main.ts:页面入口文件vite-env.d.ts:Vue Types类型文件
模块的导出
- React
- Vue
模块应该使用统一入口进行导出,以 components/ 为例
目录结构,注意这里 HelloWorld/ 下的 assets/ 为组件私有资源,components/ 为私有组件。我们会把 components/index.ts 作为统一的组件入口。
components/
├── HelloWorld/
| ├── assets/
| ├── components/
| └── index.tsx
└── index.ts
在把模块导出成统一入口:
// components/index.ts
export { default as HelloWorld } from './HelloWorld';
在页面组件中使用:
import React from 'react';
import { HelloWorld } from '@/components';
const Page: React.FC = function Page() {
return (
<HelloWorld />
);
};
export default Page;
模块应该使用统一入口进行导出,以 components/ 为例
目录结构,注意这里 HelloWorld/ 下的 assets/ 为组件私有资源,components/ 为私有组件。我们会把 components/index.ts 作为统一的组件入口。
components/
├── HelloWorld/
| ├── assets/
| ├── components/
| ├── HelloWorld.vue
| └── index.ts
└── index.ts
先把 Vue 组件导出成模块:
// components/HelloWorld/index.ts
import HelloWorld from './HelloWorld.vue'
export default HelloWorld;
在把模块导出成统一入口:
// components/index.ts
export { default as HelloWorld } from './HelloWorld';
在页面组件中使用:
<script>
import { HelloWorld } from '@/components';
export default {
components: {
HelloWorld,
},
};
</script>
这样做的好处是可以方便的管理和引用组件,无需再组件的使用过程中频繁的寻找组件的代码路径。由于构建工具已经支持 TreeShaking,这里无需过多的考虑性能优化的问题。