摘要:本篇的主要目標(biāo)是通過實(shí)際問題來介紹中容易被人忽略的細(xì)節(jié)以及源碼分析以最新發(fā)布的版本的源碼為例并且提供幾種解決方案。探究原因及源碼分析這里以最新發(fā)布的版本的源碼作為分析。解決方案加參數(shù)基于上面簡要的分析,我們來嘗試下參數(shù)的作用。
注:本篇不是入門教程,入門請直接查看官方文檔。本篇的主要目標(biāo)是通過實(shí)際問題來介紹 webpack 中容易被人忽略的細(xì)節(jié), 以及源碼分析(以最新發(fā)布的 release 版本1.14.0的源碼為例), 并且提供幾種解決方案。
隨著前端技術(shù)的火熱發(fā)展,工程化,模塊化和組件化的思想已逐步成為主流,與之相應(yīng)的,就需要有一整套工具流可以支撐起它。
現(xiàn)在比較熱門的前端資源模塊化管理和打包工具應(yīng)該非 Webpack 莫屬了。
Webpack 是什么使用舉例它可以將許多松散的模塊按照依賴和規(guī)則打包成符合生產(chǎn)環(huán)境部署的前端資源。還可以將按需加載的模塊進(jìn)行代碼分隔,等到實(shí)際需要的時(shí)候再異步加載。通過?loader 的轉(zhuǎn)換,任何形式的資源都可以視作模塊,比如 CommonJs 模塊、 AMD 模塊、 ES6 模塊、CSS、圖片、 JSON、Coffeescript、 LESS 等。
--引自 Webpack 中文指南
我們來看一下官方文檔中的最小用例,新建并寫入以下內(nèi)容到這兩個(gè)文件:
cats.js
var cats = ["dave", "henry", "martha"]; module.exports = cats;
app.js (Entry Point)
cats = require("./cats.js"); console.log(cats);
這個(gè)時(shí)候,就可以使用 webpack 進(jìn)行打包了:
webpack ./app.js app.bundle.js
我們來看一下發(fā)生了什么, 目錄下生成了一個(gè)打包后的文件 app.bundle.js ,這就是最基礎(chǔ)的打包過程。
提出問題如何判斷打包是否成功?
通用方案下面是我們常用的兩種判斷任務(wù)是否執(zhí)行成功的方案
通過 return code通過命令執(zhí)行后的 return code 來判斷(在 shell 中使用 $? 獲得)。 并且通常情況下 0 是執(zhí)行成功, 非 0 是未成功。 我們以上面的例子來測試一下:
可以看到 $? 的值為 0 , 且打包后的文件運(yùn)行正常。
那么我們來修改一下 app.js 文件的內(nèi)容, 將 require 引入的模塊路徑故意寫錯(cuò),來測試一下:
注意:箭頭處 $? 的值仍然為 0, 且生成的打包后的文件運(yùn)行出錯(cuò)。
這就說明,根據(jù) return code 的值判斷任務(wù)是否執(zhí)行成功, 不可行!
通過標(biāo)準(zhǔn)錯(cuò)誤輸出我們也會通過標(biāo)準(zhǔn)錯(cuò)誤輸出(stderr)來判斷一個(gè)任務(wù)執(zhí)行過程中是否有錯(cuò)誤輸出。還是使用上面的例子做示范:
根據(jù)這個(gè)例子,可以看到 webpack 并沒有標(biāo)準(zhǔn)錯(cuò)誤輸出!所以這個(gè)方法也不可行。
探究原因及源碼分析這里以最新發(fā)布的 release 版本 1.14.0 的源碼作為分析。 在 lib/Compilation.js 中我們可以看到這樣一段代碼:
var errorAndCallback = function errorAndCallback(err) { err.dependencies = dependencies; err.origin = module; module.dependenciesErrors.push(err); _this.errors.push(err); if(bail) { callback(err); } else { callback(); } };
在源碼中可以看到這個(gè)函數(shù)其實(shí)被調(diào)用的還比較多, 例如:在模塊為可選的時(shí)候, 會判斷只是拋出警告還是處理錯(cuò)誤, 而上面這段代碼自然也不必多數(shù), 關(guān)鍵點(diǎn)在于 bail 的值, 而我們繼續(xù)找, 可以看到在 bin/config-optimist.js 中有對 bail 參數(shù)的解析, 這是一個(gè)布爾值。而因?yàn)闆]有太多描述, 所以這個(gè)參數(shù)就經(jīng)常容易被忽略。
解決方案 1. 加 bail 參數(shù)基于上面簡要的分析, 我們來嘗試下 bail 參數(shù)的作用。 仍然使用上面的例子:
我們使用 webpack --bail true app.js app.bundle.js 進(jìn)行測試
可以看到, 使用 bail 參數(shù)并傳遞 true 進(jìn)去, 在遇到錯(cuò)誤的時(shí)候,打包過程將會退出, return code 為 1 且把錯(cuò)誤信息打印到 stderr .
2. 使用 webpack-fail-pluginwebpack-fail-plugin 是專為解決這個(gè)問題而生的,它會在錯(cuò)誤發(fā)生的時(shí)候 return 1. 使用方法也很簡單:
安裝:
npm install webpack-fail-plugin
使用:
var?failPlugin?=?require("webpack-fail-plugin"); ? module.exports?=?{ ????//config? ????plugins:?[ ????????failPlugin ????] }3.使用 done plugin
具體用法如下:
// ... plugins: [ // ... function() { this.plugin("done", function(stats) { if (stats.compilation.errors && stats.compilation.errors.length) { console.log(stats.compilation.errors); process.exit(1); } // ... }); } // ... ], // ...4. 使用 webpack 2
不過 webpack 2 現(xiàn)在還在 beta 階段,可以期待下。 (webpack 2 也仍然是使用 bail 參數(shù))
可以通過下面二維碼訂閱我的文章
公眾號【MoeLove】
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/86647.html
摘要:實(shí)現(xiàn)不定期更新技巧前端掘金技巧,偶爾更新。統(tǒng)一播放效果實(shí)現(xiàn)打字效果動畫前端掘金前端開源項(xiàng)目周報(bào)前端掘金由出品的前端開源項(xiàng)目周報(bào)第四期來啦。 Web 推送技術(shù) - 掘金騰訊云技術(shù)社區(qū)-掘金主頁持續(xù)為大家呈現(xiàn)云計(jì)算技術(shù)文章,歡迎大家關(guān)注! 作者:villainthr 摘自 前端小吉米 伴隨著今年 Google I/O 大會的召開,一個(gè)很火的概念--Progressive Web Apps ...
摘要:返回的綁定函數(shù)也能使用操作符創(chuàng)建對象這種行為就像把原函數(shù)當(dāng)成構(gòu)造器。同時(shí),將第一個(gè)參數(shù)以外的其他參數(shù),作為提供給原函數(shù)的預(yù)設(shè)參數(shù),這也是基本的顆?;A(chǔ)。 今天想談?wù)勔坏狼岸嗣嬖囶},我做面試官的時(shí)候經(jīng)常喜歡用它來考察面試者的基礎(chǔ)是否扎實(shí),以及邏輯、思維能力和臨場表現(xiàn),題目是:模擬實(shí)現(xiàn)ES5中原生bind函數(shù)。也許這道題目已經(jīng)不再新鮮,部分讀者也會有思路來解答。社區(qū)上關(guān)于原生bind的研...
摘要:返回的綁定函數(shù)也能使用操作符創(chuàng)建對象這種行為就像把原函數(shù)當(dāng)成構(gòu)造器。同時(shí),將第一個(gè)參數(shù)以外的其他參數(shù),作為提供給原函數(shù)的預(yù)設(shè)參數(shù),這也是基本的顆?;A(chǔ)。 今天想談?wù)勔坏狼岸嗣嬖囶},我做面試官的時(shí)候經(jīng)常喜歡用它來考察面試者的基礎(chǔ)是否扎實(shí),以及邏輯、思維能力和臨場表現(xiàn),題目是:模擬實(shí)現(xiàn)ES5中原生bind函數(shù)。也許這道題目已經(jīng)不再新鮮,部分讀者也會有思路來解答。社區(qū)上關(guān)于原生bind的研...
摘要:返回的綁定函數(shù)也能使用操作符創(chuàng)建對象這種行為就像把原函數(shù)當(dāng)成構(gòu)造器。同時(shí),將第一個(gè)參數(shù)以外的其他參數(shù),作為提供給原函數(shù)的預(yù)設(shè)參數(shù),這也是基本的顆?;A(chǔ)。 今天想談?wù)勔坏狼岸嗣嬖囶},我做面試官的時(shí)候經(jīng)常喜歡用它來考察面試者的基礎(chǔ)是否扎實(shí),以及邏輯、思維能力和臨場表現(xiàn),題目是:模擬實(shí)現(xiàn)ES5中原生bind函數(shù)。也許這道題目已經(jīng)不再新鮮,部分讀者也會有思路來解答。社區(qū)上關(guān)于原生bind的研...
摘要:毫無疑問,設(shè)計(jì)模式于己于他人于系統(tǒng)都是多贏的設(shè)計(jì)模式使代碼編寫真正工程化設(shè)計(jì)模小書前端掘金這是一本關(guān)于的小書。 JavaScript 常見設(shè)計(jì)模式解析 - 掘金設(shè)計(jì)模式(Design pattern)是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。毫無疑問,設(shè)計(jì)模式于己于他人于系統(tǒng)都是多贏的;設(shè)計(jì)...
閱讀 594·2021-11-18 13:12
閱讀 1314·2021-11-15 11:39
閱讀 2473·2021-09-23 11:22
閱讀 6194·2021-09-22 15:15
閱讀 3655·2021-09-02 09:54
閱讀 2310·2019-08-30 11:10
閱讀 3245·2019-08-29 14:13
閱讀 2913·2019-08-29 12:49