放肆青春的博客
首页
前端
算法
网络
面试
技术
后端
运维
杂项
数据库
工具
网址
电脑
个人
文章
  • 分类
  • 标签
  • 归档
github (opens new window)
gitee (opens new window)

放肆青春

一个前端菜鸟的技术成长之路
首页
前端
算法
网络
面试
技术
后端
运维
杂项
数据库
工具
网址
电脑
个人
文章
  • 分类
  • 标签
  • 归档
github (opens new window)
gitee (opens new window)
  • 前端

    • 前端 概览
    • 前端汇总

    • front 博文

    • front 项目总结

    • front 高级

    • front tools

      • 打包,构建工具
      • webpack

        • webpack
        • webpack知识点
        • webpack hash哈希值
        • webpack loader
          • webpack loader
            • loader 执行顺序
            • webpack 常用 loader
            • loader 的三种使用方式
            • loader 种类及执行顺序
            • loader 特性
            • 自定义 loader
          • loader 问题汇总
            • css-loader 和 style-loader 区别
            • file-loader 和 url-loader 区别
            • loader 和 plugin 区别
        • webpack 插件
        • webpack热更新原理
        • webpack原理
        • webpack版本
      • vite
      • rollup
      • grunt
      • yeoman
      • babel
      • gulp
      • lerna
  • vue

    • vue 概览
    • vue 汇总

    • vue 博文

    • vue 项目总结

    • vue 高级

  • html

    • html 概览
    • html 汇总

    • html 博文

  • css

    • css 概览
    • css 汇总

    • css 博文

    • sass

    • less

  • js

    • javascript 概览
    • JS 汇总

    • ES6

    • JS 博文

    • JS 工具

  • node

    • node 概览
    • node 汇总

    • node 框架

    • node 博文

  • react

    • react 概览
    • react 汇总

    • react 博文

    • react 高级

  • 微信小程序

    • 微信小程序 概览
    • 微信小程序总结
    • 微信小程序文章
    • 微信小程序 博文

    • 微信小程序 高级

  • 微信公众号

    • 微信公众号 概览
    • 微信公众号总结
    • 微信公众号文章
  • 多端开发

    • 多端开发
    • dsbridge 概览
    • jsbridge 概览
    • webview
    • uniapp

      • uniapp 概览
    • taro

      • taro 概览
    • flutter

      • flutter 概览
      • flutter 环境搭建
    • electron

      • electron 概览
  • front
放肆青春
2021-03-24

webpack loader

# webpack loader

# loader 执行顺序

loader 的执行顺序是从右向左执行的

因为 webpack 选择了 compose 这样的函数式编程方式,而 gulp 却选择应用从左到右的 pipe 管道式编程。

# webpack 常用 loader

  1. 样式:style-loader(用于将 css 编译完成的样式,挂载到页面 style 标签上)、css-loader(加载 CSS)、less-loader、sass-loader 等

  2. 文件:file-loader 、url-loader、raw-loader 等

  3. 编译:babel-loader、coffee-loader 、ts-loader(将 TypeScript 转为 JavaScript)等

  4. 校验测试:eslint-loader、mocha-loader、jshint-loader 等

  5. 数据:csv-loader xml-loader(打包加载解析 csv 和 xml 文件数据)

# loader 的三种使用方式

  1. 配置方式(推荐):在 webpack.config.js 文件中指定 loader。

  2. 内联方式:在每个 import 语句中显式指定 loader。

  3. CLI 方式:在 shell 命令中指定它们。

# loader 种类及执行顺序

  1. inline loader(行内 loader):loader 被应用在 import/require 行内

  2. pre loader(前置 loader):Rule.enforce 配置为 pre

  3. normal loader(普通 loader):没有值表示是普通 loader。

  4. post loader(后置 loader):Rule.enforce 配置为 post

1 是在我们的业务代码的模块引入语句中 2,3,4 三种 loader 是通过 webpack 配置文件中进行配置的

所有的 loader,都有两个阶段:

类似于 js 中的事件冒泡、捕获阶段(有人嫌官方的词描述的比较晦涩,修改为 loader 的标记阶段(mark stage)和执行阶段(execution/run stage))。

webpack 在使用 loader 处理资源时首先会经过 loader.pitch 阶段,pitch 阶段结束后才会读取文件而后进行 normal 阶段处理。

  1. Pitching 阶段: loader 上的 pitch 方法,按照 后置(post)、行内(inline)、普通(normal)、前置(pre) 的顺序调用。

  2. Normal 阶段: loader 上的 常规方法,按照 前置(pre)、普通(normal)、行内(inline)、后置(post) 的顺序调用。模块源码的转换, 发生在这个阶段。

inline loader 和 config loader 的优先级:

