10.css模块化

10.1.什么是css模块?

CSS模块就是所有的类名都只有局部作用域的CSS文件,当你在一个JavaScript模块中导入一个CSS文件时,CSS模块将会定义一个对象,将文件中类的名字动态的映射为JavaScript作用域中可以使用的字符串,CSS模块不是浏览器中的官方标准(official spec) 或者 实践(implementation) 而是一个(在Webpack或者Browserify的帮助下)改变类名和选择器的作用域到当前文件(类似于命名空间)的构建过程

通俗的说,css模块化,就是把css文件当作是模块来用,引入一个css文件的时候,得到一个对象,通过对象.类名的这种形式来使用css样式,这样做的好处就是所有类名都挂在了一个对象上,防止同名的类起冲突

10.2.在webpack中使用css模块化

首先,在src/assets/css/index.css文件中写入一段测试代码

.pbox{
border: 4px solid black;
color: red;
}

  

在src/assets/js/index.js中写入一段测试代码

// 引入icon图标字体
//import "font-awesome/css/font-awesome.css" // 引入图片 import imgSrc from '../img/nodeing.jpg' // 把图片插入到html网页中 // document.getElementById("box").innerHTML = '<img src="'+imgSrc+'" />' // 测试css模块 import styles from '../css/index.css' document.getElementById("box").innerHTML = `<p class="${styles.pbox} ">hello nodeing</p>`

  

此时,运行npm start是看不到css样式的,我们必须在webpack.config.js中增加配置,开启css模块化才行,配置修改如下:

{
test: /\.css$/,
use: [
'style-loader',
{
loader: 'css-loader',
options: {
name: 'assets/css/[name]_[hash:4].[ext]',
module: true,
localIdentName: '[path]-[name]-[local]-[hash:base64:6]'
}
}
]
},

  

配置修改后npm start运行就可以查看到css已经生效了,这上面的配置中

module: true, 表示开启模块化

localIdentName: '[path]-[name]-[local]-[hash:base64:6]' 表示定制类名称,[path]表示当前css文件路径,[name]表示当前css文件名称,[local]表示类名称(如:pbox),[hash:base64:6]表示base64的hash字符串,并且长度为6位

接下来,我们去src/assets/js/index.js中,把图标字体的css文件注释去掉

//import "font-awesome/css/font-awesome.css" 修改前
import "font-awesome/css/font-awesome.css"

  

修改了js文件,服务器会重启刷新,但是我们发现虽然我们引入了font-awesome.css这个文件,但是index.html中的图标仍然没有显示出来,以下是引用图标的html代码

<i class="fa fa-bath" aria-hidden="true"></i>
<i class="fa fa-envelope-open" aria-hidden="true"></i>
<i class="fa fa-microchip" aria-hidden="true"></i>
<i class="fa fa-user-circle-o" aria-hidden="true"></i>

这些图标没有生效的原因是,我们在webpack中开启了模块化,开启了模块化功能后,使用样式的方式变成了"对象.类名"的形式,而在index.html中我们还在使用原来的形式,这样就不会有效果

我们现在的需求就变成了:有些地方的css文件是需要开启模块化的,有些地方的css是不需要开启模块化的(例如:我们案例中的font-awesome.css文件),这个时候,我们需要去修改webpack配置,实现模块化文件的定制

{
test: /\.css$/,
use: [
'style-loader',
{
loader: 'css-loader',
options: {
name: 'assets/css/[name]_[hash:4].[ext]',
module: true,
localIdentName: '[path]-[name]-[local]-[hash:base64:6]'
}
}
],
//这条规则是需要开启模块化的,设置包含的文件夹
include: [
path.resolve(__dirname, 'src/assets')
]
},

  

我们在上面这条规则中配置了一条规则,include表示包含的意思,它的后面给一个数组,数组里面可以写一些路径,这些路径下的css文件就是需要开启模块化的css文件,既然是数组,那么就可以给多个路径

