如今web開發的趨勢是先後端分離。前端採用某些js框架,後端採用某些語言提供restful API,二者以json格式進行數據交互。javascript
若是後端採用node.js,則先後端可使用同一種語言,共享某些可重用的Js代碼,並共享構建工具。但不少時候咱們可能採用別的語言,如ruby/java/scala等,此時先後端代碼基本上是徹底獨立的。雖然你們都在同一個項目中,但能夠分紅互相獨立的兩塊,而且先後端一般使用不一樣的構建工具。css
好比當後端使用Scala時,咱們會使用sbt進行項目構建,對scala代碼進行編譯、測試、打包等。它的專長是處理與scala相關的任務,但對於前端的支持比較弱。前端一些常見的任務,如js庫的下載和管理、css文件的轉換、js文件合併壓縮、js測試的執行等,很難在sbt中找到好用的插件,而利用js世界裏的工具來作反而更加方便一些。html
咱們項目組這幾天正在討論是否在項目中引入一些前端框架,仍是直接用原生Javascript寫。通過反覆討論和調研,最終決定引入AngularJs。但AngularJs的引入並非單一的任務,由於咱們還須要考慮前端代碼的測試、依賴管理等,都須要有相應的工具支持,因此最後引入了這麼一整套工具:前端
bower install jquery
這套東西都是比較基礎且使用比較普遍的。通常一旦在項目中引入前端框架,或者須要寫比較多的Js代碼時,咱們都會採用它們,因此頗有必要學習並掌握它們。java
在開始前,須要先提示一下,在javascript的世界裏,不少東西都是由社區提供的,因此每一種工具都至關獨立。好比,不少工具都有着本身獨立的配置文件,本身的命令行參數,有時候還須要有一些額外的插件把兩個工具結合起來。node
因此下面將會有不少比較瑣碎的命令,咱們須要一一瞭解。不過好在咱們一旦瞭解了,下次就可使用已經配置好的文件,經過幾條命令將把有的東西都準備好,很方便。python
在Mac中,咱們可使用brew來安裝。在其它系統下,請使用相應的工具或直接到官網下載。jquery
brew install node
Nodejs可讓咱們在服務器端使用javascript編程,它是不少js工具的基礎。若是你已經安裝,請確保使用最新版本:git
brew upgrade node
查看版本:angularjs
node -v
我這裏顯示:
v0.10.28
Npm是node官方提供的包依賴管理工具。咱們下面使用的grunt等,都是以插件形式下載安裝的。
當咱們安裝好nodejs後,npm
就自動可用了。
查看版本:
npm -v
我這裏顯示:
2.0.0-alpha-5
下面咱們從零開始,首先在任意位置新建一個目錄做爲咱們的項目根目錄,好比:
mkdir ~/myproject
而後進入該目錄:
cd ~/myproject
後面的命令都將在項目根目錄下操做。
首先咱們須要爲npm提供一個package.json
,告訴它咱們的項目信息,特別是項目中將會使用的插件。咱們不須要手動建立,由於能夠直接調用如下命令:
npm init
它會問咱們一些問題,咱們能夠按需回答,也能夠所有使用默認值,反正之後能夠改起來也很容易。
最後將會產生以下的package.json
文件:
{ "name": "grunt-bower-angular-demo", "version": "0.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "repository": { "type": "git", "url": "https://github.com/freewind/grunt-bower-angular-demo.git" }, "author": "", "license": "BSD", "bugs": { "url": "https://github.com/freewind/grunt-bower-angular-demo/issues" } }
對於像咱們這樣的非nodejs項目來講,裏面的大部份內容都沒用,能夠刪掉大部分,只剩下:
{ "name": "grunt-bower-angular-demo", "version": "0.0.0" }
npm install grunt --save-dev
將使用npm下載grunt插件,它們將保存到項目根目錄下的node_components
目錄下。
後面的--save-dev
參數是說,把這個插件信息,同時添加到package.json
的devDependencies
中:
"devDependencies": { "grunt": "~0.4.5" }
因爲grunt僅在開發階段使用,因此使用--save-dev
。若是是運行時使用的,則用--save
上面安裝的grunt
並不包含命令行工具,咱們還需安裝相應的grunt-cli
,才能在命令行中調用grunt
命令:
npm install grunt-cli -g
後面的-g
是說,把grunt-cli
安裝成全局工具,以便在任意目錄下使用。
安裝後,輸入:
grunt --version
我這裏顯示爲:
grunt-cli v0.1.13 grunt v0.4.5
在比較少的狀況下,可能提示找不到grunt,則須要根據安裝grunt-cli時的提示信息,把相應的路徑添加到PATH
中:
echo PATH=$PATH:/your/path/to/grunt >> ~/.bashrc source ~/.bashrc
npm install grunt-init -g
git clone https://github.com/gruntjs/grunt-init-gruntfile.git ~/.grunt-init/gruntfile
grunt-init gruntfile
根據須要回答問題,或者使用默認值,將獲得如下Gruntfile.js
文件:
/*global module:false*/ module.exports = function(grunt) { // Project configuration. grunt.initConfig({ // Metadata. pkg: grunt.file.readJSON('package.json'), banner: '/*! <%= pkg.title || pkg.name %> - v<%= pkg.version %> - ' + '<%= grunt.template.today("yyyy-mm-dd") %>\n' + '<%= pkg.homepage ? "* " + pkg.homepage + "\\n" : "" %>' + '* Copyright (c) <%= grunt.template.today("yyyy") %> <%= pkg.author.name %>;' + ' Licensed <%= _.pluck(pkg.licenses, "type").join(", ") %> */\n', // Task configuration. concat: { options: { banner: '<%= banner %>', stripBanners: true }, dist: { src: ['lib/<%= pkg.name %>.js'], dest: 'dist/<%= pkg.name %>.js' } }, uglify: { options: { banner: '<%= banner %>' }, dist: { src: '<%= concat.dist.dest %>', dest: 'dist/<%= pkg.name %>.min.js' } }, jshint: { options: { curly: true, eqeqeq: true, immed: true, latedef: true, newcap: true, noarg: true, sub: true, undef: true, unused: true, boss: true, eqnull: true, browser: true, globals: { jQuery: true } }, gruntfile: { src: 'Gruntfile.js' }, lib_test: { src: ['lib/**/*.js', 'test/**/*.js'] } }, qunit: { files: ['test/**/*.html'] }, watch: { gruntfile: { files