Vue.js項目模板搭建

来源:http://www.cnblogs.com/fsyz/archive/2017/09/19/7554794.html
-Advertisement-
Play Games

前言 從今年(2017年)年初起,我們團隊開始引入「Vue.js」開發移動端的產品。作為團隊的領頭人,我的首要任務就是設計 整體的架構 。一個良好的架構必定是具備豐富的開發經驗後才能搭建出來的。雖然我有多年的前端開發經驗,但就「Vue.js」來說,仍然是個新手。所幸「Vue.js」有一個配套工具「V ...


前言

從今年(2017年)年初起,我們團隊開始引入「Vue.js」開發移動端的產品。作為團隊的領頭人,我的首要任務就是設計 整體的架構 。一個良好的架構必定是具備豐富的開發經驗後才能搭建出來的。雖然我有多年的前端開發經驗,但就「Vue.js」來說,仍然是個新手。所幸「Vue.js」有一個配套工具「Vue-CLI」,它提供了一些比較成熟的項目模板,很大程度上降低了上手的難度。然而,很多具體的問題還是要自己思考和解決的。

項目劃分

我們公司的H5產品大部分是嵌套在手機客戶端裡面的頁面。每個項目的功能都比較獨立,而且規模不大。這樣一來,既可以讓這些小項目各自為政,也可以把它們集中放到一個大項目中管理。各自的優缺點如下:


項目模板考慮到我們團隊剛開始使用「Vue.js」,需要逐步摸索出合適的架構。如果做成一個大項目,一旦架構要調整,很可能會傷筋動骨。所以最終的選擇是 劃分成多個小項目 。

雖然劃分成多個小項目了,但是這些小項目也要保持一致的架構和公共代碼。說白了,就是要根據業務情況搭建自己的項目模板,所有具體的項目都在這個模板的基礎上開發。下麵就介紹一下我們團隊的項目模板的搭建過程。

初始化

項目模板本身也是一個項目,所以也通過「Vue-CLI」來初始化(項目名為「webapp-public」):

vue init webpack webapp-public

這裡選用的是「webpack」模板,因為功能比較齊全。初始化的過程中要註意:

  • 安裝「Vue-Router」以支持單頁應用;

  • 安裝「ESLint」以統一編碼規範。

SASS

安裝「SASS」的支持比較簡單,先通過命令行安裝相關依賴:

npm install node-sass --save-devnpm install sass-loader --save-dev

裝好後,只要指定style標簽的「lang」屬性為「scss」,就可以用該語言來編寫樣式代碼了:

<style lang="scss" scoped></style><style src="style.scss" lang="scss"></style>

REM佈局

如今移動端的頁面為了適應不同尺寸的手機屏幕,大多都在樣式代碼中使用rem作為尺寸單位。然而,設計師給的設計稿還是以px為單位的。這就需要把px轉換為rem,這個轉換可以在腦子裡面轉,也可以通過工具去轉,比如「PostCSS」的插件「 postcss-px2rem 」。

初始化項目的時候,「PostCSS」就已經裝上了,所以直接安裝「postcss-px2rem」即可:

npm install postcss-px2rem --save-dev

裝好後還要修改項目根目錄下的「.postcssrc.js」,增加「postcss-px2rem」的配置:

"plugins": { 
 "autoprefixer": {}, 
 "postcss-px2rem": { "remUnit": 100 }
}

「px值/remUnit」即為轉換出來的rem值,可以根據自身需要修改「remUnit」的值。

然而,有些特殊的px值是不需要轉換成rem值的,這時候可以通過特殊註釋禁止「postcss-px2rem」去處理這個值。例如:

/* 不同dpr下的細線 */
.g-dpr-1 .g-border-1px { 
 border-width: 1px !important; /*no*/
 }
 .g-dpr-2 .g-border-1px { 
 border-width: 0.5px !important; /*no*/
 }

Vuex

在單頁應用開發中,負責管理狀態的「Vuex」也是必備的。安裝也非常簡單:

npm install vuex --save

然而,真正使用的時候,在一些 低版本系統的瀏覽器 中,可能會出現這樣的異常:

Error: [vuex] vuex requires a Promise polyfill in this browser.

這是因為瀏覽器不支持「Promise」,這時候就需要一個「polyfill」。我們可以直接用「babel-polyfill」:

npm install babel-polyfill --save

「babel-polyfill」會在 全局作用域 添加ES6新增的對象和方法,項目中的其他代碼並不需要顯式地引入(import或者require)它,這就意味著「Webpack」不會把它識別為項目的依賴。所以還要修改「/build/webpack.base.conf.js」,在打包入口處增加「babel-polyfill」:

entry: { 
 app: ['babel-polyfill', './src/main.js']
}

