書籍完整目錄javascript
在前端開發的初始階段,開發者一般只用關 html, css, javascript。可是現代化的前端開發已經不只僅是業務代碼自己,真正的前端開發環境涉及不少方面的需求,如:css
開發需求html
共享需求前端
性能需求java
部署需求jquery
這些東西咱們都統一的叫作前端工程化,爲了簡化前端工程化的配置,出現了不少優秀的工具好比:git
前端工做流工具:Gulp,Grunt,Broccoligithub
前端 Javascript 模塊編譯工具:Babel,Browserify,Webpackweb
前端開發系列工具: livereload,數據 mock,代碼監控,代碼檢查npm
在本節中咱們對涉及到這些概念進行簡單的概述介紹。
在開始一個前端項目的時候,一般咱們會進行技術選型,而後定義代碼規範,已經配合後端和業務進行項目的目錄規劃,我把這些相關的需求都歸爲前端開發需求。
開發一般來講是一個團隊的事,在大型的前端開發團隊中,一般會定義團隊的代碼開發規範,也能夠遵循一些開源的規範:airbnb style guide。代碼規範能夠提升代碼的可閱讀性和避免一些低級錯誤。爲了將代碼規範的檢查放到前端開發工程中,能夠利用 jslint 在提交代碼以前對代碼進行自動的 code lint。
Javascript-* 語言
前端開發的核心是 Javascript,可是由於 Javascript 語言在設計上的種種不足,爲了優化語言自己的問題,出現了不少試圖替代 Javascript 的語言, 這其中如:
Coffeescript
Livescript
Typescript
React Jsx
Dart
Elm
這些語言在語法上都具備相應的優點,如 Typescript 中提供靜態語法的一些強類型特性,Coffeescript, Livescript 提供現代化語言的語法糖特性,專門針對 xml 優化的 JSX 。這些語言最終都會編譯爲 Javascript。
ES6
由於瀏覽器的實現大多仍是 ES5 的標準,爲了使用最新的 ES6 語法,一般的作法是採用 Babel 將 ES6 編譯爲 ES5。
CommonJS
前端開發一直在追求模塊化,這個過程當中出現了 AMD, CommonJs, Umd 這些模塊定義模式,簡單而言:
AMD(Asynchronous Module Definition): 異步模塊定義,能夠異步的加載或依賴其餘模塊,支持的庫如 Require.js, Sea.js 。
CommonJs : 能夠將 Javascript 按照 Node 模塊的方式定義
UMD: 爲了兼容 AMD 仍是 CommonJsx 風格,出現了 UMD
AMD 例子:
// myFubc.js define(['jquery'], function ($) { function myFunc(){}; return myFunc; });
CommonJs 例子:
var $ = require('jquery'); function myFunc(){}; module.exports = myFunc;
UMD 例子:
(function (root, factory) { if (typeof define === 'function' && define.amd) { // AMD define(['jquery'], factory); } else if (typeof exports === 'object') { // Node, CommonJS-like module.exports = factory(require('jquery')); } else { // Browser globals (root is window) root.returnExports = factory(root.jQuery); } }(this, function ($) { function myFunc(){}; return myFunc; }));
其中,CommonJs 的風格是須要編譯的,最終會將多個模塊編譯爲一個 UMD 方式定義的模塊。
一個前端項目可能同時用了 Es6 的語法和 CommonJs 的規範,以及 JSX 語言。 因此前端開發須要 Javascript 的編譯過程,編譯的過程大可能是在開發的時候,這個過程就是 Javascript 預處理。
和 Javascript 相似,也出現了一些 css-* 語言來優化 css 的開發過程,這些語言如:
less
sass
這些 css-* 語言一樣最終都會被編譯爲原生的 css, 這個過程叫 Css 的預處理。
除了這類需求之外,由於瀏覽器的兼容問題,致使不得不在 css 上寫一些瀏覽器兼容的 hack, 爲了自動解決這些 hack, 出現了一些工具如:
Autoprefixer
Compass
在預處理流程中能夠加入這些預處理工具。
一般一個前端項目會分有一個 src 目錄和 dist 目錄, src 放置源碼,dist 放置編譯後的代碼。因此在前端工程的流程中會涉及到文件的拷貝,刪除,移動等流程。
一般的前端開發過程是,修改前端代碼,調用命令編譯代碼,而後瀏覽器 F5 刷新。這個過程能夠作到自動化,經過代碼監控工具,指定要監控的目錄和文件,若是對應文件有改變,調用編譯工具編譯源碼,而後經過 livereload 自動刷新瀏覽器。
現代化前端項目開發大可能是先後端分離的方式,也就是後端基本是提供 API 服務,在真實開發環境中,一般的問題是,後端 API 極其不穩定或者沒開發,爲了避免阻礙前端的開發,一般的作法是,先後端先約定 API 接口定義,而後前端根據定義 mock 接口。
對於大公司來講,可能有 mock 平臺來實現這一功能,但對於小公司小項目來講,可能只能本身實現,咱們能夠利用一些開源的數據 mock 工具來在前端工程中實現。
對於大型線上前端應用來講,mock 數據遠遠不夠,進入一個頁面可能須要多方的後端依賴,只能在真實環境中經過域名代理的方式實現開發和調試。
對於公司和業務,快速高效的實現業務是終極追求,這對先後端都是挑戰。在前端團隊中,可以造成基礎組件庫和業務組件庫是一種必然需求。
因此在設計前端項目架構的時候,必定要考慮業務的組件化和可共享性。
Base 基礎代碼共享
通用工具方法共享
基礎交互組件共享
業務組件共享
React 自然提供了組件的結構,只要在組件的開發過程當中,注意組件的獨立性,很容易造成可重用的組件。
web 應用的特色是,全部源碼的加載都須要經過網絡,因此優化源碼的體積是提高首屏加載時間的關鍵,涉及到的一些點:
Javascript, Css 代碼壓縮
Javascript, Css 代碼合併
圖片壓縮
Css 圖片精靈或雪碧圖(css sprit)
這些過程均可以在前端工程的 build 過程當中實現。
一個前端工程一般是多人維護的,因此會用代碼管理工具(默認 git) 來管理源碼,而後將開發流程和部署流程和 git 結合起來。
多人分支協做流程:用 git flow 來管理代碼分支
代碼自動發佈:git hook
爲了解決前端工程中複雜的流程,出現了不少開源前端流程處理工具。這些工做流工具不只僅是其自己,都是一個流程生態體系,每一個工具都涉及到對應的插件庫,幾乎咱們能想到的前端工程問題都有對用的插件可以解決。
Grunt 是最早流行起來的前端工程,其核心思想是基於配置的工做流模式,定義一個配置文件,聲明工做流各個環節的相關配置,調用 grunt 就能完成打包編譯
一樣是工做流工具,但其核心是以 tree 的基礎結構,提供極其高效穩定的工做流。
目前 Gulp 幾乎已經取締 Grunt ,成爲前端的默認流程工具,其核心思想是基於內存的流的方式,提供高效的性能,極簡的 API,定義不一樣的 task,而後將 task 串聯起來。
上面咱們已經講到了 Javascript 的預處理,這裏詳細介紹一下幾個預處理工具
Use next generation JavaScript, Today
babel 的核心標語就是,如今就開始使用下一代的 Javascript , 咱們能夠在工程中使用 Es6, Jsx, 甚至是 Es7 的語法,最終這些語法均可以被編譯爲 Es5。
Browserify 是最早出現的 CommonJs 編譯工具,使得咱們能夠像寫 Node 模塊同樣寫前端代碼,Browserify 能夠 build 使用 npm 中的全部模塊(只要 模塊支持在前端中運行)
Webpack 是支持 CommonJs 和 AMD 的模塊編譯工具,逐漸替代 Browserify, 基於 AMD 的好處就是代碼能夠異步話,這是 Browserify 沒法作到的
在本章中不會涉及到全部工具,會根據 React 的開發方式配置一個最合適的前端工程環境。主要是
JSX + Es6 + CommonJs
Webpack + Babel 作 Javascript 預處理
Gulp 作工做流