grunt学习实战(1)

grunt基础知识我就不再写了,直接看官网就可以了.官网的教程还是挺清楚的.

大概看了一点以后,打算自己试试看,就按照现在公司的项目需求,拿来练练手.需求如下:

项目结构

gruntProject根目录下,有html页面,less文件夹,jssrc文件夹.
less文件夹下,有一些公共的less文件,像global.less,mixins.less,variables.less.

像index,buy,这些比较大的页面,会有一个文件夹,把它里面的每个版块分别写入一个less文件,而根目录下的index.less,则引入了index文件夹下的less文件.

jssrc文件夹下则是每个页面引入的js,至于jq等框架,则不在这个根目录下,在更外层,这里暂时不需要考虑.

我们的需求就是,404.less,buy.less,index.less,这些页面需要直接引用的less,是需要被编译成css,并且压缩的,压缩后输出在根目录的css文件夹下.而公共的less,则不需要编译,另外,less文件夹下的文件夹里的less文件,也是不需要编译并输出的.说白了就是,一个页面引入一个css,其它作为依赖被引入的less文件,都不需要编译.而js文件,每个都需要压缩,压缩后输出到js文件夹下.


这样,一共需要用到四个插件:

  1. 编译less的插件: grunt-contrib-less
  2. 压缩js的插件: grunt-contrib-uglify
  3. 实时监测的插件: grunt-contrib-watch
  4. 加载所有插件的插件: load-grunt-tasks

首先创建一个package.json文件: npm init

然后安装插件:

  1. 安装grunt-cli: sudo npm install -g grunt-cli
  2. 安装grunt: npm install grunt –save-dev
  3. 安装load-grunt-tasks: npm install load-grunt-tasks –save-dev
  4. 安装另外几个插件,不赘述

然后开始书写Gruntfile.js:

'use strict';

module.exports = function(grunt) {

    require('load-grunt-tasks')(grunt)

    // Project configuration.
    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),
        watch: {
            files:['jssrc/*.js','less/**/*.less'],
            tasks:['default']
        },
        uglify: {
            build: {
                expand: true,
                cwd: 'jssrc/',
                src: '*.js',
                dest: 'js/',
                ext: '.min.js',
                extDot: 'last'
            }
        },
        less: {
            options: {
                compress:true
            },
            build: {
                expand: true,
                cwd: 'less/',
                src: ['*.less','!global.less','!mixins.less','!variables.less'],
                dest: 'css/',
                ext: '.min.css',
                extDot: 'last'
            }
        }
    });

    // 默认被执行的任务列表。
    grunt.registerTask('default', ['uglify','less']);

};

下面分析一下这个文件:

1.基本格式:

'use strict';

module.exports = function(grunt) {

    ...

};

2.加载package.json的devDependencies里的插件:

require('load-grunt-tasks')(grunt)

3.配置任务:

grunt.initConfig({

    ...

})

4.获取package.json里的参数(这个例子用不到):

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

5.配置uglify任务:

uglify: {
    build: {
        expand: true,
        cwd: 'jssrc/',
        src: '*.js',
        dest: 'js/',
        ext: '.min.js',
        extDot: 'last'
    }
}

这里使用的是动态配置的方法,就是说,不是针对某几个文件,而是所有匹配的文件.

  • expand: true 开始动态配置
  • cwd: 路径,是下面的src的相对路径
  • src: 需要压缩的文件,相对于cwd路径,\.js表示cwd根目录下的所有js文件.*(不包括子文件夹下的js)
  • dest: 压缩后输入的js的路径.不是相对于cwd哦,就是相对于项目根目录.
  • ext: 压缩后的文件的后缀名替换.
  • extDot: 从文件名里的第几个句点开始替换.这里定义last,就表示从最后一个句点开始替换.比如a.b.c.js,从最后一个句点开始替换,就是.js部分替换成ext.

这样做的好处是不需要经常改动配置文件,但是当文件非常多,并且开启了watch任务的时候,对电脑的性能是个很大的挑战.


6.配置less任务:

less: {
    options: {
        compress:true
    },
    build: {
        expand: true,
        cwd: 'less/',
        src: ['*.less','!global.less','!mixins.less','!variables.less'],
        dest: 'css/',
        ext: '.min.css',
        extDot: 'last'
    }
}

