怎么配置一个gruntfile.js在多个目录下使用

怎么配置一个gruntfile.js在多个目录下使用,第1张

gruntfile.js可配置路径的读取方法:

一是通过自定义的task,接受命令行参数,并据此加以处理。

二是在运行任务之前,通过grunt.config.set('xx.', value)这样的方式,动态修铅答漏改原来的配置。

举例:

module.exports = function (grunt) {

// Project configuration.

grunt.initConfig({

pkg: grunt.file.readJSON('package.json'),

jasmine_node: {

options: {

matchall: false,

extensions: 'js',

specNameMatcher: '_spec'

},

// 对于grunt-jasmine-node而言,这里设置了目标文件

all: ['test/spec/']

}

})

grunt.loadNpmTasks('grunt-jasmine-node')

grunt.registerTask('default', ['jasmine_node'])

// 自定义一个task,运行方式:举高grunt spec:dir 或 grunt spec

grunt.registerTask('spec', 'run tests in specific dir', function(dir){

// 如果是grunt spec,dir的值为undefined,那么维持原设置不变槐烂

if (dir !== undefined) {

// 否则,修改jasmine-node的all选项

grunt.config.set('jasmine_node.all', ['test/spec/' + dir])

}

// 运行原来的task

grunt.task.run('jasmine_node')

})

}

工具/原料

NodeJs

Windows系统

方法/步骤

要使用Grunt,第一件事是安装Node.js。(即使你没用过Node.js也不用担心——你只需安装它让Grunt能运行。)

安装了Node.js之后,用命令行工具执行以下命令:

$ npm install -g grunt-cli

要确认Grunt是否正确安装,可以使用以下命令:

$ grunt --version

下一步是在你的项目的根目录下创建package.json和gruntfile.js两个文件。

创建package.json文件

这个JSON文件让我们指定我们的开发环境所依赖的必须模块。有了它,项目的所有开发者都能保证安装上一致的必须模块腊祥,从而保证所有人拥有一样的开发环境。

在项目根目录下的pacakge.json文件中写上:

{

"name" : "SampleGrunt",

"version" : "0.1.0",

"author" : "Brandon Random",

"private" : true,

"devDependencies" : {

"grunt" : "~0.4.0"

}

}

然后在命令行工具运行:

$ npm install

该命令告诉npm 需要安装的必须模块,npm会安装它们,自动保存在项目根目录下一个叫做 node_modules 的文件夹里。

创建gruntfile.js文件

gruntfile.js 文件本质上就是一个wrapper函数,接受grunt作为参数:

module.exports = function(grunt){

grunt.initConfig({

pkg: grunt.file.readJSON('package.json')

})

grunt.registerTask('default', [])

}

现在你已经可以在项目根目录下运行grunt命令行工具了。

$ grunt

>Task "default" not found. Use --force to continue.

这里我们只指定了Grunt作为必须模块,还没定义任何任务。接下来我们就要指定任务和必须模块。首先来看如何拓展package.json文件。

拓展枯局团package.json文件

使用Node.js最好的一点,就是它可以根据package.json文件的内容,一次性查找和安装多个package。要安装我们项目的所有必须任务,只须在package.json文件中加上以下内容:

{

"name" : "SampleGrunt",

"version" : "0.1.0",

"author" : "Mike Cunsolo",

"private" : true,

"devDependencies" : {

"grunt" : "~0.4.0",

"grunt-contrib-cssmin": "*",

"grunt-contrib-sass": "*",

"grunt-contrib-uglify": "*",

"grunt-contrib-watch": "*",

"grunt-cssc": "*",

"grunt-htmlhint": "*",

"matchdep": "*"

}

}

那么如何实现安装?你肯定已经猜到了:

$ npm install

使用Grunt载入任务

package安装好后,还必须被Grunt载入才能为我们所用。使用 matchdep,我们用一行代码就可以自动载入所有任务。这是开发流程的一大优化,因为现在我们只须把必须任务列表写在package.json一个文件里,便于管理。

