浅谈webpack对样式的处理


Posted in Javascript onJanuary 05, 2018

本文介绍了webpack对样式的处理,分享给大家,具体如下:

我们可以在js中引入样式文件

require('myStyle.css')

这时我们便需要引入相应的webpack loader来帮助我们解析这段代码。

css-loader搭配style-loader

首先,我们可以引入css-loader和style-loader来处理css的解析,其中,css-loader是用来解析css文件,style-loader是用来将css文件嵌入到js文件里

var path = require('path')
module.exports = {
 context: path.join(__dirname, 'src')
 entry: './',
 module: {
 rules: [
  {
  test: /\.css$/,
  include: [
   path.join(__dirname, 'src')
  ],
  use: ['style-loader', 'css-loader']
  }
 ]
 },
 output: {
  path: path.join(__dirname, 'dist'),
  filename: '[name].bundle.[hash].js'
 }
}

在上面的代码里,解析顺序是从右到左解析,先使用css-loader解析出css文件之后,再使用style-loader嵌入到js代码里。

如果你使用less来写样式的话,则需要先用less-loader来编译样式文件为css文件,再继续使用css-loader与style-loader。另外,loader加载器可以省略后面的-loader。所以上面的代码可以缩写成

module: {
 rules: [
 {
  test: /\.css$/,
  include: [
  path.join(__dirname, 'src')
  ],
  use: ['style', 'css', 'less']
 }
 ]
}

一般在测试环境里为了快点编译css,会用这种方式多一点,但是这样子编译出来的js文件会比较大,不大适合在生产环境里使用。

编译成单独的文件

上面的做法会把css和js打包在一起,减少实际请求的次数,但是由于编译出来的js文件比较大,浪费带宽。因此,我们使用extract-text-webpack-plugin插件,把css文件编译成独立的文件。我们就可以利用CDN把这个文件推送到节点服务器,或者根据视情况按需加载,进而优化客户请求链路,加速页面响应。

var path = require('path'),
 ExtractTextPlugin = require('extract-text-webpack-plugin')
module.exports = {
 context: path.join(__dirname, 'src'),
 entry: './',
 module: {
 rules: [{
  test: /\.css$/,
  include: [
  path.join(__dirname, 'src')
  ],
  use: ExtractTextPlugin.extract({
  fallback: 'style',
  use: 'css'
  })
 }]
 },
 output: {
  path: path.join(__dirname, 'dist'),
  filename: '[name].bundle.[hash].js'
 },
 plugins: [
 new ExtractTextPlugin('[name].css')
 ]
}

通过上面的代码,我们使用extract-text-webpack-plugin插件处理src目录下所有的css文件,先使用css-loader插件解析出css代码,如果解析失败,使用style-loader插件解析,最终在dist目录下生成对应的js文件

兼容旧浏览器

以前我们写样式时,有些样式不同浏览器需要加不同的前缀,如-webkit-。现在有了构建工具,我们便不需要再去关注这些前缀了,构建工具会自动帮我们加上这些前缀。

对于webpack我们自然想到需要使用loader或者plugin来帮助我们做这些事情,查了下发现autoprefixer-loader已经废弃不再维护了,推荐使用posscss

postcss是用于在js中转换css样式的js插件,需要搭配其他插件一起使用,这点和babel6一样,本身只是个转换器,并不提供代码解析功能。

这里我们需要autoprefixer插件来为我们的样式添加前缀。首先下载该模块。

npm install -D autoprefixer

接着便可以配置webpack了

var autoprefixer = require('autoprefixer')
module.exports = {
 ...
 module: {
 loaders: [
  ...
  {
  {
   test: /\.css$/,
   loader: ExtractTextPlugin.extract(["css", "postcss"])
  },
  }
 ]
 },
 postcss: [autoprefixer()],
 ...
}

查看一下抽取出来的样式文件便可以发现已经加上了前缀

a {
 display: flex;
}
/*compiles to:*/
a {
 display: -webkit-box;
 display: -webkit-flex;
 display: -ms-flexbox;
 display: flex
}

另外autoprefixer还可以根据目标浏览器版本生成不同的前缀个数,例如你的应用的使用用户如果大多数是使用比较新版本的浏览器,那么便可以做如下配置。

postcss: [autoprefixer({ browsers: ['last 2 versions'] })] 这是生成的样式便会有些不一样,还是上面的例子

a {
 display: flex;
}
/*compiles to:*/
a {
 display: -webkit-flex;
 display: -ms-flexbox;
 display: flex;
}

样式压缩

压缩代码我们可以使用webpack的内置插件UglifyJsPlugin来做,它既可以压缩js代码也可以压缩css代码。

plugins: [
 ...
 new webpack.optimize.UglifyJsPlugin({
 compress: {
  warnings: false
 }
 }),
 ...
]

其实并不能说是在压缩css代码,本质来说还是压缩js代码,再将这块代码输出到css文件中。

使用CommonsChunkPlugin抽取公共代码

首先要明确一点CommonsChunkPlugin是在有多个entry时使用的,即在有多个入口文件时,这些入口文件可能会有一些共同的代码,我们便可以将这些共同的代码抽取出来成独立的文件。明白这一点非常重要。(搞了很久才明白的一点,唉~~~~)

如果在多个entry中require了相同的css文件,我们便可以使用CommonsChunkPlugin来将这些共同的样式文件抽取出来为独立的样式文件。

