webpack实战——样式文件分离

时间:2022-07-23
本文章向大家介绍webpack实战——样式文件分离,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

前言

这是webpack实战系列笔记的第7篇记录——分离样式,前几篇记录如下:

  • 打包第一个应用
  • 模块化与模块打包
  • 资源输入与输出
  • 一切皆模块
  • 预处理器【上篇】
  • 预处理器——常用loader【下篇】

在之前篇章里面主要是对js的打包应用和处理,而打包方面另外一个重要工作就是样式处理

在实际工程中,如果项目具有一定规模,那么CSS的维护成本则会比较高昂,这个时候就需要更友好且更低价的方式来处理样式问题。本篇介绍webpack结合样式编辑器、转换器及相关插件来提升样式方面的开发效率。

分离样式

1. 分离样式文件概念

在之前写的简单demo中,处理过关于CSS,并且在预处理器篇介绍过关于CSS的预处理器:style-loader和css-loader。通过JS引入CSS样式去打包,在编写阶段可以直观的描述出来模块之间的依赖关系。

但是问题随之而来:在打包后,我们对css样式的添加,是通过标签<style>来引入的,可生产环境下,一般我们希望样式存在于CSS文件中而不是style标签中,因为文件更有利于客户端进行缓存。那么我们怎么输出单独的CSS文件呢?

2. mini-css-extract-plugin

“该插件主要是用于提取样式到CSS文件的。

特性:

  • 可处理多样式文件
  • 支持按需加载

3 安装

两种方式 选择一种即可

yarn add mini-css-extract-plugin
// 或
npm install mini-css-extract-plugin

4. 举例

举个例子:

a.js引入自身a.css样式,并引入b.js,而b.js也有自身相应的b.css样式,那么最终样式会被同步加载,通过index.html的link标签加载进来。

a.js

import './a.css'
import './b.js'

document.write('A.JS<br/>');

a.css

body{
    background: deepskyblue;
}

b.js

import './b.css'

document.write('B.JS<br/>');

b.css

body{
    background: thistle;
}

webpack.config.js

const MiniCssExtractPlugin = require('mini-css-extract-plugin')

module.exports = {
    entry: {
        index: './src/a.js',
    },

    output: {
        filename: '[name].js'
    },
    mode: 'development',

    // loader配置
    module: {
        rules: [
            // css
            {
                test: /.css$/,
                use: [
                    {
                        loader: MiniCssExtractPlugin.loader,
                        options: {
                            publicPath: '../'
                        }
                    },
                    'css-loader'
                ]
            }
        ],        
    },

    plugins: [
        new MiniCssExtractPlugin({
            filename: '[name].css',
            chunkFilename: '[id].css'
        })
    ]
}

打包

yarn build
// 或
npm run build

build

HTML引入

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="./dist/index.css">
    <title>style</title>
</head>
<body>
    
    <script src="./dist/index.js"></script>
</body>
</html>

运行结果

运行引入了脚本和样式的HTML文件,查看结果:

结果

小结

其实本篇就是单独拎出来了一个loader预处理器来介绍:mini-css-extract-plugin。目的就是生产环境下,通过link引入样式存在于CSS文件中而不是style标签中,这样更有利于客户端进行缓存。

下一篇介绍样式预处理