您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關如何解析webpack4.0中Loader概念,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
webpack
作為前端最火的構建工具,是前端自動化工具鏈最重要的部分,使用門檻較高。本系列是筆者自己的學習記錄,比較基礎,希望通過問題 + 解決方式的模式,以前端構建中遇到的具體需求為出發點,學習webpack
工具中相應的處理辦法。(本篇中的參數配置及使用方式均基于webpack4.0版本
)
loader
是webpack
的核心概念之一,它的基本工作流是將一個文件以字符串的形式讀入,對其進行語法分析及轉換(或者直接在loader
中引入現成的編譯工具,例如sass-loader
中就引入了node-sass
將SCSS代碼轉換為CSS代碼,再交由css-loader
處理),然后交由下一環節進行處理,所有載入的模塊最終都會經過moduleFactory
處理,轉成javascript可以識別和運行的代碼,從而完成模塊的集成。
loader
支持鏈式調用,所以開發上需要嚴格遵循“單一職責”原則,即每個loader
只負責自己需要負責的事情:將輸入信息進行處理,并輸出為下一個loader
可識別的格式。
實際開發中,很少會出現需要自己寫loader
來實現復雜需求的場景,如果某個擴展名的文件無法快速集成到自動化構建工具里,估計很快就會被拋棄了,大家都那么忙是吧。但是了解loader
的基本原理和編譯器的基本原理卻是非常有必要的。
如果需要編寫一個功能完整的loader
,建議先到webpack
的官方網站瀏覽一下loader有哪些API
,地址:webpack官網-loader API,其中對于編寫同步loader,異步loader,如何跳過loader,如何獲取options
配置項等等都做了非常詳細的解釋,本篇中不再贅述。
假設現在要實現一個dash-loader
,它的功能是加載并處理名稱為*.tpl.html
的文件,將其變為一個CommonJs
模塊。也就是說要完成一個如下的基本轉換:
轉換前的文本:
<div> <h4>這里是標題</h4> <p>這里是內容</p> </div>
轉換后的文本:
var str = '<div><h4>這里是標題</h4><p>這里是內容</p></div>'; module.exports = str;
那么webpack.config.js
中需要增加如下的配置:
... module:{ rules:[{ test: /\.tpl\.html$/, use:[{ loader:'dash-loader' }] }] }
在項目的node_modules
依賴文件夾中新建dash-loader
文件夾,并在其中新建一個index.js
文件,內容的基本格式為:
//index.js module.exports = function(source){ var tpl=""; source.split(/\r?\n/).forEach(function(line){ line=line.trim(); if(!line.length){ return; } //對line進行處理... tpl+=line; }); return "var tpl=\'" + tpl + "\'\nmodule.exports = tpl"; }
最終由dash-loader
返回的數據就好像是從某個CommonJs
模塊中讀入的一樣了。
了解了loader
的基本結構,那么loader里到底應該寫點什么才能完成代碼轉換呢?這就涉及到了一個新的概念——編譯器(Compiler)。一個基本的編譯器,需要經過tokenize
,parse
,transform
,stringify
幾個核心步驟,它的應用是非常廣的,SPA中的virtual-DOM
的解析,babel中的ES6
語法解析等等,babel
的官網曾經推薦過一個非常棒的開源項目(10k+Star),詳細講述了如何一步一步實現一個編譯器的,建議感興趣的同學可以自行學習:
【The-Super-Tiny-Compiler】——https://github.com/jamiebuilds/the-super-tiny-compiler
上述就是小編為大家分享的如何解析webpack4.0中Loader概念了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。