基於vue-cli配置
然後使用vux的webpack配置
npm i vue-cli -g // 如果還沒安裝
vue init airyland/vux2 projectPath
cd projectPath
npm i複製程式碼
配置目的
- 利用手淘flexible佈局,字型需要根據dpr看來改變大小
- 利用postcss-px2rem自動轉換頁面中的rem,但是字型不轉換,border利用1px方案解決也不轉換
- 自動新增瀏覽器相容字首
- 利用fastclick解決點選延遲問題
- 安裝postcss和scss還有less,不是我神經病,是引用外掛和個人習慣。
- 轉換vux的px為PX,因為weUI沒有使用rem,使用的是em和px,但是又不能把它的px給轉換成rem,而且vux還有一個1px.less,也不能把它的px轉換成大寫。但是瀏覽器不管px是大小寫,都能按照px解析。
解決問題1
npm i lib-flexible -S複製程式碼
然後在main.js使用
import `lib-flexible`複製程式碼
到這裡只是呼叫,剩下的使用方法下面解決。
解決問題2
首先執行以下命令
npm i postcss-loader postcss-px2rem -D複製程式碼
因為問題3也是postcss的外掛,所以一起解決。(如果你按照vux的webpack按照的,問題3可省略)
再安裝
npm i autoprefixer -D複製程式碼
關於autoprefixer的配置自己查,可以檢視如下文章
autoprefixer配置
然後在build的vue-loader.conf.js配置postcss
postcss: [
require(`autoprefixer`)({
browsers: [`iOS >= 7`, `Android >= 4.1`]
}),require(`postcss-px2rem`)({
rootValue: 75, // 這裡對應的是750的設計圖尺寸
selectorBlackList: [`html`],
mediaQuery: true,
propBlackList: [`border-radius`,`border`] // 如果要保持font-size不轉換,替換為 [`font-size`]
})
]複製程式碼
這裡我的配置是基於手淘佈局方案的,自己可以有自己的適配方案。
然後手淘方案有字型根據dpr動態改變,所以書寫CSS的時候要在後面加上註釋,如下:
.selector {
width: 150px;
height: 64px; /*px*/
font-size: 28px; /*px*/
border: 1px solid #ddd; /*no*/
}複製程式碼
.selector {
width: 2rem;
border: 1px solid #ddd;
}
[data-dpr="1"] .selector {
height: 32px;
font-size: 14px;
}
[data-dpr="2"] .selector {
height: 64px;
font-size: 28px;
}
[data-dpr="3"] .selector {
height: 96px;
font-size: 42px;
}複製程式碼
因為我配置了border不轉換,所以/*no*/
,可以不用加,加了也不頂用。但是字型一定要使用/*px*/
這個註釋。這樣才能根據dpr改變字型大小。chrome的移動端除錯工具不支援dpr改變,所以可以手動改變dpr檢視效果。
解決問題4
如果你是按照上面一步步來的,問題4已經解決了,如果不是按照來了,應該如下方法解決。
在main.js裡面引入
import FastClick from `fastclick`
FastClick.attach(document.body)複製程式碼
引入之前要安裝,我就不寫了,如果你忘了還找不到錯誤,真真的不適合這行。
解決問題5
這個問題不重複,難的是安裝scss,用下面的方法
npm i node-sass sass-loader scss-loader -D複製程式碼
解決問題6
這是最難的,也是最煩的,weUI竟然沒使用rem佈局,用的px加em。
然後通過查詢,發現有人解決方案很雞賊,最近發現的雞賊方案比較多,比如靜音播放沒有聲音的音訊這個粗暴解決方案有空也可以嘮嘮。
貼具體程式碼吧,如果你是按照vux的webpack安裝的,只需要開啟webpack.base.conf.js檔案,然後把最下面的module.exports
修改為以下內容
module.exports = vuxLoader.merge(webpackConfig, {
plugins: [`vux-ui`, `progress-bar`, `duplicate-style`,{
name: `after-less-parser`,
fn: function (source) {
if (this.resourcePath.replace(/\/g, `/`).indexOf(`/vux/src/components`) > -1) {
source = source.replace(/px/g, `PX`)
}
// 自定義的全域性樣式大部分不需要轉換
if (this.resourcePath.replace(/\/g, `/`).indexOf(`App.vue`) > -1) {
source = source.replace(/px/g, `PX`).replace(/-1PX/g, `-1px`)
}
return source
}
}, {
name: `style-parser`,
fn: function (source) {
if (this.resourcePath.replace(/\/g, `/`).indexOf(`/vux/src/components`) > -1) {
source = source.replace(/px/g, `PX`)
}
// 避免轉換1PX.less檔案路徑
if (source.indexOf(`1PX.less`) > -1) {
source = source.replace(/1PX.less/g, `1px.less`)
}
return source
}
}]
})複製程式碼
如果不是,那就這樣改,把module.exports
的內容改成以上內容。
const vuxLoader = require(`vux-loader`)
const webpackConfig = originalConfig // 原來的 module.exports 程式碼賦值給變數 webpackConfig
module.exports = vuxLoader.merge(webpackConfig, {
plugins: [`vux-ui`]
})複製程式碼
參考文件
- vux文件
- npm網站
- 大漠的手淘佈局方案flexible
- vux的github