此文已由作者張磊授權網易雲社群發布。
使用 webpack 的時候,難免需要寫一些 loader,接著就會遇到乙個很糾結的問題。該 loader 會生成乙個檔案,一般這個檔案的生成時機都是在 loader 處理所有的檔案後。一般有兩種處理方案。一種是寫乙個 plugin,監聽對應的事件;一種是生成乙個臨時檔案,將每次讀到的內容都寫在 臨時檔案 中。第一種在使用的時候也很麻煩,需要同時在 loader 和 plugin 加一下對應的邏輯。第二種,寫入臨時檔案的這個過程很是讓人糾結。很明顯,兩種方案對於有一定潔癖的人來說,都不優雅,那麼就來尋找一種方案,既不需要寫 plugin,又不需要寫入 臨時檔案 中。
在 github 上找到乙個可用解決方案的 loader,這個 loader 看起來是關於虛擬檔案生成的,使用很簡單,指定名字,指定內容,生成乙個虛擬檔案,研究了一下,對解決問題很有幫助。關鍵**如下:
// index.jsimport * as fspatch from './fs-patch';// 省略...fspatch.add( this.fs, );// 省略...這個檔案傳入 loader.fs,看起來是對 fs 打補丁,接著再來看 fs-patch.js
// fs-patch.jsimport path from 'path';const ns = __filename;可以看到 fs-patch.js 直接劫持了 loader.fs,重寫了 fs 的一些方法,而重寫的這些方法就是生成虛擬檔案的關鍵。劫持後的 fs 在訪問這些方法的時候,首先去從快取中獲取路徑對應的內容,不存在則再從硬碟中讀取。export function patch( fs ) ,
add( options ) ;}};
fs[ ns ] = virtualfs;
createpatchfn( fs, 'readfile', function( orig, args, file, encoding, cb ) var content = vfile.content; if ( encoding != null )
content = content.tostring( encoding );
cb( null, content ) return;
});createpatchfn( fs, 'readfilesync', function( orig, args, file, encoding ) );
createpatchfn( fs, 'stat', function( orig, args, p, cb ) ,
isdirectory() ,
isblockdevice() ,
ischaracterdevice() ,
issymboliclink() ,
isfifo() ,
issocket() ,
};cb( null, vstat ); return;
});createpatchfn( fs, 'statsync', function( orig, args, p ) ,
isdirectory() ,
isblockdevice() ,
ischaracterdevice() ,
issymboliclink() ,
isfifo() ,
issocket() ,
}; return vstat;
});};export function add( fs, options ) function createpatchfn( obj, name, fn ) ;
}
優點是不需要生成臨時檔案或者另寫乙個 plugin,缺點在檔案比較大或者計算比較頻繁,對機器的要求會比較高。
免費體驗雲安全(易盾)內容安全、驗證碼等服務
更多網易技術、產品、運營經驗分享請點選。
編寫乙個webpack loader
loader是一種打包的方案,webpack預設只識別js結尾的檔案,當遇到其他格式的檔案後,webpack並不知道如何去處理。此時,我們可以定義一種規則,告訴webpack當他遇到某種格式的檔案後,去求助於相應的loader。新建loaders資料夾並建立三個loaders檔案 remove co...
webpack loader和外掛程式的編寫原理
webpack自定義loader和外掛程式的api 點選頂部api,看左側api 1.如何編寫乙個loader 實現的功能是 把js 中的lee改成delllee this.query 獲取options的name 如果loader中有非同步 這裡注意 1 使用this.async 告訴有非同步 2...
php生成pdf生成
fpdf是乙個純粹的通過php類來生成pdf文件的方法,需要生成的內容直接在php 中來指定,生成文字,線條等等,都有自己的方法。下面介 紹乙個用fpdf來生成 hello world 的pdf文件 php require fpdf.php pdf new fpdf pdf addpage pdf ...