webpack 3.X学习之多页面打包的方法


Posted in Javascript onSeptember 04, 2018

简介

我们开发不可能只写一个页面,每次都要写很多页面,这时为了开发效率,我们使用前端自动化工具webpack,那么webpack是如何打包页面的呢?又是如何打包多页面的呢?

单页面打包

我们知道要打包单页面的方法,很简单,配置入口,和html插件,

const HtmlWebpackPlugin = require('html-webpack-plugin');

const config = {
 entry:{
  index:'./src/index.js'
 },
 output:{
  path: path.join(__dirname, 'dist'),
  filename: 'js/index.js'
 }
 ...
 plugins:[
  new HtmlWebpackPlugin({
   filename: 'index.html',
   template: './src/index.html',
   hash: true,
   minify: {
    removeAttributeQuotes:true,
    removeComments: true,
    collapseWhitespace: true,
    removeScriptTypeAttributes:true,
    removeStyleLinkTypeAttributes:true
   }
  })
 ]
}

上面的配置就是打包一个单页面的代码,具体配置项的意思请参考HTMLWebpackPlugin;

如何打包多页面

在学了webpack之后,我的感受是我会配置webpack了,也能运行了,但是学习的过程中都是单页面的,那么多页是如何打包的呢?其实多页面的打包和单页面的打包的原理是一样的,只是多配置几个对应的入口,和出口,以及HtmlWebpackPlugin对象;当然你完全可以像下面这样:

const config = {
 entry:{
  index:'./src/index.js',
  info:'./src/index.js'
 },
 output:{
  path: path.join(__dirname, 'dist'),
  filename: 'js/[name].js'
 }
 ...
 plugins:[
  new HtmlWebpackPlugin({
   filename: 'index.html',
   template: './src/index.html',
   chunks:['index'],
   hash: true,
   minify: {
    removeAttributeQuotes:true,
    removeComments: true,
    collapseWhitespace: true,
    removeScriptTypeAttributes:true,
    removeStyleLinkTypeAttributes:true
   }
  }),
  new HtmlWebpackPlugin({
   filename: 'info.html',
   template: './src/info.html',
   hash: true,
   chunks:['info'],
   minify: {
    removeAttributeQuotes:true,
    removeComments: true,
    collapseWhitespace: true,
    removeScriptTypeAttributes:true,
    removeStyleLinkTypeAttributes:true
   }
  })
 ]
}

细心的你肯定发现我改变了几个地方,一是,把output.filename的‘js/index.js'变成了‘js/[name].js',这是因为我们是多页面,每个页面对应相应的js这样方便管理,二是,在HtmlWebpackPlugin对象中添加了chunks这个属性,chunk属性是让你选择对应的js模块;

