惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
News and Events Feed by Topic
S
Security @ Cisco Blogs
S
Secure Thoughts
Attack and Defense Labs
Attack and Defense Labs
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Hacker News - Newest:
Hacker News - Newest: "LLM"
Recent Commits to openclaw:main
Recent Commits to openclaw:main
H
Hacker News: Front Page
博客园 - 叶小钗
H
Heimdal Security Blog
Microsoft Security Blog
Microsoft Security Blog
Forbes - Security
Forbes - Security
AI
AI
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
T
Troy Hunt's Blog
罗磊的独立博客
Application and Cybersecurity Blog
Application and Cybersecurity Blog
爱范儿
爱范儿
GbyAI
GbyAI
The Last Watchdog
The Last Watchdog
TaoSecurity Blog
TaoSecurity Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
D
DataBreaches.Net
Recent Announcements
Recent Announcements
Schneier on Security
Schneier on Security
C
Cisco Blogs
美团技术团队
D
Docker
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
WordPress大学
WordPress大学
月光博客
月光博客
雷峰网
雷峰网
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
H
Hackread – Cybersecurity News, Data Breaches, AI and More
A
Arctic Wolf
B
Blog RSS Feed
Cisco Talos Blog
Cisco Talos Blog
C
Cybersecurity and Infrastructure Security Agency CISA
V
Vulnerabilities – Threatpost
V2EX - 技术
V2EX - 技术
Y
Y Combinator Blog
N
News and Events Feed by Topic
www.infosecurity-magazine.com
www.infosecurity-magazine.com
W
WeLiveSecurity
Security Archives - TechRepublic
Security Archives - TechRepublic
G
GRAHAM CLULEY
Jina AI
Jina AI
Hugging Face - Blog
Hugging Face - Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
The Hacker News
The Hacker News

Meteor