less任务的options中设置compress属性为true,表示编译后需要压缩.

同样,less任务也使用动态配置,它和uglify任务的配置有一点不同:

src里排除了global.lee,mixins.less,variables.less,这些全局的,不需要编译的文件.


7.配置watch任务:

watch: {
    files:['jssrc/*.js','less/**/*.less'],
    tasks:['default']
}

files属性配置需要监测变化的文件,tasks属性配置文件变化以后需要执行的任务.

这里再次用到了一个很重要的知识点: /\.js 表示目录下所有的js文件,不包括目录的子目录下的js文件. /**/*.less* 表示目录下的所有less文件,包括目录的子目录下的less文件.


8.注册default任务:

grunt.registerTask('default', ['uglify','less']);

把默认要执行的任务定义为uglify任务和less任务.


然后执行一下grunt,就可以看到文件被编译压缩好了:

编译压缩

开启实时监测模式: grunt watch, 然后修改less或者js,都会实时编译压缩.


查看源码

其实grunt就是使用一个又一个的插件,它的复杂在于插件很多都是英文的,比较难看懂,锻炼英文水平挺好~还有就是当多个插件混合使用的时候,尤其是使用了yeoman,下次我就会学习使用了yeoman以后再使用grunt.到时候再来写博客.


end

在webstorm中配置less的自动编译

上一篇说了使用webstorm自动编译sass,这篇说说怎么自动编译less,其实是差不多的.

由于我的hexo从原来的windows搬到了mac os 上,顺便也当练练手,试一下.

首先,需要下载编译less的包,执行 npm install -g less (如果是mac下,需要加上sudo)

安装完以后它会显示你安装的路径,这个路径需要记下来,后面会用到.

下面几步和sass是一样的,只是选择的是less

点击左上角的FileSettingsFile Watchers

在mac os下,应该是WebStormPreferencesToolsFile Watchers

在弹窗的窗口的右上角点击绿色的 ‘+’ 号,然后选择less

按照下图进行配置:

webstorm配置less自动编译1

其中有两个选项是需要修改配置的:

1.Program:

这里填写的是less编译包安装的路径,就是前面一开始要记下来的那个路径.

2.Outputpaths to refresh:

这里填写的是less编译后的css文件的路径,和sass里的Arguments参数一样,这里的$FileParentDir$表示的是less文件所在的文件夹的父级文件夹,而不是less文件的父文件夹.

和sass一样,它只能编译你打开的项目里的文件

比如打开test1项目,就可以自动编译less:

webstorm配置less自动编译2

下面说个比较复杂的功能,sass和其它file watcher都一样用

在配置Outputpaths to refresh这个参数,以及sass里配置Arguments参数的时候,都用到了’$FileParentDir$’这个参数,那么这个是哪里来的? 如果我还有其它配置路径的需求,要怎么做呢?

再回去看下的配置的图:

webstorm配置less自动编译1

可以看到,在每个参数的后面都有个按钮,叫 insert macro... 打开这个,就可以看到有哪些参数是可以配置的,选中以后,它会按照你当前打开的文件来举例说明这个参数的结果是什么.

webstorm配置less自动编译3

比如这个 $FileName 就是当前文件的名字,其它的每个都可以点击查看,点击insert就插入这个参数.

举个栗子,我工作中需要用到这样的路径: less文件夹下按照模块分,公共部分直接在less文件夹下,其它的各个板块分别在各自的文件夹下,比如index模块,就在index文件夹下,最后编译出来的css都到css文件夹下:

webstorm配置less自动编译4

就可以这样配置Outputpaths to refresh:

\$ProjectFileDir\$/css/\$FileNameWithoutExtension\$.css

这样,webstorm自带的配置方法已经可以满足很多需求了,如果项目架构实在太复杂,那只能移步grunt或者fis了,后续会继续学习grunt.


end

在webstorm中配置sass的自动编译

webstorm支持sass的同步编译,也就是即写即编译,并且可以指定编译后的css的目录.

本文使用的webstorm为8.0版本

点击左上角的FileSettingsFile Watchers

在弹窗的窗口的右上角点击绿色的 ‘+’ 号,然后选择scss

按照下图进行配置:

