react(craco)移动端使用postcss-px-to-viewport自适应布局 - SegmentFault 思否

无聊才收藏 关注

收藏于 : 2022-08-08 09:37   被转藏 : 1   

前言

尝试在 react 使用 postcss-px-to-viewport 自适应布局,全网找遍了,基本上都要 react-scripts eject 去修改 webpack.config.js, 或者装一大堆依赖……,最后发现还不行。

这里默认你已经配置好 craco ,并且已经存在 craco.config.js react 脚手架默认的 postcss 已经是 8.x 版本了,我这里安装了 "postcss": "^7.0.36" , 8.x 版本可以看 issues ,有人魔改了, npm 上面的 postcss-px-to-viewport github 上面的版本不一致,可以安装别人打包好的 postcss-px-to-viewport-with-include ,本文已 7.x 为例。\
发现问题,一定要去看issues,说不定有奇效。

正文

craco.config.js 下的 style 引入 require('postcss-px-to-viewport-with-include') 并填写配置。

                    
                      style: {
    postcss: {
      plugins: [
        require('tailwindcss'),
        require('autoprefixer')(overrideBrowserslist=['last 20 versions', 'android >= 4.0', 'iOS >= 7']),
        require('postcss-px-to-viewport-with-include')( {
          unitToConvert: 'px', // 要转化的单位
          viewportWidth: 375, // UI设计稿的宽度
          viewportHeight: 667, // UI
          unitPrecision: 6, // 转换后的精度,即小数点位数
          // propList: 当有些属性的单位我们不希望转换的时候,可以添加在数组后面,并在前面加上!号,如propList: ["*","!letter-spacing"],这表示:所有css属性的属性的单位都进行转化,除了letter-spacing的
          propList: ['*'], // 指定转换的css属性的单位,*代表全部css属性的单位都进行转换
          viewportUnit: 'vw', // 指定需要转换成的视窗单位,默认vw
          fontViewportUnit: 'vw', // 指定字体需要转换成的视窗单位,默认vw
          // 转换的黑名单,在黑名单里面的我们可以写入字符串,只要类名包含有这个字符串,就不会被匹配。比如selectorBlackList: ['wrap'],它表示形如wrap,my-wrap,wrapper这样的类名的单位,都不会被转换
          selectorBlackList: ['ignore'], // 指定不转换为视窗单位的类名,
          minPixelValue: 1, // 默认值1,小于或等于1px则不进行转换
          mediaQuery: true, // 是否在媒体查询的css代码中也进行转换,默认false
          replace: true, // 是否转换后直接更换属性值
          exclude: [/node_modules/], // 设置忽略文件,用正则做目录名匹配
          // include: [/node_modules/],
          landscape: false, // 是否处理横屏情况
        }),
      ],
    },
  },
                    
                  

坑点

经测试,在 postcss.config.js 下加入配置无效,呜呜呜,这里测试好久,一直以为 exclude 的问题(也有可能是我config配置有问题,但这个配置在vue项目里面是没毛病的,有懂得大佬,请指点,呜呜呜)。

2021-12-17更:吃了不会看英文文档的亏, @craco/克拉科 - npm (npmjs.com) ,设置下
mode: "file"

                    
                      const path = require('path')
module.exports=({file})=>{
  return {
    plugins: {
      tailwindcss: {},
      overrideBrowserslist: ['last 20 versions', 'android >= 4.0', 'iOS >= 7'],
      'postcss-px-to-viewport-with-include': {
        unitToConvert: 'px', // 要转化的单位
        viewportWidth: 375, // UI设计稿的宽度
        viewportHeight: 667, // UI
        unitPrecision: 6, // 转换后的精度,即小数点位数
        // propList: 当有些属性的单位我们不希望转换的时候,可以添加在数组后面,并在前面加上!号,如propList: ["*","!letter-spacing"],这表示:所有css属性的属性的单位都进行转化,除了letter-spacing的
        propList: ['*'], // 指定转换的css属性的单位,*代表全部css属性的单位都进行转换
        viewportUnit: 'vw', // 指定需要转换成的视窗单位,默认vw
        fontViewportUnit: 'vw', // 指定字体需要转换成的视窗单位,默认vw
        // 转换的黑名单,在黑名单里面的我们可以写入字符串,只要类名包含有这个字符串,就不会被匹配。比如selectorBlackList: ['wrap'],它表示形如wrap,my-wrap,wrapper这样的类名的单位,都不会被转换
        selectorBlackList: ['ignore'], // 指定不转换为视窗单位的类名,
        minPixelValue: 1, // 默认值1,小于或等于1px则不进行转换
        mediaQuery: true, // 是否在媒体查询的css代码中也进行转换,默认false
        replace: true, // 是否转换后直接更换属性值
        exclude: [/node_modules/], // 设置忽略文件,用正则做目录名匹配
        landscape: false, // 是否处理横屏情况
      },
    },
  }
}
                    
                  

引用

首发于语雀文档@is_tao
@craco/craco
postcss-px-to-viewport
postcss-px-to-viewport-with-include
 阅读文章全部内容  
点击查看
文章点评
相关文章
无聊才收藏 关注

文章收藏:17

TA的最新收藏