全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

详解JS: reduce方法实现 webpack多文件入口

1. reduce 方法介绍

1.1 简单场景

reduce 函数的设计意图就是方便进行叠加运算:

var arr = [0, 1, 2, 3];

// reduce 实现累加
var total = arr.reduce(function (pre, cur){
 return pre + cur;
}, 0);

console.log(total);  // 6

上述代码中,reduce 方法有两个参数,第一个参数是一个 callback,用于进行计算的函数;第二个参数则是累加计算的初始值: 0

reduce 以 0 作为初始值,从数组第 0 项开始累加,上述代码的计算过程如下:

total = 0;    // => 0
total = 0 + 0;  // => 0
total = 0 + 1;  // => 1
total = 1 + 2;  // => 3
total = 3 + 3;  // => 6

若不设置初始值 0,则 reduce 以数组第 0 项作为初始值,从第 1 项开始累加,其计算过程如下:

total = 0;    // => 0
total = 0 + 1;  // => 1
total = 1 + 2;  // => 3
total = 3 + 3;  // => 6

可以看出,reduce 函数根据初始值 0,不断进行叠加,完成最简单的数组累加。

1.2 两种简单的运用场景

第一个 demo,使用 reduce 函数进行二维数组的拼接:

var arr = [ [0], [1, 2], [3, 4, 5] ];

// reduce 实现数组拼接
var result = arr.reduce(function (pre, cur){
 return pre.concat(cur);
}, []);

console.log(result);  // [0, 1, 2, 3, 4, 5]

第二个 demo,使用 reduce 函数构造 JSON 数组:

// 此例演示:将所有员工的姓名进行拆分
var staff = ['Bob Dell', 'Johon Jobs', 'Maria July'];

// reduce 构造 JSON 数组
var result = staff.reduce(function (arr, full_name){
 arr.push({
  first_name: full_name.split(' ')[0],
  last_name: full_name.split(' ')[1]
 });

 return arr;
}, []);

console.log(JSON.stringify(result));
// [{"first_name":"Bob","last_name":"Dell"},{"first_name":"Johon","last_name":"Jobs"},{"first_name":"Maria","last_name":"July"}]

灵活使用 reduce 函数,能为我们节省不少中间变量和代码。

2. 用于实现 webpack 多文件入口配置

webpack 配置项中entry参数用于配置入口文件路径,通常对于只打包一个目录下的文件,只需要遍历该目录,构造一个如下的对象传递给entry即可:

// 注:index.js 为每个页面的入口文件,所有页面均在 ./fe/pages/ 目录下
var entry = {
 index: './fe/pages/home/index.js',
 list: './fe/pages/list/index.js'
};

通常,我们使用 reduce 方法来遍历同一目录下的入口:

var fs = require('fs');
var path = require('path');
...

// 定义入口路径
var entryPath = './fe/pages';

// 遍历路径下多文件入口
var entris = fs.readdirSync(entryPath).reduce(function (o, filename) {
 !/\./.test(filename) &&
 (o[filename] = './' + path.join(entryPath, filename, 'index.js'));
 return o;
}, {});

// entry = {
//  index: './fe/pages/home/index.js',
//  list: './fe/pages/list/index.js'
// }

对于多页面应用的开发场景,也许会需要构造类似于下面这样的一个对象:

// 多个入口,页面、公共组件并不一定在同一个目录下
var entry = {
 index: './fe/pages/home/index.js',
 list: './fe/pages/list/index.js',
 header: './fe/components/header/index.js',
 footer: './fe/components/footer/index.js'
};

可以发现,我们要打包的页面、公共组件不一定在同一个目录下,这时候就需要对原先的方法进行扩展,见代码:

var fs = require('fs');
var path = require('path');
...

// 定义入口路径
var entryPath = ['./fe/pages', './fe/components'];

