以前寫了一個webpack多頁應用的配置,只有一個webpack.config.js文件,實現了多入口配置打包css,js,資源文件處理。由於入口entry配置須要本身添加,HtmlWebpackPlugin有多少個頁面也要本身添加。這樣看來雖然配置是成功的,但過於機械化,是不可取的
咱們都知道開發vue,react這些應用時,通常都只有一個入口文件。並且官方都提供了本身的腳手架。可謂是很繁瑣,偏離本身實際開發的環境時,這些腳手架就不能知足咱們的要求了。雖然也有不少別人寫的多頁配置,可是感受配置模塊分離過於嚴重,並且知足不了本身的需求,不適合新手學習使用。css
不少傳統網頁的開發仍是要寫不少靜態界面,好比咱們公司,官網展現類的網站。若是要按照傳統的開發模式,咱們要爲不一樣的頁面添加css文件,js文件,這樣大大的增長了工做量,並且很枯燥。並且不能使用es6,scss.
因此這個webpack多頁配置就是爲了解決這些問題,擁抱es6.
完整配置: webpack-M-pages
本着約定大於配置的原則,咱們對頁面文件的放置進行必定的約束。
保持html文件名與入口js文件名一致,使用glob模塊,動態讀取文件夾生成配置html
└─pages //頁面配置目錄 ├─index │ index.html │ index.js │ ├─pageA │ pageA.html │ pageA.js │ └─pageB pageB.html pageB.js
│ .babelrc │ .gitignore │ .postcssrc.js │ getEntrys.js │ package-lock.json │ package.json │ README.md │ webpack.config.js │ ├─config │ base.plugin.js //包含動態生成HtmlWebpackPlugin │ entrys.js //動態入口與HtmlWebpackPlugin動態生成 │ utils.js │ └─src ├─assets │ ├─css │ │ │ bootstrap.css │ │ │ index.scss │ │ │ │ │ ├─pageA │ │ │ a.css │ │ │ as.scss │ │ │ │ │ ├─pageB │ │ │ b.css │ │ │ bb.scss │ │ │ │ │ └─pageC │ │ c.css │ │ │ ├─fonts │ │ glyphicons-halflings-regular.eot │ │ glyphicons-halflings-regular.svg │ │ glyphicons-halflings-regular.ttf │ │ glyphicons-halflings-regular.woff │ │ glyphicons-halflings-regular.woff2 │ │ │ └─img │ ph.jpg │ ├─common │ ├─css │ │ reset.css │ │ │ └─js │ common.js │ ├─js │ │ testm.js │ │ │ └─other │ a.js │ b.js │ ├─lib │ test.js │ └─pages //頁面配置目錄 ├─index │ index.html │ index.js │ ├─pageA │ pageA.html │ pageA.js │ └─pageB pageB.html pageB.js
webpack的entry配置是這樣的vue
module.exports = { devtool: '#source-map', entry:{ index:'', about:'', home:'', ..... } }
//entrys.js var glob = require('glob') var path = require('path') var PAGES_DIR = path.resolve(__dirname, '../src/pages') exports.entries = function () { var entryFiles = glob.sync(PAGES_DIR + '/*/*.js') var resultEntry = {} entryFiles.forEach(filePath => { var filename = filePath.substring(filePath.lastIndexOf('\/') + 1, filePath.lastIndexOf('.')) resultEntry[filename] = filePath }) return resultEntry }
OK,這樣咱們的入口配置文件就能夠這樣簡寫了。react
const { entries } = require("./config/entrys"); module.exports = { devtool: '#source-map', entry: entries(), }
這個其實就和自動注入entry配置同樣,因此咱們先看下 HtmlWebpackPlugin的配置
new HtmlWebpackPlugin({ template: 'index.html', filename: 'index.html', chunks: ["vendors",'index'], // hash:true, minify: { removeComments: true, collapseWhitespace: false //刪除空白符與換行符 } });
//讀取html文件 exports.htmlPages = function () { var entryHtmls = glob.sync(PAGES_DIR + '/*/*.html') var resultHtmlPages = [] entryHtmls.forEach(filePath => { var filename = filePath.substring(filePath.lastIndexOf('\/') + 1, filePath.lastIndexOf('.')) var htmlPlugin = { template: filePath, filename: filename + '.html', chunks: filename, inject: true } resultHtmlPages.push(htmlPlugin) }) return resultHtmlPages }
/*遍歷頁面,添加配置*/ let { htmlPages } = require("./entrys"); let pageArr = htmlPages(); pageArr.forEach(page => { const htmlPlugin = new HtmlWebpackPlugin({ template: page.template, filename: page.filename, chunks: ["vendors", page.chunks], // hash:true, minify: { removeComments: true, collapseWhitespace: false //刪除空白符與換行符 } }); base_plugin.push(htmlPlugin); });
let chunksArr = []; pageArr.forEach(page => { chunksArr.push(page.chunks); }); new webpack.optimize.CommonsChunkPlugin({ name: "vendors", chunks: chunksArr, //提取公用模塊 minChunks: Infinity }),
如何在windows下使用cmd命令生成文件樹?webpack
tree /f > tree.txt