1. install dependencies
npm i lib-flexible -S npm i px2rem-loader -D
2. create a new folder in the src utils folder, the new folder utils flexible.js in which code is as follows
(function() { // flexible.css var cssText = '' + '@charset "utf-8";html{color:#000;background:#fff;overflow-y:scroll;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-webkit-overflow-scrolling:touch}html *{outline:0;-webkit-text-size-adjust:none;-webkit-tap-highlight-color:transparent}body,html{font-family:"Microsoft YaHei",sans-serif,Tahoma,Arial}article,aside,blockquote,body,button,code,dd,details,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,input,legend,li,menu,nav,ol,p,pre,section,td,textarea,th,ul{margin:0;padding:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}input,input[type=button],input[type=reset],input[type=submit]{resize:none;border:none;-webkit-appearance:none;border-radius:0}input,select,textarea{font-size:100%}table{border-collapse:collapse;border-spacing:0}fieldset,img{border:0}abbr,acronym{border:0;font-variant:normal}del{text-decoration:line-through}address,caption,cite,code,dfn,em,th,var{font-style:normal;font-weight:500}ol,ul{list-style:none}caption,th{text-align:left}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:500}q:after,q:before{content:\'\'}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}a:hover{text-decoration:underline}a,ins{text-decoration:none}a:active,a:hover,a:link,a:visited{background:0 0;-webkit-tap-highlight-color:transparent;-webkit-tap-highlight-color:transparent;outline:0;text-decoration:none}'; // cssText end var styleEl = document.createElement('style'); document.getElementsByTagName('head')[0].appendChild(styleEl); if (styleEl.styleSheet) { if (!styleEl.styleSheet.disabled) { styleEl.styleSheet.cssText = cssText; } } else { try { styleEl.innerHTML = cssText; } catch (e) { styleEl.innerText = cssText; } } })(); ; (function(win, lib) { var doc = win.document; var docEl = doc.documentElement; var metaEl = doc.querySelector('meta[name="viewport"]'); doc.querySelector flexibleEl = var ( 'Meta [name = "flexible"]'); var DPR = 0; var Scale = 0; var TID; var flexible lib.flexible = || (lib.flexible = {}); IF (METAEL) { console.warn ( 'will be set in accordance with the existing scaling meta tags'); var match = metaEl.getAttribute ( 'Content') match (/ Initial \ -scale = (. [\ D \.] +) /); IF (match) { Scale = parseFloat (match [. 1]); DPR = the parseInt (. 1 / Scale); } } the else IF (flexibleEl) { var flexibleEl.getAttribute Content = ( 'Content'); IF (Content) { var initialDpr content.match = (/ Initial \ -dpR = ([\ D \.] +) /); var maximumDpr content.match = (/ maximum \ -dpR = ([ \ D \] +) /);. IF (initialDpr) { DPR = parseFloat (initialDpr [. 1]); Scale = parseFloat ((. 1 / DPR) .toFixed (2)); } IF (maximumDpr) { DPR = parseFloat (maximumDpr [. 1]); Scale = parseFloat ((. 1 / DPR) .toFixed (2)); } } } (!! && Scale DPR) IF { var isAndroid win.navigator.appVersion.match = (/ Android / GI ); var isIPhone win.navigator.appVersion.match = (/ iPhone / GI); var = devicePixelRatio win.devicePixelRatio; IF (isIPhone) { // at the iOS, 2 and 3 for the screen, with 2 solutions, the remaining 1 by scheme times IF (devicePixelRatio> =. 3 && (DPR DPR ||> =. 3)!) { IF ( docEl.firstElementChild) { dpr = 3; } else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)) { 2 = DPR; } the else { DPR = 1; } } the else { // other devices, still using 1x embodiment DPR = 1; } Scale = 1 / DPR; } docEl.setAttribute ( 'Data-DPR', DPR ); ! IF (METAEL) { METAEL = doc.createElement ( 'Meta'); metaEl.setAttribute ( 'name', 'the viewport'); metaEl.setAttribute ( 'Content', 'Initial-Scale =' + + Scale ' , maximum-Scale = '+ + Scale', Minimum-Scale = '+ + Scale', User-Scalable = NO '); docEl.firstElementChild.appendChild (METAEL); } else { var wrap = doc.createElement('div'); wrap.appendChild(metaEl); doc.write(wrap.innerHTML); } } function refreshRem() { var width = docEl.getBoundingClientRect().width; if (width / dpr > 540) { width = width * dpr; } var rem = width / 10; docEl.style.fontSize = rem + 'px'; flexible.rem = win.rem = rem; } win.addEventListener('resize', function() { clearTimeout(tid); tid = setTimeout(refreshRem, 300); }, false); win.addEventListener('pageshow', function(e) { if (e.persisted) { clearTimeout(tid); tid = setTimeout(refreshRem, 300); } }, false); if (doc.readyState === 'complete') { doc.body.style.fontSize = 12 * dpr + 'px'; } else { doc.addEventListener('DOMContentLoaded', function(e) { doc.body.style.fontSize = 12 * dpr + 'px'; }, false); } refreshRem(); flexible.dpr = win.dpr = dpr; flexible.refreshRem = refreshRem; flexible.rem2px = function(d) { var val = parseFloat(d) * this.rem; if (typeof d === 'string' && d.match(/rem$/)) { val += 'px'; } return val; } flexible.px2rem = function(d) { var val = parseFloat(d) / this.rem; if (typeof d === 'string' && d.match(/px$/)) { val += 'rem'; } return val; } })(window, window['lib'] || (window['lib'] = {}));
3. flexible.js introduced in the main.js
import './utils/flexible.js'
4. Modify in the build utils.js
const px2remLoader = { loader: 'px2rem-loader', options: { remUnit: 192 } }
const loaders = options.usePostCSS ? [cssLoader, postcssLoader, px2remLoader] : [cssLoader, px2remLoader]
5. Start project
reference: