如何使用webpack打包资源

866 阅读1分钟

微信截图_20220401093616.png

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第二天,点击查看活动详情

日常开发中,webpack是前端开发工程师的必备技能,今天我就给大家介绍一下如何使用webpack来打包资源。

打包样式资源

首先看一下目录结构:

微信截图_20220401094026.png

  1. 在src中创建一个index.less文件,简单输入内容如下:
html,body{
  background-color: pink;
  text-align: center;
  margin:0;
  padding:0
}
  1. 新建一个index.js文件导入样式:
import './index.less'
  1. 配置webpack.config.js如下(配有注释):
const {resolve} = require('path')

module.exports = {
//入口文件
  entry:'./src/index.js',
  //出口文件,即打包后存放的位置
  output:{
    filename:'built.js',
    //使用绝对路径
    path:resolve(__dirname,'build')
  },
  module:{
    rules:[
      {
        test:/\.less$/,
        //需要提前手动安装需要的包
        use:['style-loader','css-loader','less-loader']
      }
    ]
  },
  //设置为开发模式,方便开发的时候进行调试
  mode:'development'
}

注意:loader的书写顺序不能变哦,loader的执行顺序是从右到左。

less-loader将less转为css,css-loader将css转为js资源,style-loader再把样式插入到html中的style中。

执行webpack然后就打包完成啦!如下:

微信截图_20220401100447.png 可以看到样式内容被插入到了html中的style标签上:

微信截图_20220401100501.png

打包html资源

注意打包html文件的话需要使用插件来打包,因此需要我们手动安装一下:npm i html-webpack-plugin -D

首先来介绍一下这个插件的作用:

  • 默认在出口下创建一个html文件,然后导入所有的JS/CSS资源
  • 我们也可以自己指定一个html文件,在此html文件中加入资源

我们在src下创建一个html指定在该html文件基础上打包:

const {resolve} = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
  //...相同部分
  module:{
    rules:[]
  },
  plugins:[
    //默认创建一个html文件,然后引入所有的JS/CSS资源
    new HtmlWebpackPlugin({
      //可以自己指定一个html文件,在此html文件中引入资源
      template:'./src/index.html'
    })
  ],
  mode:'development'

}

打包图片资源

需要提前安装包 npm i url-loader file-loader html-loader -D

html-loader可以处理html中的img图片,可负责将其中的图片引入,然后交由url-loader进行解析,url-loader又是依赖于file-loader的。

出现问题:url-loader默认使用es6模块化解析,而html-loader引入图片是commonjs。

解决:因此如果在html中的img标签直接引入图片的话,需要注意关闭url-loader的es6模块化,使用commonjs解析。 我们先看看在images下的两张图片及其大小:

微信截图_20220401095723.png

微信截图_20220401095732.png

一张73.5kb,一张6.28kb,我们通过把图片转化为base64的方式打包,那么base64有什么好处呢?

  • 优点:减少请求数量,减轻服务器压力
  • 缺点:图片体积会变大,导致文件请求速度变慢,因此体积过大的图片不适合转化为base64

这时候我们来配置webpack.config:

const {resolve} = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
// ...相同部分
  module:{
    rules:[
      {
        test:/\.(jpg|gif|png)$/,
        loader:'url-loader',
        options:{
          //图片小于8kb会被转化为base64
          limit:8*1024
        }
      },
      {
        test: /\.html$/,
        loader: 'html-loader',
        options: {
          esModule: false
        }
      }
    ]
  },
  plugins:[
    new HtmlWebpackPlugin({
      template:'./src/index.html'
    })
  ],
  mode:'development'
}

注意: 使用一个loader的时候写法不一样,不需要写use,而是loader。

执行webpack打包之后我们打开文件查看,发现6.28kb的图片转为了base64:

微信截图_20220401001048.png

webpack是前端开发者向着高级前端进阶的门槛,但是webpack相对难懂,本文也只是介绍了webpack中一些简单的打包技巧,所以学习webpack需要沉下心来,好好做总结。


ok,今天的分享就到这里啦,欢迎评论区讨论或者指正~