Harry的博客


  • Startseite

  • Archiv

  • Tags

  • View

gulp构建一个项目

Veröffentlicht am 2017-08-23 | Visitors:

介绍:这篇文章总结了使用gulp构建一个项目的详细过程。包括开发环境搭建,构建项目并用于生产部署。

gulp自动化构建工具具备以下特点:
基于流、任务化
常用API:src、dest、watch、task、pipe

一.安装

1.安装gulp:(注意这里默认大家已经安装了npm和nodejs)
新建项目文件,cmd切换到项目目录下,这里我新建了项目文件webapp

安装全局gulp:

npm i -g gulp

2.接下来安装node依赖文件
首先用npm初始化项目配置文件:

npm init

然后命令行一直回车就行,配置文件之后可以更改

3.作为项目的开发依赖(devDependencies)安装:在当前目录安装gulp
在当前目录安装gulp:

npm i --save-dev gulp

–save-dev的意思是将当前文件保存到配置文件当中,nodejs模块保存到packge.json文件当中,当我们需要项目保存到git仓库的时候,只需要保存packge.json文件到git仓库就行。当别人需要编译你的项目,只要npm i就可以拿到你的项目配置信息。

我们可以看下package.json文件:在依赖模块添加了gulp信息

然后我们看项目文件夹webapp的node_modules文件下多了个gulp文件夹,这个就是我们刚添加的gulp模块

4.扩展插件–在当前项目文件webapp目录下,安装gulp依赖文件。
安装命令:

npm i --save--dev 插件名称

需要安装的gulp插件:

gulp-clean  
gulp-concat(文件合并)  
gulp-connect  
gulp-minify-html(html压缩)  
gulp-minify-css(CSS压缩)
gulp-cssmin(CSS压缩)(任选一个)  
gulp-jshint(JS代码检查)
gulp-imagemin(压缩图片)  
gulp-less(编译Less)    
gulp-sass(编译Sass)
gulp-load-plugins  
gulp-uglify (JS压缩)
gulp-livereload(自动刷新)
open

比如说:

npm i --save--dev gulp-clean

如果你不想一个个安装,有个批量安装的小窍门:

npm i --save--dev gulp-clean gulp-concat gulp-connect ...

各个模块之间以空格隔开。
安装好之后呢,我们在package.json文件里可以看到这些依赖插件

5.进行配置
在webapp项目根目录下,新建gulpfile.js文件,在文件中写入如下配置代码:

var gulp = require('gulp');          //引入模块
var $ = require('gulp-load-plugins');  //有了这个模块,其他的模块可以以$符号引入
var open = require('open');         //引入open

var app = {//声明一个全局变量,定义项目的路径
    srcPath : 'src/',      //源文件
    devPath : 'build/',   //开发环境--整合之后的路径
    prdPath : 'dist/'     //生成部署
};

6.拷贝命令
定义任务的API,第二个参数是一个回调函数,在回调函数里我们写入逻辑操作代码

gulp.task('任务名',function () {
    gulp.路径(路径)        //读取文件
    .pipe(...操作文件)
    .pipe(gulp.dest(目录))    //生成文件
})

二.使用

应用实例:
1.拷贝HTML:
a.新建文件夹src存放源代码

b.新建完之后,我们在gulpfile.js文件下敲入如下代码进行拷贝html:(前提之前已配置好各个路径)

gulp.task('html',function () {
    gulp.src(app.srcPath + '**/*.html')
    .pipe(gulp.dest(app.devPath))  //pipe是一个API  写文件的API--dest 拷贝到app.devPath + 'vendeor'
    .pipe(gulp.dest(app.prdPath))     //生成
    .pipe($.connect.reload());//通知服务器刷新浏览器,ie8不支持
})

c.可以测试下,命令行打开,在项目路径下,输入

gulp html

d.执行成功后可以看到项目文件下生成了新的文件夹build

2.拷贝第三方依赖库lib:前提是安装好bower并且用bower安装了第三方依赖文件(本例使用Bower安装了Angular,在bower_componets文件下)
题外话:全局安装bower:

npm install bower -g

Bower安装第三方依赖Angular:

bower install --save angular

开始拷贝JS:
a.在gulpfile.js文件下敲入如下代码进行拷贝js:(前提之前已配置好各个路径)

gulp.task('lib',function () {
    gulp.src('bower_components/**/*.js')
    .pipe(gulp.dest(app.devPath + 'vendor'))
    .pipe(gulp.dest(app.prdPath + 'vendor'))
    .pipe($.connect.reload());//通知服务器刷新浏览器,ie8不支持
})

b.命令行进入项目路径,执行命令:

gulp lib

c.如果在build目录下生成vendor文件夹及其angular文件,表示成功。

3.拷贝CSS
a.src目录新建目录style,新建文件index.less和1.less,在两个文件编写测试代码。

b.然后在gulpfile.js文件新建任务:

gulp.task('less',function () {
    gulp.src(app.srcPath + 'style/index.less')
        .pipe($.less())                     //别忘了less后的括号
        .pipe(gulp.dest(app.devPath + 'css'))
        .pipe($.cssmin())                  //压缩
        .pipe(gulp.dest(app.prdPath + 'css'))
        .pipe($.connect.reload());//通知服务器刷新浏览器,ie8不支持
});

c.运行,在命令行输入

gulp less

4.拷贝JS
同样的套路:
a.src下新建目录script,在script里新建文件1.js和2.js,随便写点测试代码。

b.新建gulp任务:
在gulpfile.js文件下添加如下一段代码即可:

gulp.task('js',function () {
    gulp.src(app.srcPath + 'script/**/*.js')
        .pipe($.concat('index.js'))            //生成
        .pipe(gulp.dest(app.devPath + 'js'))    //写入开发环境
        .pipe($.uglify())                    //压缩
        .pipe(gulp.dest(app.prdPath + 'js'))    //部署到生产环境
        .pipe($.connect.reload());//通知服务器刷新浏览器,ie8不支持
});

c.运行
在命令行输入:

gulp js

d.查看运行结果,在生产环境dist目录下生成js文件夹及其index.js文件。

5.拷贝image
套路是一样的啊,
a.在src里新建image目录,在该目录里新建一张图片,比如1.png
b.新建gulp任务,在gulpfile.js文件下添加如下代码:

gulp.task('image',function () {
    gulp.src(app.srcPath + 'image/**/*')           //读取文件
        .pipe(gulp.dest(app.devPath + 'image'))        //拷贝到开发环境
        .pipe($.imagemin())                     //压缩图片
        .pipe(gulp.dest(app.prdPath + 'image'))    //部署到生产环境
        .pipe($.connect.reload());//通知服务器刷新浏览器,ie8不支持
});

c.项目路径下运行下:

gulp image

d.查看运行结果,在生产环境目录dist里生产image目录及其文件

6.在我们部署到生产环境之后,往往需要清除build和dist 目录,避免出现旧的影响新的。这时候就需要新建一个清除任务:
在gulpfile.js文件下添加如下代码块:

gulp.task('clean',function () {  //清除
    gulp.src([app.devPath,app.prdPath]) //要删除目录
    .pipe($.clean());
});

运行:

gulp clean

7新建gulp总任务。在我们真正部署的时候,往往通过新建一个gulp总任务来执行之前的所有打包压缩任务,减少繁琐操作,代码如下:

gulp.task('build',['image','js','less','lib','html','json']);  //总任务  执行gulp build即可

运行:

gulp build

8新建服务—-自动化启动总任务build和服务器
在gulpfile.js文件下,敲入如下新建服务代码:

//新建服务
gulp.task('serve',['build'],function () {
    $.connect.server({        //启动一个服务器
        root:[app.devPath],   //从开发目录下读取
        livereload:true,      //自动刷新浏览器,ie不支持
        port:1234           //端口
    });
    open('http://localhost:1234');   //自动打开网址,打开浏览器

    //监听
    gulp.watch('bower_components/**/*',['lib']);
    gulp.watch(app.srcPath + '**/*.html',['html']);
    gulp.watch(app.srcPath + 'data/**/*.json',['json']);
    gulp.watch(app.srcPath + 'style/**/*.less',['less']);
    gulp.watch(app.srcPath + 'script/**/*.js',['js']);
    gulp.watch(app.srcPath + 'image/**/*',['image']);
});

8.1有一个小技能,我们可以新建一个gulp默认任务,让它运行gulp的时候自动启动服务serve:

//建立默认启动任务
gulp.task('default',['serve']);//default 依赖serve

可以测试一下,命令行敲入:

gulp

然后等待运行结束,浏览器会自动打开网址:http://localhost:1234/
你可以在src目录下的index.html页面敲入代码:hello world!
此时你会发现网页自动刷新了

当一个程序员打出hello world时就像中乐透一样哈哈:)

CSS3几种常用属性

Veröffentlicht am 2017-08-22 | Visitors:

/text-shadow 可以给一个对象应用一组或多组阴影效果,方式如前面的语法显示一样,用逗号隔开。
text-shadow: X-Offset Y-Offset Blur Color中 X-Offset表示阴影的水平偏移距离,其值为正值时阴影向右偏移,如果其值为负值时,阴影向左偏移;
Y-Offset是指阴影的垂直偏移距离,如果其值是正值时,阴影向下偏移反之其值是负值时阴影向顶部偏移; Blur是指阴影的模糊程度,其值不能是负值,如果值越大,阴影越模糊,反之阴影越清晰,如果不需要阴影模糊可以将Blur值设置为0;
Color是指阴影的颜色,其可以使用rgba色。著作权归作者所有。 原文: https://www.w3cplus.com/blog/52.html © w3cplus.com
*/

h1 {
    text-shadow: 1px 1px 1px #FF0000, 0 0 0 #ccc, 2px 2px 2px #ff00de;
}

/ transform-style
使转换的子元素保留其3D转换 transform-style 属性规定如何在 3D 空间中呈现被嵌套的元素。
语法:transform-style: flat|preserve-3d; 注释:该属性必须与 transform 属性一同使用。
transform :旋转 div 元素. http://www.w3school.com.cn/cssref/pr_transform.asp rotateX(angle)定义沿着 X 轴的 3D 旋转
rotateY(angle)定义沿着 Y 轴的 3D 旋转 /

.box {
    width: 10rem;
    height: 1rem;
    background: #ccc;
    border: 1px solid #FF0000;
    -webkit-transform: rotateY(60deg);
    transform: rotateY(60deg);
    -webkit-transform-style: preserve-3d;
    transform-style: preserve-3d;
}

/ animation
使用简写属性,将动画与 div 元素绑定 animation-name 规定需要绑定到选择器的 keyframe 名称
animation-duration 规定完成动画所花费的时间,以秒或毫秒计 animation-timing-function规定动画的速度曲线 ease-in-out动画以低速开始和结束。
animation-delay transform 规定在动画开始之前的延迟 animation-iteration-count 规定动画应该播放的次数. infinite规定动画应该无限次播放.
animation-direction 规定是否应该轮流反向播放动画 /

.box {
    width: 6rem;
    height: 1rem;
    background: #ccc;
    border: 1px solid #FF0000;
    -webkit-transform: rotateY(180deg);
    transform: rotateY(180deg);
    -webkit-transform-style: preserve-3d;
    transform-style: preserve-3d;
    animation: run ease-in-out 1s infinite;
    -moz-animation: run ease-in-out 1s infinite;
    -webkit-animation: run ease-in-out 11s infinite;
    -ms-animation: run ease-in-out 1s infinite;
}

/
@keyframes 规则
通过 @keyframes 规则,您能够创建动画。
创建动画的原理是,将一套 CSS 样式逐渐变化为另一套样式。 在动画过程中,您能够多次改变这套 CSS 样式。
以百分比来规定改变发生的时间,或者通过关键词 “from” 和 “to”,等价于 0% 和 100%。 0% 是动画的开始时间,100% 动画的结束时间。
为了获得最佳的浏览器支持,您应该始终定义 0% 和 100% 选择器。 注释:请使用动画属性来控制动画的外观,同时将动画与选择器绑定。
*/

@keyframes run {
    0% {
        -webkit-transform: rotateX(-5deg) rotateY(0);
        transform: rotateX(-5deg) rotateY(0);
    }
    50% {
        -webkit-transform: rotateX(0) rotateY(180deg);
        transform: rotateX(0) rotateY(180deg);
        text-shadow: 1px 1px 1px #ccc, 0 0 10px #fff, 0 0 20px #fff, 0 0 30px #fff, 0 0 40px #3EFF3E, 0 0 70px #3EFFff, 0 0 80px #3EFFff, 0 0 100px #3EFFee, 0 0 150px #3EFFee;
    }
    100% {
        -webkit-transform: rotateX(5deg) rotateY(360deg);
        transform: rotateX(5deg) rotateY(360deg);
    }
}

@-moz-keyframes run {
    0% {
        -moz-transform: rotateX(-5deg) rotateY(0);
    }
    50% {
        -moz-transform: rotateX(0) rotateY(180deg);
        text-shadow: 1px 1px 1px #ccc, 0 0 10px #fff, 0 0 20px #fff, 0 0 30px #fff, 0 0 40px #3EFF3E, 0 0 70px #3EFFff, 0 0 80px #3EFFff, 0 0 100px #3EFFee, 0 0 150px #3EFFee;
    }
    100% {
        -moz-transform: rotateX(5deg) rotateY(360deg);
    }
}

@-webkit-keyframes run {
    0% {
        -webkit-transform: rotateX(-5deg) rotateY(0);
    }
    50% {
        -webkit-transform: rotateX(0) rotateY(180deg);
        text-shadow: 1px 1px 1px #ccc, 0 0 10px #fff, 0 0 20px #fff, 0 0 30px #fff, 0 0 40px #3EFF3E, 0 0 70px #3EFFff, 0 0 80px #3EFFff, 0 0 100px #3EFFee, 0 0 150px #3EFFee;
    }
    100% {
        -webkit-transform: rotateX(5deg) rotateY(360deg);
    }
}

