[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