webpack多页面开发实践


Posted in Javascript onDecember 18, 2017

写在前面

webpack是一款模块加载器兼打包工具,能把js,css,页面,图片,视频等各种资源,进行模块化处理。而现在网上流传很多单页面的webpack模型,那多页面呢?比较少,现在我提供一个多页面的前端模型。希望大家适合使用。

在最开始接触webpack的时候,我都觉得webpack只适用于单页面应用,比如webpack+react,webpack+vue。我自己在使用webpack+vue构建项目及开发的过程中感受到了webpack的强大和方便。基于实际项目需求,我在想,多页面站点是否也能使用webapck来构建呢?于是就开始了一番探索,最终算是搭建了一套比较完整的解决方案。

本文以一个实际项目为例子,讲述在多页面项目中如何使用webpack进行工程化构建。本文是自己的实践经验总结,所以有些解决方案并不是最优的,仍在探索优化中,如果有什么错误纰漏,欢迎指出。

简介

本项目主要基于webpack2.x构建,以gulp作为辅助工具。前端使用art-template作为模板引擎,一个页面对应一个模板文件和一个入口文件,入口文件中可以通过import或require引入其他模块,这些模块webpack会自动跟入口文件合并为一个文件。

前端开发环境搭建

主要目录结构

├─dist          #打包后生成的文件目录
└─src           #开发目录
  ├─components     #通用组件
  ├─static       #静态资源目录
  │ ├─css
  │ ├─img
  │ └─js
  │   ├─component  #站点通用组件对应的js
  │   ├─lib     #第三方js库
  │   ├─services   #各页面入口
  │   └─util     #通用工具js
  ├─template      #html模板
  └─views        #页面
   main.js       #公共入口
gulpfile.js        #gulp任务配置
package.json       #项目依赖
webpack.config.js     #webpack配置

webpack配置

入口文件

// 获取入口文件
var entries = (function() {
  var jsDir = path.resolve(__dirname, 'src/static/js/services');
  var entryFiles = glob.sync(jsDir + '/*.js');
  var map = {};

  entryFiles.forEach(function(filePath) {
    var filename = filePath.substring(filePath.lastIndexOf('\/') + 1, filePath.lastIndexOf('.'));
    map[filename] = filePath;
  });
  return map;
})();

该方法将生成文件名到文件绝对路径的map, 比如

entry: {
  'page-1': '/../webpack-multipage-demo/src/static/js/services/page-1.js'
}

热更新

热更新简直不要太好用,极大地提高了开发效率。

//服务器配置
var devServer = env === 'production' ? {} : {
  contentBase: path.resolve(__dirname),
  compress: true,
  historyApiFallback: true,
  hot: true,
  inline: true,
  host: 'localhost', 
  port: 8080
};

另外,在plugin中加入new webpack.HotModuleReplacementPlugin(),开启Hot Module Replacemen,即可实现热更新。

生成html配置

约定同一页面的js文件与模板文件命名一致,最终根据该js生成与其同名的html文件。

var htmlPages = (function() {
  var artDir = path.resolve(__dirname, 'src/views');
  var artFiles = glob.sync(artDir + '/*.art');
  var array = [];
  artFiles.forEach(function(filePath) {
    var filename = filePath.substring(filePath.lastIndexOf('\/') + 1, filePath.lastIndexOf('.'));
    array.push(new HtmlWebpackPlugin({
      template: path.resolve(__dirname, 'src/template/index.html'),
      filename: filename + '.html',
      chunks: ['vendor', 'main', filename],
      chunksSortMode: function(chunk1, chunk2) {
        var order = ['vendor', 'main', filename];
        var order1 = order.indexOf(chunk1.names[0]);
        var order2 = order.indexOf(chunk2.names[0]);
        return order1 - order2;
      },
      minify: {
        removeComments: env === 'production' ? true : false,
        collapseWhitespace: env === 'production' ? true : false
      }
    }));
  });
  return array;
})();

通用模块提取为组件

对于一些在多个页面中都需要用到的模块,可将其提取出来作为通用的组件。组件的构成与页面一样,一个.js文件和一个.art文件以及一个.css文件,在js文件中渲染html内容,最后export,使用时直接require即可。具体实践可参考demo

存在问题

  1. 每新建一个页面就需要重新启动webpack服务
  2. 字体文件无法压缩,对于压缩通过font-face引入的网络字体,目前没有找到较好的解决方案

demo

基于本文理论的一个demo,地址:webpack-multipage-demo

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

Javascript 相关文章推荐
让iframe自适应高度(支持XHTML,支持FF)
Jul 24 Javascript
jquery 按钮状态效果 正常、移上、按下
Aug 12 Javascript
在页面上用action传递参数到后台出现乱码的解决方法
Dec 31 Javascript
node.js中的fs.fstat方法使用说明
Dec 15 Javascript
Javascript 拖拽的一些简单的应用(逐行分析代码,让你轻松了拖拽的原理)
Jan 23 Javascript
EasyUI,点击开启编辑框,并且编辑框获得焦点的方法
Mar 01 Javascript
JS实现网页上随机产生超链接地址的方法
Nov 09 Javascript
bootstrap导航条实现代码
Dec 28 Javascript
浅谈关于.vue文件中style的scoped属性
Aug 19 Javascript
详解Chart.js轻量级图表库的使用经验
May 22 Javascript
JQuery常见节点操作实例分析
May 15 jQuery
Vue实现简易计算器
Feb 25 Javascript
Vue侧滑菜单组件——DrawerLayout
Dec 18 #Javascript
switchery按钮的使用方法
Dec 18 #Javascript
three.js实现3D影院的原理的代码分析
Dec 18 #Javascript
JS函数节流和函数防抖问题分析
Dec 18 #Javascript
vue 将页面公用的头部组件化的方法
Dec 18 #Javascript
浅谈使用React.setState需要注意的三点
Dec 18 #Javascript
vue 项目如何引入微信sdk接口的方法
Dec 18 #Javascript
You might like
Yii框架学习笔记之应用组件操作示例
2019/11/13 PHP
thinkphp5实现微信扫码支付
2019/12/23 PHP
使用CSS3实现字体颜色渐变的实现
2021/03/09 HTML / CSS
Highslide.js是一款基于js实现的网页中图片展示插件
2020/03/30 Javascript
document节点对象的获取方式示例介绍
2013/12/24 Javascript
jQuery根据用户电脑是mac还是pc加载对应样式的方法
2015/06/26 Javascript
jQuery移动端图片上传组件
2016/06/12 Javascript
jQuery File Upload文件上传插件使用详解
2016/12/06 Javascript
详解微信小程序——自定义圆形进度条
2016/12/29 Javascript
nodejs个人博客开发第四步 数据模型
2017/04/12 NodeJs
微信小程序使用image组件显示图片的方法【附源码下载】
2017/12/08 Javascript
全面介绍vue 全家桶和项目实例
2017/12/27 Javascript
vue-cli脚手架搭建的项目去除eslint验证的方法
2018/09/29 Javascript
jquery+php后台实现省市区联动功能示例
2019/05/23 jQuery
浅入深出Vue之组件使用
2019/07/11 Javascript
JavaScript使用表单元素验证表单的示例代码
2019/08/20 Javascript
Vue自定义全局弹窗组件操作
2020/08/11 Javascript
jQuery编写QQ简易聊天框
2020/08/27 jQuery
利用Python代码实现数据可视化的5种方法详解
2018/03/25 Python
python3模块smtplib实现发送邮件功能
2018/05/22 Python
django如何通过类视图使用装饰器
2019/07/24 Python
Django之路由层的实现
2019/09/09 Python
浅谈keras保存模型中的save()和save_weights()区别
2020/05/21 Python
解决Keras TensorFlow 混编中 trainable=False设置无效问题
2020/06/28 Python
世界上最大的巴士旅游观光公司:Big Bus Tours
2016/10/20 全球购物
工业设计专业推荐信
2013/10/29 职场文书
班长岗位职责
2013/11/10 职场文书
毕业生的自我评价
2013/12/30 职场文书
期中考试后的反思
2014/02/08 职场文书
优秀学生评语大全
2014/04/25 职场文书
白莲教口号
2014/06/18 职场文书
市贸粮局召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
商务司机岗位职责
2015/04/10 职场文书
Java 超详细讲解设计模式之中的抽象工厂模式
2022/03/25 Java/Android
mysql使用FIND_IN_SET和group_concat两个方法查询上下级机构
2022/04/20 MySQL
Docker容器harbor私有仓库部署和管理
2022/08/05 Servers