精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何用5分鐘開發一個 Webpack Loader?

開發 前端
今天分享的內容是如何開發一個簡單的 Webpack Loader,希望通過這個過程能夠讓你 Get 到 Webpack Loader 的工作原理與機制。

 今天分享的內容是如何開發一個簡單的 Webpack Loader,希望通過這個過程能夠讓你 Get 到 Webpack Loader 的工作原理與機制。

[[349525]]

Loader 作為 Webpack 的核心機制,內部的工作原理卻非常簡單。接下來我們一起來開發一個自己的 Loader,通過這個開發過程來深入了解 Loader 的工作原理。

這里我的需求是開發一個可以加載 markdown 文件的加載器,以便可以在代碼中直接導入 md 文件。我們都應該知道 markdown 一般是需要轉換為 html 之后再呈現到頁面上的,所以我希望導入 md 文件后,直接得到 markdown 轉換后的 html 字符串,如下圖所示:

如何用5分鐘開發一個 Webpack Loader?

由于這里需要直觀地演示,我就不再單獨創建一個 npm 模塊,而是就直接在項目根目錄下創建一個 markdown-loader.js 文件,完成后你可以把這個模塊發布到 npm 上作為一個獨立的模塊使用。

項目結構與核心代碼如下所示:

  1. └─ 03-webpack-loader ······················· sample root dir 
  2.    ├── src ································· source dir 
  3.    │   ├── about.md ························ markdown module 
  4.    │   └── main.js ························· entry module 
  5.    ├── package.json ························ package file 
  6.    ├── markdown-loader.js ·················· markdown loader 
  7.    └── webpack.config.js ··················· webpack config file 
  1. <!-- ./src/about.md --> 
  2.  
  3. # About 
  4.  
  5. this is a markdown file. 
  1. // ./src/main.js 
  2. import about from './about.md' 
  3. console.log(about) 
  4. // 希望 about => '<h1>About</h1><p>this is a markdown file.</p>' 

每個 Webpack 的 Loader 都需要導出一個函數,這個函數就是我們這個 Loader 對資源的處理過程,它的輸入就是加載到的資源文件內容,輸出就是我們加工后的結果。我們通過 source參數接收輸入,通過返回值輸出。這里我們先嘗試打印一下 source,然后在函數的內部直接返回一個字符串'hello loader ~',具體代碼如下所示:

  1. // ./markdown-loader.jsmodule.exports = source => {// 加載到的模塊內容 => '# About\n\nthis is a markdown file.'console.log(source)// 返回值就是最終被打包的內容return 'hello loader ~'} 

完成以后,我們回到 Webpack 配置文件中添加一個加載器規則,這里匹配到的擴展名是.md,使用的加載器就是我們剛剛編寫的這個 markdown-loader.js 模塊,具體代碼如下所示:

  1. // ./webpack.config.jsmodule.exports = {entry: './src/main.js',output: {filename: 'bundle.js'  },module: {rules: [      {test: /\.md$/,        // 直接使用相對路徑use: './markdown-loader'      }    ]  }} 

TIPS:這里的 use 屬性不僅可以使用模塊名稱,還可以使用模塊文件路徑,這點與 Node 中的 require 函數是一樣的。

配置完成后,我們再次打開命令行終端運行打包命令,如下圖所示:

如何用5分鐘開發一個 Webpack Loader?

打包過程中命令行確實打印出來了我們所導入的 Markdown 文件內容,這就意味著 Loader 函數的參數確實是文件的內容。

但同時也報出了一個解析錯誤,說的是:You may need an additional loader to handle the result of these loaders.(我們可能還需要一個額外的加載器來處理當前加載器的結果)。

那這究竟是為什么呢?其實 Webpack 加載資源文件的過程類似于一個工作管道,你可以在這個過程中依次使用多個 Loader,但是最終這個管道結束過后的結果必須是一段標準的 JS 代碼字符串。

如何用5分鐘開發一個 Webpack Loader?

所以我們這里才會出現上面提到的錯誤提示,那解決的辦法也就很明顯了:

  • 直接在這個 Loader 的最后返回一段 JS 代碼字符串;
  • 再找一個合適的加載器,在后面接著處理我們這里得到的結果。