@-ms-keyframes run {
    0% {
        -ms-transform: rotateX(-5deg) rotateY(0);
    }
    50% {
        -ms-transform: rotateX(0) rotateY(180deg);
    }
    100% {
        -ms-transform: rotateX(5deg) rotateY(360deg);
    }
}

plugins-browsersync

Veröffentlicht am 2017-08-14 | Visitors:

Browsersync浏览器同步测试工具的使用

Browsersync能够快速响应文件(html、css、js、less、sass等)的更改,试想当你敲代码的同时,浏览器能够快速响应文件更改,免去手动刷新浏览器,对于开发者来说无疑会提高开发效率。

下面是分别是在gulp和webpack中的安装及使用方法。

一、gulp + browser-sync安装

安装

前提是你已安装gulp
这里用Node.js的包管理安装,前提是你已安装node.js。
全局安装:

npm install -g browser-sync

作为项目开发依赖安装:

npm install --save-dev browser-sync

使用:

在gulpfile.js文件配置如下:

var gulp = require('gulp');
var browserSync = require('browser-sync').create();
var reload = browserSync.reload;

gulp.task('server',function() {
    browserSync.init({
        server: "./dist"//生产目录
    });

    gulp.watch("./src/**/*.less",['less']);
    gulp.watch("./src/**/*.html",['htmlmin']);
    gulp.watch("./dist/**/*.css").on('change',reload);
    gulp.watch("./dist/**/*.html").on('change',reload);
});

gulp.task('default',['server'],function() {

});

angular-file-upload

Veröffentlicht am 2017-08-14 | Visitors:

背景

今天做项目遇到文件上传问题,于是找到了一个很强大的文件上传插件angular-file-upload,便做了下使用总结,方便给为老铁查阅啊。

安装

npm install --save-dev angularFileUpload  

使用

demo1:多文件上传-html文件:

<input type="file" id="file" name="file" nv-file-select uploader="uploader" ng-click="clearItems()" multiple> 上传

更酷的界面效果可以这样用,在htm文件加入官网的例子:

<div class="col-md-9" style="margin-bottom: 40px">
            <h2>Uploads only images (with canvas preview)</h2>
            <h3>The queue</h3>
            <p>Queue length: {{ uploader.queue.length }}</p>

            <table class="table">
                <thead>
                    <tr>
                        <th width="50%">Name</th>
                        <th ng-show="uploader.isHTML5">Size</th>
                        <th ng-show="uploader.isHTML5">Progress</th>
                        <th>Status</th>
                        <th>Actions</th>
                    </tr>
                </thead>
                <tbody>
                    <tr ng-repeat="item in uploader.queue">
                        <td>
                            <strong>{{ item.file.name }}</strong>
                            <!-- Image preview -->
                            <!--auto height-->
                            <!--<div ng-thumb="{ file: item.file, width: 100 }"></div>-->
                            <!--auto width-->
                            <div ng-show="uploader.isHTML5" ng-thumb="{ file: item._file, height: 100 }"></div>
                            <!--fixed width and height -->
                            <!--<div ng-thumb="{ file: item.file, width: 100, height: 100 }"></div>-->
                        </td>
                        <td ng-show="uploader.isHTML5" nowrap>{{ item.file.size/1024/1024|number:2 }} MB</td>
                        <td ng-show="uploader.isHTML5">
                            <div class="progress" style="margin-bottom: 0;">
                                <div class="progress-bar" role="progressbar" ng-style="{ 'width': item.progress + '%' }"></div>
                            </div>
                        </td>
                        <td class="text-center">
                            <span ng-show="item.isSuccess"><i class="glyphicon glyphicon-ok"></i></span>
                            <span ng-show="item.isCancel"><i class="glyphicon glyphicon-ban-circle"></i></span>
                            <span ng-show="item.isError"><i class="glyphicon glyphicon-remove"></i></span>
                        </td>
                        <td nowrap>
                            <button type="button" class="btn btn-success btn-xs" ng-click="item.upload()" ng-disabled="item.isReady || item.isUploading || item.isSuccess">
                                <span class="glyphicon glyphicon-upload"></span> Upload
                            </button>
                            <button type="button" class="btn btn-warning btn-xs" ng-click="item.cancel()" ng-disabled="!item.isUploading">
                                <span class="glyphicon glyphicon-ban-circle"></span> Cancel
                            </button>
                            <button type="button" class="btn btn-danger btn-xs" ng-click="item.remove()">
                                <span class="glyphicon glyphicon-trash"></span> Remove
                            </button>
                        </td>
                    </tr>
                </tbody>
            </table>

            <div>
                <div>
                    Queue progress:
                    <div class="progress" style="">
                        <div class="progress-bar" role="progressbar" ng-style="{ 'width': uploader.progress + '%' }"></div>
                    </div>
                </div>
                <button type="button" class="btn btn-success btn-s" ng-click="uploader.uploadAll()" ng-disabled="!uploader.getNotUploadedItems().length">
                    <span class="glyphicon glyphicon-upload"></span> Upload all
                </button>
                <button type="button" class="btn btn-warning btn-s" ng-click="uploader.cancelAll()" ng-disabled="!uploader.isUploading">
                    <span class="glyphicon glyphicon-ban-circle"></span> Cancel all
                </button>
                <button type="button" class="btn btn-danger btn-s" ng-click="uploader.clearQueue()" ng-disabled="!uploader.queue.length">
                    <span class="glyphicon glyphicon-trash"></span> Remove all
                </button>
            </div>

        </div>

    </div>

