使用 glup 打包組件庫並實現按需載入 當我們使用 Vite 庫模式打包的時候,vite 會將樣式文件全部打包到同一個文件中,這樣的話我們每次都要全量引入所有樣式文件做不到按需引入的效果。所以打包的時候我們可以不讓 vite 打包樣式文件,樣式文件將使用 gulp 進行打包。那麼本篇文章將介紹如何 ...
一、前置知識
- vw:與視口的寬度有關,1vw 就是視口寬度的 1%
- vh:與視口的高度有關,1vh 就是視口高度的 1%
- vmin:與當下視口的寬度和高度的最小值有關,取值為
vw
和vh
中較小的那個- vmax:與當下視口的寬度和高度的最大值有關,取值為
vw
和vh
中較大的那個- vmin 可以照顧移動端(手機端)橫屏和豎屏的顯示效果,保證移動開發中屏幕
旋轉
之後的尺寸不變- vw 橫屏:顯示效果不好
- vmin 橫屏:顯示效果好,項目需要橫屏的時候,可以採用vmin
二、安裝依賴
yarn add postcss-px-to-viewport -D
複製代碼
二、轉換配置
- 根目錄下 新建 postcss.config.js
// postcss.config.js
module.exports = {
plugins: {
autoprefixer: {}, // 用來給不同的瀏覽器自動添加相應首碼,如-webkit-,-moz-等等
"postcss-px-to-viewport": {
unitToConvert: "px", // 要轉化的單位
viewportWidth: 750, // UI設計稿的寬度
unitPrecision: 6, // 轉換後的精度,即小數點位數
propList: ["*"], // 指定轉換的css屬性的單位,*代表全部css屬性的單位都進行轉換
viewportUnit: "vw", // 指定需要轉換成的視窗單位,預設vw
fontViewportUnit: "vw", // 指定字體需要轉換成的視窗單位,預設vw
selectorBlackList: ["wrap"], // 指定不轉換為視窗單位的類名,
minPixelValue: 1, // 預設值1,小於或等於1px則不進行轉換
mediaQuery: false, // 是否在媒體查詢的css代碼中也進行轉換,預設false
replace: true, // 是否轉換後直接更換屬性值
exclude: [/node_modules/], // 設置忽略文件,用正則做目錄名匹配
landscape: false, // 是否處理橫屏情況
},
},
};
複製代碼
三、頁面效果測試
<template>
<div>
<div>繼承body的字體</div>
<div class="test">這是測試用的文字</div>
</div>
</template>
<script></script>
<style lang="less">
html,
body {
font-size: 12px;
}
.test {
font-size: 20px;
}
</style>
複製代碼
四、相容vant配置
4.1 配置
- vant 設計稿屏幕寬度為375
- 移除 exclude 中的 node_modules
- 新增屏幕比適配
// postcss.config.js
const path = require("path");
module.exports = ({ file }) => {
const width = file.includes(path.join("node_modules", "vant")) ? 375 : 750;
return {
plugins: {
autoprefixer: {}, // 用來給不同的瀏覽器自動添加相應首碼,如-webkit-,-moz-等等
"postcss-px-to-viewport": {
unitToConvert: "px", // 要轉化的單位
viewportWidth: width, // UI設計稿的寬度
unitPrecision: 6, // 轉換後的精度,即小數點位數
propList: ["*"], // 指定轉換的css屬性的單位,*代表全部css屬性的單位都進行轉換
viewportUnit: "vw", // 指定需要轉換成的視窗單位,預設vw
fontViewportUnit: "vw", // 指定字體需要轉換成的視窗單位,預設vw
selectorBlackList: ["wrap"], // 指定不轉換為視窗單位的類名,
minPixelValue: 1, // 預設值1,小於或等於1px則不進行轉換
mediaQuery: false, // 是否在媒體查詢的css代碼中也進行轉換,預設false
replace: true, // 是否轉換後直接更換屬性值
exclude: [], // 設置忽略文件,用正則做目錄名匹配
landscape: false, // 是否處理橫屏情況
},
},
};
};
複製代碼
<template>
<div>
<div>繼承body的字體</div>
<div class="test">這是測試用的文字</div>
<van-button>vant按鈕</van-button>
</div>
</template>
<script></script>
<style lang="less">
html,
body {
font-size: 12px;
}
.test {
font-size: 20px;
}
</style>
複製代碼
4.2 效果
五、相容行內樣式
5.1 未做相容效果
- 預設情況下,不會對行內樣式進行轉換
5.2 使用 style-vw-loader 插件進行行內樣式轉換
5.2.1 安裝依賴
yarn add style-vw-loader
複製代碼
5.2.2 插件配置
// vue.config.js
const { defineConfig } = require("@vue/cli-service");
module.exports = defineConfig({
transpileDependencies: true,
devServer: {
port: 8181,
},
//配置loader
chainWebpack: (config) => {
config.module
.rule("vue")
.test(/\.vue$/)
.use("style-vw-loader")
.loader("style-vw-loader")
.options({
viewportWidth: 750, //傳參,根據設計稿屏幕寬度來配置
});
},
});
複製代碼
<template>
<div>
<div>繼承body的字體</div>
<div class="test">這是測試用的文字</div>
<van-button>vant按鈕</van-button>
<div
style="
width: 200px;
height: 200px;
margin-top: 20px;
border: 1px solid skyblue;
"
>
測試行內樣式
</div>
</div>
</template>
<script></script>
<style lang="less">
html,
body {
font-size: 12px;
}
.test {
font-size: 20px;
}
</style>
複製代碼
5.2.3 頁面效果
六、行內樣式 非插件適配方案
//js計算中進行vw適畫 375px設計圖基準
export function px2vw(px: number string) {
const vw = Math.max(document.documentElement.clientWidth || 0, window.innerWidth ||0)
return `${(Number(px) / 750 * vw}px`
// 示例 最後,將計算好的樣式值應用到元素中:
// const element = document.querySelector('.my-element');
// element.style.width = px2vw(100);
}
複製代碼
六、配置參數拓展
propList
: 當有些屬性的單位我們不希望轉換的時候,可以添加在數組後面,併在前面加上!號,如propList: ["*","!letter-spacing"]
,這表示:所有css屬性的屬性的單位都進行轉化,除了letter-spacing
的selectorBlackList
:轉換的黑名單,在黑名單裡面的我們可以寫入字元串,只要類名包含有這個字元串,就不會被匹配。比如selectorBlackList: ['wrap']
,它表示形如wrap
,my-wrap
,wrapper
這樣的類名的單位,都不會被轉換
參考
作者:angelCopy
鏈接:https://juejin.cn/post/7213181814860398649
來源:稀土掘金
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。