在gruntfile.js里,grunt.initConfig之上,写上以下代码:

require("matchdep").filterDev("grunt-*").forEach(grunt.loadNpmTasks)

要是没有matchdep,我没橘们就必须为每一个必须任务写一次grunt.loadNpmTasks(“grunt-task-name”),随着我们使用的任务的增加,这些载入任务的代码很快就会变得相当繁冗。在Grunt载入这些任务前,我们还可以指定设置选项。

现在我们需要创建我们的HTML文件(index.html):

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="utf-8">

<meta name="viewport" content="width=device-widthinitial-scale=1.0maximum-scale=1.0">

<title>Enter your first name</title>

<link rel="stylesheet" href="build/css/master.css">

</head>

<body>

<label for="firstname">Enter your first name</label>

<input id="firstname" name="firstname" type="text">

<p id="namevalidation" class="validation"></p>

<script type="text/javascript" src="build/js/base.min.js"></script>

</body>

</html>

用HTMLHint验证HTML

在grunt.initConfig里加入下列设置代码:

htmlhint: {

build: {

options: {

'tag-pair': true,

'tagname-lowercase': true,

'attr-lowercase': true,

'attr-value-double-quotes': true,

'doctype-first': true,

'spec-char-escape': true,

'id-unique': true,

'head-script-disabled': true,

'style-disabled': true

},

src: ['index.html']

}

}

一般来说,一个plugin的设置方法如下:plugin的名称(去掉grunt-contrib-或grunt-前缀),选择使用此plugin的一个或多个对象(在这里可以给不同文件设置此plugin 的不同选项),一个选项object,以及plugin要作用的对象。现在,如果我们用命令行工具运行grunt htmlhint,该plugin就会检查我们在src里指定的HTML文件,验证其中有没有错误!但是每个小时都要手动运行几次这个任务,很快就让人觉得很繁琐了。

自动化任务运行

watch是一个特殊的任务,它可以在目标文件保存时自动触发一系列任务的运行。在grunt.initConfig里加入以下设置:

watch: {

html: {

files: ['index.html'],

tasks: ['htmlhint']

}

}

然后,在命令行工具中运行grunt watch命令。现在,你可以试试在index.html里加一行注释,保存文件。你会注意到,保存文件时会自动触发HTML的验证!这是对开发流程的一大优化:在你写代码时,watch任务就会默默同时为你验证代码,如果验证失败任务就会报告失败(它还会告诉你问题在哪)。

注意grunt watch任务会一直运行,直到命令行工具关闭,或手动停止(control+c在Mac中)。

保持JavaScript极简

让我们来写一个验证用户输入的名字的JavaScript文件。简便起见,我们这里只检查其中是否含有非字母的字符。我们的JavaScript会使用strict模式,这可以防止我们写可用但低质量的JavaScript。创建assets/js/base.js文件并在其中写上:

function Validator()

{

"use strict"

}

Validator.prototype.checkName = function(name)

{

"use strict"

return (/[^a-z]/i.test(name) === false)

}

window.addEventListener('load', function(){

"use strict"

document.getElementById('firstname').addEventListener('blur', function(){

var _this = this

var validator = new Validator()

var validation = document.getElementById('namevalidation')

if (validator.checkName(_this.value) === true) {

validation.innerHTML = 'Looks good! :)'

validation.className = "validation yep"

_this.className = "yep"

}

else {

validation.innerHTML = 'Looks bad! :('

validation.className = "validation nope"

_this.className = "nope"

}

})

})

让我们用UglifyJS来极简化这个源代码,在grunt.initConfig中加上以下设置:

uglify: {

build: {

files: {

'build/js/base.min.js': ['assets/js/base.js']

}

}

}

UglifyJS会替换所有的变量和函数名,剔除所有空白和注释,从而生成占据最小空间的JavaScript文件,对发布非常有用。同样地,我们需要设置一个watch任务来使用它,在watch的设置里加入以下代码:

watch: {

js: {

files: ['assets/js/base.js'],

tasks: ['uglify']

}

}