在项目中引入依赖:

import angularFileUpload from 'angular-file-upload';

var app = angular
    .module('app',[
      'angularFileUpload'
    ])
    .controller('myController',['FileUploader'],controller);

function controller(FileUploader) {
    var uploader = $scope.uploader = new FileUploader({
        url: 'api/portName',
        queueAfterUpload: 1,   //文件个数
        removeAfterUpload: true  //上传后删除文件
    });

    $scope.clearItems = function(){ //重新选择文件时,清空队列,达到覆盖文件的效果
        uploader.clearQueue();
    };

    //FILTERS
    uploader.filters.push({
        name: 'imageFilter',
        fn: function(item /*{File|FileLikeObject}*/,options) {
            var type = '|' + item.type.slice(item.type.lastIndexOf('/') + 1) + '|';
            return '|jpg|png|jpeg|bmp|gif|'.indexOf(type) !==-1;
        }
    });

    //CALLBACKS
    uploader.onWhenAddingFileFailed = function(item /*{File|FileLikeObject}*/, filter, options) {
        alert('只支持图片上传!');
    };
    uploader.onAfterAddingFile = function(fileItem) {
        console.info('onAfterAddingFile',fileItem);
        $scope.fileItem = fileItem._file;   //添加文件之后,把文件信息赋给scope
        //在这里可以判断添加的文件名后缀,文件大小限制
        if($scope.fileItem.size > MaxSize) {
            alert('文件大小超限!');
            uploader.removeFromQueue(fileItem);//超过大小移出队列
        }else {
            uploader.uploadAll();
        }

    };
    uploader.onAfterAddingAll = function(addedFileItems) {
        console.info('onAfterAddingAll', addedFileItems);
    };
    uploader.onBeforeUploadItem = function(item) {
        console.info('onBeforeUploadItem', item);
    };
    uploader.onProgressItem = function(fileItem, progress) {
        console.info('onProgressItem', fileItem, progress);
    };
    uploader.onProgressAll = function(progress) {
        console.info('onProgressAll', progress);
    };
    uploader.onSuccessItem = function(fileItem, response, status, headers) {
        console.info('onSuccessItem', fileItem, response, status, headers);
        //判断是否上传成功
        if(response.status == 1) {
            alert('上传成功!')
        }
    };
    uploader.onErrorItem = function(fileItem, response, status, headers) {
        console.info('onErrorItem', fileItem, response, status, headers);
    };
    uploader.onCancelItem = function(fileItem, response, status, headers) {
        console.info('onCancelItem', fileItem, response, status, headers);
    };
    uploader.onCompleteItem = function(fileItem, response, status, headers) {
        console.info('onCompleteItem', fileItem, response, status, headers);
    };
    uploader.onCompleteAll = function() {
        console.info('onCompleteAll');
    };
}

demo2:过滤器的使用
例子中过滤|doc|docx|jpg|png|pdf|多种文件格式。
html:

<input type="file" id="file" name="file" nv-file-select uploader="uploader" ng-click="clearItems()" filters="nameFilter"> 上传

controller.js:

// FILTERS
uploader.filters.push({
    name: 'nameFilter',
    fn: function(item /*{File|FileLikeObject}*/, options) {
        var type = '|' + item.name.slice(item.name.lastIndexOf('.') + 1) + '|';
        return '|doc|docx|jpg|png|pdf|'.indexOf(type) !== -1;
    }
});

多个过滤器使用
html:

<input type="file" id="file" name="file" nv-file-select uploader="uploader" ng-click="clearItems()" filters="filtername1,filtername2"> 上传

// FILTERS
uploader.filters.push({
    name: 'filtername1',
    fn: function(item /*{File|FileLikeObject}*/, options) {
        ...
    }
},{
    name: 'filtername2',
    fn: function(item /*{File|FileLikeObject}*/, options) {
        ...
    }
});

