「tasks/
」目錄包含了一系列的 Grunt 任務 及其設定。
任務主要用於捆綁前端資源,(例如樣式表、腳本和用戶端標記範本),但它們也可用於自動化各種重複的開發雜務,從 browserify 編譯到 資料庫遷移。
Sails 為了方便起見,捆綁了一些預設任務,但由於有數百個外掛程式可供選擇,您可以使用任務以最小的努力自動化幾乎所有事情。如果還沒有人建立您需要的東西,您可以隨時編寫並發布您自己的 Grunt 外掛程式到 npm!
如果您之前沒有使用過 Grunt,請務必查看入門指南,因為它解釋了如何建立 Gruntfile 以及安裝和使用 Grunt 外掛程式。
資源管道是您組織將注入到視圖中的資源的地方,它可以在 tasks/pipeline.js
檔案中找到。配置這些資源很簡單,並且使用 Grunt 任務檔案配置 和 萬用字元/glob/splat 模式。這些分為三個部分
這是一個要注入到 HTML 中的 CSS 檔案陣列,作為 <link>
標籤。這些標籤將被注入到任何出現它們的視圖中的 <!--STYLES--><!--STYLES END-->
註解之間。
這是一個 JavaScript 檔案陣列,它會作為 <script>
標籤注入到您的 HTML 中。這些標籤將被注入到任何出現它們的視圖中的 <!--SCRIPTS--><!--SCRIPTS END-->
註解之間。檔案會按照它們在陣列中出現的順序注入,這意味著您應該將依賴項的路徑放在依賴它們的檔案之前。
這是一個 HTML 檔案陣列,它將被編譯為 JST 函數並放置在 jst.js 檔案中。然後,此檔案會作為 <script>
標籤注入到您的 HTML 中的 <!--TEMPLATES--><!--TEMPLATES END-->
註解之間。
相同的 Grunt 萬用字元/glob/splat 模式和任務檔案配置也用於某些任務配置 JS 檔案本身,如果您也想更改這些檔案。
已配置的任務是您的 Gruntfile 在執行時將遵循的一組規則。它們是完全可自訂的,並且位於 tasks/config/
目錄中。您可以修改、省略或替換任何這些 Grunt 任務以符合您的需求。您也可以新增自己的 Grunt 任務——只需在此目錄中新增一個 someTask.js
檔案來配置新任務,然後將其註冊到適當的父任務 (們) (請參閱 tasks/register/*.js
中的檔案)。請記住,Sails 附帶了一組有用的預設任務,這些任務旨在讓您無需任何配置即可啟動並執行。
將自訂任務配置到您的專案中非常簡單,並且使用 Grunt 的 config 和 task API,讓您可以使您的任務模組化。讓我們來看一個快速範例,說明如何建立一個新任務來替換現有任務。假設我們想要使用 Handlebars 範本引擎,而不是預設配置的 underscore 範本引擎
npm install grunt-contrib-handlebars --save-dev
tasks/config/handlebars.js
建立一個設定檔。這是我們將放置 Handlebars 配置的地方。// tasks/config/handlebars.js
// --------------------------------
// handlebar task configuration.
module.exports = function(grunt) {
// We use the grunt.config api's set method to configure an
// object to the defined string. In this case the task
// 'handlebars' will be configured based on the object below.
grunt.config.set('handlebars', {
dev: {
// We will define which template files to inject
// in tasks/pipeline.js
files: {
'.tmp/public/templates.js': require('../pipeline').templateFilesToInject
}
}
});
// load npm module for handlebars.
grunt.loadNpmTasks('grunt-contrib-handlebars');
};
// tasks/pipeline.js
// --------------------------------
// asset pipeline
var cssFilesToInject = [
'styles/**/*.css'
];
var jsFilesToInject = [
'js/socket.io.js',
'js/sails.io.js',
'js/connection.example.js',
'js/**/*.js'
];
// We change this glob pattern to include all files in
// the templates/ direcotry that end in the extension .hbs
var templateFilesToInject = [
'templates/**/*.hbs'
];
module.exports = {
cssFilesToInject: cssFilesToInject.map(function(path) {
return '.tmp/public/' + path;
}),
jsFilesToInject: jsFilesToInject.map(function(path) {
return '.tmp/public/' + path;
}),
templateFilesToInject: templateFilesToInject.map(function(path) {
return 'assets/' + path;
})
};
// tasks/register/compileAssets.js
// --------------------------------
// compile assets registered grunt task
module.exports = function (grunt) {
grunt.registerTask('compileAssets', [
'clean:dev',
'handlebars:dev', // changed jst task to handlebars task
'less:dev',
'copy:dev',
'coffee:dev'
]);
};
// tasks/register/syncAssets.js
// --------------------------------
// synce assets registered grunt task
module.exports = function (grunt) {
grunt.registerTask('syncAssets', [
'handlebars:dev', // changed jst task to handlebars task
'less:dev',
'sync:dev',
'coffee:dev'
]);
};
tasks/config/jst.js
。只需從您的專案中刪除它。理想情況下,您應該從您的專案和專案的 Node 依賴項中刪除它。這可以通過在終端機中執行此命令來完成
npm uninstall grunt-contrib-jst --save-dev
在開發模式中,Sails 執行 default
任務 (tasks/register/default.js
)。這會編譯 LESS、CoffeeScript 和用戶端 JST 範本,然後從您應用程式的動態視圖和靜態 HTML 頁面自動連結到它們。
在生產環境中,Sails 執行 prod
任務 (tasks/register/prod.js
),它與 default
具有相同的職責,但也會縮小您應用程式的腳本和樣式表。這減少了您應用程式的載入時間和頻寬使用量。
這些任務觸發器是位於 tasks/register/
資料夾中的 「基本」Grunt 任務。在下面,您將找到 Sails 中所有任務觸發器的完整參考,以及啟動它們的命令
sails lift
執行 default 任務 (tasks/register/default.js
)。
sails lift --prod
執行 prod 任務 (tasks/register/prod.js
)。
sails www
執行 build 任務 (tasks/register/build.js
),該任務將所有資源編譯到 www
子資料夾而不是 .tmp/public
,並在參考中使用相對路徑。這允許使用 Apache 或 Nginx 提供靜態內容,而不是依賴 「www 中介軟體」。
sails www --prod
(生產環境)執行 buildProd 任務 (tasks/register/buildProd.js
),該任務與 build 任務執行相同的操作,但也會最佳化資源。
您可以通過指定設定 NODE_ENV 並在 tasks/register/ 中建立具有相同名稱的任務清單來執行其他任務。例如,如果 NODE_ENV 是 QA,則 Sails 將執行 tasks/register/QA.js (如果存在)。