使用babel-plugin-react-cssmodules替代react-css-modules

栏目: JavaScript · 发布时间: 7年前

内容简介:在更新 React 至 16.6.*后,使用 react-css-modules 的项目会出现以下 Warning主要是因为在 react-cssmodules 中,重写了 this.props,详见我们访问 react-css-modules 的项目,发现官方推荐了 babel-plugin-react-css-modules 作为替代品,其有以下优势:

在更新 React 至 16.6.*后,使用 react-css-modules 的项目会出现以下 Warning

Expected instance props to match memoized props before componentDidUpdate. This is likely due to a bug in React. Please file an issue.

主要是因为在 react-cssmodules 中,重写了 this.props,详见 issues

我们访问 react-css-modules 的项目,发现官方推荐了 babel-plugin-react-css-modules 作为替代品,其有以下优势:

  1. 将处理过程交给 babel 而不是 runtime, 提升 runtime 性能
  2. 不用频繁的调用 cssmodules 高阶组件
  3. 统一处理 options 等

替换过程

官方案例很简单,但是我们替换的过程中还是遇到了挺多的问题。主要包含以下几个步骤:

1. 安装 babel-plugin-react-css-modules

不赘述

2. 升级 babel 7

升级 babel 为@babel@7.1.6

对应的 plugin 也需要进行升级, 官方有介绍相应的替换

"@babel/core": "^7.1.6",
"@babel/plugin-proposal-class-properties": "^7.1.0",
"@babel/plugin-proposal-decorators": "^7.1.6",
"@babel/plugin-proposal-object-rest-spread": "^7.0.0",
"@babel/plugin-transform-runtime": "^7.1.0",
"@babel/preset-env": "^7.1.6",
"@babel/preset-flow": "^7.0.0",
"@babel/preset-react": "^7.0.0",

3. 格式化 stylus 文件

我们需要对 stylus 进行统一的格式化处理,防止 babel 对语法校验出错,由于文件较多,我们使用 stylus-supremacy 进行处理,使用 node 写一个批处理文件:

const stylusSupremacy = require("stylus-supremacy");
const fs = require("fs");
const path = require("path");

const formattingOptions = {
  insertColons: false,
  insertSemicolons: false,
  insertBraces: false
};

function formatFile(path){
  const content = fs.readFileSync(path, "utf8");
  const result = stylusSupremacy.format(content, formattingOptions);
  fs.writeFileSync(path, result, "utf8");
  console.log("format 成功: " + path);
}
...

4. 配置 css-loaders

const cssRegex = /\.css$/;
const cssModuleRegex = /\.cssmodule\.css$/;
const stylRegex = /\.styl$/;
const stylModuleRegex = /\.cssmodule\.styl$/;

const getStyleLoaders = (cssOptions, preProcessor) => {
  const loaders = [
    require.resolve("style-loader"),
    {
      loader: require.resolve("css-loader"),
      options: cssOptions
    }
  ];
  if (preProcessor) {
    loaders.push(require.resolve(preProcessor));
  }
  return loaders;
};

// webpack配置,添加getLocalIdent方法
rules: [
  {
    test: stylRegex,
    exclude: stylModuleRegex,
    use: getStyleLoaders({ importLoaders: 2 }, "stylus-loader")
  },
  {
    test: stylModuleRegex,
    use: getStyleLoaders(
      {
        importLoaders: 2,
        modules: true,
        camelCase: "dashes",
        getLocalIdent({ resourcePath }, localIdentName, localName) {
          return generateScope(localName, resourcePath);
        }
      },
      "stylus-loader"
    )
  }
];

5. 配置 babel-plugin-react-css-modules

generateScopedName 需要与 cssloader 处理的结果一致,否则将会失效。

同时,styl 文件需要 sugarss 进行处理,记得安装

[
  "react-css-modules",
  {
    generateScopedName: localIdentName,
    filetypes: { ".styl": { syntax: "sugarss" } },
    webpackHotModuleReloading: true, // 支持热加载
    handleMissingStyleName: "warn", // 没有时进行警告
    exclude: ".css$"
  }
];

6. 运行

删除之前的 react-css-modules

问题

  • 同时处理多个文件时报错

在文件中引用多个文件,会报错

import './common.css'
import './index.cssmodule.styl'

解决方案: 添加配置: exclude: “.css\$”


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。

Kotlin实战

Kotlin实战

【美】Dmitry Jemerov(德米特里·詹莫瑞福)、【美】 Svetlana Isakova(斯维特拉娜·伊凡诺沃) / 覃宇、罗丽、李思阳、蒋扬海 / 电子工业出版社 / 2017-8 / 89.00

《Kotlin 实战》将从语言的基本特性开始,逐渐覆盖其更多的高级特性,尤其注重讲解如何将 Koltin 集成到已有 Java 工程实践及其背后的原理。本书分为两个部分。第一部分讲解如何开始使用 Kotlin 现有的库和API,包括基本语法、扩展函数和扩展属性、数据类和伴生对象、lambda 表达式,以及数据类型系统(着重讲解了可空性和集合的概念)。第二部分教你如何使用 Kotlin 构建自己的 ......一起来看看 《Kotlin实战》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

MD5 加密
MD5 加密

MD5 加密工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换