修改过了配置文件,我们必须重启服务器才行,所以ctrl+c先关掉服务器,再通过npm start来启动,这个时候我们发现报错了,这时报错是正常的,因为,当我们在 ‘test: /.css$/’这条正则表达式规则下加了include包含的路径,那么意味着只处理了include包含路径下的css文件,而include以外的css文件并没有loader来处理它,所以,报了这样一个错误:

ERROR in ./node_modules/font-awesome/css/font-awesome.css
Module parse failed: Unexpected character '@' (7:0)
//每次看到这句话,你就应该猜到要用对应的loader来处理对应的文件
You may need an appropriate loader to handle this file type.
| /* FONT PATH
| * -------------------------- */
| @font-face {
| font-family: 'FontAwesome';
| src: url('../fonts/fontawesome-webfont.eot?v=4.7.0');
@ ./src/assets/js/index.js 3:0-44
@ multi (webpack)-dev-server/client?http://localhost:8080 ./src/assets/js/index.js

  

既然明白了报错原因,解决方案就非常简单了,我们去修改webpack配置文件

{
test: /\.css$/,
use: [
'style-loader',
{
loader: 'css-loader',
options: {
name: 'assets/css/[name]_[hash:4].[ext]',
module: true,
localIdentName: '[path]-[name]-[local]-[hash:base64:6]'
}
}
],
//这条规则是需要开启模块化的,设置包含的文件夹
include: [
path.resolve(__dirname, 'src/assets')
]
},
{
test: /\.css$/,
use: [
'style-loader',
{
loader: 'css-loader',
options: {
name: 'assets/css/[name]_[hash:4].[ext]',
}
}
],
//这条规则是不需要开启模块化的,设置包含的文件夹
include: [
path.resolve(__dirname, 'node_modules')
]
},

  

从上面的配置,我们可以看出,解决思路很简单,就是我们把原来处理css文件的配置copy了一份,然后在copy的这份上做了修改,把css模块化设置去掉了,然后通过include设置了一个路径:path.resolve(__dirname, 'node_modules'),这个路径是第三方包的安装路径,我们的font-awesome.css文件就在这个路径下,意味着在这个路径下的所有文件都不会被模块化,这样就形成了一种结构,想让哪个路径下的文件不使用模块化功能,就在这个配置中添加路径就可以了,同理,想让哪个路径下的文件使用模块化功能,就在另一个css配置项中添加路径,到此,css模块化的基础内容就已经学完了

webpack最佳入门实践系列(6)的更多相关文章

  1. webpack最佳入门实践系列(5)

    9.路径相关 原来我们打包的东西都存放到了dist目录下,并没有进行分类存储,乱成一团,这一节我们就要处理一下打包的路径,让打包后的目录看起来更加优雅 9.1.代码准备 我们先建立起这样一个目录结构 ...

  2. webpack最佳入门实践系列(4)

    7.使用字体 7.1.安装字体库-font-awesome 我们通过npm来安装字体 npm install font-awesome --save 这个时候,我们的package.json配置文件变 ...

  3. webpack最佳入门实践系列(3)

    6.使用图片 6.1.尝试在css中引入图片 在src目录下新建css文件夹,并且在css文件夹下创建app.css文件,在src目录下新建images文件夹,放入一张图片,在app.css中引入这张 ...

  4. webpack最佳入门实践系列(2)

    3.插件 在前端迅速发展的今天,许多没有太多技术含量并且感觉是在浪费时间的事情,就可以交给构建工具来做,例如:我们去手动创建index.html,手动引入打包好的js文件等操作,都可以叫个webpac ...

  5. webpack最佳入门实践系列(1)

    1.webpack简介 webpack 是一个现代 JavaScript 应用程序的模块打包器(module bundler).它可以将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源 1 ...

  6. webpack的入门实践,看这篇就够了

    webpack的入门实践 我会将所有的读者概括为初学者,即使你可能有基础,学习本节之前我希望你具有一定的JavaScript和node基础 文中的 ... ...代表省略掉部分代码,和上面的代码相同 ...

  7. 【Vuejs】301- Vue 3.0前的 TypeScript 最佳入门实践

    前言 我个人对更严格类型限制没有积极的看法,毕竟各类转类型的骚写法写习惯了. 然鹅最近的一个项目中,是 TypeScript+ Vue,毛计喇,学之...-真香! 1. 使用官方脚手架构建 npm i ...

  8. python 最佳入门实践

    勿在浮沙筑高台,无论什么技术,掌握核心精神和api,是很重要的. 但是入门过程也可能不是一帆风顺的,这里有八个入门任务,看看你完成了没有: http://code.tutsplus.com/artic ...

  9. es6+最佳入门实践(13)

    13.模块化 13.1.什么是模块化 模块化是一种处理复杂系统分解为更好的可管理模块的方式.通俗的讲就是把一个复杂的功能拆分成多个小功能,并且以一种良好的机制管理起来,这样就可以认为是模块化.就像作家 ...

随机推荐

  1. webpack最小化lodash

    lodash作为一个比较常用的前端开发工具集,在使用webpack进行vendor分离的实践中,会遇到将整个lodash文件分离到vendor.js的问题.这样会使vendor.js文件变得特别大. ...

  2. scrapy--多爬虫

    大家好,我胡汉三又回来了!!!开心QAQ 由于最近一直在忙工作的事,之前学的一些爬虫知识忘得差不多了,只能再花多一些时间来回顾,否则根本无法前进.所以在这里也像高中老师那样提醒一下大家,--每天晚上花 ...

  3. 如何导入CSV数据 (python3.6.6区别于python2 环境)

    1.python2环境下 2.python3.6.6环境下 如果用python2环境下的代码,在python3.6.6环境下编译会出现以下问题: 错误(1): SyntaxError:Missing ...

  4. saltstack特点

    目录 saltstack特点 saltstack特点 实时交互 所有的minion机器同时执行命令 no freeloader 每一台salt minion上都装有执行master传来的命令所需要的程 ...

  5. oracle(sql)基础篇系列(一)——基础select语句、常用sql函数、组函数、分组函数

    花点时间整理下sql基础,温故而知新.文章的demo来自oracle自带的dept,emp,salgrade三张表.解锁scott用户,使用scott用户登录就可以看到自带的表. #使用oracle用 ...

  6. 以+scheduledTimerWithTimeInterval...的方式触发的timer,在滑动页面上的列表时,timer会暂定回调,为什么?如何解决?

    这里强调一点:在主线程中以+scheduledTimerWithTimeInterval...的方式触发的timer默认是运行在NSDefaultRunLoopMode模式下的,当滑动页面上的列表时, ...

  7. Activiti入门 -- 轻松解读数据库

    相关文章: <史上最权威的Activiti框架学习指南> <Activiti入门 --环境搭建和核心API简介> 在Activiti中,相对前身JBPM基础上又额外多了5张,框 ...

  8. 19、AngularJs知识点总结 part-1

    1.AngularJs AngularJs是一款JavaScript开源库,由Google维护,用来协助单一页面应用程序: AngularJs的目标是通过MVC模式增强基于浏览器的应用,使开发和测试变 ...

  9. windows 10的资源管理器不显示映射的网络驱动器怎么办?

    最近在使用映射网络驱动器的时候出现一个奇怪的现象.事情源于我在资源管理器里面映射了来自多个不同账号的网络驱动器.使用的是win10系统.映射不同账号的网络驱动器是不允许的.于是只能删掉其他账号和凭证重 ...

  10. Microsxxxxxxx-面试总结

    策略题 There are four kinds of cards, respectively, 1,2, 3,4 numbers. There are seven cards for each ty ...