上面这种写法当然是没有问题,这是只有两个页面无所谓,那么有十个甚至更多呢,我们一直做着重复的事,这不是我们程序员的风格,我们就是为了能够偷懒才做程序员的不是吗?(当然还有高工资(#^.^#)),接下来我们来抽离这些重复的事;

首先,我们通过Node的glob对象,来获取我们存在的html或js;

/**
*
* @param {string} globPath 文件的路径
* @returns entries
*/
function getView(globPath,flag){
 let files = glob.sync(globPath);

 let entries = {},
 entry, dirname, basename, pathname, extname;

 files.forEach(item => {
  entry = item;
  dirname = path.dirname(entry);//当前目录
  extname = path.extname(entry);//后缀
  basename = path.basename(entry, extname);//文件名
  pathname = path.join(dirname, basename);//文件路径
  if (extname === '.html') {
   entries[pathname] = './' + entry;
  } else if (extname === '.js') {
   entries[basename] = entry;
  }
 });

 return entries;
}

既然,我们已经有了getView()函数,可以获取html和js文件,那么我们就可以确定有多少个入口,和多少个页面;
let entriesObj = getView('./src/js/*.js');

let config = {
 entry:entriesObj,
 ...
}

上面我们就配置好了入口,不需要我们手动添加了,有多少js就有多少入口;

let pages = Object.keys(getView('./src/*html'));

pages.forEach(pathname => {
 let htmlname = pathname.split('src\\')[1];
 let conf = {
  filename: `${htmlname}.html`,
  template: `${pathname}.html`,
  hash: true,
  chunks:[htmlname],
  minify: {
   removeAttributeQuotes:true,
   removeComments: true,
   collapseWhitespace: true,
   removeScriptTypeAttributes:true,
   removeStyleLinkTypeAttributes:true
  }
 }

 config.plugins.push(new HtmlWebpackPlugin(conf));
});

最后,我们获取HTML页面,和添加对应页面的HTMLWebpackPlugin对象;

后记

通过以上的三个步骤,就可以配置好一个可以打包多页面的webpack工具;本人的水平比较有限,在书写的过程中,可能有很多说的比较模糊,请多多包涵,也请大神拍砖,多多指教

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery News Ticker 基于jQuery的即时新闻行情展示插件
Nov 05 Javascript
js URL参数的拼接方法比较
Feb 15 Javascript
分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容
Apr 20 Javascript
JavaScript实现简单获取当前网页网址的方法
Nov 09 Javascript
跨域请求的完美解决方法(JSONP, CORS)
Jun 12 Javascript
Bootstrap table简单使用总结
Feb 15 Javascript
基于JavaScript 性能优化技巧心得(分享)
Dec 11 Javascript
详解layui中的树形关于取值传值问题
Jan 16 Javascript
轻量级JS Cookie插件js-cookie的使用方法
Mar 22 Javascript
基于elementUI实现图片预览组件的示例代码
Mar 31 Javascript
Vue函数式组件的应用实例详解
Aug 30 Javascript
基于javascript的无缝滚动动画实现2
Aug 07 Javascript
JS获取并处理php数组的方法实例分析
Sep 04 #Javascript
vue click.stop阻止点击事件继续传播的方法
Sep 04 #Javascript
vue form 表单提交后刷新页面的方法
Sep 04 #Javascript
原生JS实现动态加载js文件并在加载成功后执行回调函数的方法
Dec 30 #Javascript
微信小程序内拖动图片实现移动、放大、旋转的方法
Sep 04 #Javascript
JS中DOM元素的attribute与property属性示例详解
Sep 04 #Javascript
JavaScript使用indexOf()实现数组去重的方法分析
Sep 04 #Javascript
You might like
php实现文件编码批量转换
2014/03/10 PHP
Thinkphp中的curd应用实用要点
2015/01/04 PHP
PHP内核探索之变量
2015/12/22 PHP
Laravel框架模板继承操作示例
2018/06/11 PHP
laravel 数据迁移与 Eloquent ORM的实现方法
2019/04/12 PHP
脚本之家贴图转换+转贴工具用到的js代码超级推荐
2007/04/05 Javascript
JQuery打造PHP的AJAX表单提交实例
2009/11/03 Javascript
javascript中Math.random()使用详解
2015/04/15 Javascript
jQuery的选择器中的通配符[id^='code']或[name^='code']及jquery选择器总结
2015/12/24 Javascript
jquery遍历标签中自定义的属性方法
2016/09/17 Javascript
从零开始做一个pagination分页组件
2017/03/15 Javascript
vue Render中slots的使用的实例代码
2017/07/19 Javascript
template.js前端模板引擎使用详解
2017/10/10 Javascript
vue-cli2.9.3 详细教程
2018/04/23 Javascript
Vue.js 图标选择组件实践详解
2018/12/03 Javascript
Vue CLI3移动端适配(px2rem或postcss-plugin-px2rem)
2020/04/27 Javascript
Javascript前端下载后台传来的文件流代码实例
2020/08/18 Javascript
TypeScript 运行时类型检查补充工具
2020/09/28 Javascript
[01:55]2014DOTA2国际邀请赛 BBC正赛第一天总结
2014/07/10 DOTA
Python实现的数据结构与算法之基本搜索详解
2015/04/22 Python
九步学会Python装饰器
2015/05/09 Python
python生成IP段的方法
2015/07/07 Python
浅谈Python 字符串格式化输出(format/printf)
2016/07/21 Python
对python多线程SSH登录并发脚本详解
2019/02/14 Python
浅谈pycharm使用及设置方法
2019/09/09 Python
Python pip安装模块提示错误解决方案
2020/05/22 Python
Pretty Little Thing美国:时尚女性服饰
2018/08/27 全球购物
new修饰符是起什么作用
2015/06/28 面试题
DOM和JQuery对象有什么区别
2016/11/11 面试题
幼儿园五一活动方案
2014/02/07 职场文书
高中微机老师自我鉴定
2014/02/16 职场文书
《春笋》教学反思
2014/04/15 职场文书
委托代理人授权委托书范本
2014/09/24 职场文书
普通党员个人整改措施
2014/10/27 职场文书
储备店长岗位职责
2015/04/14 职场文书
2016年推广普通话宣传周活动总结
2016/04/06 职场文书