module.exports = {
 entry: {
 "A": "./src/entry.js",
 "B": "./src/entry2.js"
 },
 ...
 plugins: [
 new webpack.optimize.CommonsChunkPlugin({
 name: "commons", filename: "commons.js"
 }),
 ...
 ]
}

当然,这里不止会抽取共同的css,如果有共同的js代码,也会抽取成为commons.js。 这里有个有趣的现象,抽取出来的css文件的命名将会是参数中name的值,而js文件名则会是filename的值。

CommonsChunkPlugin好像只会将所有chunk中都共有的模块抽取出来,如果存在如下的依赖

// entry1.js
var style1 = require('./style/myStyle.css')
var style2 = require('./style/style.css')

// entry2.js
require("./style/myStyle.css")
require("./style/myStyle2.css")

// entry3.js
require("./style/myStyle2.css")

使用插件后会发现,根本没有生成commons.css文件。

如果我们只需要取前两个chunk的共同代码,我们可以这么做

module.exports = {
 entry: {
 "A": "./src/entry.js",
 "B": "./src/entry2.js",
 "C": "./src/entry3.js"
 },
 ...
 plugins: [
 new webpack.optimize.CommonsChunkPlugin({
 name: "commons", filename: "commons.js", chunks: ['A', 'B']
 }),
 ...
 ]
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
根据分辩率调用不同的CSS.
Jan 08 Javascript
基于jquery的lazy loader插件实现图片的延迟加载[简单使用]
May 07 Javascript
jquery ajax学习笔记2 使用XMLHttpRequest对象的responseXML
Oct 16 Javascript
可以浮动某个物体的jquery控件用法实例
Jul 24 Javascript
JavaScript兼容浏览器FF/IE技巧
Aug 14 Javascript
jQuery学习之DOM节点的插入方法总结
Jan 22 Javascript
详解AngularJS中$filter过滤器使用(自定义过滤器)
Feb 04 Javascript
js Canvas绘制圆形时钟效果
Feb 17 Javascript
js中的事件委托或是事件代理使用详解
Jun 23 Javascript
微信小程序按钮去除边框线分享页面功能
Aug 27 Javascript
vue--点击当前增加class,其他删除class的方法
Sep 15 Javascript
jquery实现图片无缝滚动 蒙版遮蔽效果
Jan 11 jQuery
js实现HTML中Select二级联动的实例
Jan 05 #Javascript
详解tween.js 中文使用指南
Jan 05 #Javascript
Javascript中从学习bind到实现bind的过程
Jan 05 #Javascript
JS实现数组简单去重及数组根据对象中的元素去重操作示例
Jan 05 #Javascript
vue 中directive功能的简单实现
Jan 05 #Javascript
浅谈React前后端同构防止重复渲染
Jan 05 #Javascript
使用vue实现grid-layout功能实例代码
Jan 05 #Javascript
You might like
使用PHP批量生成随机用户名
2008/07/10 PHP
10个可以简化php开发过程的MySQL工具
2010/04/11 PHP
常用的PHP数据库操作方法(MYSQL版)
2011/06/08 PHP
php实现邮件发送并带有附件
2014/01/24 PHP
Js动态创建div
2008/09/25 Javascript
javascript new一个对象的实质
2010/01/07 Javascript
JQuery的一些小应用收集
2010/03/27 Javascript
javascript错误的认识不用关心内存管理
2012/12/15 Javascript
Jquery UI震动效果实现原理及步骤
2013/02/04 Javascript
打开新窗口关闭当前页面不弹出关闭提示js代码
2013/03/18 Javascript
jquery实现拖拽调整Div大小
2015/01/30 Javascript
js变形金刚文字特效代码分享
2015/08/20 Javascript
jQuery倒计时代码(超简单)
2017/02/27 Javascript
深入理解 Koa 框架中间件原理
2018/10/18 Javascript
微信小程序绘制图片发送朋友圈
2019/07/25 Javascript
webpack的tree shaking的实现方法
2019/09/18 Javascript
React+EggJs实现断点续传的示例代码
2020/07/07 Javascript
JavaScript函数柯里化实现原理及过程
2020/12/02 Javascript
在Python中使用HTMLParser解析HTML的教程
2015/04/29 Python
浅谈Python实现2种文件复制的方法
2018/01/19 Python
Python利用多线程同步锁实现多窗口订票系统(推荐)
2019/12/22 Python
python 解决cv2绘制中文乱码问题
2019/12/23 Python
在win64上使用bypy进行百度网盘文件上传功能
2020/01/02 Python
Python3自定义http/https请求拦截mitmproxy脚本实例
2020/05/11 Python
keras实现基于孪生网络的图片相似度计算方式
2020/06/11 Python
Python爬虫逆向分析某云音乐加密参数的实例分析
2020/12/04 Python
在使用非全零作为空指针内部表达的机器上, NULL是如何定义
2014/11/09 面试题
给定一个时间点,希望得到其他时间点
2013/11/07 面试题
给女儿的表扬信
2014/01/18 职场文书
校园歌咏比赛主持词
2014/03/18 职场文书
内蒙古鄂尔多斯市市长寄语
2014/04/10 职场文书
加入学生会演讲稿
2014/04/24 职场文书
小学课外阅读总结
2014/07/09 职场文书
员工生日活动方案
2014/08/24 职场文书
2014年旅游局法制宣传日活动总结
2014/11/01 职场文书
Spring Data JPA框架的核心概念和Repository接口
2022/04/28 Java/Android