如果一个项目同时存在 inline loader 和 config loader,那么先解析 inline loader,再解析 config loader,可以再 inline loader 上去控制 config loader 上的配置是否执行,例如你的同事配置了 config loader,但是你不想用 config loader,只想用 inline loader 这种情形。

  1. 加入!前缀,将禁用所有已配置的 normal loader(普通 loader)

不使用 config loader 中的 normal loader,例如 require('!a-loader!./a.js');

  1. 加入!!前缀,将禁用所有已配置的 loader

不使用 config loader 中的 pre loader,normal loader,post loader,例如 require('!!a-loader!./a.js');

  1. 加入-!前缀,将禁用所有已配置的 preLoader 和 loader,但是不禁用 postLoaders

不使用 config loader 中的 normal loader,pre loader,例如 require('-!a-loader!./a.js');

Loader 实际的执行顺序与 loader 的类型,pitch 方法,inline-loader 的前缀都有关系。

normal loader 和 pitch loader

  1. 关于 normal loader 本质上就是 loader 函数本身。
// loader函数本身 我们称之为loader的normal阶段
function loader(source) {
  // dosomething
  return source;
}
1
2
3
4
5

在默认的 Loader 执行阶段这四种 loader 会按照如下顺序执行:

资源文件 => 前置(pre)loader => 普通(normal)loader => 行内(inline)loader => 后置(post)loader => webpack 编译 loader 处理后的内容

  1. 关于 pitch loader 就是 normal loader 上的一个 pitch 属性,它同样是一个函数:
// pitch loader是normal上的一个属性
loader.pitch = function(remainingRequest, previousRequest, data) {
  // ...
};
1
2
3
4

pitch 阶段返回的非 undefeind 的值会造成 loader 打破原有顺序掉头执行,这就叫做熔断效果。

pitch Loader 的熔断效果:

# loader 特性

  1. loader 支持链式调用。链中的每个 loader 会将转换应用在已处理过的资源上。一组链式的 loader 将按照相反的顺序执行。链中的第一个 loader 将其结果(也就是应用过转换后的资源)传递给下一个 loader,依此类推。最后,链中的最后一个 loader,返回 webpack 所期望的 JavaScript。

  2. loader 可以是同步的,也可以是异步的。

# 自定义 loader

    1. 最简化版
module.exports = function(source) {
  return source.replace(/test/, "test123");
};
1
2
3
    1. 使用 loader-utils 和 schema-utils
import { getOptions } from "loader-utils"; // 工具库,getOptions获取传递给 loader 的选项
import validateOptions from "schema-utils"; // 加载程序和插件中用于验证选项的软件包。

const schema = {
  type: "object",
  properties: {
    test: {
      type: "string",
    },
  },
};

export default function(source) {
  const options = getOptions(this);

  validateOptions(schema, options, "Example Loader");

  // 对资源应用一些转换……

  return `export default ${JSON.stringify(source)}`;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# loader 问题汇总

# css-loader 和 style-loader 区别

css-loader: 加载.css 文件

style-loader: 使用<style>将 css-loader 解析后的内容挂载到 html 页面当中

# file-loader 和 url-loader 区别

相同点:file-loader 与 url-loader 都是在 webpack 中引入图片的解决方案。

不同点:

  1. file-loader:file-loader 可以解析项目中文件的 url 引入(不仅限于 css),返回的是文件的 public URL。

  2. url-loader:与 file-loader 不同,url-loader 可以在图片大小小于设定的 limit 的时候返回的是一个 bDataURL(base64 码),大于 limit 时会调用 file-loader 对图片进行处理。

两者关系: url-loader 封装了 file-loader,但 url-loader 不依赖于 file-loader。

# loader 和 plugin 区别

  1. 作用不同

loader,它是一个转换器,用于对模块源码的转换,

plugin 是一个扩展器,为了扩展 webpack 的功能,目的在于解决 loader 无法实现的其他事,从打包优化和压缩,到重新定义环境变量,功能强大到可以用来处理各种各样的任务

  1. 运行时机不同

loader 作用在编译模块过程中,plugins 在整个编译周期都起作用

  1. loader 遵循单一职责,一个 loader 只做一件事情,plugins 是基于事件机制工作,会监听 webpack 打包过程中的某些节点,作用于 webpack 打包的整个过程

参考:多角度解析 Webpack5 之 Loader 核心原理 https://juejin.cn/post/7036379350710616078 (opens new window)

更新时间: 2/17/2022, 2:59:48 PM
webpack hash哈希值
webpack 插件

← webpack hash哈希值 webpack 插件→

最近更新
01
前端权限管理
02-24
02
vue2指令
02-24
03
vue2 hook
02-24
更多文章>
Theme by Vdoing | Copyright © 2019-2022 放肆青春
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式