亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

webpack實現一個行內樣式px轉vw的loader示例

2024-05-06 16:46:05
字體:
來源:轉載
供稿:網友

px; padding: 5px 0px; outline: none; font-size: 14px; line-height: 30px; font-family: tahoma, arial, "Microsoft YaHei";"> 需求

自從有了postcss來處理css文件,我們可以快速進行網站適配的開發,只需要改改參數,樣式按照設計稿的px寫,webpack編譯自動轉換成rem或者vw等。

但是,標簽內的px怎么辦呢?postcss并不提供轉換這個的功能。

探索

啟動思路

我正在做一個vue項目,剛好想要實現上面提到的需求,例如下面的例子

<h3 style="font-size: 28px;margin-top: 10px" width="500px">Test</h3>

我希望他能根據我設置的基準值自動轉換成vw。

<h3 width="00vw" style="font-size: 00vw; margin-top: 00vw;">Test</h3>

要想實現這樣一個東西,離不開編譯工具webpack,webpack有loader、plugin,用什么好呢?通過找資料,我從一篇px轉rem的文章中得到了提示 react內聯樣式使用webpack將px轉rem

沒錯,就是webpack-loader

寫一個webpack loader,在webpack編譯階段,讀取vue文件里面的內容,通過正則識別出需要轉換的像素px,再通過公式轉換成vw。

開始行動

1、了解loader的實現原理

寫一個loader很簡單,傳入source,干些壞事,干完之后,返回處理過的source。source對應的是每一個通過loader匹配到的文件。

