webpack loader 生成虛擬檔案的方案

2022-06-06 19:33:15 字數 1925 閱讀 6751

此文已由作者張磊授權網易雲社群發布。

使用 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;

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 ) ;

}

可以看到 fs-patch.js 直接劫持了 loader.fs,重寫了 fs 的一些方法,而重寫的這些方法就是生成虛擬檔案的關鍵。劫持後的 fs 在訪問這些方法的時候,首先去從快取中獲取路徑對應的內容,不存在則再從硬碟中讀取。

優點是不需要生成臨時檔案或者另寫乙個 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 ...