任务主要用于捆绑前端资产(如样式表、脚本和客户端标记模板),但也可以用于自动化各种重复的开发工作,从browserify编译到数据库迁移.
Sails 捆绑了一些默认任务以方便使用,但由于有数百个插件可供选择,因此您可以使用任务以最少的努力来自动化几乎任何操作。如果还没有人构建您需要的东西,您始终可以编写并发布自己的 Grunt 插件到npm!
如果您以前没有使用过Grunt,请务必查看入门指南,因为它解释了如何创建一个Gruntfile,以及如何安装和使用 Grunt 插件。
资产管道是您组织将注入视图中的资产的地方,它位于tasks/pipeline.js
文件中。配置这些资产很简单,使用 Grunt 任务文件配置和通配符/glob/splat 模式。这些分为三个部分
这是一个要注入 HTML 中作为<link>
标记的 CSS 文件数组。这些标记将在任何出现它们的视图中的<!--STYLES--><!--STYLES END-->
注释之间注入。
这是一个要注入 HTML 中作为<script>
标记的 JavaScript 文件数组。这些标记将在任何出现它们的视图中的<!--SCRIPTS--><!--SCRIPTS END-->
注释之间注入。这些文件按数组中出现的顺序注入,这意味着您应该将依赖项的路径放在依赖它们的之前。
这是一个将被编译为 JST 函数并放置在 jst.js 文件中的 HTML 文件数组。然后,该文件作为<script>
标记注入 HTML 中的<!--TEMPLATES--><!--TEMPLATES END-->
注释之间。
如果您想更改这些,一些任务配置 JS 文件本身也会使用相同的 Grunt 通配符/glob/splat 模式和任务文件配置。
已配置的任务是您的 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
承担相同的职责,但也缩小了应用程序的脚本和样式表。这减少了应用程序的加载时间和带宽使用量。
这些任务触发器是“基本”Grunt 任务,位于tasks/register/
文件夹中。下面,您将找到 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(如果存在)。