# 介绍 . 本项目是作为公司的前端的模板项目。采用的是 Vue 的全家桶技术。 本文档介绍项目如何使用和扩展、采用的技术栈、目录结构和最佳实践等。你不用一次看完所有内容,但是建议在正式开发前完整读一遍文档。 ## 安装、启动和打包 安装: ```bash yarn ``` 启动: ```bash npm start ``` 打包: ```bash npm run build ``` ## 浏览器兼容 默认配置 IE11+, Edge, Chrome, Firefox. 建议配置,去除 IE 的支持,Edge 17+, Chrome 55+(360 安全浏览器 9.1+)。 ## 技术栈 Vue 2.x Vuex 3.x Vue router 2.x TODO: 架构图 ## 构建工具 vue-cli ## 工具安装 ### Chrome 插件 [Vue.js devtools](https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd) ## VS Code 插件 1. Vetur (Author: Pine Wu) 1. Prettier (Author: Esben Petersen) # 注意: 其他的 vscode 插件可能导致格式化不一致 1. REST Client (Author: Huachao Mao) 1. Quokka.js (Author: Wallaby.js) - optional ## 目录结构 | 目录 | 说明 | | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | dist/ | 打包产出 | | docs/ | 技术要点的设计思路 | | node_modules/ | 依赖包 | | public/ | 公共目录,供发布 | | src/assets/ | 图片、字体文件等文件. 在多数情况下,应该把资源文件放在 src/features/下,这种情况可以让应用垂直划分,同时可以更干净的删除资源。 | | src/auth/ | 认证信息是全局的 | | src/api/ | api 集中管理,以资源角色分组,方便复用 | | src/components/ | 全局组件  | | src/constants/ | 集中放置全局常量,方便更新 API 的服务器地址等 | | src/directives/ | 全局的 directive | | src/features/ | 实现业务需求的组件。目标是让尽可能多的相关文件在相同的业务组件内。这使得开发团队可以更好的划分任务。业务组件可以依赖全局元素,如 src/auth, src/components, src/directives,或者依赖其它业务组件。但是业务组件不应该依赖其它业务组件的子组件,它应该使用其它组件的 public API。必要时,子组件可能在业务组件中重复。 | | src/modules/ | 当系统变大,多人负责独立模块时,设立 modules 文件夹,modules 文件夹下包含 api, components, constants, directives, filters, features, routes, store. 即 modules 下是一个小世界,在外部引用各个单独的 module。采用此文件夹时,就不需要 src/features/文件夹了。 | | src/filters/ | 全局的 filter | | src/plugins/ | vue plugins | | src/styles/ | 全局样式。 局部样式应该放在 src/features/ 或 src/modules/\*/features 中 | | src/utils/ | 共享的工具类。 跟业务有关的工具方法放在 src/features/中 | | src/router/index.js | vue-router,可以引用 src/modules 下面的 routes。如果没有划分 module,可以在 src/router 下面写 model,比如 user.js。 | | src/store/index.js | 使用 Vuex 管理状态的单一 store. 可以引用 src/modules 下面的 store 。如果没有划分 module,可以在 src/store 下面写 page,比如 user.js。 | | static/ | 不需要 Webpack 处理的静态文件 | | tests/ | 单元测试和 E2E 测试 | ## 错误处理 ### 通用的错误处理 #### API 请求 从用户操作,界面有一处集中显示操作反馈。 处理顺序如下: 1. 用户操作 2. 触发 vue action 3. 调用 vuex action(无需处理错误) 4. 调用 api,若出错,修改全局错误状态,并通知展示状态 5. 界面展示程序状态,即出错信息 如果用户需要 vuex action 的结果,可以在 vuex action 里面返回 promise,不建议在 component 处理状态。 应该尽可能通过 store 的状态更新使得界面更新。 ## 状态处理 无需共享状态的组件可以直接在组件的生命周期中发请求获取数据。一般是纯显示的组件比较多。 共享状态的通过 vuex 来处理。 ## TODO: 1. module state 2. 新项目以 ES2018 为基准,选择 stage 3 的特性,将常用的特性列表在 readme 中给出网址 3. 目前(2019-01-31),iview 和 elementui 都已经明确表示它们不支持移动端(在移动端组件的显示不是很完美)。移动端的策略需要另外讨论。[quasar](https://github.com/quasarframework/quasar) [vux](https://github.com/airyland/vux) [vuetify](https://github.com/vuetifyjs/vuetify) 4. animation 以 iview 内部为主。个别地方需要定制的话,可以自制动画,或采用 animated.js 5. iview 处理 less 的主题修改有问题 [github issue](https://github.com/iview/iview/issues/4156) 考虑通过单独的项目来定制主题 [iview docs](https://www.iviewui.com/docs/guide/theme) 6. 路由设计: 目录;auth. 根据用户的角色动态生成 routes? 7. form 校验。form 表单数据与 URL 同步,浏览器后退根据 URL 回填 form,回填时 URL 优先 form 默认值;使用表单查询或翻页时,使用表单数据,然后根据表单数据更新 URL,会造成 component update? 8. 组件传递消息: props, vuex, event 9. 布局建议。侧边栏,顶部导航栏,页脚。内容页。 10. loading. 11. message. global config. 页面内反馈。系统消息。 12. router: component cache 13. 组件可选。比如消息列表。 14. mock。 15. 浏览器探测,提示升级。 16. chart: echarts optional 17. 百度统计 18. sourcemap 在各个环境中的设置 19. \$http 可以统一使用一套,做好错误捕获就可以了。在登录和退出接口设置好 token。 ### 参考资料 1. [Vue-pizza](https://github.com/prograhammer/vue-pizza) 1. [Error handling with async-await in Vue and Vuex](https://dimitrioslytras.com/vue-error-handling/)