首页 > 其他分享 >umi配置chainWebpack,使用自定义loader----jsx-px2rem

umi配置chainWebpack,使用自定义loader----jsx-px2rem

时间:2022-11-15 14:47:29浏览次数:45  
标签:style umi 自定义 px2rem jsx loader regRules backUp

前言

虽然云谦大佬在github上说了,umi本身的配置已经很完善了,但是肯定满足不了所有人各种各样的奇葩需求。。。

比如今天说的将jsx中的style里,将px转换为rem。

 

umi本身提供了postcss、cssloader等,但是要想将jsx中的px转换成rem,并未找到相关的插件。就只有手写一个loader,然后再修改umi的webpack配置了。

 

loader:

jsx-px2rem-loader.js:

import regRules from './reg';
import _ from 'lodash';    // lodash是一个js工具库,特别方便建议各位去了解一下
 
module.exports = function(source) {
  if (this.cacheable) {
    this.cacheable();
  }
  let backUp = source;
 
  // style={{marginRight: '1px'}} => style={{marginRight: '0.01rem'}}
  if (regRules.pxReg.test(backUp)) {
    backUp = backUp.replace(regRules.pxReg, px => {
      let val = px.replace(regRules.numReg, num => {
        return num / 100;
      });
      val = val.replace(/px$/, 'rem');
      return val;
    });
  }
 
 
  // marginRight: 1 => marginRight: '0.01rem'
  _.each(regRules.styleReg, (reg, styleName) => {
    if (reg.test(backUp)) {
      backUp = backUp.replace(reg, val => {
        return val.replace(regRules.numReg, num => {
          return `"${num / 100}rem"`;
        });
      });
    }
  });
 
 
  // img标签 width: 1 => style={{width: '0.01rem'}}
  _.each(regRules.imgReg, (reg, styleName) => {
    if (reg.test(backUp)) {
      backUp = backUp.replace(reg, val => {
        let style = '';
        val.replace(regRules.numReg, num => {
          style = `${num / 100}rem`;
        });
        return `style={{${styleName}:"${style}"}}`;
      });
    }
  });
  
  return backUp;
}

 


reg.js:

// 匹配jsx中的px 如 1px
const pxReg = /\b(\d+(\.\d+)?)px\b/g;    
 
// 匹配jsx中 缩写形式的style 如:marginRight: 1
const styleReg = {    
  marginTop: /\bmarginTop(?:\s+):(?:\s+)?(\d+)/g,
  marginRight: /\bmarginRight(?:\s+)?:(?:\s+)?(\d+)/g,
  marginBottom: /\bmarginBottom(?:\s+)?:(?:\s+)?(\d+)/g,
  marginLeft: /\bmarginLeft(?:\s+)?:(?:\s+)?(\d+)/g,
  fontSize: /\bfontSize(?:\s+)?:(?:\s+)?(\d+)/g,
  paddingTop: /\bpaddingTop(?:\s+)?:(?:\s+)?(\d+)/g,
  paddingRight: /\bpaddingRight(?:\s+)?:(?:\s+)?(\d+)/g,
  paddingBottom: /\bpaddingBottom(?:\s+)?:(?:\s+)?(\d+)/g,
  paddingLeft: /\bpaddingLeft(?:\s+)?:(?:\s+)?(\d+)/g,
}
 
// 匹配img 中的行内样式 width: '20'
const imgReg = {    
  height: /\bheight(?:\s+)?=(?:\s+)?(\'||\")?(\d+)?=(\'||\")?/g,
  width: /\bwidth(?:\s+)?=(?:\s+)?(\'||\")?(\d+)?=(\'||\")?/g,
}
 
// 匹配数字
const numReg = /(\d+)/g;
 
export default {
  pxReg,
  styleReg,
  imgReg,
  numReg,
}

 

修改chainWebpack配置

之后便是修改umi的webpack配置。

这是官方的说明:

https://umijs.org/zh/config/#chainwebpack

 

很简洁的一句话,让人摸不着头脑。

 

而github上webpackChain的issue回复速度也是让人无语,文档也是不清不楚。

求助umi官方人员得到的回复却是参照webpackChain。

 

没有办法,只能一个一个去尝试。

终于,在快要放弃的时候成功了。

 

config.js

import path from 'path'
 
...
 
chainWebpack(config){
    config.module
      .rule('jsx-px2rem-loader')
      .test(/\.js$/)
        .exclude
        .add([path.resolve('../src/pages/.umi'), path.resolve('node_modules')])
        .end()
      .use('../loader/jsx-px2rem-loader')
        .loader(path.join(__dirname, '../loader/jsx-px2rem-loader'));
  }


注意:在配置config的时候,.use() 与 .loader()的路径事关重要!根据项目实际路径自行更换!

配置错误会出现诸如: /.umi not found或者未报错但是并未执行loader等等错误!

 

我的目录结构如下:

 

config.js(也就是修改chainWebpack的文件)存在与config目录下。

标签:style,umi,自定义,px2rem,jsx,loader,regRules,backUp
From: https://www.cnblogs.com/cczlovexw/p/16892353.html

相关文章

  • java poi导出excel单元格设置自定义背景颜色(任意颜色)
    转自:http://t.csdn.cn/QHfUU//创建一个workbook对象Workbookworkbook=newXSSFWorkbook();//创建一个sheet对象Sheetsheet=workbook.createSheet();//创......
  • SAP ABAP FICO FAGLL03H CODING BLOCK新增自定义字段
    1、SGLPOS_N_GL_CT、SGLPOS_N_CT两个结构新增自定义字段  2、执行t-code:HDBVIEWS  3、实施增强 FAGL_LIB  4、使用selectdata方法 5、代码示例:......
  • 自定义一个python pip包
    新建一个目录mkdirexample基本说明文件README.rstLICENSEsetup.cfgsetup.pyMANIFEST.indocsexample/README.rst点击查看代码=====example=====Pollsi......
  • 自定义定时器
    自定义定时器#include<iostream>#include<sys/epoll.h>#include<chrono>#include<functional>#include<memory>#include<set>int64_tgid{0};structNodeBa......
  • 【AGC】远程配置如何传入自定义属性
    ​背景:现在AGC远程配置端侧服务提供的SDK支持传入自定义属性获取和更新云端配置数据了。下面将通过一个demo集成远程配置SDK来实现这一功能。 集成准备1.在AGC创建工......
  • 1710. 卡车上的最大单元数 ----- 贪心算法,自定义sort排序
    请你将一些箱子装在一辆卡车上。给你一个二维数组boxTypes,其中boxTypes[i]=[numberOfBoxesi,numberOfUnitsPerBoxi]:numberOfBoxesi是类型i的箱子的数量。numb......
  • JavaScript自定义数据类型判断函数
    functionjudgeType(ele){letres=typeofele;if(res==="object"){//短路表达式,第一个成立则返回第二个的值,第一个不成立,则返回第一个的值......
  • 自定义组件
    创建自定义组件类似于页面,一个自定义组件由jsonwxmlwxssjs4个文件组成。要编写一个自定义组件,首先需要在json文件中进行自定义组件声明(将component字段设为true......
  • 自定义页面
    [Page构造器]Page({/***页面的初始数据*/data:{},/***生命周期函数--监听页面加载*/onLoad:function(e){},/**......
  • 自定义组件传参
    参数声明Component({//参数properties:{//这里定义了innerText属性,属性值可以在组件使用时指定innerText:{type:String,value:'def......