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

目录

吐槽:

loader:

修改chainWebpack配置

完结


吐槽:

最初追随潮流,老大看到了umi这个国人开发标签的框架,觉得可以尝试,并且相信阿里。从此开始了填坑之路。。。

虽然云谦大佬在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目录下。

 

完结

转载于:umi配置chainWebpack,使用自定义loader----jsx-px2rem_ggggmlor的博客-CSDN博客_umi 配置chainwebpack

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了在umi使用postcss-px-to-viewport插件进行移动端布局,你需要按照以下步骤进行操作: 1. 首先,在.umirc.ts文件中引入postcss-px-to-viewport插件。你可以使用命令`npm i postcss-px-to-viewport`或`yarn add postcss-px-to-viewport`来安装插件的依赖。 2. 然后,通过import语句将postcss-px-to-viewport插件引入到你的代码中,例如:`import px2vw from "postcss-px-to-viewport"`。 3. 接下来,在.umirc.ts文件中进行配置。你可以在插件配置部分添加以下代码来配置postcss-px-to-viewport插件: ```javascript export default { // ... extraPostCSSPlugins: [ px2vw({ // 插件配置选项 }) ], // ... } ``` 4. 在配置选项中,你可以根据需要设置不同的参数来适应你的项目。例如,你可以设置viewportWidth、unitPrecision、viewportUnit和selectorBlackList等选项,以便根据自己的需求进行移动端布局。 总结起来,你需要先下载并引入postcss-px-to-viewport插件,然后在.umirc.ts文件中进行配置,最后根据需要设置插件的参数。这样,你就可以在umi使用postcss-px-to-viewport插件进行移动端布局了。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [umi如何利用postcss-px-to-viewport做移动端布局?](https://blog.csdn.net/zhaojiaxing123/article/details/129260295)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [在umijs中的.umirc.ts文件常用配置 和 postcss-px-to-viewport插件的配置](https://blog.csdn.net/muguli2008/article/details/118386442)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值