module.exports = function (source) { // 干些壞事 return source}

2、如何讓loader干壞事

先看一個簡單的vue文件,通常分為3部分,<template>、<script>、<style>

<template> <div>  <h3 style="font-size: 28px;margin-top: 10px" width="500px">Test</h3> </div></template><script> export default {  name: '',  components: {},  created () {},  mounted () {},  methods: {} }</script><style lang="less"> h3 {  font-size: 20px; }</style>

我們知道<style>部分已經有postcss會進行轉換處理,所以我把重點放到了<template>內部的 “00px”。

其實source對應的就是這樣一個vue文件,該例子中有28px、10px、500px是需要轉換的目標,首先用正則把他們都找出來。

先把template部分提出來,防止把style部分也轉換了

const template = /<template>([/s/S]+)<//template>/gi// 匹配出來的部分<template> <div>  <h3 style="font-size: 28px;margin-top: 10px" width="500px">Test</h3> </div></template>

匹配px的正則

const ZPXRegExp = /(/d+)px/

對template里面的px進行轉換

module.exports = function (source) { let _source = '' // 如果當前的source里面存在template if (template.test(source)) {  // 匹配template部分  _source = source.match(template)[0] } // 匹配出template里面的px let pxGlobalRegExp = new RegExp(ZPXRegExp.source, 'ig') if (pxGlobalRegExp.test(_source)) {  // px轉換vw,核心部分  let $_source = _source.replace(pxGlobalRegExp, createPxReplace(defaults.viewportWidth, defaults.minPixelValue, defaults.unitPrecision, defaults.viewportUnit))  // 轉換之后替換回source中,返回函數值  return source.replace(template, $_source) } else {  //沒有就不轉,直接返回  return source }}

px轉vw的公式

我使用的是 postcss-px-to-viewport 內部實現的轉換公式

function createPxReplace (viewportSize, minPixelValue, unitPrecision, viewportUnit) { // 不用好奇$0, $1是怎么來的,他們是replace第二個參數提供的 return function ($0, $1) {  if (!$1) return  var pixels = parseFloat($1)  if (pixels <= minPixelValue) return  return toFixed((pixels / viewportSize * 100), unitPrecision) + viewportUnit }}function toFixed (number, precision) { var multiplier = Math.pow(10, precision + 1),  wholeNumber = Math.floor(number * multiplier) return Math.round(wholeNumber / 10) * 10 / multiplier}

使用和postcss-px-to-viewport類似的配置

一個基本的配置大概包含這些信息

let defaultsProp = { unitToConvert: 'px', viewportWidth: 750, unitPrecision: 5, viewportUnit: 'vw', fontViewportUnit: 'vw', minPixelValue: 1}

給webpack-loader加上option

const loaderUtils = require('loader-utils')const opts = loaderUtils.getOptions(this)const defaults = Object.assign({}, defaultsProp, opts)

好了,現在我們實現了一個可以干壞事的loader,
注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
美女性感视频久久久| 国产精品成人播放| 久久精品国产亚洲| 久久躁狠狠躁夜夜爽| 992tv在线成人免费观看| 欧美日韩国产麻豆| 日韩av免费在线观看| 亚洲网站在线看| 国产精品视频地址| 黑人巨大精品欧美一区免费视频| 日韩视频免费大全中文字幕| 亚洲天堂男人的天堂| 久久电影一区二区| 日本成人激情视频| 亚洲qvod图片区电影| 欧美日韩国产色| 亚洲理论电影网| 国产一区二区三区视频| 国产日韩在线看| 一本一本久久a久久精品牛牛影视| 91在线视频成人| 国产性色av一区二区| 97精品一区二区视频在线观看| www.日韩免费| 日韩的一区二区| 中国人与牲禽动交精品| 国产一区香蕉久久| 亚洲天堂影视av| 中文字幕日韩欧美在线视频| 日韩大片免费观看视频播放| 中文字幕日韩精品有码视频| 国产亚洲a∨片在线观看| 人人爽久久涩噜噜噜网站| 国产亚洲精品成人av久久ww| 国产999在线| 国产精品欧美日韩一区二区| 国语自产精品视频在线看抢先版图片| 色妞久久福利网| 欧美性高跟鞋xxxxhd| 国产精品三级网站| 国产日韩欧美在线视频观看| 欧美精品videosex极品1| 日韩人在线观看| 亚洲国产精品成人精品| 中文字幕欧美视频在线| 亚洲第一精品夜夜躁人人爽| 精品电影在线观看| 日韩欧美黄色动漫| 国产精品成av人在线视午夜片| 亚洲国产精品va在看黑人| 亚洲视频在线观看视频| 亚洲日本中文字幕免费在线不卡| 中文国产成人精品久久一| 亚洲国产精品久久久久| 91精品国产综合久久久久久蜜臀| 欧美一区二区三区免费观看| 国语自产精品视频在线看| 国产精品福利片| 九九热精品视频| 4k岛国日韩精品**专区| 国产精品亚洲激情| 久久免费视频在线| 91精品在线一区| 日韩电影视频免费| 亚洲福利视频网| 欧美另类极品videosbest最新版本| 国产视频精品久久久| 国产欧美欧洲在线观看| 国产日韩在线看| 亚洲视频国产视频| 久久精品色欧美aⅴ一区二区| 亚洲一区二区三区久久| 亚洲精品影视在线观看| 亚洲xxx视频| 日韩激情在线视频| 黄色一区二区三区| 成人久久久久久久| 三级精品视频久久久久| 国产精品jvid在线观看蜜臀| 97久久超碰福利国产精品…| 亚洲欧美在线看| 欧美乱妇40p| 亚洲美女视频网站| 国产欧美久久久久久| 国产精品丝袜久久久久久高清| 日本久久精品视频| 精品国产91久久久| xxxxxxxxx欧美| 精品久久香蕉国产线看观看亚洲| 欧美性猛交xxxx乱大交3| 日韩中文在线中文网三级| 亚洲91精品在线观看| 国产精品亚洲欧美导航| 亚洲成人免费网站| 亚洲人线精品午夜| 国产91精品最新在线播放| 在线精品91av| 欧美另类暴力丝袜| 日韩在线视频一区| 韩国国内大量揄拍精品视频| 日韩在线观看成人| 久久久97精品| 欧美高跟鞋交xxxxhd| 国产精品第一第二| 精品久久久久久中文字幕一区奶水| 国产精品视频一区二区高潮| 亚洲精品视频在线观看视频| 国产成人综合久久| 日韩成人在线观看| 国产精品揄拍500视频| 日韩精品免费一线在线观看| 欧美精品做受xxx性少妇| 亚洲老头老太hd| 久久久亚洲国产| 精品亚洲夜色av98在线观看| 日韩国产高清视频在线| 精品国产成人在线| 欧美影院久久久| 福利微拍一区二区| 美女撒尿一区二区三区| 欧美激情一区二区三级高清视频| 日韩视频在线免费观看| 亚洲最新视频在线| 亚洲欧美制服综合另类| 国产日韩av在线| 国产97在线观看| 蜜臀久久99精品久久久久久宅男| 国产午夜精品视频免费不卡69堂| 日韩有码视频在线| 日韩精品亚洲视频| 麻豆国产精品va在线观看不卡| 久久国产精品偷| 亚洲福利视频专区| 欧美激情啊啊啊| 2018中文字幕一区二区三区| 亚洲精品自拍第一页| 欧美性xxxx极品hd满灌| 国产一区二区日韩精品欧美精品| 久久99精品久久久久久琪琪| 亚洲一区二区三区四区在线播放| 国产精品一区二区三| 亚洲国产精品嫩草影院久久| 亚洲精品在线看| 欧美乱大交xxxxx另类电影| 成人网欧美在线视频| 欧美刺激性大交免费视频| 日本aⅴ大伊香蕉精品视频| 亚洲在线免费看| 91精品国产高清久久久久久久久| 日韩美女写真福利在线观看| 亚洲国产日韩欧美综合久久| 国产成人精品午夜| 成人在线视频网| 日韩精品久久久久久福利| 色婷婷综合久久久久中文字幕1| 日本久久亚洲电影| 日韩av高清不卡| 日韩精品福利在线| 菠萝蜜影院一区二区免费| 久久亚洲精品中文字幕冲田杏梨| 成人在线国产精品| 亚洲97在线观看| 91香蕉国产在线观看| 国产精品美女午夜av|