webpack 入口文件 php,如何實現webpack多入口文件打包配置

本篇文章主要介紹了webpack多入口文件頁面打包配置詳解,現在分享給大家,也給大家做個參考。

大多數情況下,我們使用 webpack來打包單頁應用程序,這個時候只需要配置一個入口,一個模板文件,但也不盡是如此,有時候也會碰到多頁面的項目,而且以我的經驗來看,這種情況出現的頻率還不低,例如項目比較大,無法進行全局的把握,或者項目需要多次的更新迭代等,都適合做成多頁面程序,這就涉及到了 webpack的多頁面文件的打包配置問題。

手動配置

單頁應用程序和多頁應用程序的 webpack配置文件其實絕大部分都還是相同的,只不過多頁的配置需要在單頁配置的基礎上顧及到多個頁面罷了,loader、output、plugins這些基本都不需要改動,需要改動的一般都是入口文件 entry,如果你用到了 抽離css樣式的插件 extract-text-webpack-plugin、自動模板插件 html-webpack-plugin的話,那么還需要對這兩個插件進行額外的改寫,大多數情況下,我們也都只需要改動這三個地方,所以本文就只簡單說下這三個位置,如果在實際的項目中還有其他的地方需要改動,參照這三個位置即可。

示例的文件目錄如下:

169c2434fe9c4bfdeb714bb755132095.png

entry

單頁應用程序的入口配置一般如下所示:entry: resolve(__dirname, "src/home/index.js")

這個配置就是指定 webpack從 /src/home/index.js這個文件開始進入,進行一系列的打包編譯過程。

如果是多頁應用程序,則需要多個入口文件,例如:entry: {

home: resolve(__dirname, "src/home/index.js"),

about: resolve(__dirname, "src/about/index.js")

}

這樣,整個項目就有了兩個入口 home和 about

extract-text-webpack-plugin

extract-text-webpack-plugin 插件主要是為了抽離css樣式,防止將樣式打包在 js中引起頁面樣式加載錯亂的現象,單頁程序中,一般這樣使用此插件:plugins: [

new ExtractTextPlugin('style.[contenthash].css')

]

而到了多頁程序,因為存在多個入口文件以及對應的多個頁面,每個頁面都有自己的 css樣式,所以需要為每個頁面各自配置一下:plugins: [

new ExtractTextPlugin('home/[name].[contenthash].css'),

new ExtractTextPlugin('about/[name].[contenthash].css')

]

除此之外還需要注意一點,每個頁面也只需要自己的 css樣式,理論上把別的頁面 css樣式文件也打包到自己的頁面中當然也是可以的,但顯然是不合理的,這只會增加冗余代碼,還可能會導致不可預測的樣式覆蓋等問題,所以需要對下面這種 loader配置進行修改:{

test: /\.css$/,

loader: 'style!css!autoprefixer'

},

{

test: /\.scss$/,

loaders: [

'style',

'css?modules&importLoaders=1&localIdentName=[path]___[name]__[local]___[hash:base64:5]',

'sass',

'autoprefixer'

]

},

上面的配置會把所有編譯出來的 css文件打包到同一個文件中,我們要做的就是把這些 css分離開,每個頁面都有各自單獨的 css樣式文件:// 為每個頁面定義一個 ExtractTextPlugin

const homeExtractCss = new ExtractTextPlugin('home/[name].[contenthash].css')

const aboutExtractCss = new ExtractTextPlugin('about/[name].[contenthash].css')

// ...

module: {

rules: [

// 每個頁面的 ExtractTextPlugin 只處理這個頁面的樣式文件

{

test: /src(\\|\/)home(\\|\/)css(\\|\/).*\.(css|scss)$/,

use: homePageExtractCss.extract({

fallback: 'style-loader',

use: ['css-loader', 'postcss-loader', 'sass-loader']

})

},

{

test: /src(\\|\/)about(\\|\/)css(\\|\/).*\.(css|scss)$/,

use: salePersonalCenterExtractCss.extract({

fallback: 'style-loader',

use: ['css-loader', 'postcss-loader', 'sass-loader']

})

}

]

}

// ...

// 每個頁面都有各自的 ExtractTextPlugin,所以需要都聲明一遍

plugins: [

homeExtractCss,

aboutExtractCss

]

html-webpack-plugin

html-webpack-plugin插件的使用,在單頁應用程序和多頁應用程序中的 webpack配置沒什么區別new HtmlWebpackPlugin({

filename: 'home/home.html',

template: 'src/home/html/index.html',

inject: true,

minify: {

removeComments: true,

collapseWhitespace: true

}

})

new HtmlWebpackPlugin({

filename: 'about/about.html',

template: 'src/about/html/index.html',

inject: true,

minify: {

removeComments: true,

collapseWhitespace: true

}

})

有幾個頁面,就對每個頁面進行上述配置即可。

自動配置

上述的配置代碼已經可以滿足多頁面開發需求了,但是有一點似乎有些遺憾,那就是每增加一個頁面,就需要更新一遍 entry、extract-text-webpack-plugin、HtmlWebpackPlugin的配置,雖然只是幾行代碼的問題,而且基本上都是復制粘貼沒什么難度,但畢竟代碼再少也需要過問,并且需要改的地方比較多,倉促之下可能還會遺漏,要是能一勞永逸,寫一遍代碼,無論以后增刪頁面都不需要過問就好了。

稍微觀察下這個目錄就可以發現,這個目錄結構其實是很有規律的:

169c2434fe9c4bfdeb714bb755132095.png

每個頁面都是 src/目錄下的一個文件夾,這個文件夾中有兩個子目錄,分別存放這個頁面的模板 html,樣式文件 css,還有一個入口文件 index.js

既然有規則,那么肯定是可以進行程序編碼的,如果按照這種規則,每個頁面都是 ./src下的一個目錄,目錄名即為頁面名,并且這個目錄中的結構也都是相同的,那么可以通過一個通用方法來獲取所有的頁面名稱(例如 home、about),這個通用方法的一個示例如下:function getEntry () {

let globPath = 'src/**/html/*.html'

// (\/|\\\\) 這種寫法是為了兼容 windows和 mac系統目錄路徑的不同寫法

let pathDir = 'src(\/|\\\\)(.*?)(\/|\\\\)html'

let files = glob.sync(globPath)

let dirname, entries = []

for (let i = 0; i < files.length; i++) {

dirname = path.dirname(files[i])

entries.push(dirname.replace(new RegExp('^' + pathDir), '$2'))

}

return entries

}

