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

首頁 > 編程 > JavaScript > 正文

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

2019-11-19 12:56:55
字體:
來源:轉載
供稿:網友

需求

自從有了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,😯不,是做好事!

我們來看看轉換成果

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

反思

雖然實現了我一開始的需求,但是心里總是不淡定,因為還些坑沒有想明白,后續如果想明白了,再進行完善。

源碼

style-vw-loader

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中日韩美女免费视频网站在线观看| 日韩国产高清污视频在线观看| 欧美日韩美女在线观看| 中文字幕日韩精品有码视频| 九九热精品视频在线播放| 91日本在线观看| 亚洲黄色免费三级| 精品少妇v888av| 亚洲欧美精品一区二区| 亚洲精品资源在线| 欧美一级大片视频| 久久久久久久影院| 亚洲午夜未删减在线观看| 青青草一区二区| 在线一区二区日韩| 国产精品第一页在线| 97视频在线观看免费| 国外成人免费在线播放| 日本国产精品视频| 成人精品福利视频| 亚洲精品国产拍免费91在线| 国产视频999| 91免费在线视频网站| 精品国产乱码久久久久酒店| 国产精品日日摸夜夜添夜夜av| 国产一区二区日韩精品欧美精品| 久久五月情影视| 一区二区三区视频免费| 日韩精品在线观看一区二区| 97人人模人人爽人人喊中文字| 国产精品欧美久久久| 久久久国产一区二区| 欧洲亚洲女同hd| 一区二区福利视频| 最近2019中文字幕一页二页| 欧美日韩国内自拍| 成人久久一区二区三区| 中文字幕欧美日韩在线| 欧美日韩免费观看中文| 一级做a爰片久久毛片美女图片| 九九九久久国产免费| 亚洲影视九九影院在线观看| 久久精品中文字幕免费mv| 欧美日韩国产在线看| 6080yy精品一区二区三区| 黄色一区二区在线观看| 亚洲综合中文字幕68页| 91国产在线精品| 成人免费激情视频| 国产精品永久免费观看| 97超级碰碰碰| 亚州国产精品久久久| 国产日韩欧美在线观看| 青青久久av北条麻妃黑人| 69av视频在线播放| 国产色视频一区| 午夜精品久久久久久久99黑人| 欧美人与性动交a欧美精品| 91色视频在线导航| 亚洲а∨天堂久久精品喷水| 亚洲福利影片在线| 国产成人av在线| 欧美精品一区二区三区国产精品| 欧美一区二区视频97| 日韩a**站在线观看| 成人免费黄色网| 国外色69视频在线观看| 欧美激情中文网| 日韩一二三在线视频播| 欧美成人小视频| 中文字幕亚洲综合久久筱田步美| 九九九久久国产免费| 欧美成aaa人片免费看| 国产精品视频yy9099| 在线丨暗呦小u女国产精品| 色偷偷偷亚洲综合网另类| 亚洲图片制服诱惑| 成人字幕网zmw| 欧美日韩中文字幕在线| 另类少妇人与禽zozz0性伦| 91香蕉亚洲精品| 亚洲人成毛片在线播放| 国产69精品久久久久久| 久久久久久伊人| 最新91在线视频| 亚洲aa中文字幕| 久久99国产精品自在自在app| 久久综合伊人77777蜜臀| 国产精品精品视频一区二区三区| 成人精品一区二区三区电影免费| 国产69精品久久久久9999| 狠狠做深爱婷婷久久综合一区| 国产欧美欧洲在线观看| 亚洲国产精品字幕| 精品国产乱码久久久久酒店| 久久久精品一区| 国产精品久久久久7777婷婷| 91成人精品网站| 日本不卡免费高清视频| 亚洲欧美日韩图片| 国产网站欧美日韩免费精品在线观看| 亚洲自拍偷拍在线| 亚洲无限av看| 亚洲精品一区二区在线| 亚洲第一免费播放区| 久久久久999| 日韩欧美精品在线观看| 中文字幕欧美精品日韩中文字幕| 黑人精品xxx一区一二区| 国产精品免费久久久久影院| 色综合影院在线| 亚洲国产免费av| 欧美大片免费看| 日韩精品久久久久久久玫瑰园| 国产精品美腿一区在线看| 欧美另类69精品久久久久9999| 97婷婷大伊香蕉精品视频| 国产精品av在线| 最近2019好看的中文字幕免费| 欧美黑人巨大xxx极品| 亚洲性av网站| 91精品在线国产| 中文字幕亚洲一区在线观看| 国产婷婷97碰碰久久人人蜜臀| 欧美—级a级欧美特级ar全黄| 日韩精品在线观看一区| 欧美理论电影网| 亚洲精品资源在线| 日韩三级成人av网| 91亚洲精品在线观看| 亚洲sss综合天堂久久| 精品视频久久久久久久| 亚洲第一福利网站| 亚洲人成在线观看网站高清| 亚洲自拍偷拍一区| 欧美一级片免费在线| 日韩在线视频播放| 精品久久香蕉国产线看观看亚洲| 精品视频久久久| 欧美日韩国产第一页| 欧美日韩一区二区免费视频| 国产精品久久久久久久电影| 日韩在线免费av| 亚洲精品国产电影| 国产欧美精品xxxx另类| 亚洲一级黄色片| 日韩中文字幕免费视频| 欧美日韩ab片| 欧美日韩国产成人在线| 欧美激情亚洲另类| 日韩av中文字幕在线免费观看| 久久国产精品亚洲| 色播久久人人爽人人爽人人片视av| 成人性生交大片免费看小说| 91精品视频播放| 久久久久久这里只有精品| 亚洲精品美女久久久久| 日韩av片免费在线观看| 日本一区二区在线免费播放| 国产精品久久久久久影视| 亚洲一区二区三区在线免费观看| 91av网站在线播放| 久久夜色精品国产亚洲aⅴ| 日韩乱码在线视频|