您的位置:首页 > Web前端 > Webpack

重写webpack多页应用配置脚手架

2017-06-25 09:14 423 查看
之前写了一个webpack多页应用的配置,只有一个webpack.config.js文件,实现了多入口配置打包css,js,资源文件处理。因为入口entry配置需要自己添加,HtmlWebpackPlugin有多少个页面也要自己添加。这样看来虽然配置是成功的,但过于机械化,是不可取的

为什么要进行多页应用配置?

我们都知道开发vue,react这些应用时,一般都只有一个入口文件。而且官方都提供了自己的脚手架。可谓是很繁琐,偏离自己实际开发的环境时,这些脚手架就不能满足我们的要求了。虽然也有很多别人写的多页配置,但是感觉配置模块分离过于严重(我看不懂,囧),而且满足不了自己的需求,不适合新手学习使用。

很多传统网页的开发还是要写很多静态界面,比如我们公司,官网展示类的网站。如果要按照传统的开发模式,我们要为不同的页面添加css文件,js文件,这样大大的增加了工作量,而且很枯燥。而且不能使用es6,scss.

所以这个webpack多页配置就是为了解决这些问题,拥抱es6.

完整配置:webpack-M-pages

先看下脚手架的目录

│  .babelrc
│  .gitignore
│  a.txt
│  base.plugin.js //动态生成HtmlWebpackPlugin
│  entry.config.js//读取多页入口文件
│  package.json
│  pagesArray.js //获取多页文件,HtmlWebpackPlugin的参数
│  README.md
│  utils.js  //生产环境与开发环境
│  webpack.config.js
│
└─src
├─common //公用样式
│  ├─css
│  │      reset.css
│  │
│  └─js  //公用js
│          common.js
│          easyTable.js
│
├─css
│  │  bootstrap.css
│  │  index.css
│  │
│  ├─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
│
├─js
│      index.js
│      mod.js
│      pageA.js
│      pageB.js
│      pageC.js
│      testm.js
│
├─lib
│      easyTable.js
│      mod.js
│
└─pages
index.html
pageA.html
pageB.html
pageC.html


打包后的目录

│  index.html
│  pageA.html
│  pageB.html
│  pageC.html
│
└─static
├─css
│      index.css
│      index.css.map
│      pageA.css
│      pageA.css.map
│
├─fonts
│      glyphicons-halflings-regular.eot
│      glyphicons-halflings-regular.ttf
│      glyphicons-halflings-regular.woff
│      glyphicons-halflings-regular.woff2
│
├─img
│      glyphicons-halflings-regular.f721466.svg
│      ph.50e1eb2.jpg
│
└─js
indexa94351a6f2b24f4c647a.js
moda94351a6f2b24f4c647a.js
pageAa94351a6f2b24f4c647a.js
pageBa94351a6f2b24f4c647a.js
pageCa94351a6f2b24f4c647a.js
testma94351a6f2b24f4c647a.js
vendorsa94351a6f2b24f4c647a.js


怎么自动注入entry配置?

webpack的entry配置是这样的

module.exports = {
devtool: '#source-map',
entry:{
index:'',
about:'',
home:'',
.....
}
}


1.问题来了,当入口文件很多的时候怎么办? 一个个写?显然这是不可行的。怎么解决?

当然是读取文件夹下的文件了,然后写入配置呗。

//entry.config.js
var path = require('path');
var fs = require('fs');
let entry_files = {};
function each_file(dir) {
try {
fs.readdirSync(dir).forEach(function (file) {
var file_path = dir + '/' + file;
var fname = path.basename(file, '.js');
entry_files[fname]=file_path;
})
} catch (e) {

}
}
each_file('./src/js');
//entry_files是一个object对象,也就是遍历js文件夹下的js文件,然后写成entry所需配置的格式。
module.exports=entry_files;


OK,这样我们的入口配置文件就可以这样简写了。

var entry_files=require('./entry.config');
module.exports = {
devtool: '#source-map',
entry: entry_files,

}


怎么自动配置HtmlWebpackPlugin?

这个其实就和自动注入entry配置一样,所以我们先看下 HtmlWebpackPlugin的配置

new HtmlWebpackPlugin({
template: '',//你的html页面地址
filename: '',//生成后html的名字
chunks: ['vendors'],
// hash:true,
minify: {
removeComments: true,
collapseWhitespace: false //删除空白符与换行符
}
});


OK,一样的办法我们读取html模板文件,然后写成需要的格式呗

//pagesArray.js
var path = require('path');
var fs = require('fs');
let pagesArray = [];
function each_file(dir) {
try {
fs.readdirSync(dir).forEach(function (file) {
/*
* {
*   index:'./src/index.html',
*   chunkname:'index'
* }
* */
var file_obj={};
var file_path = dir + '/' + file;
var chunk_name = path.basename(file, '.html');
file_obj['filename']=file;
file_obj['template']=file_path;
file_obj['chuckName']=chunk_name;
pagesArray.push(file_obj)
})
} catch (e) {

}
}
each_file('./src/pages');
//导出我们需要的html模板信息
module.exports=pagesArray;


/*遍历页面,添加配置*/
pagesArray.forEach((page)=>{
const htmlPlugin = new HtmlWebpackPlugin({
template: page.template,
filename: page.filename,
chunks: ['vendors', page.chuckName],
// hash:true,
minify: {
removeComments: true,
collapseWhitespace: false //删除空白符与换行符
}
});

base_plugin.push(htmlPlugin)


然后就可以这样配置webpack了

plugins: require('./base.plugin')


这样就算我们完成了多页配置了,是不是很不错呢?

温馨提示

如何在windows下使用cmd命令生成文件树?

tree /f > tree.txt
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: