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 相关文章推荐
Jquery实现弹出层分享微博插件具备动画效果
Apr 03 Javascript
基于jQuey实现鼠标滑过变色(整行变色)
Dec 07 Javascript
javascript弹出带文字信息的提示框效果
Jul 19 Javascript
轻松掌握JavaScript装饰者模式
Aug 27 Javascript
js窗口震动小程序分享
Nov 28 Javascript
Angular2 路由问题修复详解
Mar 01 Javascript
js对象实例详解(JavaScript对象深度剖析,深度理解js对象)
Sep 21 Javascript
如何重置vue打印变量的显示方式
Dec 06 Javascript
vue基于viewer实现的图片查看器功能
Apr 12 Javascript
layui原生表单验证的实例
Sep 09 Javascript
node省市区三级数据性能测评实例分析
Nov 06 Javascript
Vue-CLI与Vuex使用方法实例分析
Jan 06 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
使用Xdebug调试和优化PHP程序之[1]
2007/04/17 PHP
php几个预定义变量$_SERVER用法小结
2014/11/07 PHP
window.js 主要包含了页面的一些操作
2009/12/23 Javascript
js arguments,jcallee caller用法总结
2013/11/30 Javascript
jquery实现弹出div,始终显示在屏幕正中间的简单实例
2014/03/08 Javascript
jQuery DOM删除节点操作指南
2015/03/03 Javascript
JS基于Mootools实现的个性菜单效果代码
2015/10/21 Javascript
通用无限极下拉菜单的实现代码
2016/05/31 Javascript
json对象与数组以及转换成js对象的简单实现方法
2016/06/24 Javascript
基于vue.js实现的分页
2018/03/13 Javascript
Javascript实现异步编程的过程
2018/06/18 Javascript
用Node提供静态文件服务的方法
2018/07/06 Javascript
Javascript中弹窗confirm与prompt的区别
2018/10/26 Javascript
node.js文件操作系统实例详解
2019/11/05 Javascript
原生JS实现天气预报
2020/06/16 Javascript
ssm+vue前后端分离框架整合实现(附源码)
2020/07/08 Javascript
解决vue项目中遇到 Cannot find module ‘chalk‘ 报错的问题
2020/11/05 Javascript
Python及Pycharm安装方法图文教程
2019/08/05 Python
python使用sessions模拟登录淘宝的方式
2019/08/16 Python
[原创]赚疯了!转手立赚800+?大佬的python「抢茅台脚本」使用教程
2021/01/12 Python
python基于爬虫+django,打造个性化API接口
2021/01/21 Python
澳大利亚制造的蜡烛和扩散器:Glasshouse Fragrances
2018/05/20 全球购物
理肤泉加拿大官网:La Roche-Posay加拿大
2018/07/06 全球购物
捷克建筑材料网上商店:DEK.cz
2021/03/06 全球购物
淘宝店铺营销方案
2014/02/13 职场文书
计算机专业应届生求职信
2014/04/06 职场文书
《沙漠中的绿洲》教学反思
2014/04/24 职场文书
管理岗位竞聘演讲稿
2014/08/18 职场文书
小学教师师德师风承诺书
2015/04/28 职场文书
培训简讯范文
2015/07/20 职场文书
2016党风廉政建设心得体会范文
2016/01/25 职场文书
告诉你一个秘密:富人致富的五大优点
2019/07/11 职场文书
MYSQL如何查看进程和kill进程
2022/03/13 MySQL
铁拳制作人赞《铁拳7》老头环Mod:制作精良 但别弄了
2022/04/03 其他游戏
Win11电源已接通但未充电怎么办?Win11电源已接通未充电的解决方法
2022/04/05 数码科技
Win11安装升级时提示“该电脑必须支持安全启动”
2022/04/19 数码科技