设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 重新 试卷 创业者
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

透过现象看本质: 常见的前端架构风格和案例(4)

发布时间:2019-10-11 14:38 所属栏目:21 来源:_sx_
导读:下面是典型的AngularJS代码, 视图层: h2Todo/h2 divng-controller=TodoListControllerastodoList span{{todoList.remaining()}}of{{todoList.todos.length}}remaining/span [ahref=ng-click=todoList.archive()arch

下面是典型的AngularJS代码, 视图层:

  1. <h2>Todo</h2> 
  2. <div ng-controller="TodoListController as todoList"> 
  3.  <span>{{todoList.remaining()}} of {{todoList.todos.length}} remaining</span> 
  4.  [ <a href="" ng-click="todoList.archive()">archive</a> ] 
  5.  <ul class="unstyled"> 
  6.  <li ng-repeat="todo in todoList.todos"> 
  7.  <label class="checkbox"> 
  8.  <input type="checkbox" ng-model="todo.done"> 
  9.  <span class="done-{{todo.done}}">{{todo.text}}</span> 
  10.  </label> 
  11.  </li> 
  12.  </ul> 
  13.  <form ng-submit="todoList.addTodo()"> 
  14.  <input type="text" ng-model="todoList.todoText" size="30" 
  15.  placeholder="add new todo here"> 
  16.  <input class="btn-primary" type="submit" value="add"> 
  17.  </form> 
  18. </div> 

逻辑层:

  1. angular.module('todoApp', []) 
  2.  .controller('TodoListController', function() { 
  3.  var todoList = this; 
  4.  todoList.todos = [ 
  5.  {text:'learn AngularJS', done:true}, 
  6.  {text:'build an AngularJS app', done:false}]; 
  7.  todoList.addTodo = function() { 
  8.  todoList.todos.push({text:todoList.todoText, done:false}); 
  9.  todoList.todoText = ''; 
  10.  }; 
  11.  todoList.remaining = function() { 
  12.  var count = 0; 
  13.  angular.forEach(todoList.todos, function(todo) { 
  14.  count += todo.done ? 0 : 1; 
  15.  }); 
  16.  return count; 
  17.  }; 
  18.  todoList.archive = function() { 
  19.  var oldTodos = todoList.todos; 
  20.  todoList.todos = []; 
  21.  angular.forEach(oldTodos, function(todo) { 
  22.  if (!todo.done) todoList.todos.push(todo); 
  23.  }); 
  24.  }; 
  25. }); 

至于MVP、MVVM,这些MVC模式的延展或者升级,网上都大量的资源,这里就不予赘述。

Redux

Redux是Flux架构的改进、融合了Elm语言中函数式的思想. 下面是Redux的架构图:

程序员透过现象看本质:常见的前端架构风格和案例

从上图可以看出Redux架构有以下要点:

  • 单一的数据源.
  • 单向的数据流.

单一数据源, 首先解决的是传统MVC架构多模型数据流混乱问题(如下图)。单一的数据源可以让应用的状态可预测和可被调试。另外单一数据源也方便做数据镜像,实现撤销/重做,数据持久化等等功能

程序员透过现象看本质:常见的前端架构风格和案例

单向数据流用于辅助单一数据源, 主要目的是阻止应用代码直接修改数据源,这样一方面简化数据流,同样也让应用状态变化变得可预测。

上面两个特点是Redux架构风格的核心,至于Redux还强调不可变数据、利用中间件封装副作用、范式化状态树,只是一种最佳实践。还有许多类Redux的框架,例如Vuex、ngrx,在架构思想层次是一致的:

程序员透过现象看本质:常见的前端架构风格和案例

复制风格

程序员透过现象看本质:常见的前端架构风格和案例

基于复制(Replication)风格的系统,会利用多个实例提供相同的服务,来改善服务的可访问性和可伸缩性,以及性能。这种架构风格可以改善用户可察觉的性能,简单服务响应的延迟。

这种风格在后端用得比较多,举前端比较熟悉的例子,NodeJS. NodeJS是单线程的,为了利用多核资源,NodeJS标准库提供了一个cluster模块,它可以根据CPU数创建多个Worker进程,这些Worker进程可以共享一个服务器端口,对外提供同质的服务, Master进程会根据一定的策略将资源分配给Worker:

  1. const cluster = require('cluster'); 
  2. const http = require('http'); 
  3. const numCPUs = require('os').cpus().length; 
  4. if (cluster.isMaster) { 
  5.  console.log(`Master ${process.pid} is running`); 
  6.  // Fork workers.for (let i = 0; i < numCPUs; i++) { 
  7.  cluster.fork(); 
  8.  } 
  9.  cluster.on('exit', (worker, code, signal) => { 
  10.  console.log(`worker ${worker.process.pid} died`); 
  11.  }); 
  12. } else { 
  13.  // Workers可以共享任意的TCP连接 // 比如共享HTTP服务器  
  14.  http.createServer((req, res) => { 
  15.  res.writeHead(200); 
  16.  res.end('hello world 
  17. '); 
  18.  }).listen(8000); 
  19.  console.log(`Worker ${process.pid} started`); 
  20. 复制代码 

利用多核能力可以提升应用的性能和可靠性。我们也可以利用PM2这样的进程管理工具,来简化Node集群的管理,它支持很多有用的特性,例如集群节点重启、日志归集、性能监视等。

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读