摘要:相反,解釋背后的原理是什么使他比一個(gè)構(gòu)造器更加強(qiáng)大。仍然是構(gòu)造器類似這樣的工具存在的主要原因之一就是解決依賴問題。是一個(gè)模塊構(gòu)造器,就是前文所說的。
Webpack是一個(gè)JavaScript模塊構(gòu)造器。 這是適合它功能的名稱。 但是,我想在本文中展現(xiàn)Webpack的真正功能。
本文將不講解如何使用Webpack。 相反,解釋背后的原理:是什么使他比一個(gè)構(gòu)造器更加強(qiáng)大。
Webpack仍然是構(gòu)造器
類似webpack這樣的工具存在的主要原因之一就是解決依賴問題。 JavaScript中的模塊引起的依賴問題; 特別是Node.js.
Node.js允許您模塊化代碼。 代碼的模塊化導(dǎo)致依賴關(guān)系的問題。 可能會發(fā)生循環(huán)依賴,例如,A - > B - > A引用。 Webpack怎么解決這個(gè)問題呢?它使用了工具來構(gòu)建所有引用模塊的完整依賴圖。 使用此圖表,可以進(jìn)行分析,以幫助您緩解這種依賴圖的壓力。
Webpack允許你的代碼中有多個(gè)入口,并將一個(gè)將依賴關(guān)系圖捆綁到一個(gè)或多個(gè)輸出的文件。
Webpack遠(yuǎn)不止這些
對我而言,使webpack如此特別的是它提供的很大的擴(kuò)展點(diǎn)。
LoadersLoaders是我喜歡稱之為迷你透明機(jī)。 他們載入任何類型的文件 - 例如TypeScript,CoffeeScript,JSON等 - 并產(chǎn)生JavaScript代碼,以便以后添加到Webpack正在構(gòu)建的依賴關(guān)系圖中。
Loaders的強(qiáng)大之處在于它們數(shù)量很多。 Loaders是一個(gè)擴(kuò)展點(diǎn)。 您可以創(chuàng)建自己的加載程序,并且有100個(gè)或者更多的第三方加載程序。
例如,有沒有一個(gè)Loaders使我們可以采用像C#這樣的靜態(tài)類型語言,并將其轉(zhuǎn)化為JavaScript?
這就對Loaders有了一些限制。Loaders可以根據(jù)文件類型等進(jìn)行鏈接,配置,過濾。
Custom Loader Example
如webpack文檔所解釋的,Loader只是一個(gè)導(dǎo)出功能的節(jié)點(diǎn)模塊。 一個(gè)loader與一個(gè)導(dǎo)出函數(shù)的nodejs模塊一樣簡單:
module.exports = function(src) { return src + " " + "window.onload = function() { " + " console.log("This is from the loader!"); " + "}"; };
這是一個(gè)Lodader的簡單例子。 這個(gè)Lodader正在做的是在當(dāng)前瀏覽器會話的窗口加載上附加一個(gè)函數(shù)來寫入控制臺。
根據(jù)這個(gè)想法,我們可以采取任何來源的輸入,并且可以插入任何我們需要的輸入。 所以回到我們前面的例子,我們可以用C#作為輸入,并創(chuàng)建一個(gè)解析器,將它轉(zhuǎn)化為Webpack希望的本地JavaScript。
一個(gè)C#到JavaScript的轉(zhuǎn)換器是有點(diǎn)牽強(qiáng),實(shí)在點(diǎn)就是根本毫無意義,但我希望讀者能從中體會到webpack比一個(gè)普通構(gòu)造器強(qiáng)大的地方
Plugins插件允許webpack擴(kuò)展性比通過文件傳文件方式的Loader更強(qiáng)。插件允許你向webpack核心插入更多的功能,例如您可以添加一個(gè)用于縮小的插件; 從輸出中提取某些文本,如CSS; 使用插件進(jìn)行壓縮,等等。
插件可以通過訪問Webpack編譯器來工作。 他們可以訪問可能發(fā)生并可能發(fā)生的所有編譯步驟,并可以修改這些步驟。 這意味著一個(gè)插件可以修改什么文件做為源文件,添加什么文件作為靜態(tài)資源,等等。
插件的一個(gè)小例子如下:
file: "./my-custom-plugin.js" function MyCustomPlugin() {} MyCustomPlugin.prototype.apply = function(compiler) { compiler.plugin("emit", displayCurrentDate); compiler.plugin("after-emit", displayCurrentDate) } function displayCurrentDate(compilation, callback) { console.log(Date()); callback(); } module.exports = MyCustomPlugin;
在這個(gè)例子中,我們將兩個(gè)事件處理程序添加到Webpack編譯器中的兩個(gè)多帶帶的事件鉤子中。 其結(jié)果是將在emit之前打印日期日志,emit之后打印日期日志
在Webpack配置文件中可以這樣子配置:
var MyCustomPlugin = require("my-custom-plugin"); var webpackConfig = { ... plugins: [ new MyCustomPlugin() ] }
插件將會在emit和after-emit的時(shí)候執(zhí)行,webpack的編輯鉤子函數(shù)列表在webpack官網(wǎng)可以找到
插件的重要性就是它也是一個(gè)擴(kuò)展點(diǎn)。 Webpack的設(shè)計(jì)方式是讓用戶完全擴(kuò)展Webpack的核心。 有很多插件可供選擇,很多是第三方。
考慮到這一點(diǎn),插件可以占用您需要的所有資源,并使用算法進(jìn)行壓縮。 事實(shí)上,已經(jīng)有一個(gè)插件為這件事情。
SummaryWebpack是一個(gè)模塊構(gòu)造器,就是前文所說的。 它需要您的依賴關(guān)系圖,并輸出瀏覽器可以讀的格式。
但是webpack能做的不止這些
如果我們可以采用C#代碼,并將其轉(zhuǎn)換成JavaScript? 如果我們可以使用YAML配置文件,并創(chuàng)建一個(gè)剛剛配置的工作程序怎么辦? 如果我們拍攝圖像,并自動將其裁剪和灰度,該怎么辦?
我認(rèn)為,如果您開始將Webpack視為一個(gè)轉(zhuǎn)換器,而不僅僅是加載器,則可以看到Webpack的真正實(shí)力。
感謝您的閱讀,希望這會有所幫助。
關(guān)注我的公眾號,更多優(yōu)質(zhì)文章定時(shí)推送
翻譯自 The Wonderful World of Webpack
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/88547.html
摘要:在過程中,發(fā)現(xiàn)的報(bào)錯(cuò)是在中兩個(gè)頁面的無刷切換中出現(xiàn)的。看向網(wǎng)址等等網(wǎng)址的前綴是,這個(gè)是谷歌瀏覽器插件的前綴。難不成,這個(gè)文件是谷歌瀏覽器插件的于是看向了中間的那一串神秘字符串。 場景重現(xiàn) 項(xiàng)目是一個(gè)SPA,使用了Vue+Vue-Router+Webpack+jQuery。報(bào)錯(cuò)的場景如下:showImg(http://7xk109.com1.z0.glb.clouddn.com/blog...
摘要:注意該插件是簡單的字符串替換,所以如果是定義常量最好使用包裹要替換的內(nèi)容,或者使用轉(zhuǎn)化,否則會變成代碼直接插入,比如版本號這樣替換的時(shí)候就會變成而不會變成導(dǎo)致錯(cuò)誤的數(shù)據(jù)格式。 0x001 概述 上一章講的是js壓縮混淆,和這一章沒有半毛錢關(guān)系,這章講的是DefinePlugin,一個(gè)好像沒有用,但其實(shí)很好用的一個(gè)插件,我很喜歡,嘿嘿嘿! 0x002 插件介紹 說白了,這是一個(gè)簡單的字符...
摘要:前端日報(bào)精選漸進(jìn)式動畫解決方案從前端開發(fā)看面向未來的敏捷學(xué)習(xí)法知乎專欄深度剖析現(xiàn)代應(yīng)用眾成翻譯譯關(guān)于你需要知道的一切構(gòu)建離線優(yōu)先的應(yīng)用知乎專欄中文為何默認(rèn)開啟四進(jìn)程不犧牲內(nèi)存占用異步一淺出異步事件性能調(diào)優(yōu)之內(nèi)存篇二知乎專欄之性能 2017-06-16 前端日報(bào) 精選 漸進(jìn)式動畫解決方案從前端開發(fā)看面向未來的敏捷學(xué)習(xí)法 - 知乎專欄深度剖析現(xiàn)代 JavaScript 應(yīng)用 — SiteP...
摘要:初始項(xiàng)目設(shè)置我們將使用包管理器來處理依賴項(xiàng)。使用包管理器可以使您的項(xiàng)目依賴項(xiàng)保持最新狀態(tài),并能夠獲取和安裝最新的包。是小型應(yīng)用的最佳選擇之一。 翻譯:瘋狂的技術(shù)宅英文標(biāo)題:Creating a full-stack web application with Python, NPM, Webpack and React英文原文:https://codeburst.io/creating....
摘要:初始項(xiàng)目設(shè)置我們將使用包管理器來處理依賴項(xiàng)。使用包管理器可以使您的項(xiàng)目依賴項(xiàng)保持最新狀態(tài),并能夠獲取和安裝最新的包。是小型應(yīng)用的最佳選擇之一。 翻譯:瘋狂的技術(shù)宅英文標(biāo)題:Creating a full-stack web application with Python, NPM, Webpack and React英文原文:https://codeburst.io/creating....
閱讀 1439·2019-08-29 17:14
閱讀 1646·2019-08-29 12:12
閱讀 727·2019-08-29 11:33
閱讀 3261·2019-08-28 18:27
閱讀 1442·2019-08-26 10:19
閱讀 904·2019-08-23 18:18
閱讀 3525·2019-08-23 16:15
閱讀 2539·2019-08-23 14:14