注意:filtername1和filtername2两个过滤器之间是逻辑与关系(即&&),所以使用的时候避免出现逻辑或。做项目写了个坑,filtername1过滤器校验图片,filtername2校验word,html使用filters=”filtername1,filtername2”就出现图片和word都不允许上传问题。解决方法是用

item.name.slice(item.name.lastIndexOf('/') + 1) + '|';
return '|doc|docx|jpg|png|pdf|'.indexOf(type) !== -1;

小结:angular-file-uplo插件支持多文件上传,限制文件大小,将文件上传用队列queue管理,有很多API可供调用,完成业务逻辑需求,如果浏览器支持H5的话,界面效果也很酷,可以增加进度条展示等等。

gulp使用

Veröffentlicht am 2017-07-20 | Visitors:

gulp是基于流的自动化构建工具,对代码进行打包压缩和管理,提供简单的API就能实现对复杂代码的管理,并且提供很多插件,大大提高了开发效率。

安装

前提是已安装好node.js,查看node.js安装

全局安装命令

npm install gulp -g  

-g代表全局安装gulp,这样在你所有的项目下都可以使用gulp

作为项目开发依赖安装命令

npm install --save-dev gulp  

–save-dev代表gulp将作为项目开发依赖安装,会在项目的package.js文件里添加gulp安装信息

使用

在项目根目录下新建gulpfile.js文件,在文件里配置如下:

var gulp = require('gulp');

gulp.task('default',function(){
  ...
});

gulp.task('taskname',function(){
  ...
});

require引入gulp,之后就可以调用task()方法创建任务,进行管理。
task的第一个参数是任务名,当运行gulp时,默认执行default任务;task的第二个参数是一个函数,定义该任务要执行的一些操作。

运行

在命令行敲入命令:

$ gulp

几种常用插件

gulp-uglify是用来压缩JS文件的
安装

npm install --save-dev gulp-uglify  

使用
在gulpfile.js文件进行配置如下:

var uglify = require('gulp-uglify');

gulp.task('uglify',function){
  gulp.src('src/*.js')
    .pipe(uglify())
    .pipe(gulp.dest('dist'))
});

gulp.src(‘文件路径’),将输出匹配路径的文件,并pipe到下一个插件中。.js将匹配所有.js文件;src/**/.js将匹配src所有深度下的所有.js文件。
gulp.dest(‘目标文件路径’),将打包好的文件输出到目标路径下。

gulp-cssmin用来压缩css文件
安装

npm install --save-dev gulp-cssmin

使用
在gulpfile.js文件进行配置如下:

var cssmin = require('gulp-cssmin');

gulp.task('cssmin',function(){
  console.log('cssmin');
  gulp.src('src/css/**/*.css')
   .pipe(cssmin())
   .pipe(gulp.dest('dist/css'));
});

这里将匹配src/css目录下的所有.css文件,用pipe()实现基于流的输出管理。

gulp-html-minify压缩html文件
安装

npm install --save-dev gulp-html-minify

使用
在gulpfile.js文件进行配置如下:

var htmlmin = require('gulp-html-minify');
gulp.task('html',function(){
    gulp.src('src/**/*.js')
        .pipe(htmlmin())
        .pipe(gulp.dest('dist'));
})

gulp-less将less文件编译成css文件
安装

npm install --save-dev gulp-less    

使用
在gulpfile.js文件配置如下:

var less = require('gulp-less');
gulp.task('less',function(){
    gulp.src('src/**/*.less')
        .pipe(less())
        .pipe(cssmin())
        .pipe(gulp.dest('dist'));
});      

gulp-sass用来编译sass文件为css文件
安装

npm install --save-dev gulp-sass  

使用
在gulpfile.js文件配置如下:

var sass = require('gulp-sass');
gulp.task('sass',function(){
   gulp.src('src/**/*.scss')
       .pipe(sass())
       .pipe(cssmin())
       .pipe(gulp.dest('dist/css'));
});  

webpack2简单使用

Veröffentlicht am 2017-07-18 | Visitors:

webpack是一个模块打包器。能够对模块的依赖关系进行静态分析,然后根据指定规则生成静态资源。webpack2在配置文件格式上做了一些变动,比webpack1新增了

安装

前提是安装好Node.js,
全局安装:

npm install -g webpack

作为项目开发依赖安装:

npm install --save-dev webpack

使用

这里以新建配置文件来执行,项目根目录下新建webpack.config.js文件,配置如下:

var webpack = require('webpack');
var path = require('path');

var config = {
    entry:"entry.js",//入口文件路径
    output:{//输出文件
        path:path.resolve(__dirname,'build'),
        filename:"[name].bundle.js"
    },
    module:{//模块
        ...
    }
}

module.exports = config;

配置文件的结构大致是以上的结构。

运行

$ webpack

常用xxx-Loader的使用:

style-loader和css-loader

style-loader把js字符串生成为style节点;css-loader是把css转换为js输出。两者经常一起使用。

安装

npm install --save-dev css-loader

使用

在webpack.config.js文件配置如下:

module:{
    rules:[{
        test:/\.css$/,
        use:[
          { loader:"stycss-loader" },
          { loader:"css-loader" }
        ]
    }]
}

html-loader

html-loader是把html文件转换为js.

安装

npm install --save-dev html-loader

使用

在webpack.config.js文件配置如下:

module:{
    rules:[{
        test:/\.html$/,
        use:[
            {
                loader:"html-loader",
                option: {
                    minimize:true
                }
            }
        ]
    }]
}

less-loader

less-loader是把less编译为css.

安装

npm install --save-dev less-loader

使用

在webpack.config.js文件配置如下:

module:{
    rules:[
        {
            test:/\.less$/,
            use:[
                {
                    loader:"style-loader"
                },
                {
                    loader:"css-loader"
                },
                {
                    loader:"less-loader"
                }
            ]
        }
    ]
}

sass-loader

sass-loader是将sass编译为css。

安装

npm install --save-dev sass-loader

使用

在webpack.config.js文件配置如下:

modu:{
    rules:[
        {
            test:/.\scss$/,
            use:[
                {
                    loader:"style-loader"
                },
                {
                    loader:"css-loader",
                    option:{ sourceMap:true }
                },
                {
                    loader:"sass-loader",
                    option:{ sourceMap:true }
                }
            ]
        }
    ]
}

sourceMap:true用于启用CSS的source map

插件使用

想要使用一个插件,你只需要require()它,然后把它添加到plugins数组中。

BannerPlugin

内置插件BannerPlugin,用来给输出的文件头部添加注释信息。

使用

在webpack.config.js文件配置如下:

plugins:[
    new webpack.BannerPlugin('添加注释信息...')
]

HtmlWebpackPlugin

简化HTML文件的创建,为webpack包提供服务,可以用来生成HTML5文件。

安装

npm install --save-dev html-webpack-plugin

使用

在webpack.config.js文件配置如下:

var webpack = require('webpack');
var path = require('path');
var HtmlWebpackPlugin = require('html-webpack-plugin');

var config = {
    entry:"./entry.js",
    output:{
        path:path.resolve(__path,'build'),
        filename:"bundle.js"
    }
    plugins:[
        new HtmlWebpackPlugin()
    ]
}

module.exports = config;

这将会生成一个包含bundle.js引入信息的HTML文件。

设置select默认值-Angular

Veröffentlicht am 2017-06-08 | Visitors:

1.HTML代码

<body ng-app="MyModule">
<div ng-controller="MyCtrl">
<select ng-model="mylabel"ng-options="v.label for v in lists"></select>
</div>
</body>

2.JS代码

var myModule =angular.module("MyModule", []);
myModule.controller('MyCtrl', ['$scope',
function($scope) {
$scope.lists= [
{"label": "步伐1","value" :"111"},
{"label": "步伐2","value" :"233"}
];
$scope.mylabel= $scope.lists[0];//默认数组第一个作为option的值
}
]);

3.执行结果:默认显示“步伐1”
http://img.blog.csdn.net/20170110204541116?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2ViX2hhcnJ5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

4.延伸–ng-options用法[1]
ng-optins属性可以在表达式中使用数组或对象来自动生成一个select的option列表,与ng-repeat类似。

一般用法:

对于数组:

l v.value for v in array
l v.value as v.label for v in array //将v.label值作为v.value

对于对象:

l  label for (key , value) in object
l  select as label for (key ,value) in object

5.引用:更多用法参考链接

[1].http://www.cnblogs.com/panda-zhang/p/5290694.html

less

Veröffentlicht am 2017-03-11 | Visitors:

Less语言快速入门

介绍:Less是一门CSS预处理语言,它扩充了CSS语言,重点来了:它增加了诸如变量、混合(Mixins)、函数等功能,这让静态的CSS语言强大了有木有,方便制作主题(比如换肤)、扩充,更易维护。

使用:

1.变量

Less允许使用变量事先定义一些通用样式,在需要的时候引入,特点就是按需自取,自助餐有木有。
看下面栗子:

//这里是一些简单的LESS语法
@width:400px;
@height:300px;
@font_size:12px;
@color:#ccc;
@font-size:14px;
textarea {
    width:@width;
    height:@height;
    font-size:@font_size;
}
.test {
  color:@color;
  background-color:@color;
  font-size:@font-size;
}

Less编译后的对应CSS:

textarea {
  width: 400px;
  height: 300px;
  font-size: 12px;
}
.test {
  color: #cccccc;
  font-size: 14px;
  background-color: #cccccc;
}

