react create-react-app v5配置 px2rem (不暴露 eject方式)

这篇具有很好参考价值的文章主要介绍了react create-react-app v5配置 px2rem (不暴露 eject方式)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

环境信息:

create-react-app v5
“react”: “^18.2.0”
“postcss-plugin-px2rem”: “^0.8.1”

配置步骤:

不暴露 eject 配置自己的webpack:
1.下载react-app-rewired 和 customize-cra-5

npm install react-app-rewired customize-cra-5 --save-dev

2.在项目根目录创建一个config-overrides.js 文件

3.安装 postcss-plugin-px2rem 和 lib-flexible (注意这里安装 postcss-px2rem、px2rem这类都行,都是 px2rem衍生的库,不过不同的库具体配置不一样,建议查看文档具体有哪些参数。查看方法可以去 npm 官网 搜索包名,查看详情即可,或者问 ai 比如: 文心,gpt)

cnpm install postcss-plugin-px2rem  lib-flexible --save

4.配置config/webpack.config.js

加上这段代码重写addPostcssPlugins 方法:

// 重写 addPostcssPlugins 方法
const addPostcssPlugins = plugins => (config) => {
  const rules = config.module.rules.find(rule => Array.isArray(rule.oneOf)).oneOf;
  rules.forEach(r => r.use
      && r.use.forEach((u) => {
        if (u.options && u.options.postcssOptions && u.options.postcssOptions.ident === 'postcss') {
          if (!u.options.postcssOptions.plugins) {
            u.options.postcssOptions.plugins = plugins;
          }
          if (u.options.postcssOptions.plugins) {
            const originalPlugins = u.options.postcssOptions.plugins;
            u.options.postcssOptions.plugins = [originalPlugins, ...plugins];
          }
        }
      }));
  return config;
};

然后 使用配置:

addPostcssPlugins([['postcss-pxtorem', {
    rootValue: 37.5,
    propList: ['*'],
  }]]),

或者 :

 addPostcssPlugins([['postcss-px2rem-exclude', {
    remUnit: 37.5,
    exclude: /node_modules/i,
  }]]),

4.在 src/index.js(入口文件引入 import ‘lib-flexible’; )
react create-react-app v5配置 px2rem (不暴露 eject方式),create-react-app v5,React,react.js,前端,前端框架
5.public/index.html 里 注释调 meta 和加上 一段兼容ipad和ipad pro 的兼容代码。

注释掉(注释的原因是 lib-flexible 会自动创建 meta):

<meta name="viewport" content="width=device-width, initial-scale=1" />

在 head里加上(ipad和ipad pro ):

<!-- 淘宝弹性布局方案lib-flexible不兼容ipad和ipad pro的解决方法 -->
    <script>
    /(iPhone|iPad|iPhone OS|Phone|iPod|iOS)/i.test(navigator.userAgent)&&(head=document.getElementsByTagName('head'),viewport=document.createElement('meta'),viewport.name='viewport',viewport.content='target-densitydpi=device-dpi, width=480px, user-scalable=no',head.length>0&&head[head.length-1].appendChild(viewport));
    </script>

这段代码用于检测用户是否正在使用iPhone、iPad、iPod或iOS等苹果设备。如果是,它将创建一个新的视口元标签,并添加到HTML文档的头部。视口元标签的内容设置为 ‘target-densitydpi=device-dpi, width=480px, user-scalable=no’,这意味着它会尝试让页面在各种设备上看起来相似,页面的宽度被设置为480px,并且用户不能手动缩放页面。

我的 index.html 代码如下:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
    <!-- <meta name="viewport" content="width=device-width, initial-scale=1" /> -->
    <meta name="theme-color" content="#000000" />
    <meta
      name="description"
      content="Web site created using create-react-app"
    />
    <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
    <!--
      manifest.json provides metadata used when your web app is installed on a
      user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
    -->
    <link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
    <!--
      Notice the use of %PUBLIC_URL% in the tags above.
      It will be replaced with the URL of the `public` folder during the build.
      Only files inside the `public` folder can be referenced from the HTML.

      Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
      work correctly both with client-side routing and a non-root public URL.
      Learn how to configure a non-root public URL by running `npm run build`.
    -->
    <title>React App</title>
    <!-- 淘宝弹性布局方案lib-flexible不兼容ipad和ipad pro的解决方法 -->
    <script>
    /(iPhone|iPad|iPhone OS|Phone|iPod|iOS)/i.test(navigator.userAgent)&&(head=document.getElementsByTagName('head'),viewport=document.createElement('meta'),viewport.name='viewport',viewport.content='target-densitydpi=device-dpi, width=480px, user-scalable=no',head.length>0&&head[head.length-1].appendChild(viewport));
    </script>
  </head>
  <body>
    <noscript>You need to enable JavaScript to run this app.</noscript>
    <div id="root"></div>
    <!--
      This HTML file is a template.
      If you open it directly in the browser, you will see an empty page.

      You can add webfonts, meta tags, or analytics to this file.
      The build step will place the bundled scripts into the <body> tag.

      To begin the development, run `npm start` or `yarn start`.
      To create a production bundle, use `npm run build` or `yarn build`.
    -->
  </body>
  
