可是若是咱们要开发多页面项目的时候就没有这么方便了,你必需要本身配置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: '../' 配置
具体配置请查看配置文件
其余的一些问题和对应解决方案会独立出一篇文章来论述,谢谢
最后,感谢你的耐心阅读,若是对你有帮助能够点个赞哦!