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 相关文章推荐
Javascript自定义函数判断网站访问类型是PC还是移动终端
Jan 10 Javascript
ext前台接收action传过来的json数据示例
Jun 17 Javascript
js代码实现的加入收藏效果并兼容主流浏览器
Jun 23 Javascript
jquery动态改变div宽度和高度
Feb 09 Javascript
jQuery实现的Div窗口震动效果实例
Aug 07 Javascript
浅析JavaScript作用域链、执行上下文与闭包
Feb 01 Javascript
ES6新特性:使用export和import实现模块化详解
Jul 31 Javascript
seajs中模块依赖的加载处理实例分析
Oct 10 Javascript
详解如何使用babel进行es6文件的编译
May 29 Javascript
vue debug 二种方法
Sep 16 Javascript
koa中间件核心(koa-compose)源码解读分析
Jun 15 Javascript
vite2.0+vue3移动端项目实战详解
Mar 03 Vue.js
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
PHP生成网页快照 不用COM不用扩展.
2010/02/11 PHP
PHP上传图片进行等比缩放可增加水印功能
2014/01/13 PHP
php中数字、字符与对象判断函数用法实例
2014/11/26 PHP
PHP实现获取FLV文件的时间
2015/02/10 PHP
php清除和销毁session的方法分析
2015/03/19 PHP
php上传文件并显示上传进度的方法
2015/03/24 PHP
Yii实现自动加载类地图的方法
2015/04/01 PHP
PHP文件生成的图片无法使用CDN缓存的解决方法
2015/06/20 PHP
PHP处理CSV表格文件的常用操作方法总结
2016/07/01 PHP
php封装的smarty类完整实例
2016/10/19 PHP
php批量删除操作(数据访问)
2017/05/23 PHP
PHP基于socket实现客户端和服务端通讯功能
2017/07/13 PHP
js传参数受特殊字符影响错误的解决方法
2013/10/21 Javascript
jquery操作对象数组元素方法详解
2014/11/26 Javascript
JS限制文本框只能输入数字和字母方法
2015/02/28 Javascript
freemarker判断对象是否为空的方法
2015/08/13 Javascript
学习JavaScript设计模式(封装)
2015/11/26 Javascript
深入理解js中this的用法
2016/05/28 Javascript
利用VUE框架,实现列表分页功能示例代码
2017/01/12 Javascript
用Nodejs搭建服务器访问html、css、JS等静态资源文件
2017/04/28 NodeJs
JavaScript注册时密码强度校验代码
2017/06/30 Javascript
使用JS实现导航切换时高亮显示的示例讲解
2018/08/22 Javascript
Vue.js实现开发购物车功能的方法详解
2019/02/22 Javascript
vue回到顶部监听滚动事件详解
2019/08/02 Javascript
jQuery实现form表单基于ajax无刷新提交方法实例代码
2019/11/04 jQuery
粗略分析Python中的内存泄漏
2015/04/23 Python
python把1变成01的步骤总结
2019/02/27 Python
python实现各种插值法(数值分析)
2019/07/30 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
2019/11/11 Python
python flask搭建web应用教程
2019/11/19 Python
Pytorch: 自定义网络层实例
2020/01/07 Python
难忘的一天教学反思
2014/04/30 职场文书
农村结婚典礼主持词
2015/06/29 职场文书
保护动物的宣传语
2015/07/13 职场文书
本地搭建minio文件服务器(使用bat脚本启动)的方法
2022/07/15 Servers
nginx访问报403错误的几种情况详解
2022/07/23 Servers