// 遍历路径下多文件入口
var mkEntriesMap = function (entryPath){
 if (typeof(entryPath) == 'string') {  // 若 entryPath 为字符串,则直接遍历此目录
  var path_map = fs.readdirSync(entryPath).map(function (filename){
   return filename + '::./' + path.join(entryPath, filename, 'index.js');
  });
 } else if (typeof(entryPath) == 'object') {  // 若 entryPath 为数组,则进行两级遍历
  var path_map = entryPath.map(function (entry){
   return fs.readdirSync(entry).map(function (filename){
    return filename + '::./' + path.join(entry, filename, 'index.js');
   });
  }).reduce(function (preArr, curArr){
   return preArr.concat(curArr);
  }, []);
 } else {
  throw 'Type of config.entryPath is not valid.';
  return;
 }

 return path_map.reduce(function (o, file_map){
  var file_name = file_map.split('::')[0];
  var file_path = file_map.split('::')[1];

  if (!/\./.test(file_name)) {
   o[file_name] = file_path;
  }

  return o;
 }, {});
};

// 构造对象
var entris = mkEntriesMap(entryPath);

// entry = {
//  index: './fe/pages/home/index.js',
//  list: './fe/pages/list/index.js',
//  header: './fe/components/header/index.js',
//  footer: './fe/components/footer/index.js'
// }

这样做的好处在于,只需配置一开始的entryPath就行了,同时支持单个或多个路径下的文件打包:

// entryPath 可以为一个字符串
var entryPath = './fe/pages';

// entryPath 也可以设为一个数组
var entryPath = ['./fe/pages', './fe/components'];

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


# webpack  # 多入口  # 入口文件  # 入口  # 详解JS数组Reduce()方法详解及高级技巧  # JavaScript之map reduce_动力节点Java学院整理  # 无循环 JavaScript(map、reduce、filter和find)  # Javascript面试经典套路reduce函数查重  # 解析JavaScript数组方法reduce  # 详解JavaScript中数组的reduce方法  # JavaScript reduce和reduceRight详解  # Javascript中内建函数reduce的应用详解  # JavaScript中自带的 reduce()方法使用示例详解  # JavaScript中reduce()方法的使用详解  # JavaScript mapreduce工作原理简析  # js数组方法reduce经典用法代码分享  # 遍历  # 目录下  # 第一个  # 多个  # 第二个  # 是一个  # 则是  # 两种  # 只需  # 设为  # 在同一个  # 这样做  # 只需要  # 可以看出  # 能为  # 也许会  # 最简单  # 类似于  # 若不  # 方法来 


相关文章: 装修招标网站设计制作流程,装修招标流程?  如何选择高效可靠的多用户建站源码资源?  清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?  制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?  建站之星如何防范黑客攻击与数据泄露?  ui设计制作网站有哪些,手机UI设计网址吗?  岳西云建站教程与模板下载_一站式快速建站系统操作指南  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  如何用IIS7快速搭建并优化网站站点?  如何在西部数码注册域名并快速搭建网站?  如何彻底删除建站之星生成的Banner?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  如何有效防御Web建站篡改攻击?  建站之星代理商如何保障技术支持与售后服务?  如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法  图册素材网站设计制作软件,图册的导出方式有几种?  C++用Dijkstra(迪杰斯特拉)算法求最短路径  制作网站怎么制作,*游戏网站怎么搭建?  网站制作服务平台,有什么网站可以发布本地服务信息?  微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?  建站之星logo尺寸如何设置最合适?  如何在VPS电脑上快速搭建网站?  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  如何通过FTP服务器快速搭建网站?  如何快速搭建高效WAP手机网站吸引移动用户?  如何在IIS管理器中快速创建并配置网站?  ,巨量百应是干嘛的?  香港服务器选型指南:免备案配置与高效建站方案解析  重庆网站制作公司哪家好,重庆中考招生办官方网站?  整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?  建站之星免费版是否永久可用?  做企业网站制作流程,企业网站制作基本流程有哪些?  如何通过二级域名建站提升品牌影响力?  免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?  c# 在高并发场景下,委托和接口调用的性能对比  成都响应式网站开发,dw怎么把手机适应页面变成网页?  如何高效利用亚马逊云主机搭建企业网站?  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  定制建站平台哪家好?企业官网搭建与快速建站方案推荐  视频网站app制作软件,有什么好的视频聊天网站或者软件?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  微网站制作教程,我微信里的网站怎么才能复制到浏览器里?  如何高效生成建站之星成品网站源码?  建站之星安装后界面空白如何解决?  郑州企业网站制作公司,郑州招聘网站有哪些?  北京建设网站制作公司,北京古代建筑博物馆预约官网?  如何快速生成凡客建站的专业级图册?  如何在腾讯云服务器上快速搭建个人网站?  制作网站的模板软件,网站怎么建设? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。