升级到v.0.12

Sails v0.12的升级伴随着Socket.io和Express的升级,以及一些bug的修复和性能的提升。你可以发现这个版本大部分向后兼容v0.11,但是还是有一些大的改动--sails.sockets.*方法的改变也许会或多或少地影响你的app。下面的升级指南大部分都是在解决这些改变,所以如果你从一个已有的v0.11 app中升级并且使用了sails.sockets方法,假使它影响到了你的app那么请确保已经仔细阅读了下面的内容。除此之外,在一个已经存在的工程中运行sails lift应该还是能工作的。

下面的章节提供了改动地方和修复bug、性能提升和新特性的一个高层概述,同时也包含了如何从v0.11升级到v0.12的一个基本指导。

安装更新

在你的Sails app的根目录下运行下面的命令:

npm install [email protected] --force --save

--force标志将会重写安装在你的node_modules/文件夹下已经存在的Sails依赖成Sails v0.12,--save标志将会更新你的package.json文件让以后你的npm安装软件的时候会使用新的版本。

升级后需要立即做的事情

  • 如果你的app使用了socket.io-redis适配器,那么请升级它到至少是1.0.0(npm install --save socket.io-redis@^1.0.0)
  • 如果你的app在前端使用了Sails socket client(比如assets/js/dependencies/sails.io.js),那么也请升级到最新版本(sails generate sails.io.js --force)。

在v0.12中的改变预览

完整的改变列表请参考Sails的改变日志,其它(包括Waterline, sails-hook-socketssails.io.js)的也是一样。

  • 安全性增强:更新了一些潜在的弱点的依赖
  • 反向路由功能现在内嵌到Sails的内核通过新的方法--sails.getRouteFor()sails.getUrlFor()
    • 普遍地提升了多节点支持底层的sails.socket.*方法,并且对相关的最新socket.io升级做出了些额外的调整和提高。添加一个更加小巧的Redis集成在socket.io-redis的顶部,使用redis客户端去实现跨服务器通信而不需要用多个socket 客户端。
    • 清空sails.socket.*方法的API,规范化重载函数和那些在多服务器部署会导致问题的被弃用的方法。
    • 添加几个全新的方法:.leaveAll(), .addRoomMembersToRooms(),和.removeRoomMembersFromRooms()
    • sails.sockets.id()现在变成sails.sockets.getId()(向后兼容w/这个弃用的消息)
    • 新的Sails app带有更新版本的sails.io.js(JS Sails socket client)。这个升级绑定了最新版本的socket.io-client,也包含了一些更高级的功能(包含了为所有的虚拟套接字请求指定通用头部的能力)。
    • 升级到最新的grunt-contrib-*版本依赖(消除了许多NPM弃用的警告和提供更好的错误信息)。
    • 如果你在使用NPM v3,当运行sails new的时候会等于运行npm install而不是以前的符号链接到你的新的app初始化依赖中去。这个也许会比你之前使用的变慢了,但是这是必须的改变因为NPM处理嵌套的依赖的方法已经改变了。虽然内核维护者一直在找寻一个更好的长期解决办法,但是同时如果你运行很多次sails new并且速度慢困扰着你,那么考虑临时地降级到npm的早期版本(v2.x)。如果你安装的NPM版本小于3.0,那么Sails将会继续利用那经典地符号链接策略。

套接字方法

毫无疑问,在Sails v0.12的最大改变就是由sockets钩子暴露的底层sails.sockets方法的API。为了确保Sails app在多服务器环境(aka "multi-node" or "clustered")中完美无暇地执行,一些底层方法将会被弃用并且会添加一些新的方法。

下面的sails.sockets方法将被弃用:

如果你在你的app中使用上面的任一个方法,虽然它们在v0.12中仍然还可以工作但是你最好尽快地将它们替换掉因为它们在下一个版本中将会被删除掉的。更多信息参考每个方法的独立文档页。

资源丰富的发布订阅

资源丰富的.subscribers()方法已经被弃用因为和sails.sockets.subscribers()相同的原因。如果你在你的代码中使用它那么参考它的文档中说明替换的方法指导。

Waterline(ORM)更新

Sails v0.12带有最新版本的Waterline(ORM) v0.11.0.这里有两个改变的API值得注意:

.save()不再提供其回调函数的第二个参数

.save()实例方法的回调不再有第二个参数。提供这第二个参数的需求让.save()变得性能差,尤其app工作在成百万的记录中。这个改变解决了那些问题通过消除需要构建的冗余请求以及避免你的数据库不得不处理他们。

如果在你的代码中某些地方有这种类似的代码:

sierra.save(function (err, modifiedSierra){
  if (err) { /* ... */  return; }

  // ...
});

那么现在需要替换成这样:

sierra.save(function (err){
  if (err) { /* ... */  return; }

  // ...
});
内建的时间戳自定义的专栏或字段

你现在可以为内建的createdAtupdatedAt属性配置一个自定义的专栏名称(也就是Mongo/Redis中的字段名字) 。在过去,上层的autoCreatedAtautoUpdatedAt模型设置可以指定为false来禁用自动注入createdAtupdatedAt。现在这个功能还是可以能用,但是现在你还可以为它们指定字符串值。如果一个字符串被指定了,它将被理解为自定义的专栏(字段)名称来用在自动化的时间戳上。

{
  attributes: {},
  autoCreatedAt: 'my_cool_created_when_timestamp',
  autoUpdatedAt: 'my_cool_updated_at_timestamp'
}

如果你使用workaround suggested by @sgress454 here,你也许可以利用这个简单的方法。

SQL适配器性能

Sails-PostgreSQLSails-MySQL进行补丁更新,该补丁可以有效地提高性能当在populating关联的时候。感谢@jianpingw深挖代码并发现一个处理数据库会记录很多次的bug。如果你使用这些适配器中的一个,那么升级到[email protected][email protected]后会给你一个性能的巨大提升。

贡献

虽然不是技术上发布的一部分,但是Sails v0.12是由对贡献者可用的的工具和资源的一些主要提升完成的。大部分的内核钩子现在都完全文档化了(controllers|grunt|logger|cors|responses|orm),并且团队还把对Sails工程有贡献的人放在一起成一个Code of Conduct

对于贡献者最大的改变是更新的贡献指导,包含了新的、流线型的feature/enhancement提议和合并feature、enhancements、补丁到内核的流程。因为Sails框架在不断成长(包括代码量和用户量),建立一个清晰的流程来review和合并问题贡献者、代码贡献者、以及文档贡献者是很有必要的。

文档

该版本带来一个对官方参考文档的深度清理工作,以及对在线文档http://sailsjs.org/documentation的一些小的可用性改进。现在网站的[日本版本](http://sailsjs.jp/)已经可用了,另外其他[四个版本(Korean,Brazillian Portugese,Taiwanese Mandarin,和Spanish)的翻译工程](https://github.com/balderdashy/sails-docs#in-other-languages)已经在进行中了。

另外Sails.js工程有一个官方博客。Sails.js博客是所有更新和关于Sails.js公告的来源,也包括所有相关的工程比如Waterline、Skipper和机械规格表。

需要帮忙?

如果你升级到v0.12之后遇到了一个未曾见过的问题,请审查我们的投稿指南并提交问题到Sails GitHub代码库中

results matching ""

    No results matching ""