先來嘗試第一種辦法。回到 markdown-loader 中,我們將返回的字符串內容修改為 console.log('hello loader~'),然后再次運行打包,此時 Webpack 就不再會報錯了,代碼如下所示:

  1. // ./markdown-loader.js 
  2. module.exports = source => { 
  3.   // 加載到的模塊內容 => '# About\n\nthis is a markdown file.' 
  4.   console.log(source) 
  5.   // 返回值就是最終被打包的內容 
  6.   // return 'hello loader ~' 
  7.   return 'console.log("hello loader ~")' 

那此時打包的結果是怎樣的呢?我們打開輸出的 bundle.js,找到最后一個模塊(因為這個 md 文件是后引入的),如下圖所示:

如何用5分鐘開發一個 Webpack Loader?

這個模塊里面非常簡單,就是把我們剛剛返回的字符串直接拼接到了該模塊中。這也解釋了剛剛 Loader 管道最后必須返回 JS 代碼的原因,因為如果隨便返回一個內容,放到這里語法就不通過了。

# 實現 Loader 的邏輯

了解了 Loader 大致的工作機制過后,我們再回到 markdown-loader.js 中,接著完成我的需求。這里需要安裝一個能夠將 Markdown 解析為 HTML 的模塊,叫作 marked。

安裝完成后,我們在 markdown-loader.js 中導入這個模塊,然后使用這個模塊去解析我們的 source。這里解析完的結果就是一段 HTML 字符串,如果我們直接返回的話同樣會面臨 Webpack 無法解析模塊的問題,正確的做法是把這段 HTML 字符串拼接為一段 JS 代碼。

此時我們希望返回的代碼是通過 module.exports 導出這段 HTML 字符串,這樣外界導入模塊時就可以接收到這個 HTML 字符串了。如果只是簡單地拼接,那 HTML 中的換行和引號就都可能會造成語法錯誤,所以我這里使用了一個小技巧,具體操作如下所示:

  1. // ./markdown-loader.js 
  2. const marked = require('marked'
  3. module.exports = source => { 
  4.   // 1. 將 markdown 轉換為 html 字符串 
  5.   const html = marked(source) 
  6.   // html => '<h1>About</h1><p>this is a markdown file.</p>' 
  7.   // 2. 將 html 字符串拼接為一段導出字符串的 JS 代碼 
  8.   const code = `module.exports = ${JSON.stringify(html)}` 
  9.   return code 
  10.   // code => 'export default "<h1>About</h1><p>this is a markdown file.</p>"' 

先通過 JSON.stringify() 將字段字符串轉換為標準的 JSON 字符串,然后再參與拼接,這樣就不會有問題了。

我們回到命令行再次運行打包,打包后的結果就是我們所需要的了。

除了 module.exports這種方式,Webpack 還允許我們在返回的代碼中使用 ES Modules 的方式導出,例如,我們這里將module.exports修改為 export default,然后運行打包,結果同樣是可以的,Webpack 內部會自動轉換 ES Modules 代碼。

  1. // ./markdown-loader.js 
  2. const marked = require('marked'
  3. module.exports = source => { 
  4.   const html = marked(source) 
  5.   // const code = `module.exports = ${JSON.stringify(html)}` 
  6.   const code = `export default ${JSON.stringify(html)}` 
  7.   return code 

# 多個 Loader 的配合

我們還可以嘗試一下剛剛說的第二種思路,就是在我們這個 markdown-loader 中直接返回 HTML 字符串,然后交給下一個 Loader 處理。這就涉及多個 Loader 相互配合工作的情況了。

我們回到代碼中,這里我們直接返回 marked 解析后的 HTML,代碼如下所示:

  1. // ./markdown-loader.js 
  2. const marked = require('marked'
  3. module.exports = source => { 
  4.   // 1. 將 markdown 轉換為 html 字符串 
  5.   const html = marked(source) 
  6.   return html 

然后我們再安裝一個處理 HTML 的 Loader,叫作 html-loader,代碼如下所示:

  1. // ./webpack.config.js 
  2. module.exports = { 
  3.   entry: './src/main.js'
  4.   output: { 
  5.     filename: 'bundle.js' 
  6.   }, 
  7.   module: { 
  8.     rules: [ 
  9.       { 
  10.         test: /\.md$/, 
  11.         use: ['html-loader''./markdown-loader'
  12.       } 
  13.     ] 
  14.   } 

安裝完成過后回到配置文件,這里同樣把 use 屬性修改為一個數組,以便依次使用多個 Loader。不過同樣需要注意,這里的執行順序是從后往前,也就是說我們應該把先執行的 markdown-loader 放在后面,html-loader 放在前面。

完成以后我們回到命令行終端再次打包,這里的打包結果仍然是可以的。

至此,我們就完成了這個 markdown-loader 模塊,其實整個過程重點在于 Loader 的工作原理和實現方式。

 

責任編輯:張燕妮 來源: 今日頭條
相關推薦

2012-06-28 10:26:51

Silverlight

2018-05-14 10:56:25

APPiOS開發代碼

2024-09-20 12:25:16

Webpackchunkbundle

2021-04-30 16:23:58

WebRTC實時音頻

2015-07-08 09:43:22

程序員

2018-11-08 13:53:15

Flink程序環境

2010-12-10 17:23:56

IBMIaaS

2011-07-11 09:58:52

2020-02-17 13:45:27

抓取代碼工具

2021-06-22 10:43:03

Webpack loader plugin

2021-03-30 17:51:25

機器人系統聊天

2022-06-29 11:49:56

ServelessIaaSPaaS

2024-07-29 12:21:12

2015-11-09 10:07:12

彈性平臺Shopify20w

2017-03-01 17:47:46

Chrome

2020-09-14 11:30:26

HTTP3運維互聯網

2021-01-29 11:43:53

SSHLinux命令

2021-04-19 23:29:44

MakefilemacOSLinux

2025-03-26 01:35:00

tabs開發組件

2024-09-02 00:03:00

tabs組件CSS
點贊
收藏

51CTO技術棧公眾號

综合 欧美 亚洲日本| 开心色怡人综合网站| 三级在线观看免费大全| 亚洲欧洲国产精品一区| 天天影视涩香欲综合网 | 国内不卡的一区二区三区中文字幕 | 国产高清视频一区| 久久久久久国产| 日韩成人在线观看| 亚洲国产精品高清久久久| 少妇高潮毛片色欲ava片| 亚洲第一精品网站| 日韩高清一区在线| 欧美第一黄网免费网站| 在线观看亚洲大片短视频| 国产96在线亚洲| 欧美日韩免费一区二区三区| 欧美精品久久久久久久自慰| 在线免费观看黄色| av在线一区二区三区| 成人av在线天堂| 日韩不卡在线播放| 在线观看视频免费一区二区三区| 最近中文字幕2019免费| 免费成人蒂法网站| 91成人精品观看| 在线观看日韩av先锋影音电影院| 亚洲国产精品无码观看久久| 国产原创精品视频| 中文字幕不卡一区| 欧美精品123| 黄色av免费观看| 黄页网站大全一区二区| 国产精品老牛影院在线观看| 日韩三级一区二区三区| 欧美亚韩一区| 欧美伦理91i| 2014亚洲天堂| 日韩激情在线| 伊人青青综合网站| 日本黄色网址大全| 日韩精选在线| 日韩精品极品视频| 在线观看国产免费视频 | 日韩电影免费观看| 亚洲视频在线一区观看| 四虎永久国产精品| av在线日韩国产精品| 国产人久久人人人人爽| 欧美亚洲另类久久综合| 欧美女子与性| 久久综合久久久久88| 免费国产在线精品一区二区三区| 天天干天天摸天天操| 成人免费高清视频在线观看| 国产二区一区| 国模无码一区二区三区| 成人免费视频一区二区| 国产亚洲精品自在久久| 天堂在线观看av| 91蝌蚪porny| 日本婷婷久久久久久久久一区二区 | 中文字幕在线观看不卡视频| 欧美最大成人综合网| 青青视频在线观| 国产欧美一区二区精品性色超碰| 日本一区不卡| 色影院视频在线| 亚洲日本电影在线| 日本一本中文字幕| 性爽视频在线| 欧美日韩国产精选| 日韩精品在线播放视频| 久久久伦理片| 亚洲天堂av在线免费观看| 成人免费视频入口| 亚洲精品小说| 国语自产偷拍精品视频偷| 在线观看日韩中文字幕| 免费观看在线色综合| 亚洲一区二区三区在线视频 | 成人午夜精品在线| 久久久久久久久一区| 91大神在线网站| 亚洲精品视频在线| 国产男女无遮挡| 日韩黄色三级| 亚洲国产欧美自拍| 欧美日韩国产一二三区| 欧美天天视频| 国产精品av在线播放| 精品国产无码AV| 久久综合给合久久狠狠狠97色69| 亚洲欧美99| 成人三级小说| 欧美日韩国产bt| 国产xxxxxxxxx| 色狮一区二区三区四区视频| 久久久久国产精品免费网站| 波多野结衣一区二区三区在线| 狠狠色狠狠色合久久伊人| 国产一区二区中文字幕免费看| av在线播放网| 五月天丁香久久| 欧美男女交配视频| 欧美重口另类| 美乳少妇欧美精品| 一区二区视频网站| 91免费视频大全| 天天做天天躁天天躁| 日韩欧美一区二区三区免费观看 | 成人h视频在线| 深夜福利在线视频| 依依成人精品视频| 国产九九在线观看| 伊人久久大香线蕉av不卡| 精品中文字幕在线观看| 久久久久久av无码免费看大片| 成人激情av网| 大地资源网在线观看免费官网| 日本精品网站| 亚洲欧美精品在线| 日韩欧美大片在线观看| 国产精品123| 在线观看日韩羞羞视频| 成人久久网站| 亚洲网址你懂得| 日本天堂网在线观看| 国产一区二区精品久久91| 亚洲精品二区| 黄色成人在线视频| 亚洲天堂网在线观看| 午夜精品三级久久久有码| 国产69精品久久久久777| 日韩最新中文字幕| 亚洲欧洲二区| 日韩最新在线视频| 在线观看中文字幕av| 欧美极品少妇xxxxⅹ高跟鞋| 日本成年人网址| 美女久久99| 国产成人a亚洲精品| 日av在线播放| 在线观看三级视频欧美| 99国产精品免费| 天堂一区二区在线| 欧美一区视久久| 日韩免费小视频| 夜夜嗨av一区二区三区免费区| 日韩人妻精品中文字幕| 26uuu国产一区二区三区| 欧美视频第三页| 精品理论电影| 国产日韩在线视频| 中文字幕伦理免费在线视频 | 五月天欧美精品| 中文字幕 亚洲一区| 免费日韩精品中文字幕视频在线| 久久精彩视频| 久久久成人av毛片免费观看| 中日韩美女免费视频网址在线观看| 特级西西444www大胆免费看| 国产精品美女久久久久aⅴ| 国产亚洲视频一区| 黄色一区二区三区四区| 精品久久sese| av亚洲一区二区三区| 丝袜美腿精品国产二区| 99久久精品国产色欲| 亚洲综合在线免费观看| japanese在线观看| 日韩av二区在线播放| 中文字幕中文字幕在线中心一区| 色悠久久久久综合先锋影音下载| 久久久欧美精品| 精品电影在线| 欧美一区二区三区啪啪| 久久久久久久久久免费视频| 国产日韩欧美a| 国产不卡的av| 国产精品视频| 中文字幕成人一区| 日韩mv欧美mv国产网站| 国产精品爽爽爽爽爽爽在线观看| 日本一本在线免费福利| 国产午夜精品麻豆| 国产又粗又长视频| 欧美日韩中文字幕综合视频| 国产美女网站视频| a美女胸又www黄视频久久| 亚洲精品高清无码视频| 国产综合精品一区| 亚洲国产日韩欧美| av不卡一区二区| 国产精品视频精品| sm在线播放| 另类视频在线观看| 欧美在线一卡| 精品免费一区二区三区| 亚洲精品无码久久久久| 亚洲国产精品久久人人爱蜜臀| 一色道久久88加勒比一| 国产不卡高清在线观看视频| 国产 porn| 1024成人| 久久av喷吹av高潮av| 婷婷国产精品| 国产v亚洲v天堂无码| 国产精品黄色片| 欧美在线视频网| 制服丝袜在线播放| www.99久久热国产日韩欧美.com| 亚州男人的天堂| 日韩精品专区在线| 一级特黄aaa| 91极品视觉盛宴| 日韩在线视频免费播放| 亚洲一区二区成人在线观看| 亚洲伦理一区二区三区| 欧美韩国一区二区| www.色多多| www国产精品av| 亚洲色偷偷色噜噜狠狠99网| 激情国产一区二区| jizz大全欧美jizzcom| 老司机久久99久久精品播放免费| 缅甸午夜性猛交xxxx| 国户精品久久久久久久久久久不卡| 亚洲图片在线观看| 成人在线免费观看视频| 日本一区二区三区四区高清视频 | 国产在线观看黄色| 婷婷成人综合网| 国产精品6666| 午夜久久久久久| 日本一区二区欧美| 红桃av永久久久| www.av麻豆| 精品久久中文字幕| www..com国产| 欧美视频一区二区三区…| 国产无套内射又大又猛又粗又爽 | 99超碰在线观看| 欧美性猛交xxxx| 天天干,天天干| 色视频一区二区| 成人免费一级片| 欧美日韩小视频| 国产日韩欧美视频在线观看| 91麻豆精品国产无毒不卡在线观看| 中文字字幕在线观看| 欧美乱熟臀69xxxxxx| 国产又粗又大又黄| 91精品欧美久久久久久动漫 | eeuss影院一区二区三区| 午夜久久久久久久| 久久这里只有精品6| japanese中文字幕| 国产精品乱码人人做人人爱| 免费国产羞羞网站美图| 一片黄亚洲嫩模| 五月婷婷激情网| 欧美性猛交xxxx富婆弯腰| 老熟妇一区二区三区啪啪| 欧美老人xxxx18| 亚洲第一天堂影院| 日韩久久免费电影| 91大神xh98hx在线播放| 九九热精品视频在线播放| 成人影院在线视频| 国产精品麻豆va在线播放| 自拍偷拍欧美日韩| 国产精品久久亚洲| 精品国产一区二区三区| 亚洲精品偷拍视频| 一本久道久久久| 向日葵污视频在线观看| 国产99一区视频免费| www.久久国产| 亚洲视频在线一区观看| 国产精品第二十页| 欧美日韩亚洲综合| 日韩中文字幕影院| 中文字幕最新精品| av资源中文在线天堂| 国产精品尤物福利片在线观看| 66精品视频在线观看| 日韩精品欧美在线| 欧美日韩精品免费观看视频完整| 18禁男女爽爽爽午夜网站免费| 激情综合网激情| 91精品国产自产| 亚洲免费观看高清完整版在线观看熊| 日韩欧美高清在线观看| 91麻豆精品国产无毒不卡在线观看| 天天操天天干天天操| 久久久国产成人精品| 三上悠亚激情av一区二区三区| 91偷拍精品一区二区三区| 国产99久久久国产精品成人免费 | 日本不卡不码高清免费观看| 中文字幕一二三| 欧美国产欧美综合| 国产成人免费观看视频| 日韩欧美激情在线| 3d成人动漫在线| 日本精品久久久久影院| 亚洲精品不卡在线观看| 一区在线电影| 视频一区视频二区在线观看| 熟女人妻一区二区三区免费看| 欧美激情综合五月色丁香小说| 日韩av一区二区在线播放| 91麻豆精品国产自产在线 | 欧美富婆性猛交| 色8久久久久| 天堂av一区二区| 亚洲自啪免费| 午夜剧场免费看| 一区二区三区免费观看| 在线免费观看一级片| 国产香蕉精品视频一区二区三区| 国产高清视频色在线www| aa日韩免费精品视频一| 欧美99久久| 亚洲av无日韩毛片久久| 国产精品久久久久久久久久免费看| 久久国产视频精品| 日韩av在线精品| 国内激情视频在线观看| 国产精品视频福利| 亚洲激情另类| 99久久免费看精品国产一区| 亚洲五月六月丁香激情| 欧美亚洲精品在线观看| 国内免费精品永久在线视频| 国语一区二区三区| 日日摸日日碰夜夜爽无码| www.66久久| 国产欧美日韩另类| 亚洲国产精品一区二区久| av美女在线观看| 精品亚洲第一| 久久国产毛片| 一区二区三区在线观看免费视频| 一本久久a久久精品亚洲| 毛片免费在线观看| 国产福利成人在线| 激情五月综合| 久久撸在线视频| **性色生活片久久毛片| 国产夫绿帽单男3p精品视频| 欧美国产乱视频| 美女av一区| 男人透女人免费视频| 欧美国产综合色视频| 一级久久久久久久| 欧美黑人一区二区三区| 欧美freesex8一10精品| 国产日韩欧美精品在线观看| 久久综合中文字幕| 中文字幕日本视频| 久久夜色精品国产| 538任你躁精品视频网免费| 激情伊人五月天| 国产日韩欧美精品在线| 国产欧美综合视频| 久久久久久久久国产精品| 亚洲警察之高压线| 日本高清一区二区视频| 亚洲国产aⅴ成人精品无吗| 日韩在线免费看| 国产欧美精品va在线观看| 欧美日韩中文| 国产精品高清无码在线观看| 777久久久精品| 超碰在线最新网址| 日韩亚洲一区在线播放| 国产在线国偷精品产拍免费yy| 国产一级免费观看| 国产午夜精品视频| 日日夜夜精品视频| 妞干网在线免费视频| 亚洲色图.com| 色视频精品视频在线观看| 成人福利视频网| 亚洲一区成人| 我家有个日本女人| 亚洲欧美制服丝袜| 国产视频一区二| 日日摸天天爽天天爽视频| 一卡二卡三卡日韩欧美| av在线播放av| 精品视频一区二区| 国产一区二区福利视频| 无码任你躁久久久久久久| 欧美国产视频一区二区| 日韩精品午夜| 亚洲天堂久久新| 精品久久人人做人人爱|