03-02.使用Loader打包样式文件

2019-04-21  本文已影响0人  v刺猬v

使用Loader打包样式文件

首先对上一节的代码进行编辑(/source_code/03/03-02)

文件结构

代码:

import avatar from '../images/avatar.jpg'
import './index.css'

let img = new Image()
img.src = avatar
img.classList.add('avatar')
let root = document.getElementById('root')
root.appendChild(img)
.avatar {
  width: 150px;
}

直接运行打包,控制台输出

ERROR in ./source_code/03/03-02/src/index.css 1:0
Module parse failed: Unexpected token (1:0)
You may need an appropriate loader to handle this file type.

原因在于webpack并不能直接识别.css格式的文件,这时我们就需要借助loader对css样式文件进行编译打包

使用css-loader和style-loader

npm i style-loader, css-loader -D

这次就打包成功了,我们再次修改一下代码结构

.avatar {
  width: 150px;
}
@import './avatar.css'

重新打包,依旧成功编译打包成功。那我们看下css-loader和style-loader执行,都做了些什么。

  1. 首先css-loader将其他文件所有文件,包括通过@import语法导入的文件,整合到一起。
  2. 其次style-loader将这些css,以一个style元素的形式插入到入口文件(index.html)的header元素当中。
    WX20190419-184606@2x.png

这样webpack就能识别css样式文件,并作为模块,被引入到项目文件中了。

编译打包scss样式文件(/source_code/03/03-03)

//...
module: {
  rules: [{
    test: /\.scss$/,
    use: ['style-loader', 'css-loader', 'sass-loader']
  }]
}
//...

在webpack的配置中,loader是有先后顺序的要求的。loader的执行顺序是从下到上,从右到左。所以use: ['style-loader', 'css-loader', 'sass-loader']中,我们先使用sass-loader,对sass语法进行翻译,再使用css-loader,对样式进行整合,最后,使用style-laoder将整理好的样式,插入到目标文件的header元素中。

使用postcss-loader为样式增加厂商前缀

module.exports = {
  plugins: [
    require('autoprefixer')
  ]
}
//...
module: {
  rules: [{
    test: /\.jpg$/,
    use: 'file-loader'
  }, {
    test: /\.scss$/,
    use: [
      'style-loader',  
      'css-loader', 
      'postcss-loader',
      'sass-loader'
    ]
  }]
}
//...
WX20190419-193224@2x.png

我们可以看到postcss-loader和autoprefixer已经为相关的CSS3语法的代码,加入了对应的厂商前缀。

css-loader中一些常用的配置项

{
  test: /\.scss$/,
  use: [
    'style-loader',
    {
      loader: 'css-loader',
      options: {
        importLoaders: 2  // Number of loaders applied before CSS loader
      }
    }, 
    'postcss-loader',
    'sass-loader'
  ]
}
{
  test: /\.scss$/,
  use: [
    'style-loader',
    {
      loader: 'css-loader',
      options: {
        importLoaders: 2  // Number of loaders applied before CSS loader
        modules: true  // 开启CSS模块化
      }
    }, 
    'postcss-loader',
    'sass-loader'
  ]
}
import avatar from '../images/avatar.jpg'

function Avatar() {
  let root = document.getElementById('root')
  let img = new Image()
  img.src = avatar
  root.appendChild(img)
}

export default Avatar
import avatar from '../images/avatar.jpg'
import style from './index.scss' //CSS模块化语法
import Avatar from './avatar'

new Avatar()

let img = new Image()
img.src = avatar
img.classList.add(style.avatar) // 模块化的使用CSS样式类
let root = document.getElementById('root')
root.appendChild(img)

使用webpack打包字体文件(/source_code/03/03-04)

@font-face {font-family: "iconfont";
  src: url('../font/iconfont.eot?t=1555679325036'); /* IE9 */
  src: url('../font/iconfont.eot?t=1555679325036#iefix') format('embedded-opentype'), /* IE6-IE8 */
  url('../font/iconfont.woff?t=1555679325036') format('woff'),
  url('../font/iconfont.ttf?t=1555679325036') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
  url('../font/iconfont.svg?t=1555679325036#iconfont') format('svg'); /* iOS 4.1- */
}

.iconfont {
  font-family: "iconfont" !important;
  font-size: 16px;
  font-style: normal;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

.iconpaper:before {
  content: "\e662";
}

@import './avatar.scss'
import './index.scss'

let root = document.getElementById('root')
let icon = document.createElement('i')
icon.classList.add('iconfont', 'iconpaper')
root.appendChild(icon)
{
  test: /.(eot|svg|ttf|woff|woff2)/,
  use: 'file-loader'
}

阅读资料

上一篇 下一篇

猜你喜欢

热点阅读