webstorm配置sass自动编译1

其中红色的两个地方是需要修改的,其他我没有改过,都是默认就是那样的.

Arguments:

可以配置编译后的文件的输出路径,我这里写的是:

--no-cache --update --sourcemap --watch $FileName$:$FileParentDir$\css\$FileNameWithoutExtension$.css

注意, $FileName$后面有个冒号,然后$FileParentDir$表示的是scss文件所在的文件夹的父级文件夹,而不是scss文件的父文件夹.

举个栗子,我的项目叫sass-learn,里面有个scss文件夹,里面存放scss文件,那么按照这样配置的结果,style.scss所在的文件夹就是scss,scss的父文件夹就是sass-learn,然后找到sass-learn下的css文件夹,编译后的style.css文件就会在这里.

webstorm配置sass自动编译2

Output paths to refresh:

改成这样:$FileNameWithoutExtension$.css:$FileNameWithoutExtension$.css.map

在使用的过程中还有两点需要注意:

1.同步编译只能在项目文件夹下,也就是webstorm左侧打开的项目.随便打开一个项目外的文件是不行的.
2.这个和webstorm没有什么关系,就是sass编译不能带有中文,无论是路径名,文件名,文件里的内容,都不能识别中文,如果要修改它也不是不可以,但我觉得不用中文也挺好的,养成好习惯嘛.


end

使用hexo搭建github.io博客(四)-美化主题&添加多说

上一篇里介绍了怎么更换博客的主题,这篇介绍如何在细节上完善这个主题,以及如何添加多说评论

完善细节

hexo的博客主题使用的是stylus技术,类似于less和sass吧.最后的文章都只有一个css,就是style.css,它在E:hexo/public/css/style.css,不过这个是通过hexo generate编译过后得到的样式表,要修改的话,需要到主题包里去修改:主题包里样式在这里:E:\hexo\themes\yilia\source\css
然后就找到对应的样式,改改就可以了,具体怎么找,这个是stylus的技术.一般来说都很简单,都是小地方改动,都能找到的.

举个栗子,这个主题本来所有的字体都是宋体,我希望把它换成雅黑,那我可以找到它:

E:\hexo\themes\yilia\source\css\style.styl:

修改body的字体:

body
  font-family:"Microsoft Yahei","HelveticaNeue-Light","Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,sans-serif;
  ...

这样,文章的字体就会变成雅黑

又比如,它主题里的行内代码片段只有这样的code,但是我希望有一种这样的code,但是我觉得倾斜是不必要的,那么我就可以把markdown里面本来的倾斜体定义成code这种行内代码段:

E:\hexo\themes\yilia\source\css\_partial\article.styl:

.article-entry{
  ...
  em {
    font-style: normal;
    background: #fbedeb;
    color: #e2678f;
    padding: 0 5px;
    margin: 0 2px;
    font-size: 0.9em;
    -webkit-border-radius: 3px;
    border-radius: 3px;
  }
  ...
}

这样我就把原来主题中的斜体改成了我喜欢的code这样.

添加多说评论

登陆多说以后,访问这里获取到通用代码,我的是这样的:

<!-- 多说评论框 start -->
<div class="ds-thread" data-thread-key="请将此处替换成文章在你的站点中的ID" data-title="请替换成文章的标题" data-url="请替换成文章的网址"></div>
<!-- 多说评论框 end -->
<!-- 多说公共JS代码 start (一个网页只需插入一次) -->
<script type="text/javascript">
    var duoshuoQuery = {short_name:"codebunny"};
    (function() {
        var ds = document.createElement('script');
        ds.type = 'text/javascript';ds.async = true;
        ds.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') + '//static.duoshuo.com/embed.js';
        ds.charset = 'UTF-8';
        (document.getElementsByTagName('head')[0]
         || document.getElementsByTagName('body')[0]).appendChild(ds);
    })();
</script>
<!-- 多说公共JS代码 end -->

这段代码可以在这里找到,其中的codebunny是它叫你填信息的时候填的多说域名

注意这地方有个short_name:"codebunny"

然后找到主题里对应放置评论部分的视图模板,不同的主题所在的位置也不同,我的在这里:

E:\hexo\themes\yilia\layout\_partial\article.ejs

找到原来的评论部分:

