Sails v0.12 包含 Socket.io 和 Express 的升级,以及许多错误修复和性能改进。虽然您会发现此版本在很大程度上与 Sails v0.11 向后兼容,但对 sails.sockets.*
方法有一些重大更改,可能会影响您的应用程序。这些更改在下面的迁移指南中进行了说明,因此如果您要将现有应用程序从 v0.11 升级,并且正在使用 sails.sockets
方法,请务必仔细阅读下面的信息。除了这些更改之外,在现有项目中运行 sails lift
应该可以正常工作。
以下部分提供有关更改、主要错误修复、增强功能和新功能的高级概述,以及有关如何将 v0.11.x Sails 应用程序升级到 v0.12 的基本教程。
从您的 Sails 应用程序的根目录运行以下命令
npm install sails@~0.12.0 --force --save
--force
标志将使用 Sails v0.12 的最新补丁版本覆盖您 node_modules/
文件夹中安装的现有 Sails 依赖项,--save
标志将更新您的 package.json 文件,以便将来 npm 安装也会使用新版本。
socket.io-redis
适配器,请升级到至少 1.0.0 版本 (npm install --save socket.io-redis@^1.0.0
)。assets/js/dependencies/sails.io.js
),也请安装最新版本 (sails generate sails.io.js --force
)。有关完整更改列表,请参阅 Sails 的更改日志文件,以及 Waterline、sails-hook-sockets 和 sails.io.js 的更改日志文件。
sails.getRouteFor()
和 sails.getUrlFor()
方法内置到 Sails 核心。sails.socket.*
方法的多节点支持(因此可扩展性),并对与最新 socket.io 升级相关的其他调整和改进进行了调整。添加了一个更紧密的 Redis 集成,该集成位于 socket.io-redis
之上,使用 Redis 客户端来实现跨服务器通信,而不是额外的套接字客户端。sails.socket.*
方法的 API,规范化了重载函数,并弃用了在多服务器部署中会导致问题的方法(更多信息请见下文)。.leaveAll()
、.addRoomMembersToRooms()
和 .removeRoomMembersFromRooms()
。sails.sockets.id()
现在是 sails.sockets.getId()
(向后兼容弃用消息)。sails.io.js
(JavaScript Sails 套接字客户端)生成。此升级捆绑了最新版本的 socket.io-client
,以及一些更高级的功能(包括为所有虚拟套接字请求指定通用标头的功能)。grunt-contrib-*
依赖项(消除了许多 NPM 弃用警告并提供来自 NPM 的更详细的错误消息)。sails new
现在将运行 npm install
而不是对新应用程序的初始依赖项进行符号链接。这比您习惯的速度慢,但这是由于 NPM 处理嵌套依赖项的方式发生更改而必须进行的更改。核心维护人员正在 努力 找到更好的长期解决方案,但在此期间,如果您经常运行 sails new
并且速度变慢让您感到困扰,请考虑暂时降级到早期版本的 NPM(v2.x)。如果安装的 NPM 版本早于版本 3,Sails 将继续利用传统的符号链接策略。毫无疑问,Sails v0.12 中最大的变化是对 sockets
钩子公开的低级 sails.sockets
方法的 API 进行了更改。为了确保 Sails 应用程序在 多服务器(也称为“多节点”或“集群”)环境 中完美运行,已弃用几个 低级方法,并且添加了一些新方法。
以下 sails.sockets
方法已被弃用
如果您在应用程序中使用任何这些方法,它们在 v0.12 中仍然可以正常工作,但您应该尽快替换它们,因为它们可能会在下一个版本中从 Sails 中删除。有关更多信息,请参阅每个方法的单独文档页面。
由于与 sails.sockets.subscribers()
相同的原因,已弃用 .subscribers()
资源丰富的 PubSub 方法。如果您在代码中使用此方法,请遵循文档中的指南进行替换。
Sails v0.12 附带最新版本的 Waterline ORM (v0.11.0)。有两个 API 更改需要注意
.save()
不再向其回调提供第二个参数.save()
实例方法的回调不再接收第二个参数。虽然需要第二个参数很方便,但它使 .save()
的性能降低,特别是对于处理数百万条记录的应用程序。此更改通过消除对构建冗余查询的需要以及防止数据库处理这些查询来解决这些问题。
如果您的应用程序中有类似以下代码的地方
sierra.save(function (err, modifiedSierra){
if (err) { /* ... */ return; }
// ...
});
您应该将其替换为
sierra.save(function (err){
if (err) { /* ... */ return; }
// ...
});
您现在可以为内置 createdAt
和 updatedAt
属性配置自定义列名称(即字段名称,对于 Mongo/Redis 用户而言)。过去,可以将顶层 autoCreatedAt
和 autoUpdatedAt
模型设置指定为 false
,以完全禁用 createdAt
和 updatedAt
的自动注入。这仍然像以前一样有效,但现在您还可以为这两个设置中的一个或两个指定字符串值。如果指定了字符串,它将被理解为用于自动时间戳的自定义列(/字段)名称。
{
attributes: {},
autoCreatedAt: 'my_cool_created_when_timestamp',
autoUpdatedAt: 'my_cool_updated_at_timestamp'
}
如果您正在使用 这里 @sgress454 建议的解决方法,您可能希望改用这种更简单的方法。
Sails-PostgreSQL 和 Sails-MySQL 接受了补丁更新,在填充关联时显着提高了性能。感谢 @jianpingw 深入研究源代码并发现了一个处理数据库记录次数过多的错误。如果您使用的是其中任何一个适配器,升级到 `[email protected]or
[email protected]` 将为您提供显着的性能提升。
虽然从技术上讲不是发布的一部分,但 Sails v0.12 伴随着对贡献者可用的工具和资源的一些重大改进。更多核心钩子现在已完全记录(controllers|grunt|logger|cors|responses|orm),团队还为参与 Sails 项目做出了 行为准则。
对贡献者的最大变化是 更新的贡献指南,其中包含用于功能/增强功能提案以及将功能、增强功能和补丁合并到核心的新简化流程。随着 Sails 框架的增长(代码库和用户群都增长了),有必要为如何审查和合并问题贡献、代码贡献以及对文档的贡献建立更清晰的流程。
此版本还包含对官方参考文档的深度清理,以及对 https://sails.js.cn/documentation 上的在线文档的一些小幅易用性改进。整个 Sails 网站现在提供 日语 版本,并且正在进行另外四个 翻译项目,分别针对韩语、巴西葡萄牙语、台湾普通话和西班牙语。
此外,Sails.js 项目(终于)有了 官方博客。Sails.js 博客是所有有关 Sails 的长篇更新和公告的新来源,以及我们相关项目(如 Waterline、Skipper 和机器规范)的新来源。
如果您在将 Sails 应用程序升级到 v0.12.0 时遇到意外问题,请查看我们的贡献指南并 在 Sails GitHub 库中提交问题。