这里要注意,Less以‘@’符号作为开头来定义变量,就像JS里以var定义变量一样,且变量的值只能是属性值,不能是变量,比如说,我这样定义一个变量:

@font:font-size;
.test{
@font:14px;  //这样做是不行的,less不会编译成功!
}

2.后代选择器—可以嵌套

@color:#ccc;


div {
  color:@color;
    p{   //添加嵌套样式
        color:@color;
     }
  &:after{   //通过&添加伪类
    color:#ddd;
  }
}

Less编译后的CSS:

div {
  color: #cccccc;
}
div p {
  color: #cccccc;
}
div:after {
  color: #ddd;
}

这种方法也是比较常用的啦~小编我学会后就来推荐啦

3.文件引用

@import “文件名”;   //文件名可以是相对路径

文件引用有两个常用方法:

①将全局变量引入到样式类文件时,使用’@import “文件名.less”;‘语句引入即可

②另一种常见用法是将初始化的Less文件引入,当需要样式类时,引入初始化Less文件即可。

4.混合(Mixins)

混合可以将已经写好的样式A引入到样式B,从而实现样式B对样式A所有属性的继承。

.border-radius(@radius: 4px) {
  -webkit-border-radius: @radius;
  -moz-border-radius: @radius;
  border-radius: @radius;
}
#form-box {
  .border-radius;
  div{
    .border-radius(14px);
  }
}

Less编译后的CSS:

#form-box {
  -webkit-border-radius: 4px;
  -moz-border-radius: 4px;
  border-radius: 4px;
}
#form-box div {
  -webkit-border-radius: 14px;
  -moz-border-radius: 14px;
  border-radius: 14px;
}

这里提一个比较有意思的变量@arguments,它包含了所有传递进来的参数,如果不想一个个写参数就可以使用它。

.margin (@top:0, @right:0, @bottom:0, @left:0) {
  margin:@arguments;
}
div {
  .margin(2px,5px);
}

Less编译后的CSS:

div {
  margin: 2px 5px 0 0;
}

5.函数

div {
  .fun(100px);  //引用函数
}
.fun(@px){  //函数声明和JS里的很像,括号加参数
  width:@px;
}
Less编译成CSS:
div {
  width: 100px;
}

注意到没有,函数是不编译的

angular-instruction

Veröffentlicht am 2017-03-05 | Visitors:

Angular几个常用指令

1.ng-if指令

定义:指令用于表达式值为false时移除 HTML 元素;如果if语句的执行结果为true,会添加移除元素,并显示。ng-if 指令不同于 ng-hide, ng-hide 隐藏元素,而 ng-if 是从 DOM 中移除元素。

用法实例:通过ng-if控制元素隐藏/显示,达到点击隐藏和显示的效果也是常见的用法。推荐这种方法,简单快捷有木有。

<div ng-click="a!=a" ng-if="aa">
    <!--每当点击div元素,改变a的值,达到隐藏显示div元素的目的-->
    ...
</div>
<script>
       var a=true;
</script>
2.ng-show指令

定义:ng-show 指令在表达式为 true 时显示指定的 HTML 元素,否则隐藏指定的 HTML 元素

用法:
<div ng-show="expression"> ... </div>

Expression是表达式,你可以自己定义。

3.ng-hide指令

定义:指令在表达式为 true 时隐藏 HTML 元素

用法:

<div ng-hide="expression">
    ...
</div>
4.ng-repeat指令

定义:指令用于循环输出指定次数的 HTML 元素
集合必须是数组或对象

用法:

<body ng-app="moduleName" ng-controller="CtrlName">

    <h1 ng-repeat="item in group">{{item}}</h1>

<script>
var app = angular.module("moduleName", []);
app.controller("CtrlName", function($scope) {
    $scope.group = [
        "RMB",
        "Doller",
        "Chnia",
        "Beijing"
    ]
});
</script>

</body>

渲染出的DOM:

<body ng-app="moduleName" ng-controller="CtrlName">
    <h1>RMB</h1>
    <h1>Doller</h1>
    <h1>Chnia</h1>
    <h1>Beijing</h1>
</body>

Ng-reapt在处理后台数据时经常用到,后台返回的数据往往比这要复杂,可能是数组里包含了对象,比如在上面group里加一个List对象:

$scope.group = [
     "RMB",
     "Doller",
     "Chnia",
     "List":{a:1,b:2}
]

要取得a的值,就要这么写:

<h1 ng-repeat="item in group">{{item.List.a}}</h1>

更多内容敬请关注博客,欢迎和我交流哦~

123
yangjie

yangjie

29 Artikel
15 Tags
© 2020 yangjie
本站总访问量次 本站访客数人次
Erstellt mit Hexo
|
Theme — NexT.Muse