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
標記將覆寫安裝在您的 node_modules/
資料夾中現有的 Sails 相依性,換成最新的 Sails v0.12 修補程式版本,而 --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.socket.*
方法的多節點支援(以及因此的可擴展性),並針對最新的 socket.io 升級進行了額外的調整和改進。新增了更緊密的 Redis 整合,其建立在 socket.io-redis
之上,使用 Redis client 來實作跨伺服器通訊,而不是額外的 socket client。sails.socket.*
方法的 API,標準化了過載函數並棄用了在多伺服器部署中會導致問題的方法(下方有更多說明)。.leaveAll()
、.addRoomMembersToRooms()
和 .removeRoomMembersFromRooms()
。sails.sockets.id()
現在是 sails.sockets.getId()
(向後相容並帶有棄用訊息)。sails.io.js
(JavaScript Sails socket client)產生。此升級捆綁了最新版本的 socket.io-client
,以及一些更進階的功能(包含為所有虛擬 socket 請求指定通用標頭的能力)。grunt-contrib-*
相依性(消除了許多 NPM 棄用警告,並提供來自 NPM 的更佳錯誤訊息)。sails new
現在將執行 npm install
而不是符號連結您的新應用程式的初始相依性。這比您可能習慣的速度慢,但由於 NPM 處理巢狀相依性的方式有所變更,因此這是必要的變更。核心維護人員正在 致力於 更好的長期解決方案,但在這段期間,如果您經常執行 sails new
並且速度變慢讓您感到困擾,請考慮暫時降級到較早版本的 NPM (v2.x)。如果安裝的 NPM 版本早於 3,Sails 將繼續利用經典的符號連結策略。毫無疑問,Sails v0.12 中最大的變更是 sockets
hook 公開的底層 sails.sockets
方法的 API。為了確保 Sails 應用程式在 多伺服器(又稱「多節點」或「叢集」)環境 中完美運行,幾個 底層方法 已被棄用,並且新增了一些新方法。
以下 sails.sockets
方法已被棄用
如果您在應用程式中使用這些方法中的任何一個,它們在 v0.12 中仍然可以運作,但您應該盡快替換它們,因為它們可能會在下一個版本的 Sails 中移除。請參閱每個方法的個別文件頁面以取得更多資訊。
資源型 PubSub 方法 .subscribers()
因為與 sails.sockets.subscribers()
相同的原因而被棄用。如果您在程式碼中使用此方法,請遵循文件中的指南來替換此方法。
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]或
[email protected]` 將為您帶來顯著的效能提升。
雖然技術上不屬於此版本的一部分,但 Sails v0.12 同時也大幅改進了可供貢獻者使用的工具和資源。更多核心 hook 現在已完全文件化 (controllers|grunt|logger|cors|responses|orm),並且團隊已為 Sails 專案制定了 行為準則。
對於貢獻者而言,最大的變更是 更新的貢獻指南,其中包含用於功能/增強功能提案以及將功能、增強功能和修補程式合併到核心的新精簡流程。隨著 Sails 框架的成長(程式碼庫和使用者群),有必要建立更清晰的流程,以了解如何審查和合併問題貢獻、程式碼貢獻和文件貢獻。
此版本還對官方參考文件進行了深度清理,並對 https://sails.dev.org.tw/documentation 上的線上文件進行了一些小的可用性改進。整個 Sails 網站現在提供 日語 版本,並且還有四個其他的 翻譯專案 正在進行中,分別是韓語、巴西葡萄牙語、台灣繁體中文和西班牙語。
此外,Sails.js 專案(終於)有了一個 官方部落格。Sails.js 部落格是所有關於 Sails 的長篇更新和公告的新來源,以及我們相關的專案,例如 Waterline、Skipper 和 machine 規範。
如果您在將您的 Sails 應用程式升級到 v0.12.0 時遇到意外問題,請查看我們的貢獻指南,並 在 Sails GitHub 儲存庫中提交問題。