精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲成人免费视| 国产一区二区在线免费观看| 精品无码久久久久久国产| a√天堂在线观看| 阿v免费在线观看| 国产精品一区二区男女羞羞无遮挡| 欧美国产一区二区三区| 波多野结衣一本| 四虎成人精品一区二区免费网站| 亚洲午夜精品在线| 日韩欧美在线观看强乱免费| 精品毛片在线观看| 香蕉久久夜色精品国产| 久久精品视频免费播放| 特级西西人体wwwww| 亚洲青青一区| 在线观看国产91| 成人免费a级片| 在线观看免费黄色| 久久久午夜精品理论片中文字幕| 成人网在线视频| 久久久久在线视频| 亚洲一级网站| 日韩中文字幕久久| 色婷婷av777| 超碰成人在线免费| 5858s免费视频成人| 毛葺葺老太做受视频| 电影k8一区二区三区久久 | 欧美日韩成人一区| 日本不卡在线观看视频| 中中文字幕av在线| 中文字幕精品一区| 日本亚洲欧洲精品| 完全免费av在线播放| 波多野结衣视频网站| 亚洲香蕉网站| 欧美另类极品videosbest最新版本| 黄色三级生活片| 性欧美lx╳lx╳| 亚洲国产欧美在线成人app | 欧美在线观看www| 超碰在线最新网址| 亚洲午夜一二三区视频| 亚洲精品天堂成人片av在线播放| av大片在线看| 国产日韩精品一区二区三区 | 日韩av成人| aaa欧美色吧激情视频| 国产91色在线|亚洲| 精品人妻伦一区二区三区久久| 久久99精品国产.久久久久 | 国产女女做受ⅹxx高潮| 超碰高清在线| 精品久久久香蕉免费精品视频| 免费看毛片的网址| h片在线观看下载| 亚洲永久免费视频| 日本xxxxxxxxxx75| 欧美xxxhd| 日本高清无吗v一区| 农村妇女精品一二区| 日本欧美韩国| 欧美日韩亚洲丝袜制服| 欧美日韩在线观看不卡| 狂野欧美性猛交xxxx| 欧美人体做爰大胆视频| 天天综合成人网| 日韩国产在线不卡视频| 精品国产不卡一区二区三区| 中文字幕人妻一区二区三区| 日本三级久久| 伊人男人综合视频网| 欧美a在线播放| 亚洲激情中文在线| 国内揄拍国内精品少妇国语| 国产精品男女视频| 欧美aaa在线| 91免费版黄色| 亚洲 小说区 图片区 都市| 久久女同精品一区二区| 亚洲精品免费在线看| 91麻豆免费在线视频| 亚洲成在线观看| 日韩亚洲在线视频| 亚洲国产天堂| 亚洲成avwww人| 变态另类ts人妖一区二区| 99久久99热这里只有精品| 欧美激情精品久久久久久黑人 | 久久精品日产第一区二区三区精品版| 精彩国产在线| 亚洲欧美日韩国产手机在线| 又粗又黑又大的吊av| 欧美影视资讯| 日韩免费观看高清完整版在线观看| 超碰男人的天堂| 999久久久91| 欧美亚洲成人精品| 中文字幕一区二区三区四区免费看| 国产精品乡下勾搭老头1| 久久久久久欧美精品色一二三四| 欧美尤物美女在线| 黄色成人在线播放| 91网址在线观看精品| 欧美日韩爱爱| 欧美激情aaaa| 国产精品久久久午夜夜伦鲁鲁| 不卡的电视剧免费网站有什么| 中文字幕精品—区二区日日骚| 97人澡人人添人人爽欧美| 欧美日韩国产欧美日美国产精品| 天天躁日日躁狠狠躁免费麻豆| 日韩久久精品网| 97视频在线观看视频免费视频 | 亚洲天堂精品在线观看| www.亚洲天堂网| 亚洲欧美日本国产| 啊v视频在线一区二区三区| 国产精品suv一区| 国产成人一级电影| 国产精品夜夜夜爽张柏芝| 亚洲成人av观看| 亚洲精品日韩丝袜精品| 国产精品美女毛片真酒店| 国产一区二区三区久久久 | 在线观看中文字幕不卡| 国产a级黄色片| 女人香蕉久久**毛片精品| 国产欧美va欧美va香蕉在线| 韩日在线视频| 岛国视频午夜一区免费在线观看 | 91色在线porny| 日韩精品在线视频免费观看| 日韩综合一区二区三区| 久久久精品电影| 亚洲天堂2021av| 国产欧美精品日韩区二区麻豆天美| 国产人妻777人伦精品hd| 在线视频亚洲欧美中文| 欧美精品做受xxx性少妇| 国产精品一区二区人人爽| 国产精品久久看| 色免费在线视频| 日韩一区电影| 成人免费福利视频| 超鹏97在线| 欧美一区二区三区精品| 国产va在线播放| 国产成人精品三级麻豆| 18禁裸男晨勃露j毛免费观看| 日韩成人精品| 91国产美女视频| 深夜福利免费在线观看| 欧美日韩综合视频| 美女被到爽高潮视频| 日韩激情一二三区| 亚洲第一导航| 精品久久国产一区| 欧美激情一级欧美精品| 神马午夜一区二区| 色噜噜夜夜夜综合网| 国产不卡在线观看视频| 精品在线一区二区三区| 日本一道在线观看| 黄色成人美女网站| 日本一区二区不卡| 日本免费在线视频| 精品日韩99亚洲| 欧美另类一区二区| 国产精品午夜久久| 在线成人精品视频| 亚洲女优在线| 在线成人av电影| eeuss鲁片一区二区三区| 欧美洲成人男女午夜视频| av大片在线看| 精品久久久久久久久久久久久久久久久| 国产精选第一页| 国产午夜精品一区二区三区视频| wwwwwxxxx日本| 亚洲一级高清| 先锋影音亚洲资源| 91午夜精品| 国产精品美女久久久久久免费| 51xtv成人影院| 亚洲免费伊人电影在线观看av| 亚洲一区在线观| 亚洲成人av中文| 黑人狂躁日本娇小| 不卡一区二区中文字幕| 国产精品区在线| 亚洲深夜av| 日本一区二区免费高清视频| 天堂av一区二区三区在线播放| 国产欧美日韩精品在线观看| 国内激情视频在线观看| xxxx欧美18另类的高清| 性xxxx18| 日韩一区二区精品| 日韩国产成人在线| 亚洲午夜激情av| 殴美一级黄色片| 99国产精品久久久久久久久久久| 久久久久久久久久久久久久久国产 | 久久99国产综合精品免费| 中文字幕在线不卡国产视频| 国产老熟女伦老熟妇露脸| 国产一区二区三区国产| 老熟妇仑乱视频一区二区| 极品尤物久久久av免费看| 伊人狠狠色丁香综合尤物| 自拍自偷一区二区三区| 国产精品av一区| 97久久精品一区二区三区的观看方式| 性做久久久久久| 伊人狠狠色丁香综合尤物| 小嫩嫩12欧美| 国产九色精品| 日本久久伊人| 成人黄色大片在线免费观看| xxxx另类黑人| 伊人激情综合网| 毛片在线播放网址| 精品久久免费看| 国产视频第一页| 欧美人伦禁忌dvd放荡欲情| 波多野结衣电车痴汉| 大荫蒂欧美视频另类xxxx| 国产亚洲成人精品| 亚洲精品免费在线播放| 精品无码一区二区三区蜜臀 | 精品毛片乱码1区2区3区| 国产老女人乱淫免费| 欧美日韩一区二区三区四区 | 日韩经典中文字幕| 日本国产在线观看| 精品国产精品网麻豆系列| www.中文字幕| 欧美v国产在线一区二区三区| 国产乱色精品成人免费视频| 欧美日本不卡视频| 国产强伦人妻毛片| 日韩一区二区麻豆国产| 亚洲第一色网站| 日韩免费高清av| 国模人体一区二区| 亚洲国产精品成人精品| 五月天婷婷视频| 日韩av在线资源| 欧美人体大胆444www| 国产一区二区久久精品| 色婷婷激情五月| 亚洲а∨天堂久久精品喷水| 天堂中文网在线| 日韩国产激情在线| 欧美拍拍视频| 日韩资源在线观看| a天堂中文在线官网在线| 欧美理论电影在线播放| jizz一区二区三区| 2018中文字幕一区二区三区| 天堂资源在线| 国产精品久久久久久久久免费| 色综合久久久| yy111111少妇影院日韩夜片| 卡通动漫国产精品| 日韩欧美视频一区二区三区四区 | 色综合影院在线| 国产在线观看a| 国外成人在线播放| 69堂精品视频在线播放| 成人亚洲欧美一区二区三区| 77成人影视| 欧美日韩免费精品| 一个色综合网| 免费在线激情视频| 国产在线播放一区| 色综合久久五月| 欧美国产激情一区二区三区蜜月| 日韩欧美国产成人精品免费| 亚洲综合免费观看高清在线观看| 成人午夜淫片100集| 欧美日韩一区三区四区| 日本xxxx人| 在线视频国产日韩| 好看的中文字幕在线播放| 国产成人精品午夜| 视频一区国产| 色之综合天天综合色天天棕色| 午夜国产欧美理论在线播放| 欧美污视频网站| 国产在线国偷精品免费看| 国产视频久久久久久| 亚洲欧洲日产国产综合网| 日本一区二区网站| 欧美喷水一区二区| 日韩成人黄色| 欧美国产亚洲精品久久久8v| jizz欧美| 久久精品国产美女| 国产精品v日韩精品v欧美精品网站 | www亚洲国产| 久久久久在线| 无码国产69精品久久久久网站| 中文字幕一区二区三区乱码在线| 日韩精品一区二区av| 欧美日韩国产在线播放网站| 天堂在线免费av| 久久久久这里只有精品| 亚洲最大的免费视频网站| 日本免费高清一区二区| 一区在线视频观看| 97人人模人人爽人人澡| 国产欧美日韩亚州综合| 久久久国产精品成人免费| 日韩一区二区在线观看| 麻豆传媒视频在线| 国产成人高清激情视频在线观看| 极品束缚调教一区二区网站 | 久久一卡二卡| 91在线网站视频| 久久免费大视频| 看欧美ab黄色大片视频免费| 久久婷婷国产综合国色天香| 日韩 国产 在线| 精品国产免费一区二区三区四区 | 欧美在线欧美在线| 国产 日韩 欧美 综合 一区| 7777在线视频| 久久99精品国产.久久久久| 日韩女同一区二区三区| 色婷婷av一区二区三区之一色屋| 五月婷婷综合久久| 97在线观看免费| 国内精品国产成人国产三级粉色| 无码人妻aⅴ一区二区三区日本| 久久国产免费看| 免费精品在线视频| 欧美日韩国产高清一区二区| 自拍视频在线播放| 国产精品视频专区| 91欧美国产| www.亚洲自拍| 一二三四社区欧美黄| 粉嫩av一区二区夜夜嗨| 久久久久久国产精品久久| 北条麻妃一区二区三区在线观看| 黄色特一级视频| 成熟亚洲日本毛茸茸凸凹| 伊人365影院| 日韩国产激情在线| 经典三级一区二区| 亚洲人成网站在线观看播放| 精品一二三四在线| avove在线播放| 亚洲福利视频专区| 国产精品伦理| 亚洲午夜激情| 国产乱子伦一区二区三区国色天香| 国产探花在线播放| 亚洲白拍色综合图区| 亚洲天堂一区二区| 一本一生久久a久久精品综合蜜| 精彩视频一区二区三区| 久久国产精品波多野结衣| 精品精品国产高清a毛片牛牛| 欧美一级鲁丝片| 神马影院午夜我不卡影院| 精品亚洲国内自在自线福利| 久草视频免费播放| 亚洲男人天堂古典| 4438五月综合| 欧美在线一区视频| 亚洲国产精品二十页| a级片免费观看| 日韩暖暖在线视频| 欧美在线高清| 成人免费看aa片| 69p69国产精品| 水蜜桃在线视频| 一本色道久久99精品综合| 丁香婷婷深情五月亚洲| 91视频久久久| 欧美高清视频在线| 欧美精品乱码| 黄色av电影网站| 欧美日韩国产片| 末成年女av片一区二区下载| 一区二区在线观看网站| 成人小视频免费观看| 中文字幕观看视频| 久久久久久久一区二区| 91欧美国产| 人人妻人人藻人人爽欧美一区| 777亚洲妇女| 欧美www.| 黄色一级在线视频| 亚洲色图制服诱惑| 国产精品一区在线看|