webpack基础使用(二)

五、处理图片

file-loader

  1. 通过src使用图片, 有三种方式
// ===========================1===========================
// image.js
// webpack 5以后require返回的是一个对象
img.src = require('../img/1-icon.png').default

// webpack.config.js
      {
        test:/\.(png|svg|gif|jpe?g)$/,
        use: [ 'file-loader' ]
      }

// ===========================2===========================
// image.js
img.src = require('../img/1-icon.png')

// webpack.config.js
      {
        test:/\.(png|svg|gif|jpe?g)$/,
        use: [ 
          {
            loader: 'file-loader',
            options: {
              // 导出的内容是否转化为esMoudle 
              esModule: false
            }
          } 
        ]
      }

// ===========================3===========================
// image.js
import imgSrc from '../img/1-icon.png'
img.src = imgSrc

// webpack.config.js
      {
        test:/\.(png|svg|gif|jpe?g)$/,
        use: [ 'file-loader' ]
      }
  1. 通过url使用图片,注意要关闭 css-loader转为esModule的功能
// bgImg.css
.bgImg {
  background-image: url('../img/2-message.jpg');
}

// image.js
bgImg.className = 'bgImg'

// css-loader 看到url,或转成require处理
{
        test: /\.less$/,
        use: ['style-loader', {
          loader: 'css-loader',
          options: {
            // 代表向前找一个loader处理
            importLoaders: 1,
            esModule: false
          }
        }, 'postcss-loader', 'less-loader']
      }
  1. 设置文件名称输出
{
        test:/\.(png|svg|gif|jpe?g)$/,
        use: [ 
          {
            loader: 'file-loader',
            options: {
              name: 'img/[name].[hash:6].[ext]',
              // outputPath: 'img'
            }
          } 
        ]
      }

常见属性配置:
[ext]:扩展名
[name]:文件名
[hash]:文件内容md4
[contentHash]:文件hash, 和hash一样
[hash:<length>]:限定长度的hash
[path]:路径

url-loader

yarn add url-loader --dev
url-loader 和 file-loader类似,只是url-loader默认使用base64加载图片。
优点可以减少一次请求的次数, 但是文件大的时候,一次性请求就会很慢。
不过url-loader可以通过limit来控制加载方式。

{
        test:/\.(png|svg|gif|jpe?g)$/,
        use: [ 
          {
            loader: 'url-loader',
            options: {
              name: 'img/[name].[hash:6].[ext]',
              // 可以限制小于这个大小的才使用base64
              limit: 20 * 1024
            }
          } 
        ]
      }

asset module

  1. 处理图片
    a. asset/resource (类似file-loader)
      {
        test:/\.(png|svg|gif|jpe?g)$/,
        type: 'asset/resource'
      }

    // 1.图片字体都放在一个地方,不建议
    // assetModuleFilename: 'img/[name].[hash:4][ext]'

   // 2.单独配置
      {
        test:/\.(png|svg|gif|jpe?g)$/,
        type: 'asset/resource',
        generator: {
          filename: 'img/[name].[hash:4][ext]'
        }
      }

b. asset/inline (类似url-loader)

// 全部转成base64
      // {
      //   test:/\.(png|svg|gif|jpe?g)$/,
      //   type: 'asset/inline'
      // }
      // 根据条件转成base64
      {
        test:/\.(png|svg|gif|jpe?g)$/,
        type: 'asset',
        generator: {
          filename: 'img/[name].[hash:4][ext]'
        },
        parser: {
          dataUrlCondition: {
            maxSize: 20 * 1024
          }
        }
      }

c. asset/source (raw-loader 不常用)

  1. 处理图标字体
// font.js
  const oSpan = document.createElement('span')
  oSpan.className = 'iconfont icon-linggan lg-icon'
  oEle.appendChild(oSpan)

// webpack.config.js
{
        test: /\.(ttf|woff2?)$/,
        type: 'asset/resource',
        generator: {
          filename: 'font/[name].[hash:4][ext]'
        }
      }
六、插件使用
  • loader: 负责转换 特定类型 。
  • plugin: 可以做更多事情,每个插件都是一个类。
    plugin是通过钩子机制实现, 钩子必须是一个函数或者一个包含apply方法的对象。
  1. clean-webpack-plugin 清除目标目录
    yarn add clean-webpack-plugin --dev
