解决css文件细分问题

要拆分css,就必须吧css当成像js那样的模块,要把css当成模块,就必须要有一个构建工具(wepack),它具备合并代码的能力

而webpack本身只能读取css的文件内容,并将其当做js代码进行分析,因此,会导致错误,于是,就必须有一个loader,将css转换为js代码

css-loader

css-loader的作用,就是将css代码,转换为js代码
它的原理极其简单,将css代码作为字符串导出

例如:

  1. .red{
  2. color:"#f40"
  3. }

经过css-loader转换后变成js代码

  1. module.exports='
  2. .red{color:"#f40"}
  3. '

上面的js代码经过简化后的,不代表真是的css-loader的转换后的代码,css-loader转换后的代码更加复杂,同时会导出更多的信息,但是核心的思想不变

再例如:

  1. .red{
  2. color:"#f40",
  3. background:url("./bg.png")
  4. }

经过css-loader后转换为变成js代码

  1. var import1=require("./bg.png");
  2. module.exports='.red
  3. {
  4. color:"#f40",
  5. background:url("${import1}")
  6. }
  7. '

这样一来,讲过webpack后续处理,会把依赖的./bg.png添加到模块的列表中,然后将代码转换为

  1. var import1=__webpack_require("./src/bgc.png");
  2. module.exports='.red
  3. {
  4. color:"#f40",
  5. background:url("import1")
  6. }
  7. '

再例如

  1. @import "./reset.css"
  2. .red
  3. {
  4. color:"#f40",
  5. background:url("./b.png")
  6. }

会转换为:

  1. var import1=require('./reset.css');
  2. var import2=require('./bg.png');
  3. module.exports=`${import1}
  4. .red{
  5. color:"#40",
  6. background:url("${import2}")
  7. }
  8. `

总结,css-loader干了什么

  1. 将css文件内容作为字符串导出
  2. 将css中的其他依赖作为require导入,以便webpack分析依赖

style-loader

由于css-loader仅提供了将css转换字符串的能力,剩余的事情要交给其他的loader或者plugin来处理

style-loader可以将css-loader转换后的代码进一步处理,将css-loader导出的字符串加入到页面的style元素中去

例如

  1. .red{
  2. color:"#f40"
  3. }

经过css-loader转换后

  1. module.exports=`.red{color:"#f40"}`

经过style-loader转换成

  1. module.exports=`.red{
  2. color:"#f40"
  3. }
  4. `
  5. var style=module.exports;
  6. var styleElem=document.createElement("style");
  7. styleElem.innerHTML=style;
  8. document.head.appendChild(styleElem);
  9. module.exports={}

以上代码均为简化代码,并不代表真是的代码
style-loader有能力避免同一个样式的重复导入