多頁項目的webpack配置

在咱們使用vue,angular等框架開發的時候,大多數都是構建單頁項目。並且,像這樣的框架都有對應的命令一步生成webpack配置(好比vue的vue init webpack my-project之類)。


可是若是咱們要開發多頁面項目的時候就沒有這麼方便了,你必需要本身配置webpack。css

單頁項目和多頁項目的區別在於單頁項目全部的js,css等資源只須要在入口html文件中引入,你甚至都不須要額外配置,像html-webpack-plugin這樣的插件自動就幫你把js和css插入了到入index.html中了。
html

而多頁項目下每一個頁面除了有部分共享資源外,還須要引入每一個頁面單獨的js,css等文件。vue

面對這個區別,關鍵就在於html-webpack-plugin插件的配置。node

首先咱們假設全部的頁面入口文件都在 src/html/ 下,這樣咱們能夠經過nodejs的fs模塊同步讀取該目錄下的全部文件的名字:webpack

let htmlArr = fs.readdirSync(path.resolve(__dirname, 'src/html'));
複製代碼

htmlArr中將會保存一個html目錄下全部文件名的一個數組,而後咱們經過遍歷這個數組來獲取webpack的entry配置對象和html-webpack-plugin的配置對象:git

let entrys = {};
let htmlPlugins = [];
 
for(let item of htmlArr){
	//咱們只須要.html前面的文件名
	let name = item.split('.html')[0];
	htmlPlugins.push(new WebpackHtmlPlugin({
		filename: item,
		template: path.resolve(__dirname, `src/html/${item}`),
		//common表明公共模塊,name就是html對應的同名js文件
		//這個配置將會自動在生成的html中插入你指定的js
		chunks: ['common', name]
	}));
	//配置入口
	entrys[name] = `./src/js/${name}.js`;
};
複製代碼

接下來在webpack配置中傳入上面生成的entrys和htmlPlugins配置對象:
github

module.exports = merge(base, {
	//傳入entry配置
	entry: entrys,
	devtool: "cheap-module-eval-source-map",
	devServer: {
		contentBase: path.join(__dirname, "dist"),
		compress: true,
		port: 8080,
		//hot: true,
		index: 'index.html',
		open: true
	},
	plugins: [
		//傳入html-webpack-plugin配置對象
		...htmlPlugins,
	]
});
複製代碼

以上配置是我開發環境下的配置,生產環境下內容會多一點點。配置好以後編譯,你就就會發現html-webpack-plugin爲你生成了多個頁面入口html:web



其中一個比較關鍵的地方除了html-webpack-plugin的配置外就是使用node的fs模塊同步讀取html文件夾中全部文件的名字,這樣你只要在文件夾中新增一個頁面入口webpack就能自動讀取到:數組

固然這都是些基礎配置,不過已經能夠拿來用了。bash

這裏我將個人配置內容上傳到了github上:github.com/CSLLG/muti-…

---------------------------8月26日補充內容--------------------------------------

今天補充了更多配置,具體以下:

2018.8.26最新更新

一、完善url-loader對圖片資源的處理功能

二、添加html-withimg-plugin處理html中img標籤src屬性引入的圖片

三、把全部配置文件遷移到 './build/' 路徑下,目的是讓配置文件看起來更整潔

四、加入process.evn.NODE_ENV環境配置

五、添加mini-css-extract-plugin,把css文件從bundle.js中獨立成單獨的css文件

此次配置調整中遇到的問題及解決方案記錄:

一、按理說使用url-loader處理圖片應該不須要下載file-loader,可是當圖片大小超過限制編譯就會報「can not find modlue file-loader」的錯,官方文檔是說「當圖片大小超過限制時會默認使用file-loader」,但不知具體緣由是不是由於新版本url-loader將file-loader的功能剔除了。

二、webapck4.0+以上版本再也不推薦使用extract-text-webpack-plugin處理css模塊,而是推薦mini-css-extract-plugin

不過這裏有一個問題,就是當你把css文件放入dist/css/目錄下將會致使css中引用的圖片路徑出錯,網上有不少人推薦的解決方案是在output配置中加入 publicPath: '../' 配置,

但其實這樣會致使除了css中引用圖片的路徑是對的外其餘全部文件中的路徑都是錯的,甚至致使css文件引入錯誤。

最優的解決方案是在引入MiniCssExtractPlugin.loader時使用對象方式,並在options目錄下添加 publicPath: '../' 配置

具體配置請查看配置文件

其餘的一些問題和對應解決方案會獨立出一篇文章來論述,謝謝

最後,感謝你的耐心閱讀,若是對你有幫助能夠點個贊哦!

相關文章
相關標籤/搜索