// webpack.config.js
  const { CleanWebpackPlugin } = require('clean-webpack-plugin')

  plugins: [
    new CleanWebpackPlugin()
  ]
  1. html-webpack-plugin 生成默认html
    yarn add html-webpack-plugin --dev

默认有个ejs模板,我们也可以自定义模板,新建public/index.html

<!DOCTYPE html>
<html lang="">

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width,initial-scale=1.0">

  <link rel="icon" href="<%= BASE_URL %>favicon.ico">

  <title>
    <%= htmlWebpackPlugin.options.title %>
  </title>
</head>

<body>
  <noscript>
    <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled.
        Please enable it to continue.</strong>
  </noscript>
  <div id="app"></div>
  <!-- built files will be auto injected -->
</body>

</html>
const HtmlWebpackPlugin = require('html-webpack-plugin')
plugins: [
    new CleanWebpackPlugin(),
    // 可以定义多个HtmlWebpackPlugin插件用于生成多个html文件
    new HtmlWebpackPlugin({
      title: 'jerry-webpack-plugin',
      template: './public/index.html'
    })
  ]
  1. DefinePlugin定义常量( webpack自带)
const { DefinePlugin } = require('webpack')

plugins: [
    new CleanWebpackPlugin(),
    new HtmlWebpackPlugin({
      title: 'jerry-webpack-plugin',
      template: './public/index.html'
    }),
    new DefinePlugin({
    // 定义常量
    new DefinePlugin({
      // 这里要添加双引号,DefinePlugin会把数据原封不动返回
      BASE_URL: '"./"'
    })
  ]
  1. copy-webpack-plugin拷贝资源
    有些资源只需要拷贝,不需要打包。
    yarn add copy-webpack-plugin --dev
const CopyWebpackPlugin = require('copy-webpack-plugin')

new CopyWebpackPlugin({
      patterns: [
        {
          // 省略了to,to默认output.path的文件夹
          from: 'public',
          globOptions: {
            // index.html上面已经操作过了,需要排除。
            // 默认从项目根找, **代表从当前目录找
            ignore: ['**/index.html']
          }
        }
      ]
    })
七、babel
  • babel负责处理JS兼容,比如JSX、TS、ES6+。
    和postcss 很像, 不过postcss主要处理是css兼容。
  1. 命令行使用
    yarn add @babel/core @babel/cli @babel/preset-env --dev
    @babel/core:核心模块
    @babel/cli:命令行使用babel
    @babel/preset-env:预设
    npm babel src --out-dir build --presets=@babel/preset-env

  2. babel-loader, 同样依据.browserslistrc里面配置
    yarn add babel-loader --dev

      {
        test: /\.js$/,
        use: [
          {
            loader: 'babel-loader',
            options: {
              presets: ['@babel/preset-env']
              // presets: [ 
              //   [
              //     '@babel/preset-env', 
              //     // 这里的配置为准
              //     {targets: 'chrome 91'}
              //   ]
              // ],
            }
          }
        ]
      }
  1. 使用配置文件
    使用 babel.config.js(json cjs mjs), 一般就是.js后缀。

babel 7之前使用babelrc.json(js)类似配置文件

// webpack.config.js
      {
        test: /\.js$/,
        use: [ 'babel-loader' ]
      }

// babel.config.js
module.exports = {
    presets: ['@babel/preset-env']
}
八、polyfill
  • webpack 4自动包含polyfill,打包产出比较大, webpack 5 就移出去了。
    preset-env对于新语法不能全部转换,所以需要polyfill来打补丁。
    yarn add core-js regenerator-runtime
    babel-polyfill进行了拆分,不建议直接使用了,
// babel.config.js
module.exports = {
    presets: [
      [
        '@babel/preset-env',
        {
          // false: 不对当前的JS处理做 polyfill 的填充
          // usage: 依据用户源代码当中所使用到的新语法进行填充
          // entry: 依据我们当前筛选出来的浏览器决定填充什么
          // 使用entry,需要在使用的地方导入头文件
          // import "core-js/stable";
          // import "regenerator-runtime/runtime"
          useBuiltIns: 'usage',
          // 默认版本2
          corejs: 3
        }
      ]
    ]
  }

// webpack.config.js
    {
        test: /\.js$/,
        // 防止node_modules中的库也使用了babel,导致干扰
        exclude: /node_modules/,
        use: [ 'babel-loader' ]
      }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容