另外要提一下的是,使用「Vue-CLI」初始化項目的時候預設安裝了「 babel-plugin-transform-runtime 」,而它的作用跟「babel-polyfill」是重覆的,所以可以移除前者。修改根目錄下的「.babelrc」,移除這一行:

"plugins": ["transform-runtime"]

然後刪除依賴即可:

npm uninstall babel-plugin-transform-runtime --save-dev

訪問路徑

每個小項目真正在伺服器(不管是測試、預發佈還是生產環境的伺服器)上運行的時候,是通過一級子目錄去區分的。

這就意味著,項目中的所有路徑都要加上一層目錄(比如原訪問路徑為「http://localhost:8080/home」,現在就得改成「http://localhost:8080/project-a/home」)。千萬別以為這是很簡單的事情,實際上要改的地方是很多的。

首先要改的是「Vue-Router」的 基路徑 配置:

new Router({ 
 base: '/project-a/', // 基路徑
 mode: 'history', 
 routes: [
 { path: '/', component: Home }
]
});

設置基路徑後,跟路由相關的所有路徑都是相對基路徑,而不是根目錄。

然後是開發伺服器的 資源發佈路徑 (/config/index.js):

dev: { assetsPublicPath: '/project-a/' }

對應地還要修改「/build/dev-server.js」的兩處地方,不然訪問的時候就會404:

require('connect-history-api-fallback')({ 
 // 預設為"/index.html",因為資源發佈路徑改了,所以這裡也要對應上
 index: '/project-a/index.html'
 })
// 運行項目後預設打開的頁面地址
var uri = 'http://localhost:' + port + '/project-a/'

最後還要修改 Webpack熱更新的檢測路徑 。先修改「/build/dev-server.js」:

require('webpack-hot-middleware')(compiler, { 
 log: false, 
 path: '/project-a/__webpack_hmr'
 })

然後修改「/build/dev-client.js」:

require('webpack-hot-middleware/client?path=__webpack_hmr&dynamicPublicPath=true&noInfo=true&reload=true')

順帶一提,上面的這堆參數完全是用源代碼調試的結果,官網文檔並沒有詳細說明。

全部改完之後可以發現,跟目錄有關的代碼有5處,具體項目使用的時候豈不是要改5次?非常麻煩。這種情況下,把這部分邏輯寫成一個公共函數去調用是最好的選擇。新建文件「 /src/add-dirname.js 」:

const DIR_NAME = '/project-a/';
module.exports = function(path) { 
 return (DIR_NAME + path).replace(/\/{2,}/g, '/');
};

然後把剛纔涉及添加一級子目錄的代碼全部改成調用該函數來實現:

這樣一來,如果要修改一級子目錄,只需要修改常量「DIR_NAME」的值就可以了。

公共代碼

我們的公共代碼分為三種:

  • 通用性較強的庫 :包括團隊成員編寫的一些通用庫、無法通過npm安裝的通用庫等,跟業務無關;

  • 業務邏輯庫 :跟業務有關,但是跟表現層無關的公共代碼;

  • 業務組件庫 :表現層的組件。

它們都位於「/src/public」:

在每一種公共代碼的文件夾內,具體某一個庫或者組件的目錄結構如下:

  • /src/public/components/img-box

  • img-box.vue

  • 1.1

這裡要特別提一下的是 版本號 這一層文件夾。如果對庫或者組件的修改會造成以前的調用代碼不相容,就不應該修改原文件,而是新建一個版本號文件夾,把新的代碼以及其餘的資源文件都放到這個新文件夾中。這樣做的好處是,具體的項目要更新公共代碼時,直接把項目模板的「/src/public」覆蓋過去就行,不用擔心不相容。

構建

「webpack」這個項目模板已經配置好構建的邏輯。通過一個命令就可以執行構建:

npm run build

根據預設配置,代碼會被髮布到項目根目錄下的「dist」文件夾內。然而,這樣簡單粗暴的發佈方式並不能滿足實際需求:

  • 資源文件(圖片、CSS、JS等)要發佈到 CDN伺服器 ;

  • HTML中要通過完整的URL引用資源文件(因為資源文件在CDN的域上);

  • 不用的環境(測試、預發佈、生產)使用不同的域訪問。

先解決區分環境的問題,我們在構建命令中新增一個參數以表示環境:

npm run build <test|pre|prod>

然後在根目錄下新建一個配置文件「conf.json」(簡單起見,只寫了兩種環境的配置):

文件內容表示的分別是不同環境下的HTML文件發佈路徑、資源發佈路徑以及資源訪問路徑。

接下來就要把這些配置接入到「Webpack」的打包配置中。修改「/config/index.js」,先在開頭加上:

var env = process.argv[2]; // 環境參數(從0開始的第二個)
var conf = require('../conf');
// 找出對應環境的配置conf.indexRoot = conf.indexRoots[env];
conf.assetsRoot = conf.assetsRoots[env];
conf.assetsPublicPath = conf.assetsPublicPaths[env];

然後修改構建部分的代碼:

build: { 
 index: path.resolve(__dirname, conf.indexRoot + 'index.html'),
 assetsRoot: path.resolve(__dirname, conf.assetsRoot),
 assetsPublicPath: conf.assetsPublicPath
}

此時運行構建命令,就可以把項目發佈到「conf.json」指定的路徑中。

小結

至此,項目模板搭建完畢。其實最重要的一點就是 可配置化 ,否則,開發具體項目的人初始化一個項目還要改十幾個地方,效率就很低了。

項目模板的使用

項目模板已經搭建好了,但是怎麼用呢?有兩種常用場景:

  • 初始化新項目 :克隆或拉取項目模板項目,複製該項目的所有文件(除了「.git」文件夾)到新項目的文件夾,修改配置後進行後續開發。

  • 更新公共代碼 :克隆或拉取項目模板項目,複製要更新的代碼到目標項目的對應路徑。

兩種場景都離不開「克隆或拉取」、「複製和粘貼」,這種做法一是麻煩,二是逼格太低。所以後來我用Node.js寫了一個命令行工具「webapp-cli」來完成這兩項工作。

初始化項目的命令為:

webapp init [projectPath]

例如:

webapp init test

更新特定文件的命令為:

webapp update <fileGlobs> [projectPath]

例如:

webapp update /src/public/** test

這個工具並沒有改變操作方式,只是由人工操作變成程式代勞。

 

 

>

學習前端的同學註意了!!!

學習過程中遇到什麼問題或者想獲取學習資源的話,歡迎加入前端學習交流群461593224,我們一起學前端!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 序 好久沒寫設計模式了,自從寫了兩篇之後,就放棄治療了,主要還是工作太忙了啊(藉口,都是藉口),過完年以後一直填坑,填了好幾個月,總算是穩定下來了,可以打打醬油了。 為什麼又重新開始寫設計模式呢?學習使我快樂啊(我裝逼起來我自己都害怕),其實主要是最近填坑的時候看源代碼有點暈,很多代碼不知道他們為什 ...
  • 單例,故名思議,一個只能創建一個實例的類。 單例被廣泛應用於Spring的bean(預設)、線程池、資料庫連接池、緩存,還有其他一些無狀態的類如servlet。 一個沒必要多例的類實現了單例可以節約空間(顯而易見),節省資源(線程、資料庫連接)。 單例模式有這麼多好處,那我們來實現它吧,首先想到的是 ...
  • 報錯 原因 action與result-type順序搞錯了 package里元素必須按照一定的順序排列: result-types interceptors default-interceptor-ref default-action-ref default-class-ref global-res ...
  • 【一朝,王母娘娘設宴,大開寶閣,瑤池中做蟠桃勝會】 有一天,王母娘娘要在瑤池辦party,就需要準備大量的食材。要知道,天上的神仙也分三六九等,九曜星、五方將、二十八宿、四大天王、十二元辰、五方五老、普天星相、河漢群神等等,不同等級的神仙在宴會中吃的東西也不一樣。 為了方便管理,我們把神仙分為低級神 ...
  • 對很多創業公司而言,很難在初期就預估到流量十倍、百倍以及千倍以後網站架構會是什麼樣的一個狀況。同時,如果系統初期就設計一個千萬級併發的流量架構,很難有公司可以支撐這個成本。 因此,這裡主要會關註架構的眼花。在每個階段,找到對應該階段網站架構所面臨的問題,然後在不斷解決這些問題,在這個過程中整個架構會 ...
  • 單體應用程式通常具有一個單一的關係型資料庫。使用關係型資料庫的一個主要優點是您的應用程式可以使用 ACID 事務。很不幸的是,當我們轉向微服務架構時,數據訪問將變得非常複雜。這是因為每個微服務所擁有的數據對當前微服務來說是私有的,只能通過其提供的 API 進行訪問。封裝數據可確保微服務松耦合,獨立演... ...
  • 上篇中解釋到什麼是架構風格和應該以怎樣的視角來理解REST(Web的架構風格)。本篇來介紹一組自洽的術語,用它來描述和解釋軟體架構;以及列舉下對於基於網路的應用來說,哪些點是需要我們重點關註的。 1 軟體架構 軟體架構方面研究的是如何以最佳的方式劃分一個系統、如何標識組件、組件之間如何通信、信息如何 ...
  • 最近公司項目的需求上要求我們iPad項目上一些需要輸入數字的地方用我們自定義的軟鍵盤而不是移動端設備自帶的鍵盤,剛接到需求有點懵,因為之前沒有做過,後來理了一下思路發現這東西也就那樣。先看一下實現之後的效果: 實現的效果就是當點擊頁面中需要彈出軟鍵盤的時候軟鍵盤彈出,浮在頁面的中間,和模態框一樣的效 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...