<% if (!index && post.comments && config.disqus_shortname){ %>
    ...
<% } %>

替换为:

<% if (!index && post.comments && config.duoshuo_shortname){ %>
<section id="comments">
  <!-- 多说评论框 start -->
  <div class="ds-thread" data-thread-key="<%= post.layout %>-<%= post.slug %>" data-title="<%= post.title %>" data-url="<%= page.permalink %>"></div>
  <!-- 多说评论框 end -->
  <!-- 多说公共JS代码 start (一个网页只需插入一次) -->
  <script type="text/javascript">
    var duoshuoQuery = {short_name:"codebunny"};
    (function() {
      var ds = document.createElement('script');
      ds.type = 'text/javascript';ds.async = true;
      ds.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') + '//static.duoshuo.com/embed.js';
      ds.charset = 'UTF-8';
      (document.getElementsByTagName('head')[0]
              || document.getElementsByTagName('body')[0]).appendChild(ds);
    })();
  </script>
  <!-- 多说公共JS代码 end -->
</section>
<% } %>

也就是说,把前面得到的通用代码复制到<section id="comments"></section>里面去,然后把data-thread-key data-title data-url 如上替换就好了.

然后找到主题的_config.yml,添加一个变量:

duoshuo_shortname: codebunny

这里的codebunny就是刚才的short_name,也就是多说域名.


end

使用hexo搭建github.io博客(三)-更换主题

上一篇完成后,我们知道了要怎么来发布博客文章,但是,这个博客丑了点,这篇就来说说怎么更换主题让博客变得高大上

一.寻找喜欢的主题

可以在这里找到

我自己找到了一款更好看的,在这里

以我自己的安装过程为例:

二.安装主题:

到hexo所在的路径下E:hexo,右键打开Git Bush,执行:

$ git clone https://github.com/litten/hexo-theme-yilia.git themes/yilia

三.使用主题:

打开_config.yml做如下修改:

theme: yilia

四.更新主题:

进入E:hexo/themes/yilia,右键打开Git Bush,执行 git pull:

五.测试推送:

回到E:hexo,执行: hexo generate hexo server, 打开localhost:4000预览,就可以看到新的主题了

然后hexo deploy推送到github.io

六.配置主题:

主题配置在E:\hexo\themes\yilia下的_config.yml:

我是这样配置的:

# Header
menu:
 主页: /
 所有文章: /archives
 # 随笔: /tags/随笔

# SubNav
subnav:
 github: "https://github.com/OOP-Code-Bunny/"       //github地址
 weibo: "http://weibo.com/p/1005052438739075/home"  //微博地址
 rss: "#"                                           //订阅
 zhihu: "#"                                         //知乎地址
 #douban: "#"                                       //下面这些前面带#的,就不显示在主页上,如果有账号,就可以打开
 #mail: "#"
 #facebook: "#"
 #google: "#"
 #twitter: "#"
 #linkedin: "#"

rss: /atom.xml

# Content
excerpt_link: more
fancybox: true
mathjax: true

# Miscellaneous
google_analytics: ''
favicon: /favicon.png

#你的头像url
avatar: "https://avatars1.githubusercontent.com/u/11350373?v=3&s=460"     //设置头像图片
#是否开启分享
share: true
#是否开启多说评论,填写你在多说申请的项目名称 duoshuo: duoshuo-key
#若使用disqus,请在博客config文件中填写disqus_shortname,并关闭多说评论
duoshuo: true                                                             //使用'多说'评论
#是否开启云标签
tagcloud: true

#是否开启友情链接
#不开启——
#friends: false
#开启——
friends:
 我的github: https://github.com/OOP-Code-Bunny/                           //自定义友情链接
 周孝刚: https://github.com/a5635268/
 王麟: http://kingarthas37.github.io/
 郑印: https://github.com/zhengyin/

#是否开启“关于我”。
#不开启——
#aboutme: false
#开启——
aboutme: 虽然咸鱼翻身还是咸鱼,但至少可以变得好吃一点                                   //关于我介绍

duoshuo_shortname: codebunny                                             //多说域名,后面再解释

七.发布主题:

hexo generate hexo deploy 发布到github.io

下一篇讲解怎么对主题做一些美化修改,以及添加多说评论


end