但是如果我們要開發多頁面專案的時候就沒有這麼方便了,你必須要自己配置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上:github.com/CSLLG/muti-…
---------------------------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: '../' 配置
具體配置請檢視配置檔案
其他的一些問題和對應解決方案會獨立出一篇文章來論述,謝謝
最後,感謝你的耐心閱讀,如果對你有幫助可以點個贊哦!