meteor 更新 1.7 后是不是原来项目无法在新版本运行了 - V2EX Meteor 在国内无法安装包怎么办? - V2EX 强烈建议、要求喜欢 Meteor 的同学们一起搞个 Meteor 社区吧 - V2EX 使用 Meteor 开发一个社交网络 APP - V2EX 面向 小白开发者 和 专业开发者 的 Meteor - V2EX Meteor 创始人眼中的计算终端发展简史 - V2EX 我最近光说 Meteor 的好话了,为了更好的看清事物正反面,请大家帮忙来使劲儿拍、吐槽 Meteor 吧~ - V2EX 一个围绕 Meteor 的微信公众号:两个圆点一条直线 - V2EX 第一届( 2016)中国 Meteor 技术峰会 - V2EX meteor 框架适合用在互联网类平台吗 分享:最近在学 Meteor 结合 React,使用 FlowRouter 做路由和 react-layout 布局,以及 Semantic-UI 界面 - V2EX 玩 Meteor 踩过的陨石坑总结 - V2EX 试用了两天 Meteor 觉得很不错 用 Meteor 做了个站,大家可以来凑凑 - V2EX 有 V 友用 Meteor.js 做正式的产品吗?进来讨论一下 楼主是个偏执狂 - V2EX Meteor 中文社区上线啦!! - V2EX 请问 meteor build 出来的 iOS app 能够直接发布到 Appstore 吗? - V2EX linux 下面使用 meteor build 不加 --debug 参数的话无法生成出 bundle。 - V2EX CNAME 到 origin.meteor.com 的网站无法访问怎么破? - V2EX Meteor 1.0 - V2EX 是不是应该成立一个 MeteorChina 社区呢?因为我发现连一份最新版的 Doc 翻译都没有。 - V2EX 很好奇 Meteorpedia 这个 wiki 是用什么软件驱动的? - V2EX Band ~ Let`s play music together - V2EX MeteorDay - V2EX Kadira - V2EX 一个超级简单版的 slack - V2EX 2014 Meteor Challenge 还剩余 2 天 - V2EX 国内有多少 Meteor 开发者? - V2EX Meteor News - V2EX 技术选型使用meteor的创业公司 - V2EX meteor.js 匿名信息板 - V2EX Telescope - V2EX meteor 6.0有什么新变化吗? - V2EX meteor的google中文论坛地址,大家进论坛交流啦 - V2EX 一个修改 Essay 的小工具 - V2EX Meteor 开始给 contributor 发 T-shirt 了,大家有收到邮件吗? - V2EX Meteor有个很大的问题 - V2EX 我用Meteor和Telescope搭的一个JavaScript分享网站 - V2EX 初学Meteor的几个讨论 - V2EX 全国铁路数据的可视化app - V2EX 请问如何安装 meteorite(atmosphere 的 package) ? - V2EX meteor是个好东西,但是浏览器可以直接改数据的问题怎么解决啊? - V2EX Meteor 0.5.1 发布 - V2EX Meteor-BBS可有删帖、改帖、移帖等功能? - V2EX Meteor 0.5.0: 数据库权限控制、账户系统和新的视频教程 - V2EX Meteor-BBS v0.2 发布,支持 QQ 登录和简单的权限控制了 - V2EX Secure Remote Password protocol - V2EX Installer & smart package manager for Meteor - Meteorite - V2EX 用 Meteor 克隆了一个实时的 V2EX - V2EX
Meteor Mantra 介绍 - V2EX
russj · 2016-07-09 · via Meteor

Mantra 是一种基于 Meteor 1.3+、 React 和 ES2015 的应用程序架构。它不是一个框架,而是一套如何构建 Meteor App 的标准,同时也有一套相关开源库来提高代码编写效率。

简单来说, Mantra 是关于如何组织你的 Meteor 应用代码的标准,特别是前端部分 (基于 React),当然它对后端代码的组织也有要求。

如果你熟悉 React , Mantra 类似于 Flux ,讲究的是对数据流的控制,但是规定得更加细致。

目的

Mantra 的目的是让程序写出更易于理解和维护的代码。它对几乎所有的情况都有一个标准,另外还为 Meteor App 增加单元测试覆盖率。

和 Perl 类似, JavaScript 的一个难点就是同样一个问题有太多实现方式,而且可能都是最佳解决方案。所以经常是不同的人使用不同的方法。 Mantra 让 Meteor App 有一个统一的结构,遵循相同的标准,就像设计模式一样,降低大家理解代码结构的难度,确保模块之间解耦,像 Flux 一样让数据单向流动,这样维护代码更加容易。

Mantra 使用的原则很有前瞻性,能够很长时间不会过时,同时也允许其他人做必要的改变。

偏重前端

现在的 Web App 的大部分代码都是在前端。后端的代码逻辑相对简单也好管理,后端的难点在于性能优化,特别是大并发的处理,数据库等。

Mantra 的核心在如何组织客户端代码。它倡导前后端代码分离,前端不用知道后端代码是如何实现的,但是可以代码共享。因为是基于 React 又侧重前端,所以 Mantra 很类似 React 的那些标准,例如 Flux , Redux 等,解决的问题也类似,都是控制数据流 data flow ,让代码更易理解维护。如果你对 React 熟悉,理解 Mantra 就不难。如果理解有困难,建议多看看 React 的高级用法,例如 stateless/pure function , Higher Order Components 等。

Mantra 不相信 Universal App ,就是不相信一套前端代码适应所有终端平台。它鼓励一套后端代码,但是为每个前端平台开发单独的 app 来提高用户体验,尽量通过模块化来共享代码。


其他 Mantra 的基本介绍可以参看这篇中文翻译 http://www.jianshu.com/p/96d6b8e64c3a

下面我来详细解释 Mantra 的各个部件。


这里介绍的顺序和文档里的不一样,主要是先从新的概念介绍,不然对已经熟悉的也难理解。

Application Context

应用上下文 context 对所有 action 和 container 开放读取,所以这是你分享变量的地方。

import * as Collections from '/lib/collections';
import {Meteor} from 'meteor/meteor';
import {FlowRouter} from 'meteor/kadira:flow-router';
import {ReactiveDict} from 'meteor/reactive-dict';
import {Tracker} from 'meteor/tracker';

export default function () { 
  return { 
    Meteor, 
    FlowRouter, 
    Collections, 
    LocalState: new ReactiveDict(), 
    Tracker 
  };
}

从上面例子中可以看出, context 可以让大家少写重复的代码,又可以在不同模块之间分享变量。

Actions

处理业务逻辑的模块。包括验证,状态管理和远程数据交互。

Action 就是一个简单的函数而已,第一个参数必须是应用的上下文 Context 。 Action 不得使用引入除了参数以外的任何变量和模块,甚至全局变量,但是可以使用库函数。

export default { 
  create({Meteor, LocalState, FlowRouter}, title, content) { 
    if (!title || !content) { 
      return LocalState.set('SAVING_ERROR', 'Title & Content are required!'); 
    } 

    LocalState.set('SAVING_ERROR', null); 

    const id = Meteor.uuid(); 
    // There is a method stub for this in the config/method_stubs 
    // That's how we are doing latency compensation 
    Meteor.call('posts.create', id, title, content, (err) => { 
      if (err) { 
        return LocalState.set('SAVING_ERROR', err.message); 
      } 
    }); 
    FlowRouter.go(`/post/${id}`); 
  }, 
  clearErrors({LocalState}) { 
    return LocalState.set('SAVING_ERROR', null); 
  }
};

UI

Mantra 只使用 React 作为 UI 组件。

在 UI 组件内部不需要知道 App 的其他任何内容,也不应该读取和修改应用的 state 。 UI 使用到的数据和事件应该由 props 从 container 传入,或者通过事件作为 action props 传入。如果 UI 组件使用到本地 state ,那么这个 state 不应该被外部的任何组件使用,仅限于组件内部使用。

Mantra 文档里给出的代码示例:

import React from 'react';

const PostList = ({posts}) => ( 
  <div className='postlist'> 
    <ul> 
      {posts.map(post => ( 
        <li key={post._id}> 
          <a href={`/post/${post._id}`}>{post.title}</a> 
       </li> ))} 
    </ul> 
  </div>
);

export default PostList;

上面的例子代码就是 React 里的无状态纯函数实现, UI 只负责展示界面,没有逻辑、状态等处理。

State 管理

有两种状态:本地状态(客户端)和远程状态(服务器)。本地状态不和外界发生联系;远程状态需要和外界,例如数据库同步数据。

类似 Flux 里的 store 概念 (可参考 使用 Meteor 和 React 开发 Web App ), Meteor 有不同的方式实现,例如 MiniMongo , ReactiveDict 等。 Mantra 在这方面很灵活,没有要求用哪一种。但是还是有一些规则

  • Action 里可以读写 state
  • Container 里只能读 state
  • UI 组件里既不能读也不能写 state ,只能由 props 传入

Dependency Injection 依赖注入

首先,什么是依赖? Mantra 有两种依赖

  1. context - 通常就是配置, models 和各种数据
  2. actions - 业务逻辑。每个 action 都以 context 为第一个参数

例如:

const context = { 
  DB, 
  Router, 
  appName: 'My Blog'
};

const actions = { 
  posts: { 
    create({DB, Router}, title, content) { 
      const id = String(Math.random()); 
      DB.createPost(id, title, content); 
      Router.go(`/post/${id}`); 
    } 
  }
};

然后注入依赖。 Mantra 使用 react-simple-di 这个包来进行依赖注入。背后其实就是 React context 。这个包接受 Context 和 Actions 作为依赖。

import {injectDeps} from 'react-simple-di';
import Layout from './layout.jsx';

// 上面定义的 context 和 actions 定义在这里

const LayoutWithDeps = injectDeps(context, actions)(Layout);

现在 LayoutWithDeps 就可以在 app 里随意使用了。

如何使用依赖?

首先创建一个 UI 组件。可以看到这个组件的依赖是通过 props 传入的

class CreatePost extends React.Component { 
  render() { 
    const {appName} = this.props; 
    return ( 
      <div> 
        Create a blog post on app: ${appName}. <br/> 
        <button onClick={this.create.bind(this)}>Create Now</button> 
      </div>  
    ); 
  } 

  create() { 
    const {createPost} = this.props; 
    createPost('My Blog Title', 'Some Content'); 
  }
}

使用依赖

const {useDeps} from 'react-simple-di';

// 前面定义的 CreatePost react 组件 

const depsToPropsMapper = (context, actions) => ({ 
  appName: context.appName, 
  createPost: actions.posts.create
});

const CreatePostWithDeps = useDeps(depsToPropsMapper)(CreatePost);

如果你没有定义自己的 mapper 函数(就是上面的 depsToPropsMapper ), useDeps 将使用下面的默认 mapper 函数,这样就可以直接使用 context 和 actions 了。

const mapper = (context, actions) => ({ 
  context: () => context, 
  actions: () => actions
});

Mantra 使用依赖注入的目的是隔离代码。例如隔离 UI 组件和 actions 。

一旦配置好, Applicaton Context 就会被注入到把 Context 作为第一参数的 action 。

Container 同样也能读取 Application Context 。

不能在子组件里注入依赖,只能是最上层组件,通常就是 Layout Component ,例如下面代码。

import React from 'react';
export default function (injectDeps) { 
  // See: Injecting Deps 
  const MainLayoutCtx = injectDeps(MainLayout); 
  // Routes related code
}

Container

Container 的作用是集成、组装数据。它的中文意思是容器,里面包裹的就是 UI 组件。主要功能:

  • 处理 state ,处理后把值通过 props 传入 UI 组件
  • 把 action 传入 UI 组件
  • 把应用 Context 传入 UI 组件

Container 是一个 React 组件。如这篇文章所述的 Controller-View

Flux

如上图所示,使用一个父组件,就是 Mantra 的 container 来监听数据的变化,子组件 UI Component 负责界面渲染和互动。 Controller 就是高阶组件 (Higher Order Components) HOC 来包裹 UI 组件。高阶组件负责数据查询,子组件负责渲染等。

Mantra 使用 react ‐ komposer 来作为 container 获取数据状态。

container 的规则

  • 每个 jsx 文件只能有一个 container ,而且这个 container 应该是默认 export
  • composer 和 mapper 函数应该从 container 模块输出
  • composer 函数只能使用从 props 输入的值
  • mapper 应该是纯函数

Note: 基于 Mantra Draft 0.2.0