國內有哪些公司在用Vue.js,有什麼心得?
不管是PC端,還是WAP端,還是Native端。如果能說說實踐方案就更好~~
更新:1、由餓了么 UED (知乎專欄)設計的桌面端組件庫已經開源,文檔:Element,倉庫: GitHub - ElemeFE/element: Desktop UI elements for Vue.js 2.0。這套組件庫是基於 Vue 2 的,我們也希望大家開始使用 Vue 2,一起來豐富它的生態圈。2、下面提到的移動端組件都被整合進了 Mint UI,倉庫在 GitHub - ElemeFE/mint-ui: Mobile UI elements for vue.js======= 原答案 =======
餓了么。
從去年開始,有越來越多的項目在使用 vue。這些項目裡面,有桌面端(比如 餓了么安全應急響應中心)也有移動端(比如 餓了么招聘),有面向用戶的,也有後台系統。實踐方案的話,vue + webpack + vue-router + vue-resource。就我個人而言,vue 的開發體驗還是比較愉悅的。首先,文檔非常友好,所以上手會比較快。其次,配合 webpack 和 vue-loader,每個頁面都是一個 .vue 文件,寫起來很方便。另外,適合做組件化開發(每個組件也是一個 .vue 文件,可以全局或者在需要的地方引入),如果遇到比較複雜的、父子組件間需要頻繁通信的場景,可以用 vuex 搞定。在寫業務的過程中,團隊的同事們抽象了很多公共組件出來,開源在 github (餓了么前端 · GitHub)上,大家有興趣的話可以去試一試。這裡我把這些組件分類介紹一下:- 移動端:
vue-swipe:https://github.com/ElemeFE/vue-swipe
幻燈片組件vue-infinite-scroll:https://github.com/ElemeFE/vue-infinite-scroll
無限滾動,可以實現向下的無限載入。是一個 directivevue-loadmore:https://github.com/ElemeFE/vue-loadmore
下拉載入和上拉載入。是一個 componentvue-toast-mobile:https://github.com/ElemeFE/vue-toast-mobile
toast 組件vue-indicator:https://github.com/ElemeFE/vue-indicator
indicator 組件,提示用戶正在載入,自帶 modalvue-msgbox:https://github.com/ElemeFE/vue-msgbox彈出框組件- 桌面端
目前正在編寫一套完整的桌面端組件庫,利用它可以快速搭建後台頁面。將於近期開源。
下面要隆重介紹的是前兩天剛發布的一個工具。對於使用 webpack 打包的項目來說,不管是用 vue,angular 還是 react,開啟一個新項目的時候都有許多腳手架的工作要做,比如寫 webpack 的配置文件,安裝依賴等等。這個過程有時會很繁瑣,而且對新人不友好。為了解決這個問題,團隊的小夥伴寫了一個構件工具——cooking - 更易上手的前端構建工具。上面列出的工作,cooking 都可以一鍵完成,能夠極大地解放生產力。而且,它不僅支持 vue,angular 和 react 也是支持的。掘金 全網都是用 Vue.js + Webpack 實現的,算是一個純前端應用,我們的前端開發也謝了一個小的使用總結:稀土掘金:Vue 組件化開發實踐
心得:
- 明白 Vue.js 的 component system
- 理解 component 之間心得數據交互,inherit / pass variable / event 等等
- 我覺得 Vue.js 如果使用得當也能做到 UI = Vue(state),所以我用了很多 state 變數,以操作頁面樣式改動,效果很好
- 理解 v-directive 自定義,可以有很多很好用的功能
- v-transition 在 dagger 之後又很好用的效果
- vue router 加入的比較深,如果之前用了 director 之類的前端路由,改的時候成本比較大
- 了解 webpack 使用規則,理解有、無 scss 時如何寫局部樣式
- node-sass 真的很難裝(和 Vue.js 沒關係只是想吐槽)
有其它問題也可以來找我,如果你想要用 Vue.js 開發出很厲害的應用,也可以聯繫我加入我們團隊:稀土 - 加入我們
異鄉好居(異鄉好居 Uhouzz)手機訪問哦。webApp
簡單的談談 歷程心得- 當時前端組在崗3個人,要做很多東西,也受制於後端(php) 沒辦法啊,要解放生產力就得用工具。當時首選 angular和react 我還特意買了國外的教程 egghead.io - Learn professional JavaScript tools with Tutorial Videos Training @eggheadio 的教程。但是angular太重了,關鍵兩者學習曲線太陡峭了,三個人風險太大。最終投身Vue了。
- 第一次用的時候,微信公眾賬號開發。但是把Vue當成一個類jquery庫來用(不知道這麼說合適不合適)。這個階段Vue承擔的責任就是UI呈現,通過介面處理簡單的邏輯,一個頁面一個Vue實例。複雜的時候有多個。這個階段前端的路由還是PHP模板/路由控制。這個階段用成這個德性,顧及大家會罵我們,這不大材小用了么?而且組件和過濾器都沒用,那時候寫個過渡動畫都好開心啊。而且後來二期需求的時候 開發了機票那麼複雜的業務,處理列表排序的時候,那酸爽啊。
- 小夥伴們嘗試了甜頭,突然接到上級指示要做webApp。基於第一次的經驗,我們參考了青城主題 zerqu/qingcheng · GitHub 開始用Vue + webpack 主程技術預研兩天,搭好架子然後開搞。3個人一周把現在的網站搞完了。而且兩個女生Vue還是初學其中一個女生js基礎不是很好。足以說明Vue起碼簡單,文檔友好完善。後來隊員基於當前技術棧做了個開源項目:https://cnodejs.org/topic/565c4473d0bc14ae279399fe (代碼質量有點渣,但是基本實現了)
- 接下來的事情:升級到1.0以上,在社區推廣,幫助別人解決一些問題,開始讀源碼(一個commit一個commit那樣讀——笨方法),在團隊里做深層的技術分享,以及針對單頁面應用的SEO問題。 (由於家人骨折剛手術完 需要照顧家人 在推進上有些拖沓,致歉。)
- 從DOM操作的時代沒有壓力的過渡到了MVVM時代
- 簡單上手在團隊很快就安利開了(Vue設計的不錯,文檔完善友好,官方教程看完就能開擼)
- 省心 所有的操作關注點都在data上面。開發的時候,寫好data 剩下的事情就是 通過非同步請求來交互data,UI層綁定事件改變data,在組件間傳遞data。
-------------------------------------
留好分割線。沒想到分割線是留給這些感慨的:不更新回答了,已經離開這家公司了。現在回答這個問題,我和離開那時候一樣凄涼的感覺。這個項目沒有什麼參考價值了,前兩天前同事發個活動點進去,隨手發現10個以上的bug 好居基本廢棄這個項目了。好的UI雖然能給前端加分,但後面亂七八糟了,不知道是怎麼維護的。 (哈哈 說的好像是甩鍋的既視感)
vue 已經遍地開花了,真心開心。我們寫那時候還沒有什麼團隊用,遇到問題要卡一天兩天 。
現在依然寫vue,但是寫不出當時那種自豪感 和 激情。遠程開發中,很開心。不斷學習雜七雜八的東西。
vue2.0 升級中 歡迎交流噢……我們(凡普信貸)的移動端頁面正在使用 vue2.0 重構,在基於 vue-cli 腳手架生成項目模板基礎上做了些改動,加入了 vue-router ,vuex 等配套設施,本地 dev server 中加入了介面 mock 功能,還增加一個 build server 來預覽 build 結果頁面,前後端通過 spa 的方式實現分離,並相應做了分離後的聯調,部署方案。在這裡俺也對整個過程簡單做個介紹吧。
目錄結構
├── index.html 入口頁面
├── build 構建腳本目錄
│ ├── build-server.js 運行本地構建伺服器,可以訪問構建後的頁面
│ ├── build.js 生產環境構建腳本
│ ├── dev-client.js 開發伺服器熱重載腳本,主要用來實現開發階段的頁面自動刷新
│ ├── dev-server.js 運行本地開發伺服器
│ ├── utils.js 構建相關工具方法
│ ├── webpack.base.conf.js wabpack基礎配置
│ ├── webpack.dev.conf.js wabpack開發環境配置
│ └── webpack.prod.conf.js wabpack生產環境配置
├── config 項目配置
│ ├── dev.env.js 開發環境變數
│ ├── index.js 項目配置文件
│ ├── prod.env.js 生產環境變數
│ └── test.env.js 測試環境變數
├── mock mock數據目錄
│ └── hello.js
├── package.json npm包配置文件,裡面定義了項目的npm腳本,依賴包等信息
├── src 項目源碼目錄
│ ├── main.js 入口js文件
│ ├── app.vue 根組件
│ ├── components 公共組件目錄
│ │ └── title.vue
│ ├── assets 資源目錄,這裡的資源會被wabpack構建
│ │ └── images
│ │ └── logo.png
│ ├── routes 前端路由
│ │ └── index.js
│ ├── store 應用級數據(state)
│ │ └── index.js
│ └── views 頁面目錄
│ ├── hello.vue
│ └── notfound.vue
├── static 純靜態資源,不會被wabpack構建。
└── test 測試文件目錄(unite2e)
└── unit 單元測試
├── index.js 入口腳本
├── karma.conf.js karma配置文件
└── specs 單測case目錄
└── Hello.spec.js
快速開始
git clone https://github.com/hanan198501/vue-spa-template.git
cd vue-spa-template
cnpm install
npm run dev
命令列表
#開啟本地開發伺服器,監控項目文件的變化,實時構建並自動刷新瀏覽器,瀏覽器訪問 http://localhost:8081
npm run dev
#使用生產環境配置構建項目,構建好的文件會輸出到 "dist" 目錄,
npm run build
#運行構建伺服器,可以查看構建的頁面
npm run build-server
#運行單元測試
npm run unit
前後端分離
項目基於 spa 方式實現前後端分離,後端將所有 url 都返回到同一個 jsp 頁面(由前端提供),此 jsp 頁面也是前端的入口頁面。然後路由由前端控制(基於vue-router),根據不同的 url 載入相應數據和組件進行渲染。
介面 mock
前後端分離後,開發前需要和後端同學定義好介面信息(請求地址,參數,返回信息等),前端通過 mock 的方式,即可開始編碼,無需等待後端介面 ready。項目的本地開發伺服器是基於 express 搭建的,通過 express 的中間件機制,我們可以很方便的添加介面 mock 功能:
在 build/dev-server.js 中新增介面 mock 處理:
// mock api requests
var mockDir = path.resolve(__dirname, "../mock");
fs.readdirSync(mockDir).forEach(function (file) {
var mock = require(path.resolve(mockDir, file));
app.use(mock.api, mock.response);
});
其中,mock 目錄下可能有個文件內容如下,描述了一個介面的數據信息:
module.exports = {
// 介面地址
api: "/api/hello",
// 返回數據
response: function (req, res) {
res.send(`
&
hello vue!&
`);}
}
組件化
整個應用通過 vue 組件的方式搭建起來,通過 vue-router 控制相應組件的展現,組件樹結構如下:
app.vue 根組件(整個應用只有一個)
├──view1.vue 頁面級組件,放在 views 目錄裡面,有子組件時,可以建立子目錄
│ ├──component1.vue 功能組件,公用的放在 components 目錄,否則放在 views 子目錄
│ ├──component2.vue
│ └──component3.vue
├──view2.vue
│ ├──component1.vue
│ └──component4.vue
└──view3.vue
├──component5.vue
……
單元測試
可以為每個組件編寫單元測試,放在 test/unit/specs 目錄下面, 單元測試用例的目錄結構建議和測試的文件保持一致(相對於src),每個測試用例文件名以 .spec.js 結尾。
執行 npm run unit 時會遍歷所有的 spec.js 文件,產出測試報告在 test/unit/coverage 目錄。
前後端聯調
前後端分離後,由於服務端和前端的開發環境處於2台不同的機器上,整個聯調過程,入口頁面需要引用前端機器的靜態資源,又要調用後端機器的非同步介面。根據入口頁面的位置,我們可以使用不同的聯調方案:
1. 入口頁面在前端機器:
通過在本地 dev-server 中使用 https://github.com/chimurai/http-proxy-middleware 中間件把介面請求代理到後端機器,vue-cli 生成的 dev-server 中已經自帶了這個功能:
// proxy api requests
Object.keys(proxyTable).forEach(function (context) {
var options = proxyTable[context]
if (typeof options === "string") {
options = { target: options }
}
app.use(proxyMiddleware(context, options))
});
最好通過啟動 dev-server 時傳入一個參數來控制是否打開代理功能,這樣可以避免開發階段覆蓋掉我們的 mock 配置。
2. 入口頁面在後端機器:
後端工程裡面的入口 jsp 中引用的 js 文件地址需要指向前端環境中的地址,聯調時才能顯示最新的修改。主要有2種實現方式:
1) jsp 文件引用一個固定域名(如 debughost)的 js 文件, 後端機器上通過修改此域名的ip指向前端機器,達到引入前端環境 js 的目的。
2) jsp 文件通過獲取一個 url 參數(如 debughost)的值,這個值為前端機器的 ip 地址,再動態的插入一個 script 標籤引入這個 ip 的前端 js 文件。
舉個例子,假設前端機器的 ip 為 172.16.36.90,需要載入前端的js文件地址為:http://172.16.36.90:8081/main.js, 那麼後端同學的機器中需要在 host 文件加一條記錄:
172.16.36.90 debughost
而入口 jsp 頁面中則通過以下代碼開載入前端js:
var debughost = "debughost";
location.search.substr(1).split("").forEach(function (item) {
var arr = item.split("=");
var key = arr[0];
var value = arr[1];
if (key === "debughost") {
debughost = value;
}
});
var script = document.createElement("script");
script.type = "text/javascript";
script.src = "http://" + debughost + ":8081/main.js?" + (new Date()).getTime();
document.head.appendChild(script);
這樣,jsp 頁面默認會載入 http://debughost:8081/main.js這個文件。
此外,如果不想用 debughost 這個域名的 js 文件,訪問 jsp 時候還可以通過 url 帶入 debughost 參數來指定前端 ip 。
部署方案
分離後前後端代碼會存放在2個單獨的 git 倉庫中,構建過程也是分開的。後端構建時,需要依賴前端的構建結果。具體流程如下:
1. 拉取前端項目代碼
2. 構建前端(構建結果放在dist目錄)
3. 拉取後端代碼
4. 將前端的構建結果(dist目錄里的文件)複製到後端工程中
5. 構建後端
此過程可以藉助 jenkins 配置,或者,讓運維同學配合修改部署腳本。
最終的項目模板會是這樣:annnhan/vue-spa-template
==================
vue交流群:568815621
蘇寧易購觸屏版的購物車結算頁面已經用 Vue 重構了下,在眾多框架中還是選擇了 Vue,主要還是因為 API 比較友好,上線了之後在體驗上也流暢了很多。
很多低級錯誤框架都幫著處理好了,關注點已經完全移到了業務層,寫起代碼來簡直如尿崩。
想想開始重構的時候是版本是 0.12,現在已經 1.0+ 了,發展的好快,我們是背著上級偷偷重構的,其實上線的時候壓力大的很呢。———————————更新於2017年10月30日——————————————
寫了篇vue項目如何debug的文章:VueJS項目調試(debug) - Yakima Teng | 滕運鋒
還有篇講vue+vuex項目本地數據持久化的:Vuex Data Persistence數據持久化 - Yakima Teng | 滕運鋒
———————————舊文(發佈於2017年6月28日)——————————————
我們項目部也在用,因為就我一個前端,所以框架我自己定的。
公司不大,說出來你們也沒聽過-_-。
從最初用客戶端vue.js,到後面用vue-cli使用的Vue1 + webpack模版,再到後面使用Vue2+webpack,用這個框架做SPA應用也有一年半的時間了。做一些總結吧,想到哪裡寫哪裡(針對Vue2 + webpack)。
一、頁面按需載入
這主要是為了加快首屏載入速度。這樣做的好處是第一屏所需載入的文件大小變小了,代價是如果用戶會走完整個SPA的話,實際的總代碼下載量是變多了的。按需載入頁面主要就是修改/src/router/index.js文件,示例代碼如下:
import Vue from "vue"
import Router from "vue-router"
Vue.use(Router)
const Home = resolve =&> require(["@/views/Home.vue"], resolve)
const MyRoot = resolve =&> require(["@/views/my/Root.vue"], resolve)
const MyIndex = resolve =&> require(["@/views/my/Index.vue"], resolve)
const MyLogs = resolve =&> require(["@/views/my/Logs.vue"], resolve)
const MyBrokerages = resolve =&> require(["@/views/my/Brokerages.vue"], resolve)
export default new Router({
routes: [
{
path: "/home",
name: "Home",
component: Home,
meta: { needLogin: false }
},
{
path: "/my",
name: "MyRoot",
component: MyRoot,
meta: { needLogin: true },
children: [
{
path: "",
redirect: "index"
},
{
path: "index",
name: "MyIndex",
component: MyIndex,
meta: { needLogin: true }
},
{
path: "logs",
name: "MyLogs",
component: MyLogs,
meta: { needLogin: true }
},
{
path: "brokerages",
name: "MyBrokerages",
component: MyBrokerages,
meta: { needLogin: true }
}
]
},
// must be placed at the bottom
{ path: "*", redirect: "/home" }
]
})
因為覺得上面那樣引入組件的代碼重複的地方很多,本著DRY(Don"t Repeat Yourself,中文意思是「懶」 -_-)的原則,試過用下面這種方式引入組件:
function generateComponentFunction (path) {
return resolve =&> require([`@/views${path}`], resolve)
}
const Home = generateComponentFunction("/Home.vue")
const MyRoot = generateComponentFunction("/my/Root.vue")
const MyIndex = generateComponentFunction("/my/Index.vue")
const MyLogs = generateComponentFunction("/my/Logs.vue")
const MyBrokerages = generateComponentFunction("/my/Brokerages.vue")
是不是感覺這樣寫的話,引入組件的時候能少敲很多代碼呢?然而實踐發現這樣子npm run build後各個頁面被打包成了一個js,貌似是把所有這些都當成一個頁面了。
二、通過script標籤引入第三方js庫
這種方式或許並非比較好的實踐,個人保留意見,只是告知一下其實還有這種操作方法。這樣能減少本地打包後的vendor.js文件的大小,同時也利用了CDN,但是也增加了very first time的首屏載入時間,後面這些第三方js文件被緩存了,首屏載入時間是會快一點的。假設說,現在你的package.json文件中定義的依賴包有:
...
"dependencies": {
"fastclick": "^1.0.6",
"mockjs": "^1.0.1-beta3",
"vue": "^2.2.1",
"vue-router": "^2.2.0",
"vuex": "^2.2.1"
},
...
然後,在這些依賴包(第三方js文件),其實都是可以通過script標籤引入的。打開/index.html文件,示例如下(mockjs未處理,一樣一樣的):
&
&&
&
&
&
&
&
&
&
&
當然,事情沒有這麼簡單,還需要修改/build/webpack.base.conf.js文件的externals部分(不記得腳手架生成的初始文件里有沒有externals部分,如果沒有的話自己加-_-):
entry: {
app: "./src/main.js"
},
output: {
path: config.build.assetsRoot,
filename: "[name].js",
publicPath: process.env.NODE_ENV === "production"
? config.build.assetsPublicPath
: config.dev.assetsPublicPath
},
externals: {
"jquery": "window.$",
"vue": "window.Vue",
"vue-router": "window.VueRouter",
"vuex": "window.Vuex",
"fastclick": "window.FastClick"
},
resolve: {
extensions: [".js", ".vue", ".json"],
alias: {
"vue$": "vue/dist/vue.esm.js",
"@": resolve("src"),
}
},
然後vue、vue-router、vuex、jquery、fastclick這些還是平常怎麼用就怎麼用,比如:
// /src/main.js
import FastClick from "fastclick"
FastClick.attach(window.document.body)
// /src/router/index.js
import Vue from "vue"
import Router from "vue-router"
Vue.use(Router)
但是vuex的使用是個例外,需要注釋掉Vue.use(Vuex)這句代碼,因為通過使用script標籤載入window.Vuex時,Vuex會被自動安裝,無需手動安裝:
// import Vue from "vue"
import Vuex from "vuex"
// 用於使用script標籤載入window.Vuex,Vuex會被自動安裝,無需手動安裝
// Vue.use(Vuex)
三、定義一個合併對象屬性的merge方法,方便操作vuex store中的數據
/src/scripts/store.js:
/**
* Created by Yakima Teng on 2017/3/8.
*/
// import Vue from "vue"
import Vuex from "vuex"
import { merge } from "./utils"
import { config } from "./mode"
import mock from "../mock"
// 用於使用script標籤載入window.Vuex,Vuex會被自動安裝,無需手動安裝
// Vue.use(Vuex)
const state = {
config,
mock,
states: {
isLoading: true,
isAlerting: false,
alertingText: "",
alertingOkCallback () {},
alertingCancelCallback () {},
isRoaring: false,
roaringText: "",
roaringCallback () {},
isWaiting: false,
presenting: ""
},
user: {
openid: "",
phone: "",
id: "",
logined: false,
// 登錄頁的驗證碼
verificationCode: "",
// 登錄頁,用戶是否勾選了「同意車保贏用戶服務協議」
agree: true,
// 獲取驗證碼的按鈕上的文本
smsBtnText: "獲取驗證碼",
agentName: "",
agentType: "",
agentId: ""
},
...
}
const getters = {
config: state =&> state.config,
mock: state =&> state.mock,
states: state =&> state.states,
user: state =&> state.user,
...
}
const mutations = {
setStates (state, options) { merge(state.states, options) },
setUser (state, options) { merge(state.user, options) },
...
}
const actions = {
load: ({ commit }, bool) =&> commit("setStates", {
isLoading: bool
}),
roar: ({ commit }, { text, callback }) =&> commit("setStates", {
isRoaring: true,
roaringText: text,
roaringCallback: callback || null
}),
alert: ({ commit }, { text, callback }) =&> commit("setStates", {
isAlerting: true,
alertingText: text,
alertingOkCallback () {
callback callback()
commit("setStates", { isAlerting: false })
},
alertingCancelCallback: null
}),
confirm: ({ commit }, { text, okCallback, cancelCallback }) =&> commit("setStates", {
isAlerting: true,
alertingText: text,
alertingOkCallback () {
okCallback okCallback()
commit("setStates", { isAlerting: false })
},
alertingCancelCallback () {
cancelCallback cancelCallback()
commit("setStates", { isAlerting: false })
}
}),
wait: ({ commit }, bool) =&> commit("setStates", {
isWaiting: bool
}),
present: ({ commit }, val) =&> commit("setStates", {
presenting: val
})
}
export default new Vuex.Store({
state,
getters,
actions,
mutations
})
merge方法的定義:
// typeOf, return "array", "object", "function", "null", "undefined", "string", "number"
const typeOf = input =&> {
return ({}).toString.call(input).slice(8, -1).toLowerCase()
}
// 合併對象屬性(在原始對象上進行修改)
const merge = (obj, options) =&> {
if (obj options) {
for (let p in options) {
if (typeOf(obj[p]) === "object" typeOf(options[p]) === "object") {
merge(obj[p], options[p])
} else {
obj[p] = options[p]
}
}
}
return obj
}
注意這個merge方法是假設如果你賦的值有數組的話那些數組都是臨時創建的數組對象,而不是從其他地方引用來的數組對象,比如這樣:
merge({
a: 1,
b: []
}, {
b: arrA.map(item =&> {
return {
id: item.id,
value: item.content
}
})
})
如果你賦的數組值是引用的其他地方的數組對象,建議修改下merge方法,對每個數組元素(包括數組裡的數組元素)都用a = [].concat(arrB)或者a = arrB.slice(0)這種方式賦一個全新的數組對象。但是就我自己的項目而言,這種情況幾乎沒有,多加這樣的代碼除了影響性能外沒啥好處。
四、延遲載入不需要立即載入的js文件
主要是延遲載入一些日期插件之類的js文件,這樣首屏載入速度能快一點。示例代碼如下(寫在/index.html文件中):
&
五、移除打包後圖片文件文件名中的hash
如果你跟我一樣,項目中頻繁修改的是css和js代碼,圖片很少有改動,要改也是增刪,很少有更新圖片的操作的話,建議移除打包後圖片文件名中的hash,這樣可以將圖片文件更好的緩存起來。要修改的文件為/build/webpack.base.conf.js:
...
{
test: /.(png|jpe?g|gif|svg)(?.*)?$/,
loader: "url-loader",
query: {
limit: 10000,
// name: utils.assetsPath("img/[name].[hash:7].[ext]")
name: utils.assetsPath("img/[name].[ext]")
}
},
...
或者,也可以將[hash:7]改成[chunkhash],根據webpack官方文檔https://webpack.js.org/guides/caching/,這個是根據單個文件的內容產生的hash,只要這個文件內容不變,chunkhash的值也不會變。而[hash]是根據當前編譯環境來生成的,只要當前編譯的文件中有一個文件發生了變化,這個[hash]產生的hash值就會變化。
六、圖片壓縮
可以在https://tinypng.com/這個網站上事先對你的圖片文件進行壓縮,效果感人。
七、確保CSS值不被改寫
有段時間發現本地npm run dev的時候樣式好好的,npm run build後在手機里樣式就變了,後面發現是一個插件搞的鬼,修改/build/webpack.prod.conf.js文件:
...
new OptimizeCSSPlugin({
cssProcessorOptions: {
safe: true
}
}),
...
重點就是這個cssProcessorOptions: { safe: true }的配置,有些版本的vue2+webpack模板里沒有這行配置,會導致比如你的z-index值被優化(坑)到你沒脾氣。所以如果你現在的文件里有這樣配置就最好了,沒有的話需要手動添加一下。
八、使用minxin避免過大的重複代碼,提高可維護性
Vue提供了minxin這種在組件內插入組件屬性的方法,個人建議這貨能少用就少用,但是有個場景則非常建議使用minxin:當某段代碼重複出現在多個組件中,並且這個重複的代碼塊很大的時候,將其作為一個minxin常常能給後期的維護帶來很大的方便。
比如說,有個post請求,傳參欄位有二三十個,後端回參也有幾十個欄位,整個一個請求下來要寫的代碼量都好幾十行了,這個就不叫適合作為一個minxin來用了。minxin怎麼用就不說了,vue官網上都有的。
原文地址:VueJS項目實踐總結 - Yakima Teng | 滕運鋒
此回答寫於Vue 2.0發布前,部分內容可能已經過時。
公司部分項目開始使用vue。之前做的一個較大的項目用的是react,對vue的認識沒有react那麼深入。 相比之下感覺vue確實是比較靈活,但是vue的問題在於,有很多的概念是不必要的,而且有一些需求實現起來比較複雜。
舉個例子,用react寫一個表單組件,獲取表單數據的方法就那麼幾種,通過props傳回調函數,或者父組件通過ref獲取子組件實例上的數據,再來就是redux那一套了。而vue除了這些,還能通過v-model,通過sync props,通過directive等等。我個人是覺得選擇多了不太好,起碼讀別人的代碼的時候會變得更吃力。
react的組件抽象比vue更輕鬆。舉個例子,寫一個table組件,table的每一個單元格都是通過props傳進來的。react可以很輕鬆的做到通過props往子組件傳一個element實例,然後子組件在jsx里直接大括弧一用,{this.props.row1.col1}就好了。而vue里想實現這個程度的抽象真是極其複雜。因為template里不能插入vue實例,只能通過mount的方式往裡插,在想想這個props傳進來的element要跟table這個組件做一些通信的話,真是繁瑣的一筆。
再有就是vue模板里只能寫es5,還不能用console.log。各種束手束腳的。雖然看起來vue這麼多概念可以很靈活,但實際用起來並不是。反而react的jsx功能強大概念簡單,相比之下還是更喜歡用react.神馬搜索明星項目使用了vue.js
明星垂搜:http://star.sm.cn/
前端負責人小康上次組內分享過《vue in action》 http://yunpan.taobao.com/s/BKBDy49VEj長亭科技內部所有系統和對客戶產品基本都使用 Vue.js 作為前端解決方案,由於是 2B 的所以可能沒有方便展示的頁面:(我們還贊助了 Vue.js 喲!
在公司里用了大半年了,遍布部門搞個系統,體驗不用說,MVVM 里最好的。用 Node.js 來做前後端分離,開發效率實在太快了。其實 vue 有個好基友 Vuex 類Flux數據流控制框架,和 Vue 配合起來才是移動端 WebApp 大殺器。開發體驗非常接近 React Native + Redux,思維上可以做到非常好的切換。今年前端將會大大火~
http://zuodesign.cn 公司的網站主要供展示,我一個人做的。上手很簡單,我一邊看文檔一邊開發的,一個月不到吧!vuejs真心不錯的
美團上門業務的運營後台用的vue。 輕量,操作data自動渲染,數據傳遞方便,配合director.js做後台單頁應用挺好的。
——————————————————
剛才又去瞄了一眼,發展好快,我們當時用的是 0.11.5 ,現在都1.0了,而且也有路由了。自己回答下。。
話說目前天貓團隊在用vue啊…也就是vue-native,也就是weex。話說馬上要跟vue2.0的api同步了。侵刪…我們公司在使用,使用Vue寫過很多組件。沉澱出了一套機制,大概就是這麼幾條,使用不可變數據傳遞,所有的數據都存放在最外層組件,數據的創建存放在組件本身,數據的操作存放在組件本身,數據的傳遞通過value屬性,數據的變化通過input事件。 這就是我使用的心得吧,, 順便把我的文章原鏈接也發下 優美的使用Vue工作
荔枝FM小範圍APP內置專題頁用了Vue體驗就一個字:爽!
當然還有我陌咯。
從Vue還沒發布1.0版本開始就在使用。
使用Vue之前真是嘗試了N多種框架之後,最後才選中了Vue
一個是業務多針對移動端
而且使用Vue之前完全沒有任何預編譯經驗
一個是組內基本上都是用的JQuery/Zepto
首先在一些小頁面上試水,大家感覺都不錯,但是就是沒發揮到Vue的長處。
後來就有和 @躬馮 大神一起做的一個相對大的項目——圈子(其實也不大)
先自己寫了一套簡易編譯打包工具
遇到了一堆坑,還有各種詭異的問題(後面官方都修復了)
在圈子2的時候重構了一般,後面改用gulp+webpack,也用上了Vuex、Router啥的
現在我們已經大部分項目都開始使用了Vue
最近的一個項目已經在開始使用Vue2.0了。
還用了餓了么開源的Element,還是挺好用的,就是默認主題被吐槽不好看。哈哈哈
現在wecash團隊也在用vue.js。我司的PM團隊感覺非常喜歡把流程改來改去,把模塊不斷重新挪動到不同的頁面,所以,Vue.js這樣的組件化開發真的非常適合我們的應用場景(我也是一直堅持沒有最優的技術,只有最合適的),所以在真的覺得很有需要的情況下,在團隊里已經有倆個項目在用vue.js了。項目k:vue + vuex + vue-resource + vue-router + webpack + es6 + less項目w: vue + vue-resource + webpack + es6 + less。寫的最爽的k項目因為和合作方合同沒談攏被停掉了。項目w還在運行著,目前幾百萬用戶。但是不是單頁應用,,繼續改ing...
用vue搭配yeoman和fis做了一套後台腳手架,感覺不錯,主要是vue比angular輕量多了,稍微培訓一下就可以上手了。
我是從jq時代過來的前端,在剛接觸reacet和vue這類MVVM框架的時候,一個字,一臉蒙逼,在看API的時候總是以以前的老思想再衡量,看的那是相當費勁,不過最後還是艱難的看完了,如果能一開始學的時候,把之前的開發思路忘掉,再來從0開始學的話,應該會特別快,沒有思路轉換這一步,有種欲練此功 必先自宮的感覺
我們公司目前就我一個前端,因為剛好有一個移動端的網站要做(http://m.jianguanoa.com),便用了vue,因為喜歡他一切都是組建的思想,覺得拓展能力該不錯,還沒有嘗試過大型的web開發,總體來說還不錯
推薦閱讀:
※如何循序漸進的學習Vue.js,有沒有靠譜的學習資料推薦?
※提問學了Angular還有學習react或者vue了么?
※vue如何開發一個複雜場景的動態數據表格?