如何更加优雅的维护 AngularJS 项目

480 阅读2分钟

是的,现在谈 AngularJS 似乎是有点过时了,如果你跟我一样,还在不得不维护一个 AngularJS 的项目,并且还有新功能的需求需要添加,如果在老项目的基础上更加优雅的写 AngularJS 呢?

这里有一个 AngularJS style guild: github.com/toddmotto/a…

根据我最近的经验,至少能做的有几部分:

  • 假设你的项目已经是 AngularJS 1.5 以上,并且使用 webpack 或者至少支持 ES6.
  • 组件层使用 Component 代替 Directive.
  • 在 Component 中使用 ControllerAS vm, 将所有的业务逻辑写到 Controller 中,也就是 Visual Model 中,将 Visual Model 作为 View (HTML)和 Model (API 返回的 JSON data)沟通的桥梁。(从 controllerAs 可以看出,controller 的真实身份应该是 visual model, 从 MVC to MVVM 的对应关系里应该也可以看出来)
  • 使用 controllerAs vm 替代 scope 与 HTML 交互。(本质上,scope.vm = new Controller(), controller 是一个 class)
  • 路由层使用 Component Based Route 代替 Controller Based Route.
  • 将 API 封装到 Service 中。
  • 将 Route Resolve 的逻辑移到 Service 中,这样 Resolve 中的逻辑就会变得简单。
  • 如果业务逻辑复杂,可以考虑引入状态管理。 Guide 中提到了 AngularJS 中使用 Redux。其实 Mobx 或者 Redux 都有响应的库支持。
  • 当你使用 Component 的时候,就会发现,Componentnt 本质上就是一个 JSON,所有的业务逻辑都写到 controller 中。并且,bindings, 也会默认添加到 controller 上面。而实际上,熟悉,Vue 的同学也知道,visual model 上的数据也是有一定区分以及生命周期的。比如 Vue 会把 Visual Model 上的属性分为,Data,Computed, Methods, 在 Controller 中也可以做类似的区分,只是需要认为的来分割。很容易想到的是,我们其实可以写一个 Component Class,参数是: { data, computed, methods }, 然后将参数人为地 APPLY 到 controller 中,这样,就可以将 visual model 中的角色区分化,甚至不再需要手动写 controller class.
  • 第二大改进是「状态管理工具」。我在做的时候,调研的了 Redux 和 Mobox,发现对我正在维护的小型项目来说,都过于复杂了。最后还是跟 Component 一样,仿照 Vuex 的功能写了一个简单的基于 Service 的状态管理,发现也很好用。
  • 手写的 Component Class, 和 Store Class 都在这里: www.npmjs.com/package/vue… 目前只在自己的小项目上使用了一段时间,如果有需要,我再改进。