gulp
搭建前端環境之 ionic
項目實踐總結3.1 前言 3.2 angular 目錄結構簡介 3.3 ionic 目錄結構簡介 3.4 重構 ionic 目錄結構 3.4.1 區分 SRC 和 WWW 3.4.2 切換 Development、Staging、Production環境 3.5 gulp 配置詳解 3.6 升級到 ionic2 3.7 參考文檔
詳細步驟及示例請移步至 ionic quickstarter with gulp
系列文章 主要講解如何用 gulp 搭建一個前端工程化項目css
咱們經常會花不少時間去寫代碼,在項目的早期階段,不少人傾向忽視目錄結構的組織;在短時間時間內,這可讓開發人員快速的編寫代碼,但從長遠來看會影響代碼的可維護性;有時候或許會想到去 github
或者 google
去搜索,好比 angular-seed
等等,一些框架已經提供了最佳實踐的項目結構。下面將主要分享團隊在 angular
項目和 ionic
項目結構上的實踐過程;若有不恰當之處,歡迎指正。html
angular
目錄結構簡介ionic
是基於 angular
的一套移動框架,咱們須要先來看看 angular
的目錄結構:前端
許多 AngularJS 教程提供了相似於下面的項目目錄結構,這是一個很是典型的應用程序結構;在表面看起來,很是相似於 MVC 框架的目錄結構,分爲 controllers
目錄、views
目錄,以及第三方的JavaScript庫的目錄。jquery
當你只有少數的視圖和控制器,這看起來是很是的好。事實上,它只適合咱們對照教程編寫示例代碼或較小的應用程序。這種結構使得初學者很容易理解其中的概念。git
可是當你開始嚮應用程序添加複雜的功能,這種組織方式很快會遇到一些問題,一旦你有10多個控制器,視圖和指令文件,你就須要滾動目錄樹找到所需文件,隨着應用程序的增大,如何維護就會成爲一個問題:angularjs
www/ | |- app/ | |- controllers/ | | |- mainController.js | | |- otherController.js | | | |- directives/ | | |- ButtonDirective.js | | |- otherDirective.js | | | |- services/ | | |- userService.js | | |- itemService.js | | | |- js/ | | |- bootstrap.js | | |- jquery.js | | | |- app.js | | |- views/ | |- mainView.html | |- otherView.html | |- index.html | | |- css/ | |- style.scss | | |- img/ | |- logo.png
src/ |app/ | |- admin/ | | |- acount/ | | |- users/ | | |- admin.js | |- dashboard/ | | |- dashboard.js | | |- dashboard.tpl.html | |- app.js |-assets/ | |- img/ | |- css/ | |- font/ |-common/ | |- directives/ | |- resources/ | |- services/ |-sass/ | |- main.scss | |- variables.scss |-index.html vendor/ |- angular |- boootstrap |- jquery
這種結構把不一樣的業務功能拆分爲獨立的文件,條理清晰,可是仍有必定的侷限性。最大的問題是同一個業務功能的代碼分佈在 controllers
, models
, services
三個不一樣目錄下,要從中挑選出相對應的文件,創建起代碼關聯,仍是有些麻煩。在項目結構二的改進下,因而便有了第三種項目結構,按照功能模塊劃分目錄結構,或許更爲合理一些:github
讓咱們獲得最佳實踐和你應該作什麼來構建可伸縮和可維護的AngularJS應用,你的同事會愛死你的。理想 AngularJS 程序結構應該模塊化到很是具體的功能;咱們應該要利用好AngularJS的特性進一步劃分咱們的應用程序。下面看一個示例目錄結構:json
/ | |- src/ | | | | |- app/ | | |- home/ | | | | | | | |- home.module.js | | | |- home.controller.js | | | |- home.directive.js | | | |- ($feature.$type.js) | | | |- home.html | | | |- home.scss | | | | | |- config/ | | | |- config.default.json | | | |- config.development.json | | | |- config.production.json | | | |- config.js | | | | | |- app.js | | |- app.routes.js | | |- app.services.js | | |- app.templates.js | | | | |- css/ | | |- scss/ | | | |- ionic.app.scss (index file) | | |- ionic.app.css (all css will be compiled into this file) | | | | |- img/ | | | | |- lib/ | | |- angular/ | | |- angular-resource | | |- ionic | |- shared/ (common components cross projects) | | |- canvasClock/ | | |- calendar/ | | |- constants/ | |- index.html
參考:gulp
最近陸陸續續作過一些基於 ionic 的 hybird app,遇到過一些問題,踩過一些坑;有開發過 ionic 經驗的人都知道,咱們只須要使用 ionic start ProjectName
就能夠生成一個 ionic 的模板項目結構:
ionic 默認開發環境是在 www
目錄,所以咱們的關注點只須要聚焦在 www
目錄便可,觀察上面的項目結構,咱們能夠發現與在分析 angular 目錄時的按文件類型分類的目錄結構是相似的
另外:ionic 默認只提供了基於 gulp 的 sass 編譯,使用 bower 來安裝庫依賴,除此以外並無其餘的自動化構建流程,如常見的代碼合併壓縮,圖片壓縮,分環境開發等等;所以咱們須要重構 ionic 默認的目錄結構,以此來完成適合大型應用的目錄
有了上面 angular 和 ionic 目錄的簡單介紹,咱們知道 ionic 默認的項目結構可能更適合通常的項目架構,若是咱們想更好的管理 ionic 項目,咱們須要對它進行重構和更多的自動化構建過程
咱們先來看看重構後的項目目錄結構,而後再來分析它所遵循的規範:
/ | |- src/ | | | | |- app/ | | |- home/ | | | | | | | |- home.module.js | | | |- home.controller.js | | | |- home.directive.js | | | |- ($feature.$type.js) | | | |- home.html | | | |- home.scss | | | | | |- config/ | | | |- config.default.json | | | |- config.development.json | | | |- config.production.json | | | |- config.js | | | | | |- app.js | | |- app.routes.js | | |- app.services.js | | |- app.templates.js | | | | |- css/ | | |- scss/ | | | |- ionic.app.scss (index file) | | |- ionic.app.css (all css will be compiled into this file) | | | | |- img/ | | | | |- lib/ | | |- angular/ | | |- angular-resource | | |- ionic | |- shared/ (common components cross projects) | | |- canvasClock/ | | |- calendar/ | | |- constants/ | |- index.html | |- www
app
: components using for the app
css
: common stylesheets, using scss
img
: common images
lib
: thrid-party libraries managed by bower
shared
: common components cross projects
www
: compile the source code for the production environment
從上面的目錄結構能夠看到,如今的目錄結構有點相似於咱們在分析 angular 項目時的按照模塊來分類的項目結構;這種組織方式適合編寫大型的應用程序,它不一樣於咱們使用 ionic start projectName
初始化的項目目錄;
ionic 默認的目錄將全部的routes, controllers都放在一個文件夾,將全部的html 模板文件放在一個文件夾;
相反的,咱們選擇使用模塊來管理組織文件,每一個模塊是在本身的目錄包含 JavaScript(控制器)和HTML(模板),css,image;即每一個功能點都是一個小的模塊,這使它更容易保持一個大型應用程序組織和維護。
src
和 www
目錄新增長 src 文件夾,項目的源代碼(HTML、CSS、JavaScript)位於 src
目錄下面而不是位於默認的 www
目錄下
ionic serve
默認是讀取 www
目錄下文件啓動本地靜態服務器,咱們經過使用 gulp 構建來將 src 的代碼映射到 www
目錄下
development
當你想切換到開發環境在瀏覽器上運行時,只須要執行ionic serve
production
當你想切換到生產模式在設備上設備時,只需執行ionic build --env production
通常原則: ONE DIRECTORY == ONE MODULE (and one subdirectory == 1 sub module).
模塊的定義須要根據項目而定,切分的粒度也須要視狀況而定,例如咱們能夠將 login
切換爲一個模塊,全部有關login模塊的html,css,js,img都放在login模塊目錄下:
這裏引用前端農民工張雲龍大神的一張圖片做爲說明
推薦閱讀: 前端工程——基礎篇
當你從 ionic-quickStart
clone項目以後,默認的是development環境,你須要開起兩個終端來分別執行 gulp build
和 ionic serve
來運行項目:
# switch to development mode $ gulp build # same as running `gulp build --env development` # run local serve $ ionic serve
當你須要切換到staging環境,即常說的預發佈環境(壓縮源代碼,API路徑替換等等),你只須要執行gulp build --env staging
來自動化構建你的項目L
# switch to staging mode $ gulp build --env staging
當你須要切換到production環境,即常說的生產環境(與staging環境只有API路徑不一樣),你只須要執行gulp build --env production
來自動化構建你的項目:
// switch to production mode $ gulp build --env production
更改 ionic 默認的項目結構後,咱們須要基於gulp來構建更完善的流程,先來看看整個的流程圖:
在開發模式下:須要默認將 SRC
下的文件複製到 WWW
目錄下,而且實時監聽 SRC
文件的改動映射到 www
(由於 ionic serve 默認會讀取 www
目錄下的文件啓動本地服務);開發模式主要的 gulp
任務是監聽 html, css, JS 的改動,sass 的編譯,實時刷新,stylelint,JSLint,文件替換和 API 路徑配置;
在預生產模式下:首先須要清除掉 WWW
目錄下的全部文件,而後從新從 SRC
編譯代碼到WWW
目錄下,這個過程主要的 gulp
任務是:清除文件,HTML 模板合併緩存,圖片壓縮,CSS 合併壓縮,JS 合併壓縮;
在生產模式下: 生產模式和預生產模式除了 API PATH 配置不同,其它的gulp
任務都是同樣;
詳細步驟及示例請移步至 ionic-quickstarter-with-gulp
ionic2 如今雖然還未發佈,可是咱們能夠從官方文檔下載有關 ionic2 的相應示例,對比發現,咱們此次基於gulp的構建結構居然與 ionic2 有殊途同歸之妙(吹噓?),ionic2 主要分爲app
和www
目錄,以此來區分不一樣的開發模式,組件化等等,基於 Webpack 構建,流程更加完善,值得期待!
ionic2 目錄結構
|-www/ | |--Home/ |--|-HomeCtrl.js |--|-Home.html | |--Detail/ |--|-DetailCtrl.js |--|-Detail.html | |-index.html |-app.js