Yeoman+Angular+Gulp 前端环境搭建

需要系统中安装了git, node, bower工具,本文的运行版本是
node -v v6.9.1
bower -v 1.8.0
gulp -v CLI version 1.2.2

示例代码的Github地址
简书地址

使用yeoman generators

  • angular generator是一个angular骨架代码生成工具
yo angular
? Would you like to use Gulp (experimental) instead of Grunt? Yes
? Would you like to use Sass? Yes
? Would you like to include Bootstrap? Yes
Which modules would you like to include? angular-animate.js, angular-aria.js, angular-cookie
s.js, angular-resource.js, angular-messages.js, angular-route.js, angular-sanitize.js, angular
-touch.js

安装karma的依赖

npm install generator-karma --save-dev

Tips: 加上--save-dev参数不仅会在本地安装需要的包,而且会把依赖添加到package.json中,供别人同步代码的时候使用。生成代码如下:
"generator-karma": "^2.0.0",

安装项目需要的依赖的node_modules和bower_components

npm install
bower install

运行gulp任务

Gulp是一个前端开发工具,通过gulp可以方便的配置build, test, 依赖注入等等的工作,只需要执行类似gulp test这样一个命令。

  • 由于gulp本身被包含在项目的依赖中,可以在node_modules下面找到
./node_modules/gulp/bin/gulp.js -version
  • 通过embed gulp来运行build项目
./node_modules/gulp/bin/gulp.js
  • 通过embed gulp来启动一个本地的dev环境
./node_modules/gulp/bin/gulp.js serve

Tips: 其实可以在global环境下安装gulp,而不用每次都输入gulp的完整路径,运行npm install -g gulp-cli来安装。
我们推荐使用这种方式,所以在之后的内容中都将直接采用类似gulp serve的写法

  • 在运行了gulp serve之后,会默认打开系统默认的浏览器

  • 查看gulpfile.js文件,我们可以修改文件使之打开firefox浏览器,来帮助我们调试,当然你系统中要已经安装了firefox

gulp.task('start:client', ['start:server', 'styles'], function () {
-  openURL('http://localhost:9000');
+  openURL('http://localhost:9000','firefox');
 });

修改wiredep配置

  • 打开gulpfile.js配置文件可以看到,这里的bower任务是发现所有bower依赖(包括css和js),运行gulp bower将其注入到index.html中。

  • css 注入示例,运行之后会在中间加入css依赖

  <!-- build:css(.) styles/vendor.css -->
  <!-- bower:css -->
  <link rel="stylesheet" href="bower_components/bootstrap/dist/css/bootstrap.css" />
  <!-- endbower -->
  <!-- endbuild -->
  • js 注入
  <!-- build:js(.) scripts/vendor.js -->
  <!-- bower:js -->
  <script src="bower_components/jquery/dist/jquery.js"></script>
  <script src="bower_components/angular/angular.js"></script>
  <script src="bower_components/bootstrap/dist/js/bootstrap.js"></script>
  <script src="bower_components/angular-animate/angular-animate.js"></script>
  <script src="bower_components/angular-aria/angular-aria.js"></script>
  <script src="bower_components/angular-cookies/angular-cookies.js"></script>
  <script src="bower_components/angular-messages/angular-messages.js"></script>
  <script src="bower_components/angular-resource/angular-resource.js"></script>
  <script src="bower_components/angular-route/angular-route.js"></script>
  <script src="bower_components/angular-sanitize/angular-sanitize.js"></script>
  <script src="bower_components/angular-touch/angular-touch.js"></script>
  <!-- endbower -->
  <!-- endbuild -->
  • 但是在默认的yeoman生成的代码中,bower任务如下,这地方有两个问题4
// inject bower components
gulp.task('bower', function () {
  return gulp.src(paths.views.main)
    .pipe(wiredep({
      directory: yeoman.app + '/bower_components',
      ignorePath: '..'
    }))
  .pipe(gulp.dest(yeoman.app + '/views'));
});
  1. 可以发现directory变量指向的app/bower_components,但是bower默认安装在根目录下,需要修改这个路径
  2. 生成的gulp.dest pipeline是把index.html放到app/views,但是启动的时候寻找app的index.html
  • 为了解决上面两个问题,首先需要修改.bowerrc文件,指定其生成目录的位置
{
  "directory": "app/bower_components",
  "strict-ssl": false
}
  • 其次修改gulp.js,重新生成的index.html覆盖原来的
// inject bower components
gulp.task('bower', function () {
  return gulp.src(paths.views.main)
    .pipe(wiredep({
      directory: yeoman.app + '/bower_components',
      ignorePath: '..'
    }))
-  .pipe(gulp.dest(yeoman.app + '/views'));
+  .pipe(gulp.dest(yeoman.app)); //这里放到app目录下会覆盖原来的index.html
});
  • 由于每次运行wiredep需要执行gulp bower,怎样在gulp serve中每次自动运行下gulp bower把新添的bower依赖放到index.html中?可以通过添加gulp任务依赖的方式
