webpack 学习笔记:引入 CSS(上)

本篇文章介绍如何在 webpack 中使用 CSS。

webpack 默认只能解析 .js 文件和 .json 文件。如果是 CSS 的话,就需要额外引入 css-loaderstyle-loader 来处理了。

引入 CSS 资源

首先安装下依赖:

npm install --save-dev style-loader css-loader

然后修改下配置,添加对 CSS 文件的解析支持:

const path = require('path');

module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist')
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          'style-loader',
          'css-loader'
        ]
      }
    ]
  }
}

style.css

.hello {
  color: red;
}

接下来在 src/index.js 中引入:

import join from 'lodash/join';
import './style.css';

function component() {
  const element = document.createElement('div');
  element.innerHTML = join(['Hello', 'webpack'], ' ');
  element.classList.add('hello');

  return element;
}

document.body.appendChild(component());

重新构建项目 npm run build,就能看到红色的 Hello webpack 了。

webpack 学习笔记:引入 CSS

可以看见,style.css 里的内容以 <style> 标签的形式插入到了 <head> 中——这正是 style-loader 所做的事情。而 css-loader 做的,是处理以 .css 后缀引入的资源,将文件内容装换为 webpack 理解的 CommonJS 代码格式。

使用图片

CSS 难免会碰到引用图片的场景,我们试着在 style.css 中引入图片试试。

.hello {
  color: red;
+  background: url("./images/demo.jpeg");
}

然后编译,发现会有报错:

ERROR in ./src/images/demo.jpeg 1:0
Module parse failed: Unexpected character '�' (1:0)
You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders

这是因为 webpack 不能正确解析 demo.jpeg 的原因,为此需要安装 file-loader 来处理图片解析。

npm install --save-dev file-loader
const path = require('path');

module.exports = {
  ...
  module: {
    rules: [
      ...
      {
        test: /\.(png|svg|jpe?g|gif)$/,
        use: [
          'file-loader'
        ]
      }
    ]
  }
};

再次解析,发现就可以了。

npm run build

...
                                Asset      Size  Chunks                         Chunk Names
                            bundle.js  21.4 KiB    main  [emitted]              main
c23c4a29e2a53a448534478a15da11f5.jpeg    58 KiB          [emitted] [immutable]
...

webpack 学习笔记:引入 CSS

当然,我们还可以使用 url-loader 来替换 file-loader,对图片资源做进一步的控制:base64 编码。

url-loader 的介绍如下:

url-loader works like file-loader, but can return a DataURL if the file is smaller than a byte limit.

下面我们修改下配置,让 url-loader 来处理图片。

npm install url-loader --save-dev
// {
//   test: /\.(png|svg|jpe?g|gif)$/,
//   use: [
//     'file-loader'
//   ]
// },
{
    test: /\.(png|jpe?g|gif|svg|eot|ttf|woff|woff2)$/i,
    loader: 'url-loader',
    options: {
        limit: 81920,
    },
}

低于 80KB (81920 / 1024 = 80)的文件(注:这里只是作为演示使用,实际项目 8KB 就足够了)会被 base64 处理,嵌入到打包文件中,而不单独作为文件输出。

...
    Asset    Size  Chunks             Chunk Names
bundle.js  99 KiB    main  [emitted]  main
...

成功。

(完)

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!