
\u6211\u770b\u5b98\u65b9\u6559\u7a0b\u53ca\u901a\u7528\u6559\u7a0b\u597d\u50cf\u90fd\u65e0\u6cd5\u76f4\u63a5\u8fd0\u884c\n\u6709\u7684\u63d0\u793a\u6570\u636e\u5e93\u6240\u5728\u6587\u4ef6\u7cfb\u7edf nfs \u6ca1\u6709\u9501\u673a\u5236\u8fd8\u662f\u4e0d\u652f\u6301\u9501
\n" }, { "author": { "url": "member/firstfeel", "name": "firstfeel", "avatar": "https://cdn.v2ex.com/gravatar/85a30e7ba9d1ee80f9767cf8f19504cc?s=73&d=retro" }, "url": "t/332614", "title": "Meteor \u5728\u56fd\u5185\u65e0\u6cd5\u5b89\u88c5\u5305\u600e\u4e48\u529e\uff1f", "id": "t/332614", "date_published": "2017-01-06T02:32:53+00:00", "content_html": "\u6211\u4f7f\u7528\u7684\u662f\u963f\u91cc\u4e91\u670d\u52a1\u5668\u3002\u662f\u53ef\u4ee5\u5b89\u88c5 Meteor \u6846\u67b6\u7684\uff0c\u4f46\u5728\u521b\u5efa\u5e94\u7528\u5e76 Meteor update \u65f6\uff0c\u6216\u8005\u5b89\u88c5 flow-router \u7b49\u5305\u65f6\uff0c\u5b8c\u5168\u5361\u4f4f\uff0c\u5b89\u88c5\u4e0d\u4e86\u3002
\n\u5404\u4f4d\u5927\u795e\uff0c\u8bf7\u6559\u5982\u4f55\u89e3\u51b3\u6b64\u95ee\u9898, \u8c22\u8c22\uff01
\n" }, { "author": { "url": "member/firstfeel", "name": "firstfeel", "avatar": "https://cdn.v2ex.com/gravatar/85a30e7ba9d1ee80f9767cf8f19504cc?s=73&d=retro" }, "url": "t/325696", "title": "\u5f3a\u70c8\u5efa\u8bae\u3001\u8981\u6c42\u559c\u6b22 Meteor \u7684\u540c\u5b66\u4eec\u4e00\u8d77\u641e\u4e2a Meteor \u793e\u533a\u5427", "id": "t/325696", "date_published": "2016-12-06T08:20:54+00:00", "content_html": "\u8fd9\u4e00\u65f6\u95f4\u8ff7\u4e0a\u4e86 Meteorjs \u6846\u67b6\u3002\u4e00\u8fb9\u770b docs.meteor.com \u3001 guide.meteor.com \uff0c\u540c\u65f6\u4e5f\u5728\u770b Meteor in Action \uff0c Getting Started with Meteor.js Javascript Framework, Second Edition \u7b49\u4e66\u3002
\n\u540c\u65f6\u53c8\u5f88\u5b64\u72ec\uff0c\u60f3\u4ea4\u6d41\u3001\u5b66\u4e60\uff0c\u5374\u6ca1\u6709\u5730\u65b9\u3002 meteorhub.org \u51e0\u4e4e\u6253\u4e0d\u5f00\uff0c\u56fd\u5185\u4f3c\u4e4e\u4e5f\u6ca1\u6709\u793e\u533a\u53ef\u4ee5\u53bb\u4e0a\u9762\u5b66\u4e60\u7684\u3002\u540e\u6765\u81ea\u5df1\u8349\u8349\u5f04\u4e86\u4e2a\u7f51\u7ad9 https://www.ameteor.com \u3002
\n\u771f\u8bda\u7684\u5e0c\u671b\u6709\u559c\u6b22 Meteor \u7684\u670b\u53cb\uff0c\u53ef\u4ee5\u4e00\u8d77\u505a\u4e00\u4e0b\u8fd9\u4e2a\u4e8b\u60c5\uff0c \u5c31\u662f\u5f04\u4e2a\u9ad8\u8d28\u91cf\u7684 Meteor \u793e\u533a\u7f51\u7ad9\uff0c\u8ba9\u66f4\u591a\u559c\u6b22 Meteor \u7684\u670b\u53cb\u53ef\u4ee5\u805a\u5728\u5730\u4e00\u8d77\u5b66\u4e60\u3001\u4ea4\u6d41\u3002
\n\u8c22\u8c22\u5927\u5bb6\u3002
\n" }, { "author": { "url": "member/russj", "name": "russj", "avatar": "https://cdn.v2ex.com/avatar/1592/2281/27571_large.png?m=1490880089" }, "url": "t/291316", "title": "Meteor Mantra \u4ecb\u7ecd", "id": "t/291316", "date_published": "2016-07-09T03:15:33+00:00", "content_html": "Mantra \u662f\u4e00\u79cd\u57fa\u4e8e Meteor 1.3+\u3001 React \u548c ES2015 \u7684\u5e94\u7528\u7a0b\u5e8f\u67b6\u6784\u3002\u5b83\u4e0d\u662f\u4e00\u4e2a\u6846\u67b6\uff0c\u800c\u662f\u4e00\u5957\u5982\u4f55\u6784\u5efa Meteor App \u7684\u6807\u51c6\uff0c\u540c\u65f6\u4e5f\u6709\u4e00\u5957\u76f8\u5173\u5f00\u6e90\u5e93\u6765\u63d0\u9ad8\u4ee3\u7801\u7f16\u5199\u6548\u7387\u3002
\n\u7b80\u5355\u6765\u8bf4\uff0c Mantra \u662f\u5173\u4e8e\u5982\u4f55\u7ec4\u7ec7\u4f60\u7684 Meteor \u5e94\u7528\u4ee3\u7801\u7684\u6807\u51c6\uff0c\u7279\u522b\u662f\u524d\u7aef\u90e8\u5206 (\u57fa\u4e8e React)\uff0c\u5f53\u7136\u5b83\u5bf9\u540e\u7aef\u4ee3\u7801\u7684\u7ec4\u7ec7\u4e5f\u6709\u8981\u6c42\u3002
\n\u5982\u679c\u4f60\u719f\u6089 React \uff0c Mantra \u7c7b\u4f3c\u4e8e Flux \uff0c\u8bb2\u7a76\u7684\u662f\u5bf9\u6570\u636e\u6d41\u7684\u63a7\u5236\uff0c\u4f46\u662f\u89c4\u5b9a\u5f97\u66f4\u52a0\u7ec6\u81f4\u3002
\nMantra \u7684\u76ee\u7684\u662f\u8ba9\u7a0b\u5e8f\u5199\u51fa\u66f4\u6613\u4e8e\u7406\u89e3\u548c\u7ef4\u62a4\u7684\u4ee3\u7801\u3002\u5b83\u5bf9\u51e0\u4e4e\u6240\u6709\u7684\u60c5\u51b5\u90fd\u6709\u4e00\u4e2a\u6807\u51c6\uff0c\u53e6\u5916\u8fd8\u4e3a Meteor App \u589e\u52a0\u5355\u5143\u6d4b\u8bd5\u8986\u76d6\u7387\u3002
\n\u548c Perl \u7c7b\u4f3c\uff0c Javascript \u7684\u4e00\u4e2a\u96be\u70b9\u5c31\u662f\u540c\u6837\u4e00\u4e2a\u95ee\u9898\u6709\u592a\u591a\u5b9e\u73b0\u65b9\u5f0f\uff0c\u800c\u4e14\u53ef\u80fd\u90fd\u662f\u6700\u4f73\u89e3\u51b3\u65b9\u6848\u3002\u6240\u4ee5\u7ecf\u5e38\u662f\u4e0d\u540c\u7684\u4eba\u4f7f\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\u3002 Mantra \u8ba9 Meteor App \u6709\u4e00\u4e2a\u7edf\u4e00\u7684\u7ed3\u6784\uff0c\u9075\u5faa\u76f8\u540c\u7684\u6807\u51c6\uff0c\u5c31\u50cf\u8bbe\u8ba1\u6a21\u5f0f\u4e00\u6837\uff0c\u964d\u4f4e\u5927\u5bb6\u7406\u89e3\u4ee3\u7801\u7ed3\u6784\u7684\u96be\u5ea6\uff0c\u786e\u4fdd\u6a21\u5757\u4e4b\u95f4\u89e3\u8026\uff0c\u50cf Flux \u4e00\u6837\u8ba9\u6570\u636e\u5355\u5411\u6d41\u52a8\uff0c\u8fd9\u6837\u7ef4\u62a4\u4ee3\u7801\u66f4\u52a0\u5bb9\u6613\u3002
\nMantra \u4f7f\u7528\u7684\u539f\u5219\u5f88\u6709\u524d\u77bb\u6027\uff0c\u80fd\u591f\u5f88\u957f\u65f6\u95f4\u4e0d\u4f1a\u8fc7\u65f6\uff0c\u540c\u65f6\u4e5f\u5141\u8bb8\u5176\u4ed6\u4eba\u505a\u5fc5\u8981\u7684\u6539\u53d8\u3002
\n\u73b0\u5728\u7684 Web App \u7684\u5927\u90e8\u5206\u4ee3\u7801\u90fd\u662f\u5728\u524d\u7aef\u3002\u540e\u7aef\u7684\u4ee3\u7801\u903b\u8f91\u76f8\u5bf9\u7b80\u5355\u4e5f\u597d\u7ba1\u7406\uff0c\u540e\u7aef\u7684\u96be\u70b9\u5728\u4e8e\u6027\u80fd\u4f18\u5316\uff0c\u7279\u522b\u662f\u5927\u5e76\u53d1\u7684\u5904\u7406\uff0c\u6570\u636e\u5e93\u7b49\u3002
\nMantra \u7684\u6838\u5fc3\u5728\u5982\u4f55\u7ec4\u7ec7\u5ba2\u6237\u7aef\u4ee3\u7801\u3002\u5b83\u5021\u5bfc\u524d\u540e\u7aef\u4ee3\u7801\u5206\u79bb\uff0c\u524d\u7aef\u4e0d\u7528\u77e5\u9053\u540e\u7aef\u4ee3\u7801\u662f\u5982\u4f55\u5b9e\u73b0\u7684\uff0c\u4f46\u662f\u53ef\u4ee5\u4ee3\u7801\u5171\u4eab\u3002\u56e0\u4e3a\u662f\u57fa\u4e8e React \u53c8\u4fa7\u91cd\u524d\u7aef\uff0c\u6240\u4ee5 Mantra \u5f88\u7c7b\u4f3c React \u7684\u90a3\u4e9b\u6807\u51c6\uff0c\u4f8b\u5982 Flux \uff0c Redux \u7b49\uff0c\u89e3\u51b3\u7684\u95ee\u9898\u4e5f\u7c7b\u4f3c\uff0c\u90fd\u662f\u63a7\u5236\u6570\u636e\u6d41 data flow \uff0c\u8ba9\u4ee3\u7801\u66f4\u6613\u7406\u89e3\u7ef4\u62a4\u3002\u5982\u679c\u4f60\u5bf9 React \u719f\u6089\uff0c\u7406\u89e3 Mantra \u5c31\u4e0d\u96be\u3002\u5982\u679c\u7406\u89e3\u6709\u56f0\u96be\uff0c\u5efa\u8bae\u591a\u770b\u770b React \u7684\u9ad8\u7ea7\u7528\u6cd5\uff0c\u4f8b\u5982 stateless/pure function \uff0c Higher Order Components \u7b49\u3002
\nMantra \u4e0d\u76f8\u4fe1 Universal App \uff0c\u5c31\u662f\u4e0d\u76f8\u4fe1\u4e00\u5957\u524d\u7aef\u4ee3\u7801\u9002\u5e94\u6240\u6709\u7ec8\u7aef\u5e73\u53f0\u3002\u5b83\u9f13\u52b1\u4e00\u5957\u540e\u7aef\u4ee3\u7801\uff0c\u4f46\u662f\u4e3a\u6bcf\u4e2a\u524d\u7aef\u5e73\u53f0\u5f00\u53d1\u5355\u72ec\u7684 app \u6765\u63d0\u9ad8\u7528\u6237\u4f53\u9a8c\uff0c\u5c3d\u91cf\u901a\u8fc7\u6a21\u5757\u5316\u6765\u5171\u4eab\u4ee3\u7801\u3002
\n\u5176\u4ed6 Mantra \u7684\u57fa\u672c\u4ecb\u7ecd\u53ef\u4ee5\u53c2\u770b\u8fd9\u7bc7\u4e2d\u6587\u7ffb\u8bd1 http://www.jianshu.com/p/96d6b8e64c3a
\n\u4e0b\u9762\u6211\u6765\u8be6\u7ec6\u89e3\u91ca Mantra \u7684\u5404\u4e2a\u90e8\u4ef6\u3002
\n\u8fd9\u91cc\u4ecb\u7ecd\u7684\u987a\u5e8f\u548c\u6587\u6863\u91cc\u7684\u4e0d\u4e00\u6837\uff0c\u4e3b\u8981\u662f\u5148\u4ece\u65b0\u7684\u6982\u5ff5\u4ecb\u7ecd\uff0c\u4e0d\u7136\u5bf9\u5df2\u7ecf\u719f\u6089\u7684\u4e5f\u96be\u7406\u89e3\u3002
\n\u5e94\u7528\u4e0a\u4e0b\u6587 context \u5bf9\u6240\u6709 action \u548c container \u5f00\u653e\u8bfb\u53d6\uff0c\u6240\u4ee5\u8fd9\u662f\u4f60\u5206\u4eab\u53d8\u91cf\u7684\u5730\u65b9\u3002
\nimport * as Collections from '/lib/collections';\nimport {Meteor} from 'meteor/meteor';\nimport {FlowRouter} from 'meteor/kadira:flow-router';\nimport {ReactiveDict} from 'meteor/reactive-dict';\nimport {Tracker} from 'meteor/tracker';\n\nexport default function () { \n return { \n Meteor, \n FlowRouter, \n Collections, \n LocalState: new ReactiveDict(), \n Tracker \n };\n}\n\n\u4ece\u4e0a\u9762\u4f8b\u5b50\u4e2d\u53ef\u4ee5\u770b\u51fa\uff0c context \u53ef\u4ee5\u8ba9\u5927\u5bb6\u5c11\u5199\u91cd\u590d\u7684\u4ee3\u7801\uff0c\u53c8\u53ef\u4ee5\u5728\u4e0d\u540c\u6a21\u5757\u4e4b\u95f4\u5206\u4eab\u53d8\u91cf\u3002
\n\u5904\u7406\u4e1a\u52a1\u903b\u8f91\u7684\u6a21\u5757\u3002\u5305\u62ec\u9a8c\u8bc1\uff0c\u72b6\u6001\u7ba1\u7406\u548c\u8fdc\u7a0b\u6570\u636e\u4ea4\u4e92\u3002
\nAction \u5c31\u662f\u4e00\u4e2a\u7b80\u5355\u7684\u51fd\u6570\u800c\u5df2\uff0c\u7b2c\u4e00\u4e2a\u53c2\u6570\u5fc5\u987b\u662f\u5e94\u7528\u7684\u4e0a\u4e0b\u6587 Context \u3002 Action \u4e0d\u5f97\u4f7f\u7528\u5f15\u5165\u9664\u4e86\u53c2\u6570\u4ee5\u5916\u7684\u4efb\u4f55\u53d8\u91cf\u548c\u6a21\u5757\uff0c\u751a\u81f3\u5168\u5c40\u53d8\u91cf\uff0c\u4f46\u662f\u53ef\u4ee5\u4f7f\u7528\u5e93\u51fd\u6570\u3002
\nexport default { \n create({Meteor, LocalState, FlowRouter}, title, content) { \n if (!title || !content) { \n return LocalState.set('SAVING_ERROR', 'Title & Content are required!'); \n } \n\n LocalState.set('SAVING_ERROR', null); \n\n const id = Meteor.uuid(); \n // There is a method stub for this in the config/method_stubs \n // That's how we are doing latency compensation \n Meteor.call('posts.create', id, title, content, (err) => { \n if (err) { \n return LocalState.set('SAVING_ERROR', err.message); \n } \n }); \n FlowRouter.go(`/post/${id}`); \n }, \n clearErrors({LocalState}) { \n return LocalState.set('SAVING_ERROR', null); \n }\n};\n\n\nMantra \u53ea\u4f7f\u7528 React \u4f5c\u4e3a UI \u7ec4\u4ef6\u3002
\n\u5728 UI \u7ec4\u4ef6\u5185\u90e8\u4e0d\u9700\u8981\u77e5\u9053 App \u7684\u5176\u4ed6\u4efb\u4f55\u5185\u5bb9\uff0c\u4e5f\u4e0d\u5e94\u8be5\u8bfb\u53d6\u548c\u4fee\u6539\u5e94\u7528\u7684 state \u3002 UI \u4f7f\u7528\u5230\u7684\u6570\u636e\u548c\u4e8b\u4ef6\u5e94\u8be5\u7531 props \u4ece container \u4f20\u5165\uff0c\u6216\u8005\u901a\u8fc7\u4e8b\u4ef6\u4f5c\u4e3a action props \u4f20\u5165\u3002\u5982\u679c UI \u7ec4\u4ef6\u4f7f\u7528\u5230\u672c\u5730 state \uff0c\u90a3\u4e48\u8fd9\u4e2a state \u4e0d\u5e94\u8be5\u88ab\u5916\u90e8\u7684\u4efb\u4f55\u7ec4\u4ef6\u4f7f\u7528\uff0c\u4ec5\u9650\u4e8e\u7ec4\u4ef6\u5185\u90e8\u4f7f\u7528\u3002
\nMantra \u6587\u6863\u91cc\u7ed9\u51fa\u7684\u4ee3\u7801\u793a\u4f8b:
\nimport React from 'react';\n\nconst PostList = ({posts}) => ( \n <div className='postlist'> \n <ul> \n {posts.map(post => ( \n <li key={post._id}> \n <a href={`/post/${post._id}`}>{post.title}</a> \n </li> ))} \n </ul> \n </div>\n);\n\nexport default PostList;\n\n\u4e0a\u9762\u7684\u4f8b\u5b50\u4ee3\u7801\u5c31\u662f React \u91cc\u7684\u65e0\u72b6\u6001\u7eaf\u51fd\u6570\u5b9e\u73b0\uff0c UI \u53ea\u8d1f\u8d23\u5c55\u793a\u754c\u9762\uff0c\u6ca1\u6709\u903b\u8f91\u3001\u72b6\u6001\u7b49\u5904\u7406\u3002
\n\u6709\u4e24\u79cd\u72b6\u6001:\u672c\u5730\u72b6\u6001\uff08\u5ba2\u6237\u7aef\uff09\u548c\u8fdc\u7a0b\u72b6\u6001\uff08\u670d\u52a1\u5668\uff09\u3002\u672c\u5730\u72b6\u6001\u4e0d\u548c\u5916\u754c\u53d1\u751f\u8054\u7cfb\uff1b\u8fdc\u7a0b\u72b6\u6001\u9700\u8981\u548c\u5916\u754c\uff0c\u4f8b\u5982\u6570\u636e\u5e93\u540c\u6b65\u6570\u636e\u3002
\n\u7c7b\u4f3c Flux \u91cc\u7684 store \u6982\u5ff5 \uff08\u53ef\u53c2\u8003 \u4f7f\u7528 Meteor \u548c React \u5f00\u53d1 Web App\n\uff09\uff0c Meteor \u6709\u4e0d\u540c\u7684\u65b9\u5f0f\u5b9e\u73b0\uff0c\u4f8b\u5982 MiniMongo \uff0c ReactiveDict \u7b49\u3002 Mantra \u5728\u8fd9\u65b9\u9762\u5f88\u7075\u6d3b\uff0c\u6ca1\u6709\u8981\u6c42\u7528\u54ea\u4e00\u79cd\u3002\u4f46\u662f\u8fd8\u662f\u6709\u4e00\u4e9b\u89c4\u5219
\n\u9996\u5148\uff0c\u4ec0\u4e48\u662f\u4f9d\u8d56\uff1f Mantra \u6709\u4e24\u79cd\u4f9d\u8d56
\n\u4f8b\u5982:
\nconst cOntext= { \n DB, \n Router, \n appName: 'My Blog'\n};\n\nconst actiOns= { \n posts: { \n create({DB, Router}, title, content) { \n const id = String(Math.random()); \n DB.createPost(id, title, content); \n Router.go(`/post/${id}`); \n } \n }\n};\n\n\u7136\u540e\u6ce8\u5165\u4f9d\u8d56\u3002 Mantra \u4f7f\u7528 react-simple-di \u8fd9\u4e2a\u5305\u6765\u8fdb\u884c\u4f9d\u8d56\u6ce8\u5165\u3002\u80cc\u540e\u5176\u5b9e\u5c31\u662f React context \u3002\u8fd9\u4e2a\u5305\u63a5\u53d7 Context \u548c Actions \u4f5c\u4e3a\u4f9d\u8d56\u3002
\nimport {injectDeps} from 'react-simple-di';\nimport Layout from './layout.jsx';\n\n// \u4e0a\u9762\u5b9a\u4e49\u7684 context \u548c actions \u5b9a\u4e49\u5728\u8fd9\u91cc\n\nconst LayoutWithDeps = injectDeps(context, actions)(Layout);\n\n\u73b0\u5728 LayoutWithDeps \u5c31\u53ef\u4ee5\u5728 app \u91cc\u968f\u610f\u4f7f\u7528\u4e86\u3002
\u5982\u4f55\u4f7f\u7528\u4f9d\u8d56\uff1f
\n\u9996\u5148\u521b\u5efa\u4e00\u4e2a UI \u7ec4\u4ef6\u3002\u53ef\u4ee5\u770b\u5230\u8fd9\u4e2a\u7ec4\u4ef6\u7684\u4f9d\u8d56\u662f\u901a\u8fc7 props \u4f20\u5165\u7684
\nclass CreatePost extends React.Component { \n render() { \n const {appName} = this.props; \n return ( \n <div> \n Create a blog post on app: ${appName}. <br/> \n <button OnClick={this.create.bind(this)}>Create Now</button> \n </div> \n ); \n } \n\n create() { \n const {createPost} = this.props; \n createPost('My Blog Title', 'Some Content'); \n }\n}\n\n\u4f7f\u7528\u4f9d\u8d56
\nconst {useDeps} from 'react-simple-di';\n\n// \u524d\u9762\u5b9a\u4e49\u7684 CreatePost react \u7ec4\u4ef6 \n\nconst depsToPropsMapper = (context, actions) => ({ \n appName: context.appName, \n createPost: actions.posts.create\n});\n\nconst CreatePostWithDeps = useDeps(depsToPropsMapper)(CreatePost);\n\n\u5982\u679c\u4f60\u6ca1\u6709\u5b9a\u4e49\u81ea\u5df1\u7684 mapper \u51fd\u6570\uff08\u5c31\u662f\u4e0a\u9762\u7684 depsToPropsMapper \uff09\uff0c useDeps \u5c06\u4f7f\u7528\u4e0b\u9762\u7684\u9ed8\u8ba4 mapper \u51fd\u6570\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528 context \u548c actions \u4e86\u3002
\nconst mapper = (context, actions) => ({ \n context: () => context, \n actions: () => actions\n});\n\nMantra \u4f7f\u7528\u4f9d\u8d56\u6ce8\u5165\u7684\u76ee\u7684\u662f\u9694\u79bb\u4ee3\u7801\u3002\u4f8b\u5982\u9694\u79bb UI \u7ec4\u4ef6\u548c actions \u3002
\n\u4e00\u65e6\u914d\u7f6e\u597d\uff0c Applicaton Context \u5c31\u4f1a\u88ab\u6ce8\u5165\u5230\u628a Context \u4f5c\u4e3a\u7b2c\u4e00\u53c2\u6570\u7684 action \u3002
\nContainer \u540c\u6837\u4e5f\u80fd\u8bfb\u53d6 Application Context \u3002
\n\u4e0d\u80fd\u5728\u5b50\u7ec4\u4ef6\u91cc\u6ce8\u5165\u4f9d\u8d56\uff0c\u53ea\u80fd\u662f\u6700\u4e0a\u5c42\u7ec4\u4ef6\uff0c\u901a\u5e38\u5c31\u662f Layout Component \uff0c\u4f8b\u5982\u4e0b\u9762\u4ee3\u7801\u3002
\nimport React from 'react';\nexport default function (injectDeps) { \n // See: Injecting Deps \n const MainLayoutCtx = injectDeps(MainLayout); \n // Routes related code\n}\n\nContainer \u7684\u4f5c\u7528\u662f\u96c6\u6210\u3001\u7ec4\u88c5\u6570\u636e\u3002\u5b83\u7684\u4e2d\u6587\u610f\u601d\u662f\u5bb9\u5668\uff0c\u91cc\u9762\u5305\u88f9\u7684\u5c31\u662f UI \u7ec4\u4ef6\u3002\u4e3b\u8981\u529f\u80fd:
\nContainer \u662f\u4e00\u4e2a React \u7ec4\u4ef6\u3002\u5982\u8fd9\u7bc7\u6587\u7ae0\u6240\u8ff0\u7684 Controller-View
\n
\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u4f7f\u7528\u4e00\u4e2a\u7236\u7ec4\u4ef6\uff0c\u5c31\u662f Mantra \u7684 container \u6765\u76d1\u542c\u6570\u636e\u7684\u53d8\u5316\uff0c\u5b50\u7ec4\u4ef6 UI Component \u8d1f\u8d23\u754c\u9762\u6e32\u67d3\u548c\u4e92\u52a8\u3002 Controller \u5c31\u662f\u9ad8\u9636\u7ec4\u4ef6 (Higher Order Components) HOC \u6765\u5305\u88f9 UI \u7ec4\u4ef6\u3002\u9ad8\u9636\u7ec4\u4ef6\u8d1f\u8d23\u6570\u636e\u67e5\u8be2\uff0c\u5b50\u7ec4\u4ef6\u8d1f\u8d23\u6e32\u67d3\u7b49\u3002
\nMantra \u4f7f\u7528 react \u2010 komposer \u6765\u4f5c\u4e3a container \u83b7\u53d6\u6570\u636e\u72b6\u6001\u3002
\ncontainer \u7684\u89c4\u5219
\n\n\n" }, { "author": { "url": "member/livedutvchina", "name": "livedutvchina", "avatar": "https://cdn.v2ex.com/gravatar/dfb391929e4e68df8c44796699685cc4?s=73&d=retro" }, "url": "t/290651", "title": "\u4f7f\u7528 Meteor \u5f00\u53d1\u4e00\u4e2a\u793e\u4ea4\u7f51\u7edc APP", "id": "t/290651", "date_published": "2016-07-06T07:18:47+00:00", "content_html": "Note: \u57fa\u4e8e Mantra Draft 0.2.0
\n
\u548c\u5927\u5bb6\u5206\u4eab\u4e00\u4e2a\u89c6\u9891\uff1a
\nhttps://www.livecoding.tv/johncarmack/videos/nDnyw-startup-with-meteor-for-a-social-web-app
\n\u9879\u76ee\u8fd8\u5728\u5f00\u53d1\u4e2d\uff0c\u5927\u5bb6\u53ef\u4ee5\u53bb\u770b\u4ed6\u7684\u76f4\u64ad\u6216\u89c6\u9891\u3002
\n\u4e3b\u8981\u4f7f\u7528\u7684\u7f16\u7a0b\u8bed\u8a00\uff1a Javascript / HTML 5 / CSS3
\n\u4f7f\u7528\u7684\u5305\uff0c\u5e93\u548c API \uff1a Meteor.js and React.js
\n" }, { "author": { "url": "member/lizunlong", "name": "lizunlong", "avatar": "https://cdn.v2ex.com/avatar/cede/bb6e/183_large.png?m=1334370998" }, "url": "t/278218", "title": "\u9762\u5411 \u5c0f\u767d\u5f00\u53d1\u8005 \u548c \u4e13\u4e1a\u5f00\u53d1\u8005 \u7684 Meteor", "id": "t/278218", "date_published": "2016-05-12T09:01:42+00:00", "content_html": "V2EX \u9996\u53d1\uff0c\u672c\u6587\u5c06\u4e8e\u4eca\u665a\u63a8\u9001\u81f3\u6211\u7684\u5fae\u4fe1\u516c\u4f17\u53f7\u8ba2\u9605\u8005\u3002
\n\u4e00\u5468\u524d\uff0c\u6211\u4ece\u7f51\u7ad9\u5f00\u53d1\u7684\u6280\u672f\u53d1\u5c55\u8fd9\u4e00\u89d2\u5ea6\u8bb2\u660e Meteor \u65e8\u5728\u5e2e\u52a9\u6211\u4eec\u7f16\u5199\u51fa\u5e94\u8fd0\u65f6\u4ee3\u6f6e\u6d41\u7684\u7f51\u7ad9\u3002\u4eca\u5929\uff0c\u6211\u8bd5\u7740\u8f6c\u8ff0 Meteor \u521b\u59cb\u4eba\u4e4b\u4e00 Geoff Schmidt \u773c\u4e2d\u7684\u8ba1\u7b97\u7ec8\u7aef\u53d1\u5c55\u7b80\u53f2\u3002\u5bf9\u6bd4\u7740\u770b\uff0c\u4e5f\u53ef\u4ee5\u770b\u51fa\u4e00\u4e2a\u4eba\u770b\u5f85\u4e8b\u7269\u7684\u89d2\u5ea6\u57fa\u672c\u51b3\u5b9a\u4e86\u4ed6\u505a\u4e8b\u7684\u683c\u5c40\u3002
\n
Mainframe \u662f\u4ec0\u4e48\u4e1c\u897f\uff1f\u5927\u578b\u4e3b\u673a\u3002\u4e0d\u8fc7\u5728\u8fd9\u91cc\u5b83\u7279\u6307\u4e0a\u4e16\u7eaa\u516d\u4e03\u5341\u5e74\u4ee3\u7684\u5927\u578b\u8ba1\u7b97\u673a\uff0c\u5b83\u4f53\u79ef\u5e9e\u5927\uff0c\u8ba1\u7b97\u5904\u7406\u80fd\u529b\u8fdc\u4e0d\u53ca\u73b0\u4eca\u7684 iPhone \u624b\u673a\u3002\u624b\u673a\u63e1\u4e8e\u624b\u638c\uff0c Mainframe \u5462\uff0c\u4e00\u95f4\u6559\u5ba4\u90fd\u672a\u5fc5\u653e\u5f97\u4e0b\u4e00\u53f0\u3002\u7136\u800c\uff0c\u5b83\u4ecd\u7136\u610f\u4e49\u6df1\u8fdc\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u8ba1\u7b97\u5904\u7406\u80fd\u529b\uff0c\u8fd9\u662f\u4e00\u5207\u672a\u6765\u53d1\u5c55\u7684\u6839\u57fa\u3002
\nPC \u8fd9\u4e2a\u7f29\u5199\u5927\u5bb6\u80af\u5b9a\u719f\u6089\uff0c\u4e2a\u4eba\u8ba1\u7b97\u673a\u3002\u5b83\u7684\u610f\u4e49\u5728\u4e8e\u4f53\u79ef\u7684\u5927\u5e45\u7f29\u5c0f\uff0c\u4ee5\u53ca\u6210\u672c\u7684\u5927\u5e45\u964d\u4f4e\u3002\u7834\u574f\u6027\u521b\u65b0\u6307\u5c06\u73b0\u6709\u7684\u9700\u8981\u8f83\u9ad8\u6d88\u8d39\u80fd\u529b\u624d\u80fd\u4eab\u7528\u7684\u4e8b\u7269\u6216\u670d\u52a1\u901a\u8fc7\u521b\u65b0\u65b9\u5f0f\u91cd\u65b0\u6253\u5305\u4e3a\u9002\u7528\u4e8e\u666e\u7f57\u5927\u4f17\u6d88\u8d39\u7684\u5546\u54c1\u7684\u884c\u4e3a\uff0c\u91cd\u590d\u5373\u91cd\u8981\u3002\u51e0\u5343\u7f8e\u5143\uff0c\u4e00\u5f20\u684c\u5b50\uff0c\u4fbf\u53ef\u62e5\u6709\u4e00\u53f0\u8ba1\u7b97\u6548\u7387\u8fdc\u8d85\u4eba\u7c7b\u7684\u4e2a\u4eba\u7535\u8111\u3002\u5f53\u65f6\u7684\u73b0\u72b6\u662f\uff0c\u5de5\u5177\u51fa\u73b0\u4e86\uff0c\u4f46\u4eba\u4eec\u8fd8\u4e0d\u592a\u6e05\u695a\u80fd\u5229\u7528\u5b83\u5b9e\u73b0\u4ec0\u4e48\u3002
\n\u76f4\u81f3\u8f6f\u4ef6\u4e1a\u53d1\u5c55\u8d77\u6765\u3002\u56fe\u5f62\u754c\u9762\u5141\u8bb8\u975e\u4e13\u4e1a\u4eba\u58eb\u4e0e\u51b7\u51b0\u51b0\u7684\u7535\u8111\u8fdb\u884c\u4ea4\u4e92\u64cd\u4f5c\uff0c\u4ece\u800c\u5e2e\u52a9\u66f4\u591a\u7684\u4eba\u4f7f\u7528\u8ba1\u7b97\u673a\u5b9e\u73b0\u4ed6\u4eec\u7684\u9700\u6c42\uff0c\u6ca1\u9519\uff0c\u53c8\u4e00\u6b21\u7834\u574f\u6027\u521b\u65b0\u3002\u4e2a\u4eba\u8ba1\u7b97\u673a\u7684\u4f7f\u7528\u8005\u5177\u5907\u4e86\u8d85\u4eba\u7684\u8ba1\u7b97\u80fd\u529b\uff0c\u4f46\u662f\u5462\uff0c\u6570\u636e\u4ea4\u6362\u8fd8\u65e0\u6cd5\u6446\u8131\u5730\u7406\u9694\u79bb\uff0c\u6700\u591a\u662f\u7528\u8f6f\u76d8\u643a\u5e26\u7740\u6709\u9650\u7684\u6570\u636e\u5f80\u6765\u4e8e\u4e66\u623f\u548c\u529e\u516c\u5ba4\u3002
\n\u76f4\u81f3\u4e92\u8054\u7f51\u7684\u666e\u53ca\u3002\u5168\u7403\u7ecf\u6d4e\u3001\u6587\u5316\u7684\u53d1\u5c55\u901f\u5ea6\u4f9d\u8d56\u4e8e\u4f4e\u5ef6\u8fdf\u7684\u4fe1\u606f\u9001\u8fbe\u3002\u4ece\u5954\u8dd1\uff0c\u5230\u9a91\u9a6c\uff1b\u4ece\u7535\u62a5\uff0c\u5230\u4e92\u8054\u7f51\u3002\u4e0d\u4ec5\u5168\u7403\u8303\u56f4\u5185\u4fe1\u606f\u9001\u8fbe\u51e0\u8fd1\u4e3a\u96f6\u5ef6\u8fdf\uff0c\u800c\u4e14\u80fd\u591f\u627f\u8f7d\u8d8a\u6765\u8d8a\u4e30\u5bcc\u7684\u6570\u636e\u3002\u4ece\u6587\u672c\u5230\u89c6\u9891\uff0c\u4ece\u5373\u65f6\u804a\u5929\u5230\u7f51\u7edc\u76f4\u64ad\uff0c\u6ca1\u6709\u4e92\u8054\u7f51\u57fa\u7840\u8bbe\u65bd\u7684\u5efa\u8bbe\uff0c\u76f8\u5173\u7684\u670d\u52a1\u5c31\u4e0d\u53ef\u80fd\u5b9e\u73b0\u3002
\n\u4ece\u8fd9\u91cc\uff0c\u6211\u7684\u90a3\u7bc7\u7f51\u7ad9\u53d1\u5c55\u7b80\u53f2\u5c31\u7b97\u662f\u80fd\u63a5\u4e0a\u4e86\uff0c\u6211\u77e5\u9053\u4f60\u61d2\u5f97\u770b\uff0c\u8fd9\u91cc\u7b80\u5355\u9648\u8ff0\u4e00\u4e0b\u5927\u610f\u3002\u4e92\u8054\u7f51\u8ba9\u6570\u636e\u4ea4\u6362\u6709\u4e86\u7a81\u7834\u5730\u7406\u9694\u79bb\u7684\u4f18\u52bf\uff0c\u7ed3\u5408\u62e5\u6709\u8d85\u9ad8\u8ba1\u7b97\u80fd\u529b\u7684\u670d\u52a1\u5668\uff0c\u7f51\u7ad9\u5f00\u53d1\u66f4\u503e\u5411\u4e8e\u5411\u8bbf\u95ee\u8005\u7684\u6d4f\u89c8\u5668\u4f20\u8f93\u8ba1\u7b97\u540e\u7684\u7ed3\u679c\u2014\u2014 HTML \uff1b\u73b0\u5982\u4eca\uff0c\u8bbf\u95ee\u8005\u7684\u7ec8\u7aef\u2014\u2014\u5305\u62ec\u4e2a\u4eba\u8ba1\u7b97\u673a\u548c\u624b\u673a\u2014\u2014\u8ba1\u7b97\u80fd\u529b\u8d8a\u6765\u8d8a\u5f3a\uff0c\u6709\u4eba\u5f00\u59cb\u8003\u8651\u76f4\u63a5\u5411\u8bbf\u95ee\u8005\u7684\u6d4f\u89c8\u5668\u4f20\u8f93\u6570\u636e\uff0c\u8ba9\u6d4f\u89c8\u5668\u83b7\u5f97\u6570\u636e\u540e\u5728\u672c\u5730\u8fdb\u884c\u8ba1\u7b97\u548c\u6e32\u67d3\uff0c\u8fd9\u4e00\u8f6c\u53d8\u5141\u8bb8\u7f51\u7ad9\u5f00\u53d1\u8005\u5f00\u53d1\u51fa\u4ea4\u4e92\u66f4\u590d\u6742\u7684\u7f51\u7ad9\uff0c\u8fd9\u4e00\u70b9\u6211\u5728\u4e0a\u5468\u5df2\u7ecf\u4e3e\u8fc7\u4f8b\u5b50\u4e86\uff0c\u5305\u62ec\u5f00\u6e90\u9879\u76ee\u548c\u5546\u4e1a\u7f51\u7ad9\u3002
\nMeteor \u7684\u6982\u5ff5\u6b63\u662f\u5728\u8fd9\u4e00\u5927\u80cc\u666f\u4e0b\u63d0\u51fa\u7684\uff0c\u540c\u65f6 Meteor \u56e2\u961f\u4e5f\u5728\u8fd9\u56db\u5e74\u5185\u505a\u5230\u4e86\uff0c\u5e76\u4e14\u672a\u6765\u8fd8\u4f1a\u671d\u7740\u66f4\u5f00\u653e\u7684\u65b9\u5411\u53d1\u5c55\u3002\u4ece\u5927\u578b\u4e3b\u673a\uff0c\u5230\u4e2a\u4eba\u7535\u8111\uff1b\u4ece\u4e92\u8054\u7f51\uff0c\u5230\u79fb\u52a8\u5e94\u7528\u3002\u7ec8\u7aef\u7684\u4f53\u79ef\u4e0d\u65ad\u7f29\u5c0f\uff0c\u6210\u672c\u4e0d\u65ad\u964d\u4f4e\uff0c\u5904\u7406\u80fd\u529b\u4e0d\u65ad\u63d0\u9ad8\uff0c\u6570\u636e\u4ea4\u6362\u4e0d\u518d\u53d7\u5730\u7406\u9694\u79bb\uff0c\u8fd9\u4e00\u5207\u4e00\u5207\u7684\u57fa\u7840\u6761\u4ef6\u9884\u793a\u7740\u592a\u591a\u7684\u53ef\u80fd\u6027\uff0c\u76f4\u81f3\u76f8\u5e94\u7684\u8f6f\u4ef6\u4e1a\u518d\u4e00\u6b21\u53d1\u5c55\u8d77\u6765\u3002
\n\u76f8\u4e92\u8fde\u63a5\u7684\u79fb\u52a8\u8bbe\u5907\u662f\u672a\u6765\u7ec8\u7aef\u7684\u7edd\u5bf9\u4e3b\u529b\uff0c\u5b83\u4eec\u6108\u52a0\u4fbf\u643a\u3001\u4fbf\u5b9c\uff0c\u8fd9\u4e00\u8d8b\u52bf\u5219\u4f1a\u6108\u52a0\u51f8\u73b0\u3002 Meteor \u73b0\u5df2\u80fd\u591f\u5168\u65b9\u4f4d\u5730\u652f\u6301\u8fd9\u4e00\u8d8b\u52bf\uff0c\u5e76\u5c06\u6301\u7eed\u8fdb\u5316\u4ee5\u5e94\u5bf9\u751f\u6001\u73af\u5883\u7684\u7a81\u53d8\u3002
\n\u5ef6\u4f38\u9605\u8bfb\uff1a\u7b2c 2 \u5468\u56de\u987e (2016/5/2 - 5/8)
\n\u6b22\u8fce\u8ba2\u9605\u6211\u7684\u5fae\u4fe1\u516c\u4f17\u53f7\uff1a\u4e24\u4e2a\u5706\u70b9\u4e00\u6761\u76f4\u7ebf - /t/275760
\n" }, { "author": { "url": "member/lizunlong", "name": "lizunlong", "avatar": "https://cdn.v2ex.com/avatar/cede/bb6e/183_large.png?m=1334370998" }, "url": "t/276464", "title": "\u6211\u6700\u8fd1\u5149\u8bf4 Meteor \u7684\u597d\u8bdd\u4e86\uff0c\u4e3a\u4e86\u66f4\u597d\u7684\u770b\u6e05\u4e8b\u7269\u6b63\u53cd\u9762\uff0c\u8bf7\u5927\u5bb6\u5e2e\u5fd9\u6765\u4f7f\u52b2\u513f\u62cd\u3001\u5410\u69fd Meteor \u5427~", "id": "t/276464", "date_published": "2016-05-05T03:49:26+00:00", "content_html": "\u597d\u8bdd\u5728\u8fd9\uff1a/t/275760
\n" }, { "author": { "url": "member/lizunlong", "name": "lizunlong", "avatar": "https://cdn.v2ex.com/avatar/cede/bb6e/183_large.png?m=1334370998" }, "url": "t/275760", "title": "\u4e00\u4e2a\u56f4\u7ed5 Meteor \u7684\u5fae\u4fe1\u516c\u4f17\u53f7\uff1a\u4e24\u4e2a\u5706\u70b9\u4e00\u6761\u76f4\u7ebf", "id": "t/275760", "date_published": "2016-05-02T02:36:39+00:00", "content_html": "\u6211\u4e00\u5468\u524d\u521a\u521a\u5f00\u901a\u7684\uff0c\u4e3a\u8282\u7701\u5927\u5bb6\u65f6\u95f4\uff0c\u63a8\u8350\u5148\u770b\u770b\u9996\u5468\u56de\u987e\u3002
\n\u611f\u5174\u8da3\u7684\u53ef\u4ee5 RSS \u8ba2\u9605\uff0c\u4e5f\u53ef\u4ee5\u53bb\u5fae\u4fe1\u641c\u7d22 \u4e24\u4e2a\u5706\u70b9\u4e00\u6761\u76f4\u7ebf \u8ba2\u9605\u5173\u6ce8\u3002
\n\u5982\u679c\u4f60\u4ee5\u524d\u5173\u6ce8\u8fc7\u5e76\u653e\u5f03\u4e86 Meteor \uff0c\u8bf7\u544a\u8bc9\u6211\u4f60\u7684\u7591\u8651\uff0c\u6211\u53ef\u4ee5\u6839\u636e\u5176\u73b0\u72b6 (1.3 \u7248\u672c) \u548c\u5df2\u77e5\u7684\u672a\u6765\u53d1\u5c55\u65b9\u5411\u8fdb\u884c\u56de\u7b54\uff0c\u8ba9\u6211\u4eec\u91cd\u65b0\u8bc4\u4f30\u4e00\u4e0b Meteor \u5230\u5e95\u9002\u4e0d\u9002\u5408\u81ea\u5df1\u7684\u65b0\u9879\u76ee\u3002
\n" }, { "author": { "url": "member/maodouwang", "name": "maodouwang", "avatar": "https://cdn.v2ex.com/gravatar/3d39c719e0f85c31c47ffb6f9f2c2ebd?s=73&d=retro" }, "url": "t/259944", "title": "\u7b2c\u4e00\u5c4a\uff08 2016\uff09\u4e2d\u56fd Meteor \u6280\u672f\u5cf0\u4f1a", "id": "t/259944", "date_published": "2016-02-29T09:05:52+00:00", "content_html": "\u65f6\u95f4\uff1a 2016 \u5e74 3 \u6708 6 \u65e5 14:00~18:30
\n\u5730\u70b9\uff1a\u6e05\u534e\u5927\u5b66 FIT \u697c\u4e8c\u697c\u591a\u529f\u80fd\u5385
\n\u4e3b\u529e\u65b9\uff1a\u6bdb\u8c46\u7f51\u5728\u7845\u8c37 Meteor \u603b\u90e8\u7684\u7684\u5173\u5207\u548c\u6307\u5bfc\u4e0b\uff0c\u4e3e\u529e 2016 \u5e74\u7b2c\u4e00\u5c4a Meteor \u6280\u672f\u5cf0\u4f1a\uff0c\u66a8\u6bdb\u8c46\u7f51\u5f00\u53d1\u8005\u4ea4\u6d41\u4f1a\u3002
\n\u62a5\u540d\u94fe\u63a5\uff1a http://t.cn/RGMhohc
meteor \u6846\u67b6\u9002\u5408\u7528\u5728\u4e92\u8054\u7f51\u7c7b\u5e73\u53f0\u5417\uff0c\u6709\u54ea\u4e9b\u6210\u529f\u7684\u6848\u4f8b\u6216\u8005\u5f00\u6e90\u9879\u76ee\u53ef\u4ee5\u5b66\u4e60
\n", "date_published": "2016-02-26T04:00:25+00:00", "title": "meteor \u6846\u67b6\u9002\u5408\u7528\u5728\u4e92\u8054\u7f51\u7c7b\u5e73\u53f0\u5417", "id": "t/259253" }, { "author": { "url": "member/my101du", "name": "my101du", "avatar": "https://cdn.v2ex.com/avatar/cfaa/f68b/30180_large.png?m=1756193491" }, "url": "t/252759", "title": "\u5206\u4eab\uff1a\u6700\u8fd1\u5728\u5b66 Meteor \u7ed3\u5408 React\uff0c\u4f7f\u7528 FlowRouter \u505a\u8def\u7531\u548c react-layout \u5e03\u5c40\uff0c\u4ee5\u53ca Semantic-UI \u754c\u9762", "id": "t/252759", "date_published": "2016-01-22T16:04:31+00:00", "content_html": "\u4e4b\u524d\u5728\u516c\u53f8\u6253\u6742\u7684\uff0c\u56e0\u4e3a\u505a\u7684\u4e8b\u592a\u6742\uff0c\u6240\u4ee5\u4e0d\u5f97\u4e0d\u7ecf\u5e38\u5b66\u4e00\u4e9b\u4e1c\u897f\uff08\u4f46\u662f\u4e5f\u7231\u597d\uff0c\u5475\u5475\uff09\u3002
\n\n\u6700\u8fd1\u6709\u4e00\u4e2a\u8feb\u5207\u7684\u538b\u529b\u8ba9\u6211\u5c3d\u5feb\u5b66\u4e60 Meteor \u7ed3\u5408 React \uff08\u4ee5\u53ca\u5176\u4ed6\u76f8\u5173\u524d\u7aef\u7684\u6280\u672f\uff09\uff0c\u8fd9\u5bf9\u4e00\u4e2a\u53ea\u4f1a jQuery \uff0c\u5bf9\u524d\u7aef\u5404\u79cd\u706b\u70ed\u6280\u672f\u53ea\u662f\u521d\u6b65\u4e86\u89e3\u7684\u4eba\u6765\u8bf4\uff0c\u771f\u662f\u6bd4\u8f83\u5927\u7684\u6311\u6218\u2014\u2014\u5305\u62ec\u601d\u7ef4\u4e0a\u7684\u6539\u53d8\u548c\u514b\u670d\u7ecf\u9a8c\u7684\u4e0d\u8db3\u3002
\n\n\u4e8e\u662f\u767d\u5929\u7ee7\u7eed\u6253\u6742\u642c\u670d\u52a1\u5668\uff0c\u88c5\u7535\u8bdd\u7ebf\u2026\u2026\u665a\u4e0a\u770b\u8d44\u6599\uff0c\u6572\u4ee3\u7801\uff0c\u5e78\u597d\u6709\u9886\u8def\u4eba\u7ed9\u4e86\u4e0d\u5c11\u8d44\u6599\uff0c\u5927\u5927\u51cf\u5c11\u4e86\u5b66\u4e60\u65f6\u95f4\u3002
\n\n\u6211\u53d1\u73b0\u7f51\u4e0a\u5206\u522b\u8bb2 meteor \u3001 react \u7b49\u7684\u8d44\u6599\u90fd\u633a\u591a\u7684\uff0c\u4f46\u8c8c\u4f3c\u8fd8\u6ca1\u6709\u627e\u5230\u4e00\u7bc7\u4e2d\u6587\u7684\uff0c\u5e76\u4e14\u4e13\u95e8\u8bb2\u5982\u4f55\u628a\u8fd9\u4e9b\u6280\u672f\u7ed3\u5408\u8d77\u6765\u7684\u6587\u7ae0\uff0c\u6240\u4ee5\u5199\u5b8c\u4ee3\u7801\u5c31\u6574\u7406\u4e86\u4e00\u4efd\u6587\u6863\uff0c\u4ee5\u5e2e\u52a9\u548c\u6211\u4e00\u6837\u5165\u95e8\u7684 V \u53cb\u3002
\n\n\u5df2\u7ecf\u4f7f\u7528\u5230\u7684\u6280\u672f\u6e05\u5355
\n\nMeteor \u57fa\u7840\u5f00\u53d1\u6846\u67b6(\u4ee5\u53ca\u81ea\u5e26\u7684 MongoDB \uff0c accounts-ui,check \u7b49 packages)
\nMeteor-React \u524d\u7aef\u5e93
\nFlowRouter \u5ba2\u6237\u7aef\u8def\u7531
\nreact-layout \u7ed3\u5408 FlowLayout \u5b9e\u73b0 react JSX \u7684\u5e03\u5c40
\nSemantic-UI \u524d\u7aef\u754c\u9762\u5e93
\n\u5176\u4ed6 Meteor \u63d2\u4ef6
\u5730\u5740\uff1a
\nhttps://github.com/my101du/meteor-react-flowrouter-semantic-singledog
\u5b8c\u5168\u662f\u5b66\u4e60\u5165\u95e8\u7684\u6f66\u8349\u5f62\u6001\uff0c\u6ca1\u6709\u8003\u8651\u5230\u4ee3\u7801\u7684\u6574\u6d01\u548c\u201c\u6700\u4f73\u5b9e\u8df5\u201d\uff08\u8fd9\u4e2a\u8bcd\u6211\u4e00\u76f4\u89c9\u5f97\u83ab\u540d\u5176\u5999\uff09\uff0c\u5e76\u4e14 bug \u7e41\u591a\uff0c\u8bf7\u9ad8\u624b\u6307\u51fa\u6211\u53ef\u4ee5\u7ee7\u7eed\u63d0\u9ad8\u7684\u65b9\u5411\u548c\u6280\u5de7\u3002
\n" }, { "author": { "url": "member/ljbha007", "name": "ljbha007", "avatar": "https://cdn.v2ex.com/avatar/1f47/cef5/10823_large.png?m=1368098214" }, "url": "t/218951", "title": "\u73a9 Meteor \u8e29\u8fc7\u7684\u9668\u77f3\u5751\u603b\u7ed3", "id": "t/218951", "date_published": "2015-09-07T12:48:44+00:00", "content_html": "\u73a9\u4e86\u51e0\u5929 Meteor \u603b\u7ed3\u4e00\u4e0b\u9047\u5230\u8fc7\u7684\u5751
\n\u5982\u679c\u662f\u505a\u6559\u7a0b\u91cc\u7684 Todo \u5e94\u7528\u7684\u786e\u662f\u5f88\u5bb9\u6613 \u4f46\u662f\u5982\u679c\u8981\u505a\u590d\u6742\u4e00\u70b9\u7684\u5e94\u7528\u5751\u5c31\u5f00\u59cb\u591a\u8d77\u6765 \u800c\u4e14\u5f88\u591a\u90fd\u662f\u9668\u77f3\u5751\u7ea7\u522b\u7684
\u89e3\u51b3\u529e\u6cd5\uff1a https://github.com/englue/meteor-publish-composite \u4f7f\u7528\u8fd9\u4e2a\u5305\u53ef\u4ee5\u89e3\u51b3\u670d\u52a1\u5668\u7aef\u7684 join \u903b\u8f91\u590d\u6742\u7684\u95ee\u9898
\n\n\u5173\u4e8e\u8fd9\u65b9\u9762\u4e00\u4e9b\u76f8\u5173\u7684\u6587\u7ae0\uff1a https://www.discovermeteor.com/blog/reactive-joins-in-meteor/
\n\n\u89e3\u51b3\u529e\u6cd5
\n 1.\u7528 Template.<my object>.helpers \u8fd4\u56de\u4e00\u4e2a\u5173\u8054\u6587\u6863\u7684\u6307\u9488 \u8bfb\u53d6\u6307\u9488\u7684\u503c\u65f6\u4f1a\u89e6\u53d1 Meteor \u7684\u91cd\u7ed8\u6ce8\u518c\u673a\u5236 \u6240\u4ee5\u5f53\u88ab\u5173\u8054\u7684\u5bf9\u8c61\u5bf9\u8c61\u66f4\u65b0\u65f6\u5c31\u89e6\u53d1\u4e86\u91cd\u7ed8 \u4f8b\u5982
Template.book.helpers ({\n 'author' : function (){\n return Authors.find (this.authorId );\n }\n });\n\u6211\u4eec\u516c\u53f8\u4ea7\u54c1\u539f\u8ba1\u5212\u662f\u7528 Java \u540e\u53f0 + Ionic \u505a
\n\u4f46\u662f\u540e\u6765\u53d1\u73b0 Java \u5f00\u53d1\u6548\u7387\u786e\u5b9e\u4e0d\u5982\u52a8\u6001\u8bed\u8a00 \u867d\u7136\u8fd8\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\u8303\u56f4\u5185 \u4f46\u662f\u627e\u5230\u7684\u7a0b\u5e8f\u5458\u6c34\u5e73\u53c2\u5dee\u4e0d\u9f50\uff08\u6c34\u5e73\u4e0d\u597d\u7684\u90a3\u4e2a\u4ee3\u7801\u770b\u7740\u7b80\u76f4\u5413\u4eba\uff09
\u670b\u53cb\u63a8\u8350\u4e86 Meteor.js \u6211\u4e5f\u7a0d\u5fae\u7814\u7a76\u4e86\u4e00\u4e0b \u770b\u4f3c\u5f88\u7f8e\u597d \u4f46\u662f\u4e0d\u77e5\u9053\u5b9e\u9645\u5f00\u53d1\u7684\u65f6\u5019\u4f1a\u4e0d\u4f1a\u9047\u5230\u4ec0\u4e48\u95ee\u9898\uff1f
\n\u6bd4\u5982
\uff0d \u540e\u53f0\u81ea\u5b9a\u4e49\u4e1a\u52a1\u903b\u8f91\u662f\u5426\u4f1a\u5f88\u56f0\u96be\uff1f
\n \u6211\u4ee5\u524d\u4e5f\u9047\u5230\u8fc7\u50cf Django cakePHP \u8fd9\u6837\u7684\u6846\u67b6 \u867d\u7136\u529f\u80fd\u5f88\u5b8c\u5584 \u53ef\u4ee5\u91cd\u590d\u5229\u7528\u7684\u6a21\u5757\u5f88\u591a \u4f46\u662f\u6709\u4e9b\u6a21\u5757\u81ea\u5b9a\u4e49\u5f00\u53d1\u592a\u590d\u6742 \u751a\u81f3\u590d\u6742\u5230\u4e0d\u5982\u81ea\u5df1\u91cd\u65b0\u5199\u7684\u7a0b\u5ea6
\uff0d \u662f\u5426\u9047\u5230\u660e\u663e\u7684\u6548\u7387\u95ee\u9898\uff1f\u80fd\u5426\u5e94\u5bf9\u624b\u673a\u591a\u53d8\u7684\u7f51\u7edc\u73af\u5883\uff1f
\n Metero.js \u91cc\u7684 live query \u867d\u7136\u5f88\u597d\u7528 \u4f46\u662f\u6bd5\u7adf\u9700\u8981\u957f\u65f6\u95f4\u4fdd\u6301\u8fde\u63a5 \u4e00\u4e2a\u662f\u5982\u679c\u662f\u624b\u673a\u4f7f\u7528 \u6570\u636e\u6d41\u91cf\u4f1a\u4e0d\u4f1a\u592a\u5927\uff1f \u8fd8\u6709\u4e00\u4e2a\u662f\u8fd9\u6837\u5927\u91cf\u7684\u4ea4\u6362\u6570\u636e\u4f1a\u4e0d\u4f1a\u5bfc\u81f4\u7535\u91cf\u6d88\u8017\u8fc7\u5feb\uff1f \u5982\u679c\u662f\u79fb\u52a8\u7f51\u7edc\u8fd9\u79cd\u7ecf\u5e38\u6389\u7ebf\u3001\u4e0d\u7a33\u5b9a\u7684\u73af\u5883 \u6709\u6ca1\u6709\u9047\u5230\u4ec0\u4e48\u5947\u602a\u7684\u95ee\u9898\uff1f
\uff0d \u670d\u52a1\u5668\u7684\u6027\u80fd\u5f00\u9500\u6a2a\u5411\u5bf9\u6bd4\u7684\u7ed3\u679c\u5982\u4f55\uff1f
\n \u56e0\u4e3a\u9700\u8981\u7ef4\u6301\u5927\u91cf\u5ba2\u6237\u7aef\u7684 WebSocket \u4f1a\u4e0d\u4f1a\u5bfc\u81f4\u670d\u52a1\u5668\u7684\u5185\u5b58\u548c CPU \u7684\u5f00\u9500\u592a\u5927\uff1f
\u697c\u4e3b\u6b63\u5728\u4e25\u8083\u8003\u8651\u8981\u4e0d\u8981\u5206\u914d\u4e00\u70b9\u5f00\u53d1\u65f6\u95f4\u51fa\u6765\u7528 meteor.js \u505a\u4e00\u4e2a\u5feb\u901f\u539f\u578b \u6240\u4ee5\u5982\u679c\u6709 V \u6709\u5728\u6b63\u5f0f\u4ea7\u54c1\u5f00\u53d1\u4e2d\u7528\u8fc7 meteor.js \u8bf7\u4e0d\u541d\u8d50\u6559 \u6216\u8005\u52a0\u6211 qq \u4ea4\u6d41\u4ea4\u6d41 523823374
\n" }, { "author": { "url": "member/zicai", "name": "zicai", "avatar": "https://cdn.v2ex.com/avatar/bcdf/5f27/50383_large.png?m=1404702487" }, "url": "t/193774", "title": "Meteor \u4e2d\u6587\u793e\u533a\u4e0a\u7ebf\u5566\uff01\uff01", "id": "t/193774", "date_published": "2015-05-26T03:55:28+00:00", "content_html": "Meteor \u4e2d\u6587\u793e\u533aMeteorHub\u4e0a\u7ebf\u5566\uff01\uff01\uff01
\n\n\u540c\u5b66\u4eec\u53ef\u4ee5\u5728\u4e0a\u9762\u5206\u4eabMeteor\u7ecf\u9a8c\uff0c\u6216\u662f\u4f7f\u7528Meteor\u8fc7\u7a0b\u4e2d\u9047\u5230\u4e86\u56f0\u96be\uff0c\u4e0d\u7528\u6015\uff0c\u53ef\u4ee5\u5230\u793e\u533a\u5bfb\u6c42\u5e2e\u52a9
\n" }, { "author": { "url": "member/binarymann", "name": "binarymann", "avatar": "https://cdn.v2ex.com/avatar/0048/81eb/12223_large.png?m=1425720587" }, "url": "t/182700", "title": "\u8bf7\u95ee meteor build \u51fa\u6765\u7684 iOS app \u80fd\u591f\u76f4\u63a5\u53d1\u5e03\u5230 Appstore \u5417\uff1f", "id": "t/182700", "date_published": "2015-04-09T16:13:14+00:00", "content_html": "\u4e0d\u77e5\u9053\u8fd9\u7c7b\u7eafhtml/css/js\u7684App\u80fd\u591f\u901a\u8fc7\u5ba1\u67e5\u7684\u53ef\u80fd\u6027\u5927\u4e0d\uff0c\u4e0d\u8fc7meteor\u7684\u786e\u592a\u8d5e\u4e86" }, { "author": { "url": "member/tamamaxox", "name": "tamamaxox", "avatar": "https://cdn.v2ex.com/avatar/3377/4f2e/17802_large.png?m=1400124739" }, "url": "t/159437", "title": "linux \u4e0b\u9762\u4f7f\u7528 meteor build \u4e0d\u52a0 --debug \u53c2\u6570\u7684\u8bdd\u65e0\u6cd5\u751f\u6210\u51fa bundle\u3002", "id": "t/159437", "date_published": "2015-01-05T09:35:14+00:00", "content_html": "\u8fd9\u4e2a\u4ec0\u4e48\u56de\u4e8b\uff0c\u6709\u5f97\u7834\u5417\uff1f\u8bf7\u6c42\u771f\u5fc3\u591a" }, { "author": { "url": "member/lin", "name": "lin", "avatar": "https://cdn.v2ex.com/avatar/fe9f/c289/83_large.png?m=1773678072" }, "url": "t/149712", "title": "CNAME \u5230 origin.meteor.com \u7684\u7f51\u7ad9\u65e0\u6cd5\u8bbf\u95ee\u600e\u4e48\u7834\uff1f", "id": "t/149712", "date_published": "2014-11-27T07:56:01+00:00", "content_html": "\u5e94\u8be5\u662f\u88ab\u5899\u4e86\u3002\u53bb\u5e74\u5728\u4e00\u4e2ahackthorn\u4e0a\u505a\u4e86\u4e00\u4e2a \u53ef\u4ee5\u591a\u4eba\u5b9e\u65f6\u6f14\u594f\u97f3\u4e50\u7684\u5c0f\u4f5c\u54c1\u3002
\n\n\u540e\u6765\u4e00\u76f4\u60f3\u7528meteor\u91cd\u65b0\u5199\u4e00\u904d\uff0c\u4e00\u76f4\u5728\u62d6\u5ef6\uff0c\u7ed3\u679c\u8fd9\u6b21\u8d76\u5728 MeteorDay \u4e4b\u524d\u7ec8\u4e8e\u662f\u505a\u51fa\u6765\u4e86\u3002
\n\n\u4f46\u662f\u7531\u4e8e\u7f51\u7edc\u5ef6\u8fdf\u548c\u7b97\u6cd5\u4e0d\u591f\u597d\uff0c\u76ee\u524d\u7684\u5b9e\u9645\u7684\u6548\u679c\u8fd8\u5f88\u5dee\u3002\u4e4b\u540e\u4f1a\u770b\u770b profile \u4e13\u653b\u4e00\u4e0b\u6027\u80fd\u4f18\u5316\u3002
\n\n\n\n\u5982\u679c\u6253\u4e0d\u5f00\u53ef\u80fd\u662f\u56e0\u4e3a Google web Fonts \u88ab\u5899\u6ca1\u52a0\u8f7d\u51fa\u6765\uff0c\u70b9\u51fb\u4e00\u4e0besc\u5c31\u597d\u3002
\n\n\u6309\u7167\u60ef\u4f8b\u7ee7\u7eed \u516c\u5f00\u4ee3\u7801
\n", "date_published": "2014-10-18T14:00:09+00:00", "title": "Band ~ Let`s play music together", "id": "t/139895" }, { "author": { "url": "member/loddit", "name": "loddit", "avatar": "https://cdn.v2ex.com/avatar/c2be/0c8f/13134_large.png?m=1338089649" }, "url": "t/139342", "date_modified": "2014-10-16T10:10:43+00:00", "content_html": "meteor.js \u79bb 1.0 \u8d8a\u6765\u8d8a\u8fd1\u4e86\uff0c11\u67086\u53f7\u5168\u7403\u5404\u5730\u90fd\u4f1a\u4e3e\u884c\u7684\u6d3b\u52a8\uff0c\u548c hangout \u3002
\n\n\n\n\u4e4b\u524d\u7684 0.9 \u7248\u672c\u63d0\u4f9b\u4e86\u5b98\u65b9\u7684\u5305\u7ba1\u7406\u673a\u5236\uff0c1.0 \u5c06\u5f88\u53ef\u80fd\u62e5\u6709\u4e0b\u9762 roadmap \u91cc\u627f\u8bfa\u7684\u529f\u80fd\u3002
\n\n\n\n\u4e2d\u56fd\u90e8\u5206\u6709\u5317\u4eac\u548c\u9999\u6e2f
\n\n\u6211\u4f1a\u53bb\u5317\u4eac\u7684\u6d3b\u52a8\uff0c\u7ec4\u7ec7\u8005\u8fd8\u5728\u627e\u573a\u5730\u3002\u6309\u5df2\u5f80\u7684\u7ecf\u9a8c\u770b\u53c2\u4e0e\u4eba\u6570\u5e94\u8be5\u4e0d\u4f1a\u8d85\u8fc750\u4eba\uff0c\u5e0c\u671b\u5927\u5bb6\u80fd\u6709\u63a8\u8350\u3002
\n", "date_published": "2014-10-16T10:09:37+00:00", "title": "MeteorDay", "id": "t/139342" }, { "author": { "url": "member/Livid", "name": "Livid", "avatar": "https://cdn.v2ex.com/avatar/c4ca/4238/1_large.png?m=1776858751" }, "url": "t/128381", "title": "Kadira", "id": "t/128381", "date_published": "2014-08-17T07:37:05+00:00", "content_html": "\u7528\u4e8e Meteor app \u7684\u6027\u80fd\u76d1\u63a7\u5de5\u5177\uff1a