-gulp.task('start:server', function() {
+gulp.task('start:server', ['bower'], function() {// 这里的中括号bower,就是运行启动server时候的依赖
  $.connect.server({
    root: [yeoman.app, '.tmp'],
    livereload: true,
    // Change this to '0.0.0.0' to access the server from outside.
    port: 9000
  });
});
  • 运行gulp serve, 会直接打开firefox显示结果
屏幕快照 2017-03-4427 下午2.37.58.png

Gulp load plugins

这是一个非常有用的语法糖,可以帮助用户方便的访问已经安装的gulp插件。

var $ = require('gulp-load-plugins')();
$.jshint;//gulp-jshint
$.sass;  //gulp-sass

Gulp nodemon

Nodemon在开发过程中相当有用,它会自动监测nodejs源代码,然后重新启动。
以下是一个例子,注意callback函数的作用。

Tips:很多时候,我们说一个gulp任务A依赖于另外一个gulp任务B,其实是在A的callback函数返回的时候,表明A任务已经完成,之后才会去调用B任务。
所以在定义一些有依赖的gulp任务函数的时候,需要注意callback函数的写法。

gulp.task('start:server', [],(callback) => {
  let started = false;
  return $.nodemon({// $.nodemon是gulp load plugin的写法
    script: 'build-server/app.js',
    ignore: ["app","dist","upload","node","node-v6.9.1","build-server"]
  }).on('start', function () {
    if (!started) { //为了防止执行多次
      callback();
      started = true;
    }
  });
});

Gulp watch and livereload

与nodemon的后端监测相对的,前端监测使用watch和livereload配合。watch用来监测文件,当文件有改动的时候,livereload可以动态的加载到服务器上,
需要注意的是,livereload是一个服务进程,可以加载包括html,前端js,css等等文件。

gulp.task('watch', function () {
  $.livereload.listen();

  $.watch(paths.views.files)
    .pipe($.plumber())
    .pipe($.livereload());
  });

使用ES6

gulp本身的gulpfile.js可以支持ES6, 例如上面代码中使用到的let定义变量,匿名函数等等功能。需要更名为gulpfile.babel.js,可以看到这里还是采用babel解释器的方式来使用es6。
对于别的js代码,如果想使用es6的时候,可以使用gulp babel的转码器,转成es2015的格式,在浏览器上运行。下面的一个流说明了这个问题。

let es6ClientScript = lazypipe()
  .pipe($.babel, {
    presets: ['es2015']
  })
  .pipe(gulp.dest, paths.buildScriptsDest);

小结

  • yeoman的generator可以方便的帮助我们快速的建立一个骨架工程,例如generator-angular-fullstack,可以生成一个全栈的工程,包括express server,提供mongodb依赖
  • gulp是一个非常强大的项目管理工具,可以完成build, test, 注入,打包,等等功能
  • wiredep是一个非常实用的工具,可以方便的注入bower的依赖

思考题

  1. 文件.bowerrc有什么作用?"strict-ssl": false有什么作用?思考.npmrc有什么作用?
  2. 怎样理解下面的代码?
gulp.task('build', ['clean:dist'], function () {
  runSequence(['images', 'copy:extras', 'copy:fonts', 'client:build']);
});

讨论:1.文中可以看到,.bowerrc是bower的配置文件,可以指定bower的安装地址,当然还可以配置其他项,"strict-ssl": false就是一个例子,表示不启用严格的ssl验证,在有些时候不能下载包的时候需要考虑关闭strict ssl。npmrc和bowerrc类似,是npm安装时候的配置。是一个npmrc的配置,主要解决的是国内包下载慢的问题,前两个对应了phantomjs和node-sass这两个包在国内的镜像。

phantomjs_cdnurl=http://cnpmjs.org/downloads
sass_binary_site=https://npm.taobao.org/mirrors/node-sass/
registry=https://registry.npm.taobao.org

2.这个一个build任务,一般情况下是gulp的默认任务。在运行build前,可以看到要执行clean:dist任务来做一些清理,可以看到build是依赖于clean:dist的,只有当clean:dist执行结束返回的时候build才会启动;而其中的runSequence是一个gulp插件,表示执行一组任务,但是其中的任务没有严格顺序,注意和依赖区分。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容

  • gulpjs是一个前端构建工具,与gruntjs相比,gulpjs无需写一大堆繁杂的配置参数,API也非常简单,学...
    井皮皮阅读 1,274评论 0 10
  • gulpjs是一个前端构建工具,与gruntjs相比,gulpjs无需写一大堆繁杂的配置参数,API也非常简单,学...
    build1024阅读 518评论 0 0
  • gulpjs是一个前端构建工具,与gruntjs相比,gulpjs无需写一大堆繁杂的配置参数,API也非常简单,学...
    依依玖玥阅读 3,123评论 7 55
  • gulpjs是一个前端构建工具,与gruntjs相比,gulpjs无需写一大堆繁杂的配置参数,API也非常简单,学...
    小裁缝sun阅读 897评论 0 3
  • 对网站资源进行优化,并使用不同浏览器测试并不是网站设计过程中最有意思的部分,但是这个过程中的很多重复的任务能够使用...
    懵逼js阅读 1,026评论 0 8