可是若是咱們要開發多頁面項目的時候就沒有這麼方便了,你必需要本身配置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日補充內容--------------------------------------
今天補充了更多配置,具體以下:
一、完善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: '../' 配置
具體配置請查看配置文件
其餘的一些問題和對應解決方案會獨立出一篇文章來論述,謝謝
最後,感謝你的耐心閱讀,若是對你有幫助能夠點個贊哦!