webpack 打包多頁面應(yīng)用

和傳統(tǒng)的單頁面應(yīng)用打包不同,多頁面應(yīng)用其實就是配置多個入口,生成多個bundle。
下面就來看看具體應(yīng)該怎么操作吧

image.png

這是官方提供的示例,可以看到,entry變成了一個對象,而里面每一個鍵值對則就對應(yīng)了我們每一個最終生成的bundle。文檔地址:https://www.webpackjs.com/concepts/entry-points/#separate-app-and-vendor-entries

其實還是非常簡單的,原理上來說就是配置多個入口文件,使webpack生成多個依賴關(guān)系,從而構(gòu)建出多個bundlejs。這樣我們在不同的html文件引入對應(yīng)的bundle就行了。

但是有一個問題,這樣的配置我們每增加一個子頁面都需要去寫一個entry的鍵值對,非常的麻煩。那有沒有什么辦法可以一次性獲取到這些子頁面然后自動生成entry呢?

答案是有的,借助glob這個庫就可以完成。

glob這個庫有個sync的方法,可以獲取指定路徑下的所有文件,有了這個我們不就可以一次性拿到所有的子頁面了嘛。下面一起來看看具體操作吧

首先下載以下這個庫

npm i glob -D
const setMPA = ()=>{
    const entry = {}
    const htmlWebpackPlugin = []
    const entryFile = glob.sync('./pages/*/main.js')
    entryFile.forEach((filePath,index)=>{
        //根據(jù)獲取到的路勁生成多入口entry對象
        const entryName = filePath.split('/pages/')[1].split('/main.js')[0]
        entry[entryName] = filePath
        //接著生成每個入口的html模板
        htmlWebpackPlugin.push(
            new HtmlWebpackPlugin({
                filename: `${entryName}.html`,
                template: path.resolve(__dirname,`./pages/${entryName}/public/index.html`),
                chunks: [entryName], //只打入指定的chunks,不然的話webpack會將所有bundle都引入
                inject: true,//配置所有js資源放置在html得哪個位置
                minify:{
                    //壓縮配置
                    collapseWhitespace: true,
                    preserveLineBreaks:false,
                    html5:true,
                    minifyCSS:true,
                    minifyJS:true,
                    removeComments: true,
                }
            })
        )
    })
    return{
        entry,
        htmlWebpackPlugin
    }
}

有了這個函數(shù),就能拿到最新的entry以及最新的htmlWebpackPlugin配置。

目錄結(jié)構(gòu)如下


image.png

下面來看看效果


image.png

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容