分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > IT知识

css module

发布时间:2023-09-06 01:15责任编辑:赖小花关键词:暂无标签

来源:CSS Modules 用法教程

后面项目地址:https://github.com/947133297/lwj-webpack-demo

关键是打开这一行,表示开启loader的css module功能:

{ test: /\.css$/, loader: ‘style-loader!css-loader?modules‘ },

局部作用域测试

border.css

body { ??border: 10px solid darkmagenta;}.qwe{ ???border: 10px solid black;}#eee{ ???border: 10px solid green;}.outer .inner{ ???border: 10px solid red;}

app.css

body { ?background-color: blue;}:global(.qwe){ ?font-size: 40px;}#eee{ ?color: aqua;}.outer .inner{ ?font-weight: 900;}

入口js文件

require(‘./app.css‘);var other1 = require(‘./border.css‘);// Cannot read property ‘inner‘ of undefined// var html1 = ‘<div class="‘+other1.outer.inner+‘">other1</div>‘;var html1 = ‘<div class="‘+other1.outer+‘"><div class="‘+other1.inner+‘">border test1</div></div>‘;var html2 = ‘<div class="‘+other1.qwe+‘">border test2</div>‘;var html3 = ‘<div id=‘+other1.eee+‘>border test id</div>‘;document.write(html1);document.write(html2);document.write(html3);

打包后的文件中有两段这样的代码:

exports.locals = { ???"eee": "_3omJ4gpO6T45EFo0ZOMzz3", ???"outer": "_2R2TiJtwoE2Ka6dR0UXOk1", ???"inner": "_2Zm3l9VFNoYdhD18zUhAsL"};//...exports.locals = { ???"qwe": "qhJc-oYXMZ34_XRr59Qtz", ???"eee": "_2EWJ0p0M9i7zNLMpM4YhOW", ???"outer": "_1wB3wnxbesTSl4WbD-h9aP", ???"inner": "_136k_jaRt4SbXZzJIe6J6O"};

运行效果:

<style type="text/css"> ?body { ???background-color: blue; ?} ?.qwe{ ???font-size: 40px; ?} ?#_3omJ4gpO6T45EFo0ZOMzz3{ ???color: aqua; ?} ?._2R2TiJtwoE2Ka6dR0UXOk1 ._2Zm3l9VFNoYdhD18zUhAsL{ ???font-weight: 900; ?}</style><style type="text/css"> ?body { ???border: 10px solid darkmagenta; ?} ?.qhJc-oYXMZ34_XRr59Qtz{ ???border: 10px solid black; ?} ?#_2EWJ0p0M9i7zNLMpM4YhOW{ ???border: 10px solid green; ?} ?._1wB3wnxbesTSl4WbD-h9aP ._136k_jaRt4SbXZzJIe6J6O{ ???border: 10px solid red; ?}</style><body> ?<div class="_1wB3wnxbesTSl4WbD-h9aP"> ???<div class="_136k_jaRt4SbXZzJIe6J6O">border test1</div> ?</div><div class="qhJc-oYXMZ34_XRr59Qtz">border test2</div> ?<div id="_2EWJ0p0M9i7zNLMpM4YhOW">border test id</div> ?<h1>Hello World</h1> ?<span class="qwe">3333</span> ?<span id="eee">4444</span> ?<div class="outer"> ???<div class="inner"> ?????bold ???</div> ?</div></body>

结论:

  • 只要require了一个css,这个css会被预处理成css module(前提是打开了css-loader的module参数),然后添加由style-loader把处理后的内容到html中
  • 预处理的过程会把css中所有自定义的标识符(除标签选择符、以及global修饰外),都进行编码处理成另一个一一对应的标识符(猜测编码的主体包括选择符和文件名),这样被添加进html之后,虽然都是全局作用的,但不同css module之间同名的选择符会被编码成不同的标识,也就互不影响,就达到了“作用域”的目的了
  • 在js中使用的时候,可以通过导入的模块来获取转换后的标识符,从而为dom动态使用不同css module中样式
  • 以组件的概念来理解这里的应用场景,一个组件依赖于css,对这个css进行module预处理后,然后在js中动态获取预处理后标识,应用组件中样式。这样一来,组件间的样式就不会互相影响了。可见,要达到这样的目的,必须要动态处理样式,因为html中的类、id等不会被进行预处理。

组合class

dep.css

.depclass{ ???color: darkmagenta;}

combine.css

.red{ ???background-color: red;}.content{ ???composes: red; ???composes: depclass from ‘./dep.css‘; ???border: 2px solid #000;}

入口文件添加如下代码:

var c = require(‘./combine.css‘);var html4 = ‘<div class="‘+c.content+‘">compose test</div>‘;document.write(html4);

bundle.js有如下两段代码:

exports.locals = { ???"depclass": "_3o2XDTxGMaBRvs2mRiV1es"};//...exports.locals = { ???"red": "_1KvM5G6-rmsDcUM_AatNkH", ???"content": "_3oH95_iAzM0qUNDaF3GCxv _1KvM5G6-rmsDcUM_AatNkH " + __webpack_require__(2).locals["depclass"] + ""};

运行结果

<style type="text/css"> ?._1KvM5G6-rmsDcUM_AatNkH{ ???background-color: red; ?} ?._3oH95_iAzM0qUNDaF3GCxv{ ???border: 2px solid #000; ?}</style><style type="text/css"> ?._3o2XDTxGMaBRvs2mRiV1es{ ???color: darkmagenta; ?}</style><div class="_3oH95_iAzM0qUNDaF3GCxv _1KvM5G6-rmsDcUM_AatNkH _3o2XDTxGMaBRvs2mRiV1es">compose test</div>

结论:

  • 这次测试依赖了2个css,但运行的时候,发现只请求了一个bundle.js,而没有请求这两个css,是因为这两个css中的全部内容都打包到bundle.js中了。这就是webpack一个非常大的优点,组件化,减少网络请求次数
  • 被间接依赖的css,虽然没有在入口文件中调用require,但它的内容也被处理进来了,可见被require的css,中依赖了其他的css,这一系列的css都会被处理进来
  • compose提供一种简便的多个类的书写方式,支持组合当前文件中以及外部文件中的类;不用compose的话,自己在js中引用,然后拼接类名,再写到dom上也是没问题,如果要用到外部其他文件的话,还要自己去require,麻烦了些而已
  • 被引用的不管是直接引用(require)或者间接引用(compose),都会把这个被引用的文件内容全部加载进来

scss

修改配置文件如下:

 loaders:[ ?????{ test: /\.s?css$/, loader: ‘style-loader!css-loader?modules!sass-loader‘ }, ???]

1.scss:

$primaryColor: #333;.s1{ ?background: $primaryColor; ?composes: s1 from ‘./2.scss‘;}

2.scss:

$borderColor: red;.s1{ ?border: 1px solid $borderColor;}

入口文件:

var s = require(‘./scss/1.scss‘);var html5 = ‘<div class="‘+s.s1+‘">scss test</div>‘;document.write(html5);

打包:

exports.locals = { ???"s1": "_2KqHQfE-Ms43DCsHA7wfbk"};exports.locals = { ???"s1": "EhwNnMc7oenHygrKydr1t " + __webpack_require__(3).locals["s1"] + ""};

运行结果:

<style type="text/css"> ?$borderColor: red; ?._2KqHQfE-Ms43DCsHA7wfbk{ ???border: 1px solid $borderColor; ?}</style><style type="text/css"> ?.EhwNnMc7oenHygrKydr1t { ???background: #333; ??}</style><div class="EhwNnMc7oenHygrKydr1t _2KqHQfE-Ms43DCsHA7wfbk">scss test</div>

结论:

  compose进来的scss,并没有被scss-loader所处理。所以如果要实现相关的引入功能,就只能用scss中的引入语法了。compse仅仅支持css

css module

原文地址:http://www.cnblogs.com/hellohello/p/7625540.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved