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页面滚动浮动层智能定位实例代码
Aug 23 Javascript
一个通过script自定义属性传递配置参数的方法
Sep 15 Javascript
使用JavaScript链式编程实现模拟Jquery函数
Dec 21 Javascript
浅谈javascript构造函数与实例化对象
Jun 22 Javascript
jquery实现select下拉框美化特效代码分享
Aug 18 Javascript
JS原型、原型链深入理解
Feb 27 Javascript
javaScript实现鼠标在文字上悬浮时弹出悬浮层效果
Apr 12 Javascript
通过实例了解js函数中参数的传递
Jun 15 Javascript
vue中监听路由参数的变化及方法
Dec 06 Javascript
Bootstrap简单实用的表单验证插件BootstrapValidator用法实例详解
Mar 29 Javascript
JavaScript 正则应用详解【模式、欲查、反向引用等】
May 13 Javascript
JS+CSS实现炫酷光感效果
Sep 05 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
YII实现分页的方法
2014/07/09 PHP
国产PHP开发框架myqee新手快速入门教程
2014/07/14 PHP
php实现扫描二维码根据浏览器类型访问不同下载地址
2014/10/15 PHP
php设置静态内容缓存时间的方法
2014/12/01 PHP
PHP的Socket通信之UDP通信实例
2015/07/02 PHP
php中实现用数组妩媚地生成要执行的sql语句
2015/07/10 PHP
PHP+mysql实现从数据库获取下拉树功能示例
2017/01/06 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
PHP检查网站是否宕机的方法示例
2017/07/24 PHP
jquery 简短几句代码实现给元素动态添加及获取提示信息
2011/09/01 Javascript
js的hasownproperty使用示例
2014/03/02 Javascript
通过JS来动态的修改url,实现对url的增删查改
2014/09/01 Javascript
js实现鼠标滚轮控制图片缩放效果的方法
2015/02/20 Javascript
javascript实现可拖动变色并关闭层窗口实例
2015/05/15 Javascript
js动态生成form 并用ajax方式提交的实现方法
2016/09/09 Javascript
Knockout结合Bootstrap创建动态UI实现产品列表管理
2016/09/14 Javascript
jQuery手风琴的简单制作
2017/05/12 jQuery
微信小程序 空白页重定向解决办法
2017/06/27 Javascript
Vue2路由动画效果的实现代码
2017/07/10 Javascript
js实现图片懒加载效果
2017/07/17 Javascript
node实现简单的反向代理服务器
2017/07/26 Javascript
基于canvas粒子系统的构建详解
2017/08/31 Javascript
node实现的爬虫功能示例
2018/05/04 Javascript
vue底部加载更多的实例代码
2018/06/29 Javascript
vue集成kindeditor富文本的实现示例代码
2019/06/07 Javascript
Python3连接MySQL(pymysql)模拟转账实现代码
2016/05/24 Python
对python3 sort sorted 函数的应用详解
2019/06/27 Python
Python 实现自动导入缺失的库
2019/10/29 Python
Python实现屏幕录制功能的代码
2020/03/02 Python
上海奥佳笔试题面试题
2016/11/16 面试题
教师实习自我鉴定
2013/12/14 职场文书
项目建议书怎么写
2014/05/15 职场文书
普通党员对照检查材料
2014/09/24 职场文书
教师求职自荐信
2015/03/26 职场文书
Python的flask接收前台的ajax的post数据和get数据的方法
2021/04/12 Python
还在手动盖楼抽奖?教你用Python实现自动评论盖楼抽奖(一)
2021/06/07 Python