当前位置: 首页 > Web前端 > CSS

CSSModules初识

时间:2023-03-31 01:10:00 CSS

什么是CSSModules套用CSSModules官网的话,一个css文件代表一个模块,这个css文件中的类名(classnames)和动画名(animationnames)有部分effectbydefaultDomain,简单的说,CSS也有作用域(其实这个不是很准确,只是通过名称转换让CSS看起来有作用域)。给我看代码原始代码/*style.css*/.header{color:red;字体大小:20px;}/*或*/:lcoal(.header){颜色:红色;字体大小:20px;}从'./style.css'导入样式;...render(){returnheader

}转换后Code.style__header___YHKJLJH{color:red;字体大小:20px;}header
为什么要使用CSSModules我个人认为主要是CSSModules用来提供css局部作用域的能力来使css更可控,避免污染全局样式。以往,在开发过程中,往往只能依赖命名约定。程序员有意识地遵循团队的命名约定,以避免风格污染。当项目越来越大,团队成员越来越多的时候,很难避免风格被污染的情况。这个时候改样式难免有点牵强,所以如果有一种方法(CSSModules)可以让你写的样式和其他样式完全隔离,那该多爽啊。我们先了解一下css-loaderCSSModules中CSSModules相关的配置并不是官方提供的功能,而是在项目编译打包阶段修改类名替换对应的类。本质上,webpack是依靠css-loader来进行打包处理,让CSSModules生效。模块:默认值为false;true表示启用CSSModulessourceMap:默认为false,不启用sourceMap;true是开启sourceMap,在开发环境下比较实用getLocalIdent:默认是undefined,自定义function生成的类名]___[name]__[local]___[hash:base64:5],可以自定义类名的模板,适当修改即可开始实战。这里我们以reactjs为例,开启CSSModules之旅。这里我们做一个默认的约定,使用.module.css或者module.scss作为文件后缀来区分全局样式和局部样式。首先使用create-react-app创建一个my-app项目,然后运行项目(创建过程需要一些时间,因为这里会安装所有依赖包。)npxcreate-react-appmy-appnpmrunstart演示项目使用的版本信息{"name":"my-app","version":"0.1.0","private":true,"dependencies":{"react":"^16.9.0","react-dom":"^16.9.0","react-scripts":"3.1.1"},"scripts":{"start":"react-脚本开始”,“构建”:“反应脚本构建”,“测试”:“反应脚本测试”,“弹出”:“反应脚本弹出”},“eslintConfig”:{“扩展”:“反应-app"},"browserslist":{"production":[">0.2%","notdead","notop_miniall"],"development":["last1chromeversion","last1firefoxversion","last1safariversion"]}}无需任何修改,您可以使用CSSModules在my-app/src目录中添加一个style.module.css文件。标题{字体大小:25px;}从“反应”中导入反应;从“./logo.svg”导入标志;导入'./App.css';从'./style.module.css'导入样式;函数App(){返回(你好CSS模块

);}导出默认应用;保存后查看浏览器,可以在控制台看到p标签的class="style_title__2t5Z0",对应的样式类名title也转换成了style_title__2t5Z0。可以看到使用create-react-app,默认已经支持CSSModules。查看webpack配置新版create-react-app创建的项目将打包构建的脚本放在npm包中,所以需要使用npmruneject命令解压相关文件夹。运行成功后,会在项目目录下添加两个文件config、scripts文件夹,我们主要查看config/webpack.config.js,直接在oneOf/*css*/{test:cssModuleRegex中查看这块内容,使用:getStyleLoaders({importLoaders:1,sourceMap:isEnvProduction&&shouldUseSourceMap,modules:true,getLocalIdent:getCSSModuleLocalIdent,}),},/*scss*/{测试:sassModuleRegex,使用:getStyleLoaders({importLoaders:2,sourceMap:isEnvProduction&&shouldUseSourceMap,modules:true,getLocalIdent:getCSSModule,LocalIdent,}sass-loader'),},//cssModuleRegex是正则模式匹配cssModule,/\.module\.css$///getStyleLoaders用于获取对应的loader,我们只需要注意css-loader,css-loader使用的options是getStyleLoaders的第一个参数,modules:true开启css模块,其实css模块是css-loader支持的constgetStyleLoaders=(cssOptions,preProcessor)=>{常量加载器=[...{loader:require.resolve('css-loader'),options:cssOptions,},...returnloaders;可以看到在create-react-app创建的工程中已经开箱即用了CSSModules(Supportcss,scss),只需要修改样式的使用方式(import),使用module.css和module.scss(sass)后缀将CSSModules引入现有项目。将CSSModules引入脚手架也非常简单。你只需要修改css-loader的相关配置即可。sourceMap只在开发环境中打开。显示编码的哈希值。推荐使用module.scss,module.css作为CSSModules文件的后缀,与已有的样式文件区分开来。//开发环境const是否为Develop=true;...{测试:/\.module\.scss$/,使用:['style-loader',{'css-loader',options:{sourceMap:isDevelop,modules:true,localIdentName:dev?'[path]___[name]__[local]___[hash:base64:5]':'[hash:base64]',}}'postcss-loader','sass-loader'},终极武器babel-plugin-react-css-modules现在已经解决了不再需要:local来标记样式文件中哪些类名需要转换的问题,所以使用起来还是有些问题,CSSModules推荐使用camelCase,什么?向我展示来自'./style.module.css'的代码导入样式;很明显使用驼峰要简洁很多,官方的推荐也不无道理。另外,每次写className,都要用到a.b方法。能再简单点吗?当然你可以:import'./style.module.css';...render(){return()}是不是感觉更简单高效了很多?不过还需要一个babel插件babel-plugin-react-css-modules。本插件在打包阶段会将styleName属性的值转换成对应的名称(generateScopedName定义的格式),然后将styleName属性的值添加到已有的className中(如果className不存在则创建).npminstallbabel-plugin-react-css-modules--save-dev//为了支持scssnpminstallpostcss-scss需要在webpack配置文件的babel-loader配置中加入如下:{test:/\.(js|mjs|jsx|ts|tsx)$/,loader:'babel-loader',options:{plugins:[...['react-css-modules',{webpackHotModuleReloading:true,autoResolveMultipleImports:true,generateScopedName:'[path]___[name]__[local]___[hash:base64:5]',filetypes:{'.scss':{syntax:'postcss-scss',}}}]]}}其中generateScopedName是如果配置的话需要和style-loader中的localIdentName保持一致,否则styleName使用的名称会和实际生成的classname不一致,导致style失效!filetypes的配置是为了支持scss,scss样式会先由postcss-scss处理。综上所述,以上是我对CSSModules的第一次探索,我已经开始在我的项目中使用CSSModules。我可以随心所欲地编写样式,再也不用担心样式污染了。