美文网首页
webpack 打包 css

webpack 打包 css

作者: zbcy0012 | 来源:发表于2018-12-07 10:51 被阅读0次

webpack 不会直接识别任何非 js 文件,包括 html 和 css 文件,所以我们才要用到 html-webpack-plugin 和 css-loader 等。

一、打包 .css 文件(一般形式)

这里我们使用 webpack 官方推荐方式,也以此作为起始方式———使用 css-loader 和 style-loader 。

  • css-loader(官方解释):

The css-loader interprets @import and url() like import/require() and will resolve them.
css-loader 解释(interpret) @import 和 url() ,会 import/require() 后再解析(resolve)它们。

  • style-loader(官方解释):

Adds CSS to the DOM by injecting a <style> tag
将 css 以 <style /> 的形式注入到 DOM 当中

用法:

1.安装
npm i -D css-loader style-loader
2.配置 webpack.config.js
//css 加载(内联)
const cssRules = {
    test: /\.css$/,
    use: [{ loader: "style-loader" }, { loader: "css-loader" }]
};

module.exports = {
    entry:...,
    output: ...,
    module: {
        rules: [
            //内联式解决,图片外放
            cssRules
        ]
    },
};

这样,你已经指示了 webpack 在面对.css 文件时该如何解析了。
打包之后可以看到你写的 css 已经生效,并且这种做法不会生成 .css 文件,因为 css 代码已经被打包进 js 文件了,最终运行脚本时,把 css 处理为 <style /> 然后插入到 html 中。

二、打包 .png|.jpg|.gif 文件

我们常常会用到

{
  background:url(...);
}

上述的方式是无法将分离于 css、js 文件的图案媒体文件打包出来的,后果就是造成你虽然成功解释了 url(...),但是却因为没有相关的输出文件而发生一个“not found”的错误。

  • file-loader(官方解释):

Instructs webpack to emit the required object as file and to return its public URL
指示 webpack 执行将需要的对象以文件的形式引入并返回其发布地址的动作。

  • url-loader(官方解释):

Loads files as base64 encoded URL
将文件以 base64 编码的形式进行 url 编码。

他们都可以将外部的非 js 文件打包到输出位置,区别就是 url-loader 可以将一些不超出规格的媒体文件编码进 js 文件,总大小不变但是减少了请求次数。
所以这里我使用 url-loader。

1.安装
npm i -D url-loader
2.配置 webpack.config.js
//css 加载(内联)
const cssRules = {
    test: /\.css$/,
    use: [{ loader: "style-loader" }, { loader: "css-loader" }]
};
//引入图片加载规则
const pictureRules= {
    test: /\.(png|jpg|gif)$/,
    use: [
        {
            loader: "url-loader",
            options: {
                limit: 8192,
                outputPath: "images/"
            }
        }
    ]
};
module.exports = {
    entry:...,
    output: ...,
    module: {
        rules: [
            //内联式解决,图片外放
            cssRules,
            pictureRules
        ]
    },
};

在 url-loader 的 options 中配置 outputPath 可以指定这些媒体文件输出到什么位置。

//index.js
import './style.css';

你现在可以内联式地引入所有你需要的 css 文件了。
如果你使用 react 当中需要配合 jsx 来引入某图片例如:

//render.js
import React from 'react';
import image from './path/xxx.png';

export default class Z extends React.Component{

  render(){
    return (<image src={image} />)
  }
}

这种配置同样可以满足你的 js 引入需求。

三、外挂式引入 css

如果你不喜欢把 css 以 <style/> 的形式引入,而一定要把 css 单独拎出来作 .css 文件的形式,那么你可以像这样操作:

配置 webpack.config.js
//css 加载(外挂)
const cssRules2 = {
    test: /\.css$/,
    use: [{ loader: "style-loader/url" }, { loader: "url-loader" }]
};
//引入图片加载规则
const pictureRules= {
    test: /\.(png|jpg|gif)$/,
    use: [
        {
            loader: "url-loader",
            options: {
                limit: 8192,
                outputPath: "images/"
            }
        }
    ]
};
module.exports = {
    entry:...,
    output: ...,
    module: {
        rules: [
            cssRules2,
            pictureRules
        ]
    },
};

这种做法同样是以脚本的方式将 css 以 <link/> 的形式插入到 html 文件中。并且生成 .css 文件到输出目录。但是这样做并不完整,因为 .css 文件中的 url() 会被直接抄过来,而不会随同打包后的位置和名称而变化,所以凡是带有 url() 的属性都会发生“not found”的错误,其他正常。
截至发稿日期,笔者还没有搞到一个明确而完美的方式来完全外挂 css。由于并非刚需,暂时不做深入研究,如有新进展,笔者将更新本文。

更多配置请参考
webpack 官网 css-loader
webpack 官网 style-loader
webpack 官网 url-loader
webpack 官网 url-loader


作者水平有限,如有错误,欢迎指正交流。


相关文章

网友评论

      本文标题:webpack 打包 css

      本文链接:https://www.haomeiwen.com/subject/rbdocqtx.html