多頁項目的webpack配置

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

 

但是如果我們要開發多頁面項目的時候就沒有這麼方便了,你必須要自己配置webpack。

 

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

 

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

 

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

首先我們假設所有的頁面入口文件都在 src/html/ 下,這樣我們可以通過nodejs的fs模塊同步讀取該目錄下的所有文件的名字:

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

htmlArr中將會保存一個html目錄下所有文件名的一個數組,然後我們通過遍歷這個數組來獲取webpack的entry配置對象和html-webpack-plugin的配置對象:

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配置對象:

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:

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

 

當然這都是些基礎配置,不過已經可以拿來用了。

這裏我將我的配置內容上傳到了github上:https://github.com/SailorCai/muti-page-webpack

---------------------------8月26日補充--------------------------------------

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

2018.8.26最新更新

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

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

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

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

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

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

1、按理說使用url-loader處理圖片應該不需要下載file-loader,但是當圖片大小超過限制編譯就會報“can not find modlue file-loader”的錯,官方文檔是說“當圖片大小超過限制時會默認使用file-loader”,但不知具體原因是否是因爲新版本url-loader將file-loader的功能剔除了。

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

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

但其實這樣會導致除了css中引用圖片的路徑是對的外其他所有文件中的路徑都是錯的,甚至導致css文件引入錯誤。

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

具體配置請查看配置文件

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

 

最後,感謝你的耐心閱讀,如果對你有幫助可以點個贊哦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章