9

现在我们有了一个静态HTML页面,一个存放Sass和JavaScript源文件的assets文件夹,一个存放优化后的CSS和JavaScript的build文件夹,以及package.json文件和gruntfile.js文件。

至此你已经有了一个不错的基础来进一步探索Grunt。像之前提到的,一个非常活跃的开发者社区在为Grunt开发前端plugin。我建议你现在就到plugin library 去看看那300个以上的plugin。

1.1 分片、并发

分片与并发结合,将一个大文件分割成多块,并发上传,极大地提高大文件的上传速度。

当网络问题导致传输错误时,只需要重传出错分片,而不是整个文件。另外分片传输码拦能够更加实时的跟踪上传进度。

1.2 预览、压缩

支持常用图片格式jpg,jpeg,gif,bmp,png预览与压缩,节省网络数据传输。

解析jpeg中的meta信息,对于各种orientation做了正确的处理,同时压缩后上传保留图片的所有原始meta数据。

1.3 多途径添加文件

支持文件多选,类型过滤,拖拽(文件&文件夹),图片粘贴功能。

粘贴功能主要体现在当有图片数据在剪切板中时(截屏工具如QQ(Ctrl + ALT + A), 网页中右击图片点击复制),Ctrl + V便可添加此图片文件迟启胡。

1.4 HTML5 &FLASH

兼容主流浏览器,接口一致,实现了两套运行时支持,用户无需关心内部用了什么内核。

同时Flash部分没有做任何UI相关的工作,方便不关心flash的用户扩展和自定义业务需求。

1.5 MD5秒传

当文件体积大、量比较多时,支持上旁枯传前做文件md5值验证,一致则可直接跳过。

如果服务端与前端统一修改算法,取段md5,可大大提升验证性能,耗时在20ms左右。

1.6 易扩展、可拆分

采用可拆分机制, 将各个功能独立成了小组件,可自由搭配。

采用AMD规范组织代码,清晰明了,方便高级玩家扩展。

2、引入资源

2.1 下载包内容

├── Uploader.swf // SWF文件,当使用Flash运行时需要引入。

├── webuploader.js // 完全版本

├── webuploader.min.js // min版本

├── webuploader.flashonly.js // 只有Flash实现的版本。

├── webuploader.flashonly.min.js // min版本

├── webuploader.html5only.js // 只有Html5实现的版本。

├── webuploader.html5only.min.js // min版本

├── webuploader.withoutimage.js // 去除图片处理的版本,包括HTML5和FLASH.

└── webuploader.withoutimage.min.js // min版本

2.2 或者直接使用由staticfile提供的cdn版本,或者下载Git项目包。

// SWF文件,当使用Flash运行时需要引入。

├── http://cdn.staticfile.org/webuploader/0.1.0/Uploader.swf

// 完全版本。

├── http://cdn.staticfile.org/webuploader/0.1.0/webuploader.js

├── http://cdn.staticfile.org/webuploader/0.1.0/webuploader.min.js

// 只有Flash实现的版本。

├── http://cdn.staticfile.org/webuploader/0.1.0/webuploader.flashonly.js

├── http://cdn.staticfile.org/webuploader/0.1.0/webuploader.flashonly.min.js

// 只有Html5实现的版本。

├── http://cdn.staticfile.org/webuploader/0.1.0/webuploader.html5only.js

├── http://cdn.staticfile.org/webuploader/0.1.0/webuploader.html5only.min.js

// 去除图片处理的版本,包括HTML5和FLASH.

├── http://cdn.staticfile.org/webuploader/0.1.0/webuploader.withoutimage.js

└── http://cdn.staticfile.org/webuploader/0.1.0/webuploader.withoutimage.min.js

2.3 DIY打包

WebUploader文件打包借助了Grunt工具来实现

2.3.1 环境依赖

1.git命令行工具

2.node &npm命令行工具

3.grunt (npm install grunt-cli -g)

2.3.2 编译代码

1.克隆 webuploader git仓库,git clone https://github.com/fex-team/webuploader.git。

2.安装node依赖,npm install。

3.执行grunt dist,此动作会在dist目录下面创建合并版本的js, 包括通过uglify压缩的min版本。

2.3.3 配置

打开webuploader仓库根目录下面的Gruntfile.js文件, 代码合并有buildtask来完成。找到build配置项。

Gruntfile.js已经配置了一个自定义合并的demo. 打包只支持HTML5的版本

// 自己配置的实例

// glob语法。

custom: {

preset: "custom",

cwd: "src",

src: [

'widgets/**/*.js',

'runtime/html5/**/*.js' ],

dest: "dist/webuploader.custom.js"

}

3、angular指令——<web-uploader>

3.1 指令功能

添加一个上传文件按钮,可以自行配置上传文件的类型和过滤规则,且在d出的模态框中进行 *** 作,支持连续上传,分类选择上传

3.2 使用说明

这里只是使用说明,可能会加一些注意事项,具体参数或者变量说明请参看后面

3.2.1 页面添加一个指令

<web-uploader class="btn btn-info" type="image" accept="accept">uploader</web-uploader>

3.2.2 配置上传类型和过滤规则

上传类型

type有四种类型,分别为

image:图片

video:音视频

flash:flash

file:办公文档,压缩文件等等

过滤规则

accept有四个对象属性,属性中包含标题、允许文件后缀、允许的mimetype

3.2.3 指令中绑定d出模态框的事件

web-uploader这个指令中其实只做了一件事,给元素本身绑定d出模态框的事件,具体上传文件是在模态框中完成的

3.2.4 初始化uploader类,配置相关属性

在模态框控制器中用到了$timeout

$timeout(function(){

//这里是上传配置代码

},0)

因为配置uploader时需要事先准备好dom元素,angular打开模态框是异步而JavaScript是单线程,所以实际上在执行模态框控制器中的代码时,模态框并没有打开,也就是dom并没有加载完成,这会导致WebUploader报a.runningtime is not a function...的错误

3.3 指令详细说明

3.3.1 父级controller中的配置

.controller('myCtrl',['$scope', '$modal', function($scope, $modal){

//配置允许上传的类型 图片/音视频/flash/文件

$scope.accept = {

//图片

image: {

title : 'Images',//标题

extensions : 'gif,jpg,jpeg,bmp,png,ico',//允许上传文件的后缀

mimeTypes : 'image/*'//允许的mimetype

},

//音视频

video: {

title : 'Videos',

extensions : 'wmv,asf,asx,rm,rmvb,ram,avi,mpg,dat,mp4,mpeg,divx,m4v,mov,qt,flv,f4v,mp3,wav,aac,m4a,wma,ra,3gp,3g2,dv,vob,mkv,ts',

mimeTypes : 'video/*,audio/*'

},

//flash

flash: {

title : 'Flashs',

extensions : 'swf,fla',

mimeTypes : 'application/x-shockwave-flash'

},

//办公文档,压缩文件等等

file: {

title : 'Files',

extensions : 'zip,rar,ppt,pptx,doc,docx,xls,xlsx,pdf',

mimeTypes : 'application/zip,application/x-rar-compressed,application/vnd.ms-powerpoint,application/vnd.openxmlformats- officedocument.presentationml.presentation,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd.ms- excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/pdf'

}

}

}])

3.3.2 指令web-uploader

.directive('webUploader', ['$modal', function($modal){

return{

restrict: 'AE',

scope: {

accept: '=accept'

},

link: function($scope, $element, $attr){

$element.bind('click',function(){

var modalInstance = $modal.open({

controller: 'modalCtrl',

templateUrl: 'template/webuploader.tpl.html',

size:'lg',

resolve: {

items: function(){

return {

accept: $scope.accept,

type: $attr.type

}

}

}

})

modalInstance.result.then(function(returnStatus){

console.log(returnStatus)

},function(){

console.log('Modal dismissed at: ' + new Date())

})

})

}

}

}])


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12141981.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存