详细解析webpack打包css、less、sass文件

595 阅读2分钟

介绍:

webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。

使用:

webpack.config.js

entry代表打包的入口文件,output代表打包的输出文件的位置,但是output的路径是要写绝对路径,所以需要引入path模块

const path =require('path')
module.exports={
    entry:'./main.js',
    output:'bundle.js',
    //必须是绝对路径
    path:path.resolve(__dirname,'./build)'
    //代表当前目录下build文件夹里面的bundle.js文件
}

loader

loader 让 webpack 能够去处理那些非 JavaScript 文件(webpack 自身只理解 JavaScript)。loader 可以将所有类型的文件转换为 webpack 能够处理的有效模块,然后你就可以利用 webpack 的打包能力,对它们进行处理。本质上,webpack loader 将所有类型的文件,转换为应用程序的依赖图(和最终的 bundle)可以直接引用的模块。

1、解析css文件(css-loader、style-loader)

我们写的很多css代码,当加载这些代码时webpack并不知道如何对其加载,必须使用对应的loader来完成这样的功能,这个loader最常用的是css-loader

css-loader的安装npm install css-loader -D

css-loader有三种使用方案,分别是内联方式、CLI方式(webpack5已不支持)、配置方式,我们使用最多的还是配置方式这里我就主要讲配置方式

const path =require('path')
module.exports={
    entry:'./main.js',
    output:{'bundle.js',
    //必须是绝对路径
    path:path.resolve(__dirname,'./build)'
    //代表当前目录下build文件夹里面的bundle.js文件
    },
    module:{
        rules:[
            {
            test:/\.css$/,
            use:[{loader:"css-loader"}]
            }
            ]
        }
}

那里面的use当没有options时,可以直接把laoder写成字符串的形式use:['css-loader']

仅仅使用css-loader是不行的,因为它只是负责将css文件进行解析,并不会将解析之后的css插入到页面中,也就无法起作用,如果我们希望完成插入style的操作我们还需要另一个loader就是style-loader,既然要使用它,就要安装,安装style-loader:npm install style-loader -D它的作用原理就是通过js创建一个style标签,把css放到style标签中,这时我们把use写成这样就可以了: use:['style-loader','css-loader']注意webpack解析loader是从后往前解析的,所以css-loader一定要写在style-loader后面

2、解析less文件(less-loader、css-loader、style-loader)

我们都知道浏览器是不会识别到less文件的,要想less起作用必须让它变成css文件,我们使用less来把less文件转换为css文件,安装less:npm install less -D,使用npx less ./src/css/component.less > component.css可将less转换成css,但是我们实际开发中不可能这样对每个less文件运行一次转换的命令,这时我们使用less-loader,安装css-loader:npm install less-loader -D

综上处理less文件的配置可以这样写:

const path =require('path')
module.exports={
    entry:'./main.js',
    output:{'bundle.js',
    //必须是绝对路径
    path:path.resolve(__dirname,'./build)'
    //代表当前目录下build文件夹里面的bundle.js文件
    },
    module:{
        rules:[
            {
            test:/\.less$/,
            use:["style-loader","css-loader","less-loader"]
            }
            ]
        }
}

sass文件打包个less是差不多的,这里就不再详细赘述