[转] 使用babel-plugin-react-css-modules简化CSS Modules的使用
在我们的产品中,均使用CSS Modules来作为样式解决方案,大致的代码是这样的:
import React from 'react';
import styles from './table.css';
export default class Table extends React.Component {
render () {
return <div className={styles.table}>
<div className={styles.row}>
<div className={styles.cell}>A0</div>
<div className={styles.cell}>B0</div>
</div>
</div>;
}
}
但这里显然存在一些细节上的麻烦:
- 引入样式时额外增加了一个
styles
变量 - 需要不断写
styles.xxx
,重复代码
babel-plugin-react-css-modules
插件可以一定程度上缓解这些问题,使代码变为:
import React from 'react';
import './table.css';
export default class Table extends React.Component {
render () {
return <div styleName='table'>
<div styleName='row'>
<div styleName='cell'>A0</div>
<div styleName='cell'>B0</div>
</div>
</div>;
}
}
难点
- 我们的产品使用LESS而非原生的CSS来编写样式
- 为了生成的类名更漂亮,我们使用CSS Modules用了一个自定义的
getLocalIdent
实现 - 与webpack的整合可能存在一些难点
解决方案
安装依赖
npm i --save babel-plugin-react-css-modules
npm i --save-dev postcss-less
需要注意的是,babel-plugin-react-css-modules
有一个运行时依赖,所以用--save
安装比较好。而postcss-less
则用于解析LESS的语法
调整构建配置
因为有一个自定义的生成类名的函数,所以原有的.babelrc
的JSON格式已经不够了(无法表达函数),因此我们要把.babelrc
的配置移到babel-loader
的options
里去
在完成移动后,再向其中添加babel-plugin-react-css-modules
这一插件,在这个过程中将生成类名的函数抽象出来:
const generateScopedName = (name, filename) => {
const hash = hasha(filename + name, {algorithm: 'md5'});
const basename = path.basename(filename, '.less');
return `${dashCase(basename)}-${name}-${hash.slice(0, 5)}`;
};
exports.babel = {
loader: 'babel-loader',
options: {
cacheDirectory: true,
presets: [
// ...预置集
],
plugins: [
// ...其它插件
[
'react-css-modules',
{
context: path.join(__dirname, '..'),
exclude: 'node_modules',
filetypes: {
'.less': {
syntax: 'postcss-less'
}
},
generateScopedName: generateScopedName
}
]
]
}
};
以上文件为webpack/loaders.js
,相关的配置基本不用修改,原样使用就行。如果这些代码的位置不同,将其中的context
配置修改一下,对应至项目根目录就行。
然后调整一下CSS Modules相关的loader的配置,复用generateScopedName
函数:
exports.cssModules = {
loader: 'css-loader',
options: {
sourceMap: development,
modules: true,
importLoaders: true,
camelCase: 'dashes',
getLocalIdent({resourcePath}, localIdentName, localName) {
return generateScopedName(localName, resourcePath);
}
}
};
修改一些源码
需要特别注意:所有从.js
中引用.less
的代码,都不可以依赖webpack的resolve.modules
配置,只能写相对路径了。即原来写import 'common/less/global.less'
要改成import './common/less/global.less'
随后按着喜好将已经用了className
的地方慢慢改成styleName
就行。
[转] 使用babel-plugin-react-css-modules简化CSS Modules的使用的更多相关文章
- css模块化及CSS Modules使用详解
什么是css模块化? 为了理解css模块化思想,我们首先了解下,什么是模块化,在百度百科上的解释是,在系统的结构中,模块是可组合.分解和更换的单元.模块化是一种处理复杂系统分解成为更好的可管理模块的方 ...
- Angular Vue React 框架中的 CSS
框架中的 CSS Angular Vue React 三大框架 Angular Vue 内置样式集成 React 一些业界实践 Angular Angular . js (1.x):没有样式集成能力 ...
- 重温 Webpack, Babel 和 React
开始之前 在书写文章之前,我假设大家已经有了 JavaScript,Node 包管理工具,Linux 终端操作 这些基本技能,接下来,我将一步一步指引大家从头搭建一个 React 项目 最终实现的效果 ...
- 使用webpack、babel、react、antdesign配置单页面应用开发环境
这是Webpack+React系列配置过程记录的第一篇.其他内容请参考: 第一篇:使用webpack.babel.react.antdesign配置单页面应用开发环境 第二篇:使用react-rout ...
- webpack+babel+ES6+react环境搭建
webpack+babel+ES6+react环境搭建 步骤: 1 创建项目结构 注意: 先创建一个项目目录 react 这个名字自定义,然后进入到这个目录下面 mkdir app //创建app ...
- babel plugin和presets是什么,怎么用?
https://www.fullstackreact.com/articles/what-are-babel-plugins-and-presets/ 当开发react或者vuejs app时,开发者 ...
- React项目 - 几种CSS实践
前言团队在使用react时,不断探索,使用了很多不同的css实现方式,此篇blog总结了,react项目中常见的几种css解决方案:inline-style/radium/style-componen ...
- 经验分享:使用 Restyle.js 简化 CSS 预处理
Andrea Giammarchi的restyle.js是一个新的,基于JavaScript的CSS预处理器,能够运行在服务端(通过Node.js)或者浏览器中.它宣称自己是“一种简化的CSS方法”, ...
- Webpack 2 视频教程 012 - 理解Webpack 中的 CSS 作用域与 CSS Modules
原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...
- 简单 babel plugin 开发-使用lerna 工具
babel在现在的web 应用开发上具有很重要的作用,帮助我们做了好多事情,同时又有 比较多的babel plugin 可以解决我们实际开发上的问题. 以下只是学习下如果编写一个简单的babel pl ...
随机推荐
- AUTOML --- Machine Learning for Automated Algorithm Design.
自动算法的机器学习: Machine Learning for Automated Algorithm Design. http://www.ml4aad.org/ AutoML——降低机器学习门槛的 ...
- vue el-tree:默认展开第几级节点
需求描述: Tree 树形结构,默认展开第二级菜单. 查 element 文档: 解决方法: 设置 :default-expanded-keys 的值为 idArr 数组, <el-tree ...
- 004_strace工具
strace - trace system calls and signals 一.strace工具详解 之前线上主机上8351 进程夯死导致无法获悉进程信息,监控程序使用ps 命令查看进程信息至/p ...
- 021_nginx动态upstream检查
GET: 请求指定的页面信息,并返回实体主体.HEAD: 只请求页面的首部. #参考:http://tengine.taobao.org/document_cn/http_upstream_check ...
- web缓存服务器varnish-4.1.6的部署及配置详解
web缓存服务器varnish-4.1.6的部署及配置详解 1.安装varnish4.1.6安装依赖 yum install -y autoconf automake jemalloc-devel l ...
- python decorators
it's a syntatical sugar: @function1 def function2: do something equal to: function2 = function1(func ...
- 【原创】大数据基础之Flume(2)Sink代码解析
flume sink核心类结构 1 核心接口Sink org.apache.flume.Sink /** * <p>Requests the sink to attempt to cons ...
- npm dev run 报错
解决办法: npm run dev --port 8088 Error: listen EACCES 0.0.0.0:8080at Object.exports._errnoException (ut ...
- ajax控件无法使用 iis配置及web修改(转载)
1.Web.config配置问题:将Web.config中的相关节配置成如下,然后重新编译你的程序:<httpHandlers><remove verb="*" ...
- ant 安装 网址
1 http://www.testautomationguru.com/jmeter-continuous-performance-testing-part1/ 2 http://www.testau ...