</html>

react create-react-app v5配置 px2rem (不暴露 eject方式),create-react-app v5,React,react.js,前端,前端框架
6.重新运行 npm start 审查元素 看看 px 是不是被转换成了rem。如果转换成功说明,配置成功了。
可以在 App.js 里加上一个div然后在 App.css 里写上一个width,height然后 用到 div上。

.box{
  width: 100px;
  height: 100px;
  background: red;
}

react create-react-app v5配置 px2rem (不暴露 eject方式),create-react-app v5,React,react.js,前端,前端框架
运行之后的效果截图:
从100px转换成了1.333rem ,当切换时,他也跟着变大变小。
react create-react-app v5配置 px2rem (不暴露 eject方式),create-react-app v5,React,react.js,前端,前端框架

rootValue 的计算方式 :

rootValue=设计图的宽度/10
我是 375*812的设计图 所以 就是 375/10=37.5
计算rem值时,应该将屏幕宽度除以10作为基准值。

postcss-plugin-px2rem 详细配置:

postcss-plugin-px2rem是一个PostCSS插件,用于将px单位转换为rem单位。该插件提供了以下参数:

rootValue:指定根元素字体大小的值,默认为16。该值用于将px转换为rem,例如,当rootValue设置为16时,10px会被转换为0.625rem。

unitPrecision:指定转换后的rem值保留的小数位数,默认为5。

propList:指定需要转换的CSS属性,默认为[‘*’],表示所有属性都会被转换。你可以将其设为只转换某些属性,例如[‘font-size’]只转换字体大小属性。

selectorBlackList:指定不需要转换的选择器,可以是字符串或正则表达式。例如,你可以将其设置为[‘.no-rem’]来防止某些元素被转换。

replace:指定是否替换原始的px值,默认为true。如果设置为false,则会在原始值后面添加转换后的rem值,例如10px会被转换为10px /* 0.625rem */。

mediaQuery:指定是否在媒体查询中也进行转换,默认为false。

minPixelValue:指定最小转换单位的px值,默认为0。如果设置为2,则不会将1px转换为0.0625rem等非常小的值。

以下是一个postcss-plugin-px2rem插件的配置示例:

const px2rem = require('postcss-plugin-px2rem');
const postcssOptions = {
  plugins: [
    px2rem({
      rootValue: 16,
      unitPrecision: 5,
      propList: ['*', '!font-size'],
      selectorBlackList: ['.no-rem'],
      replace: true,
      mediaQuery: false,
      minPixelValue: 0
    })
  ]
};

在上述示例中,我们将根元素的字体大小设置为16,保留5位小数,只转换除font-size以外的所有属性,不转换带有.no-rem类名的元素,替换原始的px值,不在媒体查询中进行转换,最小转换单位的px值为0。

完整的配置代码:

addWebpackAlias和 addLessLoader 你可以忽略。前者是 别名 src 可以写成@ ,后者是 可以使用less 语法。

const {
  override,
  addLessLoader,
  // addPostcssPlugins,
  fixBabelImports,
  addWebpackAlias,
} = require("customize-cra-5");
const path = require("path");
// 重写 addPostcssPlugins 方法
const addPostcssPlugins = plugins => (config) => {
  const rules = config.module.rules.find(rule => Array.isArray(rule.oneOf)).oneOf;
  rules.forEach(r => r.use
      && r.use.forEach((u) => {
        if (u.options && u.options.postcssOptions && u.options.postcssOptions.ident === 'postcss') {
          if (!u.options.postcssOptions.plugins) {
            u.options.postcssOptions.plugins = plugins;
          }
          if (u.options.postcssOptions.plugins) {
            const originalPlugins = u.options.postcssOptions.plugins;
            u.options.postcssOptions.plugins = [originalPlugins, ...plugins];
          }
        }
      }));
  return config;
};

module.exports = override(
  addLessLoader({
    lessOptions: {
      javascriptEnabled: true,
      // modifyVars: { '@primary-color': '#1DA57A' }, // 你的主题色
    },
  }),
  addPostcssPlugins([['postcss-pxtorem', {
    rootValue: 37.5,
    propList: ['*'],
  }]]),
  // addPostcssPlugins([['postcss-px2rem-exclude', {
  //   remUnit: 37.5,
  //   exclude: /node_modules/i,
  // }]]),
  addWebpackAlias({
    "@": path.resolve("src"),
  })
);

