Grunt入门教程之学习笔记
我现在在几个小项目中一直在使用Node.js。在Node系统中有一些很强大的工具。我最喜欢的一个例子就是Grunt。
Grunt是一种工具,允许您定义任务,然后通过命令运行他们,在命令行中运行:
代码如下 | 复制代码 |
grunt watch |
这将启动一个watch任务,用来监控文件,我已经指定和运行指定的任务,只要这些文件变化了,就能监控到。在我的例子中,我已经在Grunt设置了只要当.js文件改变了就能检测JavaScript语法和压缩JavaScript和当.scss文件改变就能将Sass文件编译成CSS的任务。
这里介绍了如何设置。
安装Grunt
首先你需要先安装Grunt CLI,这是Grunt命令的接口。这将可以在命令行中使用Grunt命令:
代码如下 | 复制代码 |
$ npm install -g grunt-cli |
注意:由于我们使用Grunt CLI,Grunt必须安装在每个项目的基础上。这允许您在不同的项目是运行不同版本的Grunt。如果您之前全局安装了Grunt,那么你应该先卸载它:
代码如下 | 复制代码 |
$ npm uninstall -g grunt |
安装需要的依赖关系
接下来,您需要设置运行Grunt需要的所有依赖项。在这个例子中你需要grunt,grunt-contrib-jshint(检测js文件),grunt-contrib-uglify(压缩js文件),grunt-contrib-sass(编译你的Sass)。安装这些依赖项目,你需要在你的项目中的根目录下设置一个package.json文件:
代码如下 | 复制代码 |
{ "name":"Grunt-Example", "description": "Example project to demonstrate Grunt.", "version":"0.1.0", "private": true, "author": { "name": "Blake Haswell", "email": "blake.haswell@simpleweb.com.au" }, "devDependencies": { "grunt": "~0.4.0", "grunt-contrib-sass": "*", "grunt-contrib-jshint": "*", "grunt-contrib-uglify": "*", "grunt-contrib-watch": "*" } } |
一旦你创建好了这个文件,你可以在你的项目目录下运行npm install命令安装所需要的依赖项:
代码如下 | 复制代码 |
$ npm install |
设置Gruntfile.js
现在你需要创建一个"Gruntfile"。在这你可以定义你的任务。
首先在你的项目根目录下创建一个Gruntfile.js文件。创建Gruntfile真的很简单,我们只需要定义一个CommonJS模块。当需要改变我们的Grunt配置时,我们只需要修改这个模块。
代码如下 | 复制代码 |
module.exports = function(grunt){ //Grunt配置写在这里 } |
接下来,设置你的第一个任务:JSHint。在Grunt中设置任务,需要运行grunt.initConfig()方法,并通过每个对象设置你的任务。例如,这里介绍了如何设置JSHint:
代码如下 | 复制代码 |
module.exports = function(grunt){ grunt.initConfig({ //JSHint (http://www.jshint.com/docs)
}); grunt.loadNpmTasks('grunt-contrib-jshint'); |
正如你看到的,你一个对象中包含了JSHint任务。JSHint是一个多任务,所以这意味着你可以定义多个JSHint任务。在这种情况下JSHint只有一个任务:all。JSHint的all任务指定文件被linted,以及这个选项也适用于lint。
还有,你有没有注意到在底部通过grunt.loadNpmTasks('grunt-contrib-jshint')调用任务。该方法可以从node_modules/中加载grunt-contrib-jshint任务,让它可以使用你的配置。
现在你可以很容易的lint你的JavaScript文件:
$ grunt jshint
很酷,不是吗?你甚至可以创建watch任务,监测JavaScript文件和自动lints文件——当文件失败后会提配你。
代码如下 | 复制代码 |
module.exports = function(grunt){ grunt.initConfig({ //JSHint (http://www.jshint.com/docs) //watch }); grunt.loadNpmTasks('grunt-contrib-jshint'); |
现在你执行grunt watch和开始修改你的JavaScript。你保存了你的文件并且lint失败后,将会通知你。在一个跨团队的开发执行编码的标准是一个伟大的方式,它节省时间捕捉觉错误。
Grunt不只是可以用于lint你的代码,你可快速设置任务压缩你的JavaScript:
代码如下 | 复制代码 |
module.exports = function(grunt){ grunt.initConfig({ //JSHint (http://www.jshint.com/docs) //Uglify //watch }); grunt.loadNpmTasks('grunt-contrib-jshint'); |
可以编译你的Sass:
代码如下 | 复制代码 |
module.exports = function(grunt){ grunt.initConfig({ //JSHint (http://www.jshint.com/docs) //Uglify //Sass //watch }); grunt.loadNpmTasks('grunt-contrib-jshint'); |
然后,你可以将任务添加到你的watch任务,将可以自动执行这些任务:
代码如下 | 复制代码 |
module.exports = function(grunt){ grunt.initConfig({ //JSHint (http://www.jshint.com/docs) //Uglify //Sass //watch }); grunt.loadNpmTasks('grunt-contrib-jshint'); |
现在,每次Sass文件修改保存后将会重新编译成CSS,每次JavaScript文件修保存后将会自动lint和压缩。
这样编码很爽吧,很开心吧!
因为要做一个带有会员系统功能,本人需要设置的是用户注册如果忘记密码就需要重设置密码了,那么要如何设计密码重设功能?怎么做才合理呢,下面我们一起来看看。
用户流程:
1.用户忘记密码,来到密码重设界面
2.用户输入Email地址,点击重设密码按钮
3.用户收到一封密码重设邮件,里面有重设密码的链接,此链接有过期时间
4.用户点击链接,来到密码重设页面,输入新密码,完成
这个流程并没有什么创新,很多网站都是用这套流程
后端实现方式:
1.当用户输入Email地址后,验证这个Email,如果存在于数据库,那么取得用户的user_id
2.将user_id和当前时间戳编码成HASH,需要提前准备好一个KEY,并且这个KEY只存在服务器上。 HASH = md5 ( user_id + timestamp + KEY )
3.生成一个URL,并且附带刚刚生成的HASH和用户id以及timestamp,比如 http://domain.com/reset-password.php?hash=HASH&user_id=123×tamp=1392121211
4.当用户访问这个URL, 检查HASH是否合法: HASH == MD5 ( user_id + timestamp + KEY)
5.检查 timestamp 是不是过期了
6.如果所有检查通过,那么显示一个新密码表单给用户
这种方式的好处:
1.不需要额外的数据表
2.不用担心参数被用户恶意修改,因为要检查hash是不是等于那几个参数的md5
3.密码重设URL自带时间戳
4.只要KEY设置的足够长足够复杂,那么可以认为HASH是绝对安全的
例
send-reset-email.php:
代码如下 | 复制代码 |
|
reset-password-form.php:
代码如下 | 复制代码 |
if ($hash == md5( $user_id . $timestamp . $KEY )) //validation passed if ($_POST['new_password']) <input type="submit" value="submit"> |
编码 | 字符集编码范围 |
---|---|
UTF8 | [x01-x7f]|[xc0-xdf][x80-xbf]|[xe0-xef][x80-xbf]{2}|[xf0-xff][x80-xbf]{3} |
UTF16 | [x00-xd7][xe0-xff]|[xd8-xdf][x00-xff]{2} |
Big5 | [x01-x7f]|[x81-xfe]([x40-x7e]|[xa1-xfe]) |
GBK | [x01-x7f]|[x81-xfe][x40-xfe] |
GB2312汉字 | [xb0-xf7][xa0-xfe] |
GB2312半角标点符号及特殊符号 | xa1[xa2-xfe] |
GB2312罗马数组及项目序号 | xa2([xa1-xaa]|[xb1-xbf]|[xc0-xdf]|[xe0-xe2]|[xe5-xee]|[xf1-xfc]) |
GB2312全角标点及全角字母 | xa3[xa1-xfe] |
GB2312日文平假名 | xa4[xa1-xf3] |
GB2312日文片假名 | xa5[xa1-xf6] |
GB18030 | [x00-x7f]|[x81-xfe][x40-xfe]|[x81-xfe][x30-x39][x81-xfe][x30-x39] |
JIS | [x20-x7e]|[x21-x5f]|[x21-x7e]{2} |
SJIS | [x20-x7e]|[xa1-xdf]|([x81-x9f]|[xe0-xef])([x40-x7e]|[x80-xfc]) |
SJIS全角空格 | (?:x81x81) |
SJIS全角数字 | (?:x82[x4f-x58]) |
SJIS全角大写英文 | (?:x82[x60-x79]) |
SJIS全角小写英文 | (?:x82[x81-x9a]) |
SJIS全角平假名 | (?:x82[x9f-xf1]) |
SJIS全角平假名扩展 | (?:x82[x9f-xf1]|x81[x4ax4bx54x55]) |
SJIS全角片假名 | (?:x83[x40-x96]) |
SJIS全角片假名扩展 | (?:x83[x40-x96]|x81[x45x5bx52x53]) |
EUC_JP | [x20-x7e]|x81[xa1-xdf]|[xa1-xfe][xa1-xfe]|x8f[xa1-xfe]{2} |
EUC_JP标点符号及特殊字符 | [xa1-xa2][xa0-xfe] |
EUC_JP全角数字 | xa3[xb0-xb9] |
EUC_JP全角大写英文 | xa3[xc1-xda] |
EUC_JP全角小写英文 | xa3[xe1-xfa] |
EUC_JP全角平假名 | xa4[xa1-xf3] |
EUC_JP全角片假名 | xa3[xb0-xb9]|xa3[xc1-xda]|xa5[xa1-xf6][xa3][xb0-xfa]|[xa1][xbc-xbe]|[xa1][xdd] |
EUC_JP全角汉字 | [xb0-xcf][xa0-xd3]|[xd0-xf4][xa0-xfe]|[xB0-xF3][xA1-xFE]|[xF4][xA1-xA6]|[xA4][xA1-xF3]|[xA5][xA1-xF6]|[xA1][xBC-xBE] |
EUC_JP全角空格 | (?:xa1xa1) |
EUC半角片假名 | (?:x8e[xa6-xdf]) |
日文半角空格 | x20 |
今天小涛分享一个比较实用的东西:网页插入flv视频代码,可控制是否自动播放
代码如下 | 复制代码 |
<object width="500" height="400" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="quality" value="high" /><param name="allowFullScreen" value="true" /><param name="FlashVars" value="vcastr_file=/news/UploadFiles_1118/200809/神舟七号点火发射瞬间.flv&LogoText=www.111cn.net&BufferTime=3&IsAutoPlay=1" /><param name="src" value="/Flv/Flvplayer.swf" /><param name="allowfullscreen" value="true" /><param name="flashvars" value="vcastr_file=/news/UploadFiles_1118/200809/神舟七号点火发射瞬间.flv&LogoText=www.111cn.net&IsAutoPlay=1" /><param name="pluginspage" value="http://www.macromedia.com/go/getflashplayer" /><embed width="500" height="400" type="application/x-shockwave-flash" src="/Flv/Flvplayer.swf" quality="high" allowFullScreen="true" FlashVars="vcastr_file=/news/UploadFiles_1118/200809/神舟七号点火发射瞬间.flv&LogoText=www.111cn.net&BufferTime=3&IsAutoPlay=1" allowfullscreen="true" flashvars="vcastr_file=/news/UploadFiles_1118/200809/神舟七号点火发射瞬间.flv&LogoText=www.111cn.net&IsAutoPlay=1" pluginspage="http://www.macromedia.com/go/getflashplayer" /> </object> |
配置:IsAutoPlay=1 自动播放,等于0的时候手动播放
1. get是从服务器上获取数据,post是向服务器传送数据。
2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。如果不指定Method,则默认为GET请求,Form中提交的数据将会附加在url之后,以?分开与url分开。
3. 对于get方式,asp下用Request.QueryString获取变量的值,php下用$_GET获取。对于post方式,asp下用Request.Form获取提交的数据,php下用$_POST获取。
4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。
5. get安全性非常低,post安全性较高。
仔细研究下面的代码。你可以运行之来感受一下:
代码
代码如下 | 复制代码 |
〈!–两个Form只有Method属性不同–〉 〈FORM ACTION=“getpost.asp” METHOD=“get”? 〈INPUT TYPE=“text” NAME=“Text” VALUE=“Hello World”〉〈/INPUT〉 〈INPUT TYPE=“submit” VALUE=“Method=get”〉〈/INPUT〉 〈/FORM〉 〈BR〉 〈FORM ACTION=“getpost.asp” METHOD=“post”〉 〈INPUT TYPE=“text” NAME=“Text” VALUE=“Hello World”〉〈/INPUT〉 〈INPUT TYPE=“submit” VALUE=“Method=post”〉〈/INPUT〉 〈/FORM〉 〈BR〉 〈BR〉 〈% If Request.QueryString(“Text”) 〈〉 ““ Then %〉 通过get方法传递来的字符串是: “〈B〉〈%= Request.QueryString(“Text”) %〉〈/B〉“〈BR〉 〈% End If %〉 〈% If Request.Form(“Text”) 〈〉 ““ Then %〉 通过post方法传递来的字符串是: “〈B〉〈%= Request.Form(“Text”) %〉〈/B〉“〈BR〉 〈% End If %〉 |
说明
把上面的代码保存为getpost.asp,然后运行,首先测试post方法,这时候,浏览器的url并没有什么变化,返回的结果是:
通过post方法传递来的字符串是: "Hello World"
然后测试用get方法提交,请注意,浏览器的url变成了:
http://localhost/general/form/getpost.asp?Text=Hello+World
而返回的结果是:
通过get方法传递来的字符串是: "Hello World"
最后再通过post方法提交,浏览器的url还是:
http://localhost/general/form/getpost.asp?Text=Hello+World
而返回的结果变成:
通过get方法传递来的字符串是: "Hello World"
通过post方法传递来的字符串是: "Hello World"
提示
通过get方法提交数据,可能会带来安全性的问题。比如一个登陆页面。当通过get方法提交数据时,用户名和密码将出现在URL上
相关文章
- 轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
- 这篇文章算是超级入门级别的了,我们下面来给各位介绍在photoshop画斜线/直线/虚线的教程了,希望下面这篇文章给你入门来帮助。 PS怎么画斜线 选择铅笔工具,或者画笔...2016-09-14
- 这篇文章主要给大家介绍的是关于Lua语言新手入门的简单教程,文中通过示例代码一步步介绍的非常详细,对各位新手们的入门提供了一个很方便的教程,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。...2020-06-30
- 我们在php中上传文件就必须使用#_FILE变量了,这个自动全局变量 $_FILES 从 PHP 4.1.0 版本开始被支持。在这之前,从 4.0.0 版本开始,PHP 支持 $HTTP_POST_FILES 数组。这...2016-11-25
- 1、简介Smarty是一个使用PHP写出来的模板PHP模板引擎,是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离。简单的讲,目...2014-05-31
- 这篇文章主要为大家分享了20分钟MySQL基础入门教程,快速掌握MySQL基础知识,真正了解MySQL,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-12-02
- 这篇文章主要介绍了C#线程入门教程之单线程介绍,本文讲解了什么是进程、什么是线程、什么是多线程等内容,并给出了一个单线程代码示例,需要的朋友可以参考下...2020-06-25
- 当我们在星际中开地图和几家电脑作战的时候,电脑的几个玩家相当于结盟,一旦我们出兵进攻某一家电脑,其余的电脑会出兵救援。 那么如何让各家电脑知道自己的盟友被攻击了...2016-11-25
- 这篇文章主要介绍了CocosCreator入门教程之用TS制作第一个游戏,对TypeScript感兴趣的同学,一定要看一下...2021-04-16
- 举一个简单的date例子 我将使用echo命令把内容输出到我们的客户端(浏览器)。我将使用下面的代码做为基础代码。 代码如下 复制代码 <!DOCTY...2016-11-25
- 这篇文章主要介绍了详解Servlet入门级设置(超详细 IDEA2020版),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-04
- 这里主要讲到关于在php教程类的调用,申请明,使用以前各种类的实例方法与操作过程,让你清楚的知道php类的construct destruct clone call wake sleep用法。 简单购物车...2016-11-25
- MySQL发展到今天,InnoDB引擎已经作为绝对的主力,除了像大数据量分析等比较特殊领域需求外,它适用于众多场景。然而,仍有不少开发者还在“执迷不悟”的使用MyISAM引擎,觉得对InnoDB无法把握好,还是MyISAM简单省事,还能支持快...2015-11-24
- 一篇Android学习笔记之多界面切换实例,希望对各位朋友有所帮助。 用过VB 、 VC#的朋友都知道,在VB或VC#里要进行窗口(界面)切换很容易 例如在VB、C#里: 有 Fom1、...2016-09-20
- 引用:意思是将原始对象在内存中的地址传递给目标对象,就相当于原始对象和目标对象指向的是同一个内存地址。此时,如果对目标对象或者原始对象进行修改,内存中的数据也会改...2016-11-25
- 这篇文章主要介绍了阿里云ECS服务器入门使用流程(新手必看教程),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-07-13
- PHP大小写问题算是一个入门级的教程了,在此小编为php初学者介绍php开发中大小写的一些例子,希望可以帮助到各位。 今天写代码的时候发现自己代码的一处错误: $m_cate...2016-11-25
- 下面举一个很简单的?表达式的实现吧,其实它就是简单的if else哦。 <? $a = 5; //定义变数a=5 $b = 3; //定义变数b=5 $c = ($a==$b) ? ("yes") : ("no"); //如果...2016-11-25
- 这篇文章主要介绍了C语言入门之基础知识详解,文中有非常详细的C语言使用教程及相关基础知识,对正在学习c语言的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-08-04
- 现在最热门的前端框架有AngularJS、React、Bootstrap等。自从接触了ReactJS,ReactJs的虚拟DOM(Virtual DOM)和组件化的开发深深的吸引了我,下面来跟我一起领略ReactJs的风采吧~~ 文章有点长,耐心读完,你会有很大收获哦...2021-04-05