本文的主要目標是在編寫Webpack插件時獲取有關錯誤/警告管理的額外信息。Webpack插件錯誤管理
我在Webpack plug-in documentation中看到有可能將err
參數傳遞給基於時序的插件接口(在回調中),但沒有關於它如何影響Webpack生命週期的內容的進一步解釋,它的構建過程以及如何使用它。它沒有解釋是否有辦法通過其他類型的插件接口來管理錯誤。
反正作爲第一次嘗試,在'emit'
生命週期的一步,我已經試過要麼傳遞給err
參數new Error('An error has occurred')
或只是一個'An error has occured'
值,但在任何情況下,它確實顯示給定的ERR參數中控制檯是(IE可悲的是沒有任何錯誤的具體着色),和的WebPack西弗服務器卡住了:
function WpAggregationPlugin() {
this.startTime = Date.now();
this.prevTimestamps = {};
}
WpAggregationPlugin.prototype.apply = function(compiler) {
compiler.plugin('emit', (compilation, callback) => {
var changedFiles = Object.keys(compilation.fileTimestamps).filter(watchfile =>
this.prevTimestamps[watchfile] &&
(this.prevTimestamps[watchfile] < (compilation.fileTimestamps[watchfile] || Infinity)))
// compilation.errors.push(new Error('...'))
this.prevTimestamps = compilation.fileTimestamps;
if(changedFiles.length <= 0) {
callback()
} else {
process.stdout.write(`File modification detected :\n${JSON.stringify(changedFiles, null, 4)}\n`)
callback('...')
}
});
};
module.exports = WpAggregationPlugin;
所以它需要一個額外的回調調用下面的方法,以便有的WebPack建立流程恢復:
...
if(changedFiles.length <= 0) {
callback()
} else {
process.stdout.write(`File modification detected :\n${JSON.stringify(changedFiles, null, 4)}\n`)
callback('...')
callback() // EXTRA CALL
}
...
不幸的是,通過這種方式,我只是最終將無色的字符串顯示到標準輸出,而不會以任何方式影響Webpack的生命週期。
我試圖實現的是,在我的錯誤情況下,顯示紅色錯誤消息並阻止包構建過程以valid
狀態結束,直到新構建最終讓我的插件運行時沒有錯誤。
關於警告管理我猜它必須通過直接在插件本身內調用process.stdout.write()
來執行,或者在編譯參數中提供一些警告集合......但是和我所報道的一樣在這個SO的問題...這只是猜測:p
爲了記錄,我問這個問題,因爲我已經寫了一個小的構建工具,其目標是聚集在一個文件中散佈在應用程序中的所有翻譯。這是爲了讓我們的客戶處理一個單一的翻譯文件而不是幾十個。
它可以在「單拍」模式或手錶模式下運行,但我想最好的做法是直接將其作爲插件集成到Webpack構建過程中。
因此,請隨意給我關於這個「架構」選擇的觀點,因爲作爲Webpack的新手,我絕對不會擁抱它的全部潛力,我可能會根據什麼可以/應該做到這一點(作爲一個側面說明,當然,因爲它不是這篇文章的主要原因;)
在此先感謝您的提示和技巧;)!
我終於整理出來了:真正的交易是編譯.errors.push(new Error('解釋爲什麼構建失敗'))'',當然不要忘了'callback()'不管你的插件是否失敗。這個'errors.push'將會阻止webpack-dev-server處理這些包,並且會在命令行中顯示爲紅色,如果你通過'http:// yourDN:yourPort訪問你的應用/ webpac-dev-server',你會在webpack頭部分的客戶端報告這個錯誤。在編碼之前強制你的開發人員修復錯誤;) – Lemmy