[TOC]
# webpack 的 loader 从右到左(或从下到上)进行?
只是 Webpack 选择了 compose 方式,而不是 pipe 的方式而已,在技术上实现从左往右也不会有难度。
函数组合是函数式编程中非常重要的思想。
函数组合的两种形式:一种是 pipe(从左向右组合函数),另一种是 compose(从右向左组合函数)。
在 Uninx 有 pipeline 的概念,平时应该也有接触,比如 `ps aux | grep node`,这些都是从左往右的。
但是在函数式编程中有组合的概念,我们数学中常见的 `f(g(x))`,在函数式编程中一般的实现方式是从右往左,如:
~~~js
const compose = (...fns) => x => fns.reduceRight((v, f) => f(v), x);
const add1 = n => n + 1; //加1
const double = n => n * 2; // 乘2
const add1ThenDouble = compose(
double,
add1
);
add1ThenDouble(2); // 6
// ((2 + 1 = 3) * 2 = 6)
~~~
这里可以看到我们先执行的加 1,然后执行的 double,在 compose 中是采用 reduceRight,所以我们传入参数的顺序编程了先传入 double,后传入 add1。
> [loader | webpack (docschina.org)](https://webpack.docschina.org/concepts/loaders/)
# loader 工具库(Loader Utilities)[](https://webpack.docschina.org/contribute/writing-a-loader/#loader-工具库-loader-utilities-)
充分利用 [`loader-utils`](https://github.com/webpack/loader-utils) 包。它提供了许多有用的工具,但最常用的一种工具是获取传递给 loader 的选项。
[`schema-utils`](https://github.com/webpack-contrib/schema-utils) 包配合 `loader-utils`,用于保证 `loader` 选项,进行与 JSON Schema 结构一致的校验。
这里有一个简单使用两者的例子:
**loader.js**
```
import { getOptions } from 'loader-utils';
import validateOptions from 'schema-utils';
const schema = {
type: 'object',
properties: {
test: {
type: 'string'
}
}
};
export default function(source) {
const options = getOptions(this); // 获取到用户给当前 Loader 传入的 options
validateOptions(schema, options, 'Example Loader');
// 对资源应用一些转换……
return `export default ${ JSON.stringify(source) }`;
}
```
webpack 5开始,loader 插件上下文自带了 [`this.getOptions`](https://webpack.js.org/api/loaders/#thisgetoptionsschema)
# 参考
[loader的工作原理以及实现一个md-loader](https://github.com/6fedcom/fe-blog/tree/master/webpack/loader)
[loader1、loader的配置和执行顺序](https://blog.csdn.net/qq_17175013/article/details/87247975)
[编写一个 loader](https://webpack.docschina.org/contribute/writing-a-loader/)
[webpack系列——实现一个行内样式px转vw的loader](https://segmentfault.com/a/1190000016374998)
- 讲解 Markdown
- 示例
- SVN
- Git笔记
- github 相关
- DESIGNER'S GUIDE TO DPI
- JS 模块化
- CommonJS、AMD、CMD、UMD、ES6
- AMD
- RequrieJS
- r.js
- 模块化打包
- 学习Chrome DevTools
- chrome://inspect
- Chrome DevTools 之 Elements
- Chrome DevTools 之 Console
- Chrome DevTools 之 Sources
- Chrome DevTools 之 Network
- Chrome DevTools 之 Memory
- Chrome DevTools 之 Performance
- Chrome DevTools 之 Resources
- Chrome DevTools 之 Security
- Chrome DevTools 之 Audits
- 技巧
- Node.js
- 基础知识
- package.json 详解
- corepack
- npm
- yarn
- pnpm
- yalc
- 库处理
- Babel
- 相关库
- 转译基础
- 插件
- AST
- Rollup
- 基础
- 插件
- Webpack
- 详解配置
- 实现 loader
- webpack 进阶
- plugin 用法
- 辅助工具
- 解答疑惑
- 开发工具集合
- 花样百出的打包工具
- 纷杂的构建系统
- monorepo
- 前端工作流
- 爬虫
- 测试篇
- 综合
- Jest
- playwright
- Puppeteer
- cypress
- webdriverIO
- TestCafe
- 其他
- 工程开发
- gulp篇
- Building With Gulp
- Sass篇
- PostCSS篇
- combo服务
- 编码规范检查
- 前端优化
- 优化策略
- 高性能HTML5
- 浏览器端性能
- 前后端分离篇
- 分离部署
- API 文档框架
- 项目开发环境
- 基于 JWT 的 Token 认证
- 扯皮时间
- 持续集成及后续服务
- 静态服务器搭建
- mock与调试
- browserslist
- Project Starter
- Docker
- 文档网站生成
- ddd