总结:

我是根据 issues里的回答写出来的具体可参考:
react项目:在configoveride.js中addPostcssPlugins添加postcss-pxtorem无效
react create-react-app v5配置 px2rem (不暴露 eject方式),create-react-app v5,React,react.js,前端,前端框架
其他配置可以参考:
react create-react-app v5 从零搭建项目(不暴露 eject)文章来源地址https://www.toymoban.com/news/detail-726959.html

到了这里,关于react create-react-app v5配置 px2rem (不暴露 eject方式)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【React】02.create-react-app基础操作

    2023年最新珠峰React全家桶【react基础-进阶-项目-源码-淘系-面试题】 有利于团队协作开发 便于组件的复用:提高开发效率、方便后期维护、减少页面中的冗余代码 业务组件:正对项目需求封装的 普通业务组件:没有啥复用性,只是单独拆出来的一个模块 通用业务组件:具备

    2024年02月06日
    浏览(43)
  • 使用create-react-app创建react项目

    全局安装create-react-app 使用create-react-app创建一个项目 如果不想全局安装,可以直接使用npx 这需要等待一段时间,这个过程实际上会安装三个东西 react: react的顶级库 react-dom: 因为react有很多的运行环境,比如app端的react-native, 我们要在web上运行就使用react-dom react-scripts: 包含运

    2024年02月11日
    浏览(38)
  • 通用方案px2rem 处理 内联样式、element-ui表头折行、label折行、表单项换行异常

    通用方案-处理element-ui 表单项label折行、换行异常,表头折行问题 背景简介:在实际的生产环境中,客户用到的屏幕大大小小分辨率各有异同,但是为了布局的统一和美观,我们采用了 postcss-px2rem 插件对element-ui进行响应式适配处理,大部分问题得到了解决,但仍有一些细枝

    2024年02月08日
    浏览(45)
  • React官网力荐Next.js:为何它取代了Create-React-App?

    随着前端技术的快速发展,React作为一款领先的JavaScript库,不断推动着前端开发的变革。近期,React官网的一个显著变化引起了广大开发者的关注:它不再推荐使用Create-React-App作为构建React应用的默认工具,而是转向了Next.js。 那么,Next.js究竟有何魔力,让React官网做出如此决

    2024年04月26日
    浏览(34)
  • react快速开始(三)-create-react-app脚手架项目启动;使用VScode调试react

    create-react-app(以下简称cra)作为react官方提供的脚手架工具,是目前生成react项目一个非常常用和主流的工具。很多企业级的应用搭建也是基于这个脚手架工具上二次开发 create-react-app脚手架 生成的 package.json中 scripts如下: 我们看到分别是项目的启动开发环境,构建,测试的

    2024年02月10日
    浏览(59)
  • 使用 create-react-app 搭建项目ts+less+antd+redux+router+eslint+prettier+axios

    当前市面上有很多前端框架或者模板、如:umi、dva、antd-design-pro、create-react-app 等一些框架或者模板。 create-react-app 是 react 官方提供的,相对来说比较干净一些。 此项目是在 create-react-app 的基础上进行搭架、项目采用 ts 语法 项目整体上会添加上以下功能: 完整项目代码 传

    2024年02月03日
    浏览(44)
  • 1-07 React配置postcss-px-to-viewport

    移动端适配 安装依赖:在项目根目录下运行以下命令安装所需的依赖包: 配置代码 重新启动开发服务器:如果你的开发服务器正在运行,请重新启动它以应用新的配置。 之后当我们写px时会自动转换成vm单位

    2024年02月08日
    浏览(38)
  • React导航守卫(V5路由)

    下载: 当我们进行路由跳转的时候,有时候需要满足某种条件才能跳转,比如我只有我们登录成功之后才能到首页面,否则就不能到首页面,这时候我们就需要对路由进行拦截。 例如: (1)当我们登录的时候存储一个会话存储 (2)然后我们给访问页面添加一个判断 //封装一个判

    2024年01月19日
    浏览(66)
  • uni-app px与rpx的转换

    第一种转换方法: 由rpx的微信官方介绍可知 rpx(responsive pixel): 可以根据屏幕宽度进行自适应。规定屏幕宽为750rpx。 如在 iPhone6 上,屏幕宽度为375px,共有750个物理像素,则750rpx = 375px = 750物理像素,1rpx = 0.5px = 1物理像素。 由此得知是以750物理像素为基准: px / rpx = screen

    2024年02月11日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包