grunt 插件开发注意事项
grunt的插件机制
task.loadNpmTasks = function(name) {
var root = path.resolve('node_modules');
var tasksdir = path.join(root, packagename, 'tasks');
//加载grunt 插件的tasks
if (grunt.file.exists(tasksdir)) {
loadTasks(tasksdir);
} else {
grunt.log.error('Local Npm module "' + name + '" not found. Is it installed?');
}
}
1、插件中使用插件
有时我们需要在插件中使用插件来充分利用package资源, 但是由于插件通常会再被其它package使用,tasksdir通常会定位到使用插件的package下的tasks; 所以就会报错找不到相关packageName的tasks。
那么我们可以通过在插件中重新定义 loadNpmTasks 方法来实现在当前package下加载插件, 如:
//grunt查找插件的规则是通过path.join(G)
var loadNpmTasks = function(name) {
var cwd = process.cwd();
var baseDir = path.resolve(__dirname, '..');
grunt.file.setBase(baseDir);
//packdir必须使用相对路径
grunt.loadNpmTasks(name);
grunt.file.setBase(cwd);
};
2、插件中文件的处理
可以通过 grunt.file.setBase(cwd) 来设计,文件操作的cwd
3、任务名称覆盖问题
如果在插件中使用到一些非常常用的第三方插件, 如grunt-contrib-clean、grunt-contrib-copy等插件,有可能在使用插件的package中也会用到, 所以一定不要覆盖使用插件的package的grunt配置,也不能merge配置, merge会导致执行顺序的修改。
举个例子:
grunt task build 的gruntfile //package build
grunt.initConfig({
"build-xxx": {
//build-xxx是一个插件提供的task的配置
},
"clean": {
//使用插件 grunt-contrib-clean
}
}); //package build-xxx 中的tasks/build-xxx.js
grunt.registerTask('build-xxx', function() {
//如下会覆盖掉package build中的grunt config clean, 导致task clean不可用。
grunt.initConfig({
"clean": {},
"copy": {}
});
//merge会导致执行顺序被修改
grunt.config.merge({clean: {}}); grunt.task.run(["clean", "copy"])
});
以上两种方式都会导致用户在使用grunt插件时,得到和预期不一致的结果,但是一个好的插件是不应该让使用者关心下层的实现的, so,可以改进如下:
在build-xxx的tasks/build-xxx.js中增加一个cleanConfig的任务
var originGruntConfig = grunt.config.data;
grunt.initConfig({
"clean": {},
"copy": {},
"cleanConfig": {}
});
grunt.registerTask('cleanConfig', function() {
grunt.initConfig(originGruntConfig);
});
为什么要使用新增任务cleanConfig,而不是直接在 grunt.task.run(["clean", "copy"]) 执行后将配置修改过来呢, 是因为grunt的run是基于任务队列运行, 不是及时同步完成。 我们需要在run结束后在将原有的config给同步过来。
4、task中的异步处理回调问题
如果在task的function body中存在异步调用, 这个问题和插件开发没什么关心,不过在用grunt写工具时需要注意一下
setTimeout(function() {
console.log('enter');
}, 2000);
那么在grunt中是默认不会执行的, 原因grunt的tasks 队列运行机制, 队列中的tasks运行完之后会执行exit, 退出当前进程;
do {
thing = this._queue.shift();
} while (thing === this._placeholder || thing === this._marker);
// If queue was empty, we're all done.
if (!thing) {
this._running = false;
if (this._options.done) {
process.exit(0);
}
return;
}
}
可以使用grunt提供的 this.async()方法, 在异步回调结束后调用生成的done行数,已确保该异步调用能在下一个task之前执行, 如:
var done = this.async();
setTimeout(function() {
//do something;
done(true);
}, 2000);
grunt 插件开发注意事项的更多相关文章
- Grunt 插件开发与调式
1 grunt是什么 官方网站解释的很清楚,http://gruntjs.com/ http://gruntjs.cn/ 它是一种javascript任务运行器,对于需要反复重复的任务,例如压缩.编译 ...
- cordova插件开发注意事项
1. 编写插件,先创建好cordova项目之后,在项目里开发调试好在去创建插件目录 如何在cordova项目里创建呢,在android文件夹下面的res/xml/config.xml里去加入插件 例如 ...
- Signs of a poorly written jQuery plugin 翻译 (Jquery插件开发注意事项,Jquey官方推荐)
原文链接:http://remysharp.com/2010/06/03/signs-of-a-poorly-written-jquery-plugin/ 原文作者:remy sharp So far ...
- 最近给几个CRM软件配套开发了Outlook插件,讲讲Outlook插件开发注意事项
原始出处:www.cnblogs.com/Charltsing/p/OutlookAddinsTips.html联系QQ:564955427 从去年到现在,写了四五个Outlook插件,其中两个是给C ...
- 快速开发Grunt插件----压缩js模板
前言 Grunt是一款前端构建工具,帮助我们自动化搭建前端工程.它可以实现自动对js.css.html文件的合并.压缩等一些列操作.Grunt有很多插件,每一款插件实现某个功能,你可以通过npm命名去 ...
- 【技术·水】浅谈Dism++清理插件开发
前言 昨天我发布了NCleaner,一款Dism++清理插件(地址:http://bbs.pcbeta.com/viewthread-1692182-1-1.html) 有些人想要我开源NCleane ...
- 读<jQuery 权威指南>[5]-插件
一.说明 jQuery插件官网:http://plugins.jquery.com/ 使用插件时引用顺序:插件引用要位于主jquery库之后. 二.插件应用实例 演示插件jquery.validate ...
- (转)android平台phonegap框架实现原理
(原文)http://blog.csdn.net/wuruixn/article/details/7405175 android平台phonegap框架实现原理 分类: Android2012-03- ...
- [转载]Firefox插件(plugins)开发实用指南
转自: http://huandu.me/2010/02/11/595/ Firefox插件可实现强大功能,但其中麻烦事情不少.写这个实用指南首先是为了方便自己记忆,免得以后再次栽倒一些坑里面,如果能 ...
随机推荐
- lesson - 13 Linux系统日常管理2
内容概要: 1. Linux抓包工具 tcpdump 系统自带抓包工具tcpdump -nn -i eth0 tcp and host 192.168.0.1 and port 80tcpdump - ...
- Siamese Network理解
提起siamese network一般都会引用这两篇文章: <Learning a similarity metric discriminatively, with application to ...
- thinkphp3.2.3的使用心得(零)
从模板传参到控制器 模板中代码: <volist name="list" id="vo"> <a href="__CONTROLLE ...
- Q:javax.comm 2.0 windows下Eclipse的配置
@转自http://blog.csdn.net/zhuanghe_xing/article/details/7523744处 要在Windows下,对计算机的串口或并口等进行编程,可以选择使用Java ...
- 15个超强悍的CSS3圆盘时钟动画赏析
在网页上,特别是个人博客中经常会用到时钟插件,一款个性化的时钟插件不仅可以让页面显得美观,而且可以让访客看到当前的日期和时间.今天我们给大家收集了15个超强悍的圆盘时钟动画,很多都是基于CSS3,也有 ...
- JavaScript时间处理插件
摘要:代码返回的有两种时间格式 一种是/// 另外一种是---分割的 两个接收参数的说明 timestr 是接收的时间 mark是格式 默认返回的格式是/// 加上- 返回的格式是- ...
- unity3d 打包个人记录
证书问题Android:CreateCer.bat ztmyseabed 路径:tool/Build/Windows/Android下iOS:MacCer文件夹如何上传ipa:修改版本号version ...
- js 移动端上拉加载下一页通用方案
取页面三种高度 //取进度条到底部距离 var getScrollTop = function () { var scrollTop = 0; if (document.documentElement ...
- Springboot(二):Spring Boot 之 HelloWorld
关于项目的创建不再解释,需要了解的请参考: Springboot(一):使用Intellij中的Spring Initializr来快速构建Spring Boot工程 目录结构: 首先我们在上一项目的 ...
- VFS四大对象之三 struct dentry
继上一篇文章介绍了inode结构体:继续介绍目录项dentry: http://www.cnblogs.com/linhaostudy/p/7427794.html 三.dentry结构体 目录项:目 ...