借助 glob這個庫,遍歷 .src/目錄下具有這種規律 src/**/html/*.html的子目錄,通過正則匹配出這個子目錄的名稱

獲取到了所有的頁面名稱,下面就好辦了。

entry// entry: resolve(__dirname, "src/home/index.js")

// 改為

entry: addEntry()

//...

function addEntry () {

let entryObj = {}

getEntry().forEach(item => {

entryObj[item] = resolve(__dirname, 'src', item, 'index.js')

})

return entryObj

}

extract-text-webpack-plugin// plugins: [

// new ExtractTextPlugin('home/[name].[contenthash].css'),

// new ExtractTextPlugin('about/[name].[contenthash].css')

//]

// 改為

const pageExtractCssArray = []

getEntry().forEach(item => {

pageExtractCssArray.push(new ExtractTextPlugin(item + '/[name].[contenthash].css'))

})

// ...

plugins: [...pageExtractCssArray]

module.rules樣式相關的兩個loaders刪掉,改為動態添加:getEntry().forEach((item, i) => {

webpackconfig.module.rules.push({

test: new RegExp('src' + '(\\\\|\/)' + item + '(\\\\|\/)' + 'css' + '(\\\\|\/)' + '.*\.(css|scss)$'),

use: pageExtractCssArray[i].extract({

fallback: 'style-loader',

use: ['css-loader', 'postcss-loader', 'sass-loader']

})

})

})

// ...

module.exports = webpackconfig

html-webpack-plugin

plugins中無需手動初始化 html-webpack-plugin,改為動態添加:getEntry().forEach(pathname => {

let conf = {

filename: path.join(pathname, pathname) + '.html',

template: path.join(__dirname, 'src', pathname, 'html', 'index.html')

}

webpackconfig.plugins.push(new HtmlWebpackPlugin(conf))

})

// ...

module.exports = webpackconfig

完成了上述修改后,以后無論是在項目中添加頁面還是刪除頁面,都無需再對 webpack配置進行手動修改了,雖然開始時開起來似乎這種動態的自動配置代碼比較多,而且稍微復雜一點,但是從長期來看,絕對是一勞永逸的好做法。

另外,如果你的項目目錄結構和我示例的目錄結構不一樣,那么就需要你根據自己的目錄結構對代碼進行少許的修改,但整體解決問題的方法是不變的,一個易于維護的項目,目錄結構都該是有律可循的。

上面是我整理給大家的,希望今后會對大家有幫助。

相關文章:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/533882.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533882.shtml
英文地址,請注明出處:http://en.pswp.cn/news/533882.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

接口里面的方法都是抽象方法嗎_大家都在講高中學習的方法有哪些,那方法和技巧有什么異同的嗎?...

大家都在講高中學習的方法有哪些&#xff0c;那方法和技巧有什么異同嗎&#xff1f;高中怎樣學習&#xff0c;方法重要還是技巧更重要&#xff1f;老牛倒是覺得&#xff0c;二者密不可分&#xff0c;缺一不可。那么&#xff0c;我們一起來看看&#xff0c;高中怎樣學習才是最好…

python 筆試題 英方_4000字轉型數據分析師筆試面試經驗分享

大家好&#xff0c;我是戴師兄~在上一篇文章中我分享了快速自學數據分析的經驗。本篇文章&#xff0c;我將跟大家分享下我的筆試和面試心得。開頭先說說我轉型前的職業背景&#xff1a;想看筆試面試經驗的同學萌可以直接跳過這一段~2018年我從中國人民大學經濟管理學專業畢業&a…

android 抓取webview中的所有圖片_如何一鍵提取PDF文檔中的所有圖片?

原標題&#xff1a;如何一鍵提取PDF文檔中的所有圖片&#xff1f;目前PDF文檔被大家廣泛應用&#xff0c;主要是因為PDF文檔在傳輸和轉換的過程中比較穩定&#xff0c;所以PDF格式幾乎是辦公文件格式的首選。大家都知道PDF文檔轉換格式以及編輯都需要專門的PDF編輯器來實現。但…

php shell 交互,通過 Tinker 實現 Laravel 命令行交互式 Shell

通過 Tinker 實現 Laravel 命令行交互式 Shell由 學院君 創建于2年前, 最后更新于 1年前版本號 #19508 views4 likes0 collectsREPL 與 PsySHLaravel 自帶了一個功能強大的 REPL —— Tinker&#xff0c;所謂 REPL&#xff0c;是 Read–Eval–Print-Loop 的縮寫&#xff0c;這是…

python中垃圾回收機制_Python中的變量和垃圾回收機制

1、python中的變量python和java中的變量本質不一樣。java中聲明變量時要指定變量的數據類型&#xff0c;int、str或某一類&#xff0c;之后虛擬機就會在內存中申請一塊空間&#xff0c;空間的大小跟類型相關。通俗的理解就是把變量想象成一個盒子&#xff0c;盒子里能裝什么東西…

戴爾電腦好還是華為好_華碩和戴爾筆記本哪種好 華碩和戴爾優缺點分析【詳解】...

隨著時代快速的發展&#xff0c;筆記本電腦已經成了我們生活中的標配。如今&#xff0c;市面上筆記本電腦的款式眾多&#xff0c;相信大家對華碩和戴爾并不陌生吧&#xff01;那么&#xff0c;我們該怎么去選擇呢&#xff1f;今天小編就給大家介紹華碩和戴爾筆記本哪個好&#…

php檢查 session是否存在,檢查sessionid已知的PHP會話是否處于活動狀態

實際上,您可以將session_id和session_start用于此目的.$ids [135b29ef958a23418f2a804474787305, // active session135b29ef958a23418f2a804474787306, // inactive session135b29ef958a23418f2a804474787305, // active session];foreach($ids as $id){session_id($id);sess…

c++ python混合編程 restful_簡單上手nodejs調用c++(c++和js的混合編程)

因為項目的原因&#xff0c;最近經常使用node.js搭RESTful接口。性能還是很不錯啦&#xff0c;感覺比Spring Boot之類的要快。而且在不錯的性能之外&#xff0c;只要程序結構組織好&#xff0c;別讓太多的回調把程序結構搞亂&#xff0c;整體開發效率比Java快的就太多了。如果想…

電腦掃描二維碼_線上分享 | 網絡工作坊:平板電腦工作術

澳門生產力暨科技轉移中心將于9月29日下午3時&#xff0c;舉辦資訊科技工具應用線上工作坊&#xff0c;講解平板電腦辦公應用&#xff0c;歡迎有興趣人士報名&#xff0c;名額有限&#xff0c;先到先得。該中心早前已舉辦是次主題的應用工作坊&#xff0c;坊間反應積極&#xf…

java bean 轉json 串,終于找到了一篇能看懂的如何把javabean轉換成json字符串的文章,嘿嘿,分享一下!...

學會了在j2ee中使用ajax后,有時候從服務器返回客戶端的數據是對象&#xff0c;自己手動拼湊json字符串容易出錯&#xff0c;通過谷歌知道了json-lib這個類庫&#xff0c;方便的支持java中對象到json字符串的轉化。看source-forge的json-lib介紹說&#xff0c;需要jakarta commo…

數據庫設置_CentOS7 - 設置MySQL數據庫

設置MySQL數據庫本文介紹如何在CentOS上執行流行的MySQL數據庫服務器的基本安裝。 MySQL是當今使用最廣泛的數據庫系統&#xff0c;它可以在許多不同的行業中找到&#xff0c;為動態網站和大型數據倉庫等各種產品提供數據存儲。準備此配方要求CentOS系統具有有效的網絡連接和管…

提出離職后怎么定last day_不管你因為什么離職,用正規的離職方式是你最正確的選擇!...

#不管你是因為什么離職&#xff0c;用正規的離職方式離職是你最正確的選擇&#xff0c;如果因為不恰當的方式造成與公司的矛盾&#xff0c;可能讓你今后會非常被動。書面離職是最具有法律效力的&#xff0c;按照勞動法&#xff0c;你有權在提出正式離職一個月后走人&#xff0c…

mqtt php 16進制數據,phpMQTT 內存耗死問題

場景:(訂閱)鏈接不上mqtt的時候&#xff0c;一下代碼會出錯&#xff1a;function read($int 8192, $nb false){// print_r(socket_get_status($this->socket));$string"";$togo $int;if($nb){return fread($this->socket, $togo);}// var_dump($this->so…

人臉識別代碼_10行代碼實現人臉識別

什么是人臉識別人臉識別&#xff0c;是基于人的臉部特征信息進行身份識別的一種生物識別技術。用攝像機或攝像頭采集含有人臉的圖像或視頻流&#xff0c;并自動在圖像中檢測和跟蹤人臉&#xff0c;進而對檢測到的人臉進行臉部識別的一系列相關技術&#xff0c;通常也叫做人像識…

ticketvalidationexception票根不符合目標服務_如何在有效降低企業倉儲成本的同時不降低企業的總體服務質量目標水平?...

對于企業而言&#xff0c;如何降低倉儲成本&#xff0c;同時要保證物流總成本最低和不降低企業的總體服務質量和目標水平的前提下進行&#xff0c;常見的措施有以下幾點&#xff1a;一用“先進先出方式&#xff0c;減少倉儲物的保管風險。”先進先出是儲存管理的準則之一&#…

matlab編程 英文翻譯,MATLAB編程,MATLAB programming,音標,讀音,翻譯,英文例句,英語詞典...

Image:114994698204558.jpgmatlabmatlab是矩陣實驗室(matrix laboratory)之意。除具備卓越的數值計算能力外&#xff0c;它還提供了專業水平的符號計算&#xff0c;文字處理&#xff0c;可視化建模仿真和實時控制等功能。matlab的基本數據單位是矩陣&#xff0c;它的指令表達式…

python進群_Manim-python 進群問題之解答

事情起因人閑下來的時候總想找點事情做&#xff01;這不&#xff0c;昨天考完試后在B站上逛&#xff0c;不小心進入了學習區&#xff0c;在00后學長那里看到了一個視頻。鏈接如下&#xff1a;具有美感的傅里葉級數居然還能夠畫畫&#xff01;&#xff01;&#xff01;這讓我一個…

python科學計算_可視化圖解Python科學計算包NumPy

NumPy包是python生態系統中數據分析、機器學習和科學計算的主力。 它極大地簡化了向量和矩陣的操作。Python的一些主要軟件包依賴于NumPy作為其基礎架構的基礎部分&#xff08;例如scikit-learn、SciPy、pandas和tensorflow&#xff09;。我們將介紹一些使用NumPy的主要方法&am…

php 導出excel 特殊字符,PHPEXCEL導出,存在特殊字符遇到的問題

[13] > Array([payment_success_at] >[user_name] > ?.琳琳?[remarks] >[product_name] > 香菇[sku_name] > 斤[product_property] > 斤[price_original] > 5.50[price_current] > 5.50[consignee] > ?.琳琳?)以上代碼中用戶名中存在特殊符號…

win10任務欄怎么還原到下面_詳解:新版 WIN 10 V2004 任務欄和開始菜單全透明

是不是很酷炫&#xff1f;繼續往下看&#xff0c;你也可以簡單做到導語本文將告訴你如何借助一個小工具&#xff0c;將最新版 WIN 10 開始菜單和任務欄設置成全透明&#xff0c;以獲得超酷的視覺體驗。安裝和設置都很簡單&#xff0c;關鍵是一定要找到適合 WIN 10 版本的 Start…