樹洞(tree-hole)javascript
有些話不適合對任何人說,何不對着樹洞發泄一下。css
樹洞的想法源自於一個朋友對知己的見解,最初設計有一點像漂流瓶。不過,這樣的想法有一點傻。若是要嚴格匹配出一個知己須要大量的用戶,須要大數據支持,一個初級產品是不可能有如此的用戶羣。因而,我聯想到了電影《解憂雜貨鋪》,這樣就能夠避開大數據,同時對不法行爲也是一種攔截。固然,若是要作成一個成型的產品須要一個漫長的過程。html
這樣的產品在市面上是存在的,有成功的,也有失敗的。當我開始作個項目的時候也並無要把它作完整,畢竟想法不完整,同時還須要進行一些必要的知識補救。也就是說這只是一個Demo,並不完整的東西,僅僅是爲了練習一下技術。最初也想作成一個完整的項目,並且也彙集了一些朋友,不過作到後面有些不盡人意了。你們抱着不掙錢練技術的心態是建設不出好的項目來,並且我以爲主要工做在後端。另外,你們也彷佛都很忙,溝通成本也過高了,只好做罷。前端
因此,在這兒也就不作項目的結構介紹,等作成完整項目以後再作一個全面的輸出。畢竟只有一我的弄,還要去學後端,這是又一個漫長的過程。vue
近期主要研究的是vue,以前對比過vue-cli2和vue-cli3的差別,vue-cli3更簡潔。可是以前沒有研究明白,所以此次選用vue-cli3腳手架來進行研究。爲何研究vue?畢竟是中國人本身搞出來的,必須支持一下。html5
因爲沒有UI作圖,因而選用一個UI組件庫來解決這個難題。相對來講,我我的以爲vux更適合一些,其他的大可能是基於商城,組件也並沒那麼豐富。可是它的缺點就是在某些狀況下由於scoped的緣由修改內置樣式修改不了,因而改用vant。vant應該基於ant-design,設計漂亮,組件易用。java
移動端適配以前一直用的rem,rem的適配一般是經過JS動態改變根字體大小來完成,這就須要多一個JS的流程。固然,能夠經過css的方式來固定根字體大小,缺點也很明顯。淘寶前端emfe團隊給了一個相對成熟的適配方式flexible,配合px2rem-loader(px2rem)使用也是至關方便的。關於flexible適配,能夠閱讀一下《使用Flexible實現手淘H5頁面的終端適配》。react
我並沒使用它們作過實際開發,只是研究的時候發現flexible的適配方式我沒搞懂。當viewport縮放動態修改的時候,rem根值也同時動態更改,最後效果和預想的不太同樣。因而我只好寫死viewport,這樣才能恢復我要的效果。多是我配置的方式沒對,之後有空再研究。px2rem我比較喜歡它將特定的樣式根據dpr生成適配樣式,不過它貌似不能處理行內樣式,固然vue極少用行內樣式。webpack
另外,emfe在準備更新flexible 2.0版本的時候放棄了更新,改成推薦vw實現適配。rem適配並不完美,能夠閱讀下大漠老師的文章《再聊移動端頁面的適配》。vw是否是就完美呢,也不是,px換成vw會產生像素差。我以前講過,浮點數始終是不精確的,浮點數還原回px就會發現少了一點。這在移動端仍是能夠忍受的,關於使用詳細能夠查閱《如何在Vue項目中使用vw實現移動端適配》。因而,適配我選用vw,感覺一下效果。git
## 構建項目 ##
以前使用的是vue-cli 2,卸掉它,換成vue-cli 3。第一個差異是vue-cli的包名稱改成了@vue/cli。若是須要繼續使用vue-cli 2的工做方式,須要安裝@vue/cli-init包,項目構建命令和vue-cli 2相同。vue-cli其實就是一個模版拷貝的過程,大量的配置會致使模版難以維護,因而重構了vue-cli 3,作了一些初步的封裝,開箱即用。你不作任何配置就能夠進行開發工做,若是要折騰,能夠去修改配置項。
vue-cli 3更換完成,使用vue create命令生成項目,接下來根據須要勾選默認配置。具體的就不囉嗦了,官網文檔對配置項作了大體的說明,再不明白能夠搜索網上教程。我不太喜歡ESLint這個東西,由於在使用非ES寫法的時候就會提示,很煩躁,明明就是正確的JS語法。對比一下,vue-cli 2和vue-cli 3構建的項目,如圖:
從結構上看3.x更加簡潔,將2.x的build目錄、config目錄隱藏了起來,改成了使用vue.config.js來完成配置,默認是沒有這個文件的,須要本身在項目目錄下新建。相似這種配置方式在不少地方都有用到,好比環境變量、測試工具的配置等等。相對於2.x在配置文件內部去作手腳要高明得多,統一管理便於維護。3.x將不須要編譯的資源統一放到了public文件夾,包括index.html文件,去掉了2.x的static目錄。3.x去掉了router目錄,將路由直接放到src下(router.js)。
3.x在src下默認新增了store.js、registerServiceWorker.js兩個文件。store.js自沒必要說,vuex文件,管理vue狀態。registerServiceWorker.js說實話,我沒有在網上查到太多的資料,大多講解是針對react的這個文件。vue-cli 3的構建方式是學習了react的腳手架,原理上它們應該是相通的,它的目的是使項目變成一個PWA(Progressive Web Application)。也就是說,註冊一個服務來進行緩存,下一次即便沒有網絡,這個應用依然能夠訪問。
3.x還多了一個叫作插件的東西,經過vue add命令來添加,在src下會多一個plugins目錄。個人理解插件就像被二次封裝的模板庫,執行添加命令,這個庫按照生成器規定的方式被部署到對應的文件中,從而是vue-cli獲得擴展。於是vue add並不能取代npm install,具體的介紹能夠查看官方文檔。只不過,到底有些什麼已經可用的插件在官網上看不到,只能經過vue ui在圖形界面上查看安裝。我是不太喜歡這種傻瓜式的構建方式,特別中二。再加上插件開發者水平良莠不齊,不見得符合本身開發的意願。除了特殊的狀況,我更喜歡本身去安裝,編寫須要的文件。
再來看看,package.json文件,3.x簡潔了不少,2.x很多依賴包都不見了。(ps:圖中vue3的dependencies中vant是爲了展現插件這個目錄添加進去的,不是3.x新增內容。)編譯運行命令變成了一個名爲vue-cli-service的命令,它的底層仍是啓動一個webpack-dev-server,只不過附帶了一些其它功能。換句話說,它其實也是一個插件。若是要更深層次地瞭解它的工做原理,那麼只有去翻源碼。此外,2.x中好比browserslist這個字段,在3.x也是存在的,因爲我選擇配成的文件.browserslistrc。有不少配置文件均可以放入package.json中,我的認爲,放在單個文件更加直觀更利於維護。
關於vue-cli 3其餘相關的介紹,只有移步官網,裏面講解更全面。不得不吐槽,咱啥時候能完全和IE說拜拜,簡直是bull shit,這給前端開發增長了太多的難題!
## 引入UI組件庫 ##
前面介紹插件已經引入了vant,引入方式:執行vue ui啓動GUI,導入項目。切換到插件 -> 添加插件,選中並安裝插件vue-cli-plugin-vant。接下來在plugins目錄下就會出現vant.js文件,該文件已將vant引入,並且這個文件也在main.js上引入。vant.js引入有一個Locale變量,我開了代碼提示,這時就開始報錯了。這並非什麼大問題,但時常會讓人莫名其妙。
經過插件安裝是其中一種方式,另外一種一樣經過GUI圖形界面,切換到依賴 -> 安裝依賴,切換依賴包的環境,選中並安裝vant。
這不是程序員的操做方式,因而我選擇命令行安裝依賴。
# 經過 npm 安裝 npm i vant -S
有四種方式引入組件,第一種:老方法,這彷佛是不太美麗的作法。
<!-- 引入樣式 --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/vant@2.2/lib/index.css"> <!-- 引入組件 --> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/vant@2.2/lib/vant.min.js"></script> <script> var Vue = window.Vue; var vant = window.vant; // 註冊 Lazyload 組件 Vue.use(vant.Lazyload); // 調用函數式組件 vant.Toast('提示'); </script>
第二種:在main.js導入全部組件,固然也能夠像插件那樣提一個文件出來。
import Vue from 'vue'; import Vant from 'vant'; import 'vant/lib/index.css'; Vue.use(Vant);
第三種:手動按需引入組件。
import Button from 'vant/lib/button'; import 'vant/lib/button/style';
第四種:自動按需引入組件,這纔是工程化的作法。
# 安裝插件 npm i babel-plugin-import -D
// 在 babel.config.js 中配置 module.exports = { plugins: [ ['import', { libraryName: 'vant', libraryDirectory: 'es', style: true }, 'vant'] ] }; // 插件會自動將代碼轉化爲按需引入形式 import { Button } from 'vant';
因爲我全項目依靠vant,因此,我使用了第二種方式,但這是不科學的,關於這個後面會提到。
## vw適配 ##
前面介紹技術選型已經作了介紹,下面直接操做。
# 安裝依賴包 npm i postcss-aspect-ratio-mini postcss-px-to-viewport postcss-write-svg postcss-cssnext postcss-viewport-units cssnano cssnano-preset-advanced postcss-import postcss-url --S
// 配置postcss.config.js module.exports = { plugins: { "postcss-import": {}, "postcss-url": {}, "postcss-aspect-ratio-mini": {}, "postcss-write-svg": { uft8: false }, "postcss-cssnext": {}, "postcss-px-to-viewport": { viewportWidth: 375, unitPrecision: 3, viewportUnit: 'vw', selectorBlackList: ['.ignore', '.hairlines'], minPixelValue: 1, mediaQuery: false }, "postcss-viewport-units": { "silence": true }, "cssnano": { preset: 'advanced', autoprefixer: false, "postcss-zindex": false } } }
viewportWidth我配置的375,iphone6設計圖,按1倍圖處理,由於不少庫是使用的1倍圖的實際像素來進行適配的。若是不想轉換直接使用1倍圖像素,能夠在selectorBlackList加入'van'來屏蔽轉換,'van'是vant庫全部樣式的前綴。
最後解決vw適配的兼容問題,這個polyfill原理很簡單,至關於將vw單位還原爲該分辨率的實際像素。
<script src="<%= BASE_URL %>js/viewport-units-buggyfill.min.js"></script> <script src="<%= BASE_URL %>js/viewport-units-buggyfill.hacks.min.js"></script> <script>window.onload=function(){window.viewportUnitsBuggyfill.init({hacks:window.viewportUnitsBuggyfillHacks})}</script>
這兒須要注意的是不能使用字體圖標,字體圖標使用content來完成的,這個polyfill也使用了content。我不解的是postcss-px-to-viewport也使用了,卻沒有影響。其實,並不建議使用字體圖標,字體圖標一般包含很大的資源。
這只是技術選型上的配置,配置還並無完成,好比接口請求封裝、打包處理等等。
# 跑下代碼 npm run serve
## 代碼倉庫 ##
https://gitee.com/IanLew/tree-hole.git
## @樹洞系列 ##
vue項目實踐@樹洞(一)