【WEBPACK】分离css单独打包

作者: izhongxia | 来源:发表于2016-05-13 20:09 被阅读28560次

    CHANGELOG

    2018-02-08 14:46:06

    刚看了下,网上查了 webpack单独打包css,找到的文章,本文比较靠前,但是由于写的比较混乱,因此重新整理一下内容,更通俗易懂一点。

    2018-02-01 14:45:23

    由于这篇文章只写了如何把CSS打包成一个CSS文件,没有讲解如何打包成多个CSS文件,经简友提点,这里添加上了 打包成多个CSS文件的方法。

    2016-05-17 11:55

    刚学习webpack,记录一下webpack如何单独打包css


    零、介绍

    以下是个人项目中总结出来的一些基本知识,记录在这里,加深自己的印象,也让大家能够更快速方便的了解webpack,并且使用它。能力所限,有错误或者问题,请帮忙指出。

    webpack 把所有的资源都当成了一个模块, CSS,Image, JS 字体文件 都是资源, 都可以打包到一个 bundle.js 文件中.

    image.png

    webpack基本的使用很简单,但是要方方面面都讲解的话内容很多,因此这边主要讲解一下 如何使用webpack单独打包css。

    至于打包出来,怎么加hash值,怎么替换html中的引用路径,怎么上传到CND可以使用gulp来实现。【有兴趣后面在写一篇文章】

    一、extract-text-webpack-plugin 用法

    单独打包css,在webpack需要使用一个插件,extract-text-webpack-plugin

    1. 安装extract-text-webpack-plugin

    // use npm 
    npm install extract-text-webpack-plugin --save-dev
    
    // or use yarn 
    yarn add extract-text-webpack-plugin
    

    2. 配置

    加载器里面写好插件的配置(使用什么加载器),在webpack的 plugins 里面设置抽离出来的CSS文件名叫什么。

    var Ex = require('extract-text-webpack-plugin');
    // ...省略
    module: {
      loaders: [{
        test: /\.less/,
        loader: Ex.extract('style-loader', 'css-loader','less-loader')  // 单独打包出CSS,这里配置注意下
      }]
    },
    plugins: [
      new Ex("【name】.css")
    ]
    
    

    稍微详细点,可以参考这个《extract-text-webpack-plugin 的使用及安装》


    <font color="red">下面放两个实际使用例子,方便大家理解</font>

    二、单页面应用,把JS里面的CSS单独打包

    打包一个文件,只需要常规的在入口的js文件引用 css文件即可, 打包成多个CSS文件,可以设置多个CSS入口,让webpack用 loader去打包。 和分割单独打包js文件一样。下面有两个例子。

    // webpack 1.x 配置   【早期使用的配置,那时候是1.x】
    /*   webpack.config.js   */
    var precss = require('precss');
    var cssnext = require('cssnext');
    var autoprefixer = require('autoprefixer');
    var cssnano = require('cssnano');
    var Ex = require('extract-text-webpack-plugin');
    module.exports = {
        entry: './index.js',
        output: {
          filename: 'index.js'
        },
        module: {
          loaders: [{
            test: /\.less/,
            loader: Ex.extract('style-loader', 'css-loader','less-loader')  // 单独打包出CSS,这里配置注意下
          }]
        },
        plugins: [
          new Ex("【name】.css")
        ]
      }
    

    三、webpack如何打包多个CSS文件

    2. 配置文件添加对应配置

    下面直接提供一个完成的多入口CSS打包配置

    // webpack 3.x 的配置
    var path = require('path')
    var glob = require('globby')  
    var webpack = require('webpack')
    var ExtractTextPlugin = require('extract-text-webpack-plugin')
    
    // CSS入口配置
    var CSS_PATH = {
      css: {
        pattern: ['./src/**/[^_]*.less', '!./src/old/**/*.less'],
        src: path.join(__dirname, 'src'),
        dst: path.resolve(__dirname, 'static/build/webpack'),
      }
    }
    
    // 遍历除所有需要打包的CSS文件路径
    function getCSSEntries(config) {
      var fileList = glob.sync(config.pattern)
      return fileList.reduce(function (previous, current) {
        var filePath = path.parse(path.relative(config.src, current))
        var withoutSuffix = path.join(filePath.dir, filePath.name)
        previous[withoutSuffix] = path.resolve(__dirname, current)
        return previous
      }, {})
    }
    
    module.exports = [
      {
        devtool: 'cheap-module-eval-source-map',
        context: path.resolve(__dirname),
        entry: getCSSEntries(CSS_PATH.css),
        output: {
          path: CSS_PATH.css.dst,
          filename: '[name].css'
        },
        module: {
          rules: [
            {
              test: /\.less$/,
              use: ExtractTextPlugin.extract({
                use: ['css-loader', 'postcss-loader', 'less-loader']
              })
            }
          ]
        },
        resolve: {
          extensions: ['.less']
        },
        plugins: [
          new ExtractTextPlugin('[name].css'),
        ]
      },
    // 如果还需要打包js,则可以在这里增加一个单独打包js的处理【根据自己需求来】
    // {
    //    entry:{},
    //    output:{},
    //    ... 省略
    // }
    ]
    

    可能有同学还在使用webpack1.x,所以这里在贴一下webpack1.x 的简单配置

    // webpack 1.x 版本
    // ...其他配置和webpack3.x一样
    module: {
        loaders: [
            {
                test: /\.less$/,
                loader: ExtractTextPlugin.extract("style-loader","css-loader","postcss-loader","less-loader")
            },
        ]
    }
    plugins: [
      new ExtractTextPlugin('[name].css'),
    ]
    // ...其他配置和webpack3.x一样
    

    相关文章

      网友评论

      • 7447e3c43d9f:我的webpack 5.6.0,无法完成啊,报编译错误,网上有一个对于webpack4的错误,我也拿来用了,也是不ok,纠结中
      • Donald_d824:博主,webpack 3.x,打包后的css生成两次(1次:output ; 1次 :new ExtractTextPlugin('[name].css')),这有改进的地方嘛?
        izhongxia:@Donald_d824 这两个功能不一样,
        output : css 作为入口打包出来的文件
        ExtractTextPlugin: 把JS里面的CSS单独打包出来

        优化的话,从项目的结构上优化, 要嘛JS引用的CSS不进行output打包, 比如文件名加下划线的不打包【类似这样 _index.less 】,要嘛就不要在JS中单独引入css
      • 8c5bf84d440f:引用插件的时候 test里面少了个$符号,会导致不能正确的扫描到CSS后缀的文件,从而使得webpack打包失败,起码我遇到了这个问题,不知道博主有没遇到.当我加上了$符号,就成功打包了
      • 武林盟主vs:方法根本行不通,你这入口文件只写了css文件,那是要抹掉entrt.js 文件吗,这两个怎么分别写
        439fed6769a8:那么会同时导出a.css和a.js的文件
        439fed6769a8:@izhongxia 他说的问题很重要,而且文档没有提供这部分的例子,当需要导出多个js和多个css的时候,如果指定文件名的后缀。
        izhongxia:@武林盟主vs 建议你先看下webpack的基本文档
      • 9b26adfe9893:先收藏,现在还有点看不懂。但感觉是好东西。
      • 卿可津:output 指定了 .css 后缀,那同时打包 js 和 css 时怎样区分不同后缀?output.filename 没有 [ext]
        izhongxia:@bro_hei 我这边都是统一打包到一个文件夹中,你的这个需求,可以看下 file-loader 的相关参数配置
        ac0c2efe0335:@izhongxia 请问一下,图片可以打包到css对应的文件夹下吗?
        izhongxia:@卿可津 两个方法,1,入口是一个对面,key值带有后缀。
        方法2,webpack.config module.export是可以为一个数组的,然后js和css分开两个配置
      • Chromeeeeeeeee:正好用到~:+1:
      • 结构学AI:如果是多个scss文件打包成多个css文件呢?
        求助
        izhongxia:@生而有幸 webpack的入口,设置你要单独打包的 scss 文件, 如文章最后面的例子,
      • 轉角愛妳:有没有试过多个CSS文件打包出来到不同路径的文件夹的?
        izhongxia: @轉角愛妳 使用glup/grunt + webpack,单纯的webpack没有试过。
      • 5354ef18cbe7:如果有多个CSS文件也想单独打包 怎么玩?
        5354ef18cbe7:@幻龙太子 自己研究出来了......
        5354ef18cbe7:@izhongxia 并不能.....
        izhongxia:@幻龙太子 可以看下这个文章 https://segmentfault.com/q/1010000004231390

      本文标题:【WEBPACK】分离css单独打包

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