>头
流星 是一个全栈JavaScript框架的web和 移动应用程序. 自2011年以来,它一直存在,并在中国赢得了很高的声誉 流星的开发人员 作为一个理想的,易于使用的快速原型解决方案. 然而, 最近,开发人员已经意识到流星不再只是用于原型设计:它已经准备好用于商业开发. 有了它提供的包库,坚实的mongoDB/节点.它所依赖的基础, 和 the coding flexibility that it offers; 流星 makes it easy to build 健壮、安全的实时web应用程序,处理从浏览器应用程序到服务器或数据库的所有内容.
本流星教程将带您完成使用流星制作一个基本的web应用程序——一个简单的目录,允许用户登录和管理图书列表.
为什么要使用流星?? 简短的回答是:“因为《欧博体育app下载》很有趣。”. 它使开发web应用程序变得简单. 这很容易学, 它使您可以更多地关注应用程序的功能,而不是同步数据和服务页面的基础知识.
它还内置了许多方便的行为. 流星自动执行实时更新, 因此,数据更改会立即显示在浏览器窗口中, 甚至对应用程序本身的代码更改也会“实时”推送到所有浏览器和设备上。. 流星有内置的延迟补偿, 很容易部署, 并且具有易于安装的“软件包”,可以处理各种功能.
尽管这是一个相对较新的框架, 很多初创公司已经在开发流星应用了, 包括相对大规模的服务,比如 回应 和 望远镜.
在*nix系统上安装流星只需一行代码:
curl http://install.流星.Com/ | sh
虽然还没有官方的支持,但他们的Windows预览版进展得很顺利. 有传言说,Windows支持将在1.1,预计在2015年4月或5月推出. 正如您对流星这样的智能框架所期望的那样, 启动应用程序需要调用一行命令:
流星创建图书列表
这将创建一个名为“图书列表”的目录。, 并用一些样板和相关代码填充它. 要运行应用程序,请进入新创建的目录并执行:
流星
开放 http://localhost:3000
在你的浏览器中,你会看到以下内容:
您也可以在流星Pad上查看我们的应用程序的“版本0”, 一个类似于JSFiddle for 流星的网站 图书列表:默认应用程序
流星将其视图存储在HTML文件中. 如果我们打开“书单”.,我们将看到:
图书列表
Welcome to 流星!
{{> 你好}}
皇冠体育官网
皇冠体育官网
电子试玩
太阳城娱乐
太阳城娱乐
澳视澳门台
博彩平台排名
博彩平台排名
浙江地税
Video-game-platform-help@shannontm.com
全球最大的博彩平台
Jobidc个人门户
买球平台
部落守卫战官方网站
TOM明星
丰兆新材
天台之窗论坛
广西康辉国际旅行社
无锡幸福树
长沙365房产网
连云港住房公积金互联网查系统
首创股份
云南人事考试网
千教网
You've pressed the button {{counter}} times.
流星使用“Blaze”(一个模板引擎)来呈现来自这些HTML文件的响应. 使用过车把的人应该对双括号很熟悉.Js(或其他类似的模板引擎),它们在这里提供类似的功能. Blaze检查每一对双括号内的表达式,并用这些表达式产生的值替换每个表达式.
这个简单的示例程序只有两个双括号表达式:
The first, “{{> 你好}}”, tells Blaze to include a template called “你好”. That template is defined at the bottom of the file, in the section.
第二个,“{{counter}}”,稍微复杂一点. 要查看这个“计数器”值从何而来,我们需要打开“图书列表”.js”:
如果流星.isClient) {
//计数器从0开始
会话.setDefault(“计数器”,0);
Template.你好.助手({
计数器:function () {
返回的会话.(“计数器”);
}
});
Template.你好.事件({
'click button': function () {
//当按钮被点击时增加计数器
会话.(“计数器”,会话.Get ('counter') + 1);
}
});
}
如果流星.isServer) {
流星.启动(function () {
//启动时在服务器上运行的代码
});
}
有些事情需要在这里解释一下. 首先,拆分为“如果流星)”.isClient) "和" if.isServer)”. 回想一下,流星是一个全栈框架, 因此,您编写的代码在服务器和客户端上同时运行. 这些条件允许我们限制:第一个块只在客户端上运行, 第二个只在服务器上运行.
其次是“会议”.setDefault调用-这将在浏览器中初始化一个名为“counter”的会话变量. 会话变量的行为有点像流星中的全局变量(无论好坏). 但是,该会话变量没有直接显示在“{{counter}}”中。. 相反,这个“计数器”表达式是一个“助手”,它在“模板”中定义.你好.助手”部分. 这个帮助程序只是获取会话变量的值并返回它.
注意,helper是“响应式的”。. 这意味着任何时候会话变量都会发生变化, 流星会自动重新运行引用它的helper函数, Blaze会自动用新内容更新浏览器.
客户端代码还通过“Template”监视事件.你好.事件”. 我们通过事件类型和选择器(在本例中)来标识事件, “点击按钮”), 然后告诉流星这个事件应该做什么. 在这种情况下, 会话变量是递增的, 哪一个重新运行helper函数,然后重新呈现内容.
所有这些都很好,但这不是我们在本教程中想要的流星应用程序.
让我们开始调整这个应用程序——我们将显示一个静态的、硬编码的图书列表. 现在,我们把书单藏在 会话变量. 在“isClient”代码中,我们将使用“Template”.你好.在推荐书目模板呈现后立即设置会话变量:
Template.你好.render = function() {
会话.setDefault('书',
{标题:《欧博体育app下载》,作者:“哈珀·李”},
{标题:“1984”,作者:“乔治·奥威尔”},
{标题:“指环王”,作者:“J. R. R. 托尔金"},
{标题:《欧博体育app下载》,作者:“J. D. 塞林格”},
{标题:“了不起的盖茨比”,作者:“F. 斯科特•菲茨杰拉德”}
]);
};
然后,我们在" 你好 "模板中返回这个会话变量和一个新的helper:
Template.你好.助手({
书籍:function () {
返回的会话.(书的);
}
});
并在" 你好 "模板中通过变量插值将其显示在屏幕上:
Here are your books:
{{书籍}}
你可以在流星pad上查看这段代码: 书单:显示会话变量
首先要注意的是,流星服务器会自动检测到对代码库的更改, 将新代码推送给客户端, 并提示客户端重新加载. 即使在我们部署了应用程序之后, 我们可以通过热代码推送部署更改并自动更新我们的客户端.
到目前为止,我们得到的是:
哦,我们显示的数据有误. Blaze在这里的准确性得到了分数(为什么是的, 它是一个对象数组), 但是,如果我们想以一种有用的方式显示我们的图书列表,我们就必须更聪明一点. 幸运的是,Blaze可以很容易地使用" #each "指令来处理数据数组:
Here are your books:
{{#每个书籍}}
- {{title}} by {{作者}}
{{/每个}}
在大火, “#each”的工作方式有点像Angular的“ng-repeat”指令——它会遍历数组结构, 将当前上下文设置为数组中的当前对象, 并在“{{#each…}}”中重复显示HTML。. 这是我们现在的书单:
流星Pad: 正确显示会话变量
在进一步讨论之前,让我们稍微清理一下代码.
流星在如何组织代码库方面有很大的灵活性. 你会看到, 只有一些硬性规则:无论你把HTML和JavaScript放在哪里, 流星会找到的. 这种灵活性很好, 但这确实意味着您更有责任以一种有意义的方式组织代码, 这样你就不会被困在维护一个巨大的混乱.
第一个, 让我们将这个“你好”模板重命名为有意义的东西, 像“书目”, 并将样板HTML替换为:
图书列表
{{> 推荐书目}}
皇冠体育官网
皇冠体育官网
电子试玩
太阳城娱乐
太阳城娱乐
澳视澳门台
博彩平台排名
博彩平台排名
浙江地税
Video-game-platform-help@shannontm.com
全球最大的博彩平台
Jobidc个人门户
买球平台
部落守卫战官方网站
TOM明星
丰兆新材
天台之窗论坛
广西康辉国际旅行社
无锡幸福树
长沙365房产网
连云港住房公积金互联网查系统
首创股份
云南人事考试网
千教网
Here are some books:
{{#每个书籍}}
- {{title}} by {{作者}}
{{/每个}}
其次,让我们将“客户端”和“服务器”部分分离到单独的文件中. 在应用程序目录中, 我们将设置一个“client”子目录和一个“server”子目录——流星将自动知道在客户端上运行“/client/”文件, 然后在服务器上运行" /server/ "文件. 将模板代码放在以模板命名的JavaScript文件中是一个很好的约定, 因此,让我们将客户端代码放入“客户端/推荐书目”中.js”. 我们可以将当前空的服务器启动代码放在“服务器/启动”中.js”. 最后,让我们把“<模板名称=“书目”>” template code to “客户端/推荐书目.html”.> < /模板
注意,即使在所有这些转换之后, 流星仍然会自动找到我们所有的HTML和JavaScript文件. 只要文件是 的某个地方 在“/client/”中,流星将知道在客户端上运行它. 只要文件是 的某个地方 在“/server/”中,流星将知道在服务器上运行它. 再次强调,这取决于开发人员是否有条理.
现在我们的代码应该是这样的:
图书列表
{{> 推荐书目}}
皇冠体育官网
皇冠体育官网
电子试玩
太阳城娱乐
太阳城娱乐
澳视澳门台
博彩平台排名
博彩平台排名
浙江地税
Video-game-platform-help@shannontm.com
全球最大的博彩平台
Jobidc个人门户
买球平台
部落守卫战官方网站
TOM明星
丰兆新材
天台之窗论坛
广西康辉国际旅行社
无锡幸福树
长沙365房产网
连云港住房公积金互联网查系统
首创股份
云南人事考试网
千教网
Here are some books:
{{#每个书籍}}
- {{title}} by {{作者}}
{{/每个}}
Template.推荐书目.render = function() {
会话.setDefault('书',
{标题:《欧博体育app下载》,作者:“哈珀·李”},
{标题:“1984”,作者:“乔治·奥威尔”},
{标题:“指环王”,作者:“J. R. R. 托尔金"},
{标题:《欧博体育app下载》,作者:“J. D. 塞林格”},
{标题:“了不起的盖茨比”,作者:“F. 斯科特•菲茨杰拉德”}
]);
};
Template.推荐书目.助手({
书籍:function () {
返回的会话.(书的);
}
});
流星.启动(function () {
//启动时在服务器上运行的代码
});
~~~
请查看流星Pad:[初始代码清理](http://流星pad).com/pad/MwvMcsBAzfbWwEXp3/Book-List: % 20初始% 20代码% 20清理)
通过检查浏览器窗口来验证一切正常运行,然后我们就可以继续下一步了.
##在流星中使用数据库
流星服务器运行在MongoDB数据库之上. 在本教程的这一部分中, 我们将把静态图书列表从会话变量中移到该数据库中.
首先,删除模板.推荐书目.渲染代码,这样我们就不再往session变量里放东西了. 接下来,我们应该在服务器初始化时将图书列表作为fixture数据添加到数据库中. 正如您对MongoDB的期望,流星将数据存储在“集合”中。. 因此,我们将为我们的图书创建一个新的集合. 为了简单起见,我们将其命名为“books”. 事实证明,客户机和服务器都希望了解这个集合, 我们将把这段代码放到一个新的子文件夹"/lib/"中. 流星自动知道“/lib/”中的文件在客户端和服务器上运行.
我们将创建一个名为“lib/collections/books”的文件.Js”,并只给它一行代码:
~~~ js
书籍=新的流星.集合(“书”);
在浏览器窗口内指向 http://localhost:3000,转到开发控制台,检查“书”的值。. 它现在应该是一个Mongo集合! 试着跑“书”.find ().fetch()”, 你会得到一个空数组,这是有意义的, 因为我们还没有给它添加任何书. 我们可以尝试在控制台中向其添加项目:
书.插入({标题:《欧博体育app下载》,作者:“哈珀·李”})
在控制台中添加内容是相当乏味的. 而不是, 我们将进行设置,以便在服务器启动时自动将fixture数据插入数据库. 让我们回到“服务器/启动”.Js”,并添加如下内容:
流星.启动(function () {
if (!书.findOne ()) {
书.插入({标题:《欧博体育app下载》,作者:“哈珀·李”});
书.插入({标题:“1984”,作者:“乔治·奥威尔”});
书.插入{标题:“指环王”,作者:“J. R. R. 托尔金"});
书.标题:《欧博体育app下载》,作者:“J. D. 塞林格"});
书.标题:《欧博体育app下载》,作者:《欧博体育app下载》. 斯科特菲茨杰拉德"});
}
});
现在,当服务器启动时,如果没有数据,我们将添加fixture数据. 我们可以通过返回终端来验证这一点, 停止流星服务器, 运行这个命令:
流星重置
注意:你将 很少 需要这个命令,因为它重置- I.e., 清除 - 流星正在使用的数据库. 如果您的流星应用程序在数据库中有任何用户数据,则不应该运行此命令. 但在这种情况下,我们将清除所有的测试数据.
现在我们将再次启动服务器:
流星
在启动时, 流星将运行启动例程, 确保数据库为空, 并添加夹具数据. 此时,如果我们转到控制台并键入“书”.find ().Fetch() ",我们得到之前的五本书.
这一步所要做的就是在屏幕上显示图书. 幸运的是,这就像替换“返回会话”一样简单.Get (' books '); "在" books "帮助器中使用以下命令:
返回的书.find ();
我们又回到了正轨! 应用程序现在显示来自数据库游标的数据,而不是来自会话变量.
请查看流星Pad:移动到数据库
我先说一句:“不要这样做”.
如果有人在浏览器中打开这个应用程序,你觉得会发生什么, 打开控制台, 然后输入“书籍”.删除({})”?
答案是:他们会销毁这些藏品.
所以,这是一个相当大的安全问题-我们的用户 太多 访问我们的数据库. 任何客户机都可以访问整个数据库. 不仅如此,任何客户都可以 任何改变 整个数据库,包括那个".删除({})"数据清除.
这不太好,我们来解决它.
流星使用所谓的“包”来添加功能. 什么模块是Node.js和gems之于Ruby,而包则是流星的捆绑功能. 有各种各样的包裹. 浏览可用的内容, 检查气氛.js.
我们使用“流星 create”创建的默认流星应用程序包括两个名为“autoppublish”和“insecure”的包。. 第一个包使客户机能够自动访问整个数据库, 第二个是让用户可以在数据库上执行任何操作.
把这些去掉. 我们可以在app目录下运行以下命令:
流星删除自动发布不安全
完成后, 您将看到书单数据从屏幕上消失(因为您不再能够访问它)。, 如果你试试“书”.插入"调用,你会得到错误:" insert failed: Access denied ". 关于流星Pad:安全过度
如果您没有从本流星教程中学到其他东西的话, 请记住这一点:当你部署流星应用程序时, 确保您删除了自动发布和不安全的软件包. 流星有很多很好的安全防范措施, 但是如果您不安装这两个包,那么所有这些都是徒劳的.
那么,如果这些包存在这样的安全隐患,那么流星为什么要自动包含它们呢? 原因是, 特别适合初学者, 这两个包使入门更容易——您可以从浏览器的控制台中轻松调试和调整数据库. 但是,尽快放弃自动发布和不安全是一个很好的做法.
所以我们修复了这个安全漏洞,但我们也引入了两个问题. 首先,我们现在无法访问数据库. 其次,我们没有办法与数据库进行交互.
我们来解决第一个问题. 流星通过让服务器“发布”数据库的一个子集来提供对数据库的安全访问, 并让客户“订阅”该出版物.
首先,让我们创建“/server/publications”.js”:
流星.Publish ('books', function() {
返回的书.找到({});
});
我们将创建“/client/订阅”.js”:
流星.订阅(书);
在流星Pad上看看吧: 发布和订阅
服务器“发布”一个可以访问所有数据的游标, 客户端在另一端“订阅”它. 客户机使用此订阅用游标的所有数据填充数据库的镜像副本. 当我们访问“书籍”时.find ().Fetch() ",我们看到所有五个对象,我们看到它们像之前一样显示在屏幕上.
现在的不同之处在于,很容易限制客户端可以访问的内容. 尝试将发布" find () "切换到数据的子集:
流星.Publish ('books', function() {
返回的书.找到({},{限制:3});
});
现在客户只看到了五本书中的三本书,没有办法看到剩下的. 这不仅有利于安全(我不能看到其他人的银行账户)。, 但是您可以使用它来分发数据并避免客户机超载.
我们已经看到了如何以一种有限的、安全的方式为客户端提供对数据库的读访问. 现在, 让我们来看看第二个问题:如何让用户在不允许他们做任何他们想做的事情的情况下修改数据库? 去掉包的不安全使得客户端根本无法访问—让我们再次尝试允许添加书籍. 在流星中,我们通过向服务器添加一个“方法”来实现这一点. 让我们添加一个方法,将一本新书添加到“/lib/collections/books”.js”:
流星.方法({
addBook:函数(bookData) {
var bookID =书籍.插入(bookData);
返回bookID;
}
});
如你所见, 它接受“bookData”——在本例中, 这是一个具有“title”和“作者”字段的对象,并将其添加到数据库中. 一旦客户端重新加载,我们就可以从客户端调用这个方法. 你可以进入控制台,输入如下内容:
流星.call('addBook',{标题:《欧博体育app下载》,作者:“查尔斯·狄更斯”})
和很快! 你的书单上又多了一本书. 使用控制台笨拙得令人难以忍受, 所以让我们继续,在“推荐书目”模板的末尾添加一个简单的表单,让我们添加新书:
我们可以用事件用例把它连接到JavaScript, 就像我们在最初的测试应用程序中那样:
Template.推荐书目.事件({
“提交 .Add-book ": function(事件) {
事件.pr事件Default(); // this pr事件s built-in form submission
流星.调用('addBook',{标题:事件.目标.title.值,作者:事件.目标.作者.值})
}
});
你可以在流星Pad上看到这一点: 方法
当我们有了不安全的自动发布,客户端可以访问和修改整个数据库. 现在,随着不安全和自动发布的消失, 但是对于出版物, 订阅, 和方法, 客户端可以访问数据库并以受控的方式与之交互.
顺便说一句:您还可以通过使用“允许和拒绝规则”来解决流星中的安全问题。. 你可以找到更多关于这些和一些原因我更喜欢上面的方法,而不是在 discover流星.com.
看起来好像我们又回到了开始的地方, 但是有一个重要的区别:我们现在很容易限制对数据库的访问. 为了了解它是如何工作的,让我们尝试向这个应用程序添加用户. 我们将在应用程序中添加一个登录系统, 而不是让所有的客户端都使用一个系统范围的图书列表, 我们将使每个用户只能添加或阅读他们自己的图书列表.
进入app目录,安装两个包:
流星添加accounts-ui accounts-password
在那里. 您刚刚为应用程序添加了一个登录系统. 现在我们只需要将登录UI添加到图书列表.html. 把这一行放在正文的顶部:
{{> loginButtons}}
您应该在屏幕顶部看到一个登录提示:
注意,如果单击登录链接,它将要求输入电子邮件地址和密码. 我们可以通过创建“/client/config”将其切换为简单的用户名/密码登录系统.Js”,内容如下:
账户.ui.配置({
passwordSignupFields:“USERNAME_ONLY”
});
此时,您可以键入“流星”.userId() ",它将返回" null ". 您可以尝试点击链接来创建一个帐户. 叫“流星.userId() "现在应该返回一个ID字符串. 服务器可以访问相同的信息片段(如“this”).用户标识”), 因此,让“add books”方法强制用户登录并包含userID字段是微不足道的:
流星.方法({
addBook:函数(bookData) {
如果(这.userId) {
bookData.userID =这个.用户标识;
var bookID =书籍.插入(bookData);
返回bookID;
}
}
});
现在剩下的就是限制客户端,只显示该用户添加的图书. 我们利用出版物的能力来缩小客户可以接触到的内容范围:
流星.Publish ('books', function() {
返回的书.找到({userID:这.userId});
});
现在,该出版物只查找来自该特定用户的图书. We can even access the userId from Blaze expressions as “{{currentUser}}”; 和 we can use this, 使用" {{#if}} "指令(它的作用和你想的完全一样), 只显示用户登录时的数据:
{{#如果currentUser}}
Here are your books:
{{#每个书籍}}
- {{title}} by {{作者}}
{{/每个}}
{{其他}}
Please log in to see your books
{{/if}}
在流星Pad: Users上查看最终结果
现在我们可以将这个流星应用程序部署到Internet上. 我们通过进入终端上的应用程序目录并执行:
流星 deploy .流星.com
Make sure you replace “
快速演示一下,这颗流星.Com解决方案是您所需要的. 流星团队还没有宣布任何明确的服务器存储或带宽限制. 唯一值得注意的限制是,如果你的应用程序长时间不使用,网站 需要几秒钟才能为下一个用户启动.
也就是说,流星.Com不打算用于商业用途. 但是当你进入生产阶段时,有平台即服务公司像 模量 和 数字海洋 这使得部署流星应用程序变得容易. 您是否希望将流星应用程序部署到您自己的服务器上, “流星上升”让这个过程变得简单明了, 太.
祝贺你! 在学习流星的过程中,您现在已经制作并部署了一个非常简单的实时流星 web应用程序. 显然,这只是进入整个特性和功能世界的第一步. 如果你喜欢你目前所看到的,我强烈推荐 你的第一个流星应用程序由大卫·特恩布尔, 哪一个可以引导读者创建一个更复杂的应用程序, 随着更多关于流星特征的信息. 在特恩布尔的网站上,人们可以以低廉的价格买到Kindle电子书,也可以以免费的PDF格式下载.
您还需要探索可用于流星的包. Nine times out of ten, the answer to “how do I do
正如您从本教程中看到的那样, 在流星上编写应用程序既简单又有趣, 但如果我不提一下它的缺点,那就太失职了.
流星仍然相对不成熟. 它达到1.这导致了一些问题. 如果你想做些不为人知的事, 可能还没有人为这个功能编写一个包. 存在的包更有可能有bug, 很简单,因为他们存在的时间还不够长,无法解决所有的问题.
在流星中,缩放也是未知的. 有许多流星站点可以扩展到合理数量的用户, 但很少有大型网站——没有Facebook或LinkedIn那样的网站, 拥有数千万甚至上亿的用户.
然而, 对于大多数应用来说,流星是一个完美的选择, 因为这是一个减少开发时间和参与伟大事物开始的机会.
Peter (BCSc)是一个拥有20多年编程经验的前端web和移动开发人员, 最近专注于JavaScript和PHP.
世界级的文章,每周发一次.
世界级的文章,每周发一次.