詳解JS: reduce方法實(shí)現(xiàn) webpack多文件入口
1. reduce 方法介紹
1.1 簡(jiǎn)單場(chǎng)景
reduce 函數(shù)的設(shè)計(jì)意圖就是方便進(jìn)行疊加運(yùn)算:
var arr = [0, 1, 2, 3];
// reduce 實(shí)現(xiàn)累加
var total = arr.reduce(function (pre, cur){
return pre + cur;
}, 0);
console.log(total); // 6
上述代碼中,reduce 方法有兩個(gè)參數(shù),第一個(gè)參數(shù)是一個(gè) callback,用于進(jìn)行計(jì)算的函數(shù);第二個(gè)參數(shù)則是累加計(jì)算的初始值: 0
reduce 以 0 作為初始值,從數(shù)組第 0 項(xiàng)開始累加,上述代碼的計(jì)算過(guò)程如下:
total = 0; // => 0 total = 0 + 0; // => 0 total = 0 + 1; // => 1 total = 1 + 2; // => 3 total = 3 + 3; // => 6
若不設(shè)置初始值 0,則 reduce 以數(shù)組第 0 項(xiàng)作為初始值,從第 1 項(xiàng)開始累加,其計(jì)算過(guò)程如下:
total = 0; // => 0 total = 0 + 1; // => 1 total = 1 + 2; // => 3 total = 3 + 3; // => 6
可以看出,reduce 函數(shù)根據(jù)初始值 0,不斷進(jìn)行疊加,完成最簡(jiǎn)單的數(shù)組累加。
1.2 兩種簡(jiǎn)單的運(yùn)用場(chǎng)景
第一個(gè) demo,使用 reduce 函數(shù)進(jìn)行二維數(shù)組的拼接:
var arr = [ [0], [1, 2], [3, 4, 5] ];
// reduce 實(shí)現(xiàn)數(shù)組拼接
var result = arr.reduce(function (pre, cur){
return pre.concat(cur);
}, []);
console.log(result); // [0, 1, 2, 3, 4, 5]
第二個(gè) demo,使用 reduce 函數(shù)構(gòu)造 JSON 數(shù)組:
// 此例演示:將所有員工的姓名進(jìn)行拆分
var staff = ['Bob Dell', 'Johon Jobs', 'Maria July'];
// reduce 構(gòu)造 JSON 數(shù)組
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 函數(shù),能為我們節(jié)省不少中間變量和代碼。
2. 用于實(shí)現(xiàn) webpack 多文件入口配置
webpack 配置項(xiàng)中entry參數(shù)用于配置入口文件路徑,通常對(duì)于只打包一個(gè)目錄下的文件,只需要遍歷該目錄,構(gòu)造一個(gè)如下的對(duì)象傳遞給entry即可:
// 注:index.js 為每個(gè)頁(yè)面的入口文件,所有頁(yè)面均在 ./fe/pages/ 目錄下
var entry = {
index: './fe/pages/home/index.js',
list: './fe/pages/list/index.js'
};
通常,我們使用 reduce 方法來(lái)遍歷同一目錄下的入口:
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'
// }
對(duì)于多頁(yè)面應(yīng)用的開發(fā)場(chǎng)景,也許會(huì)需要構(gòu)造類似于下面這樣的一個(gè)對(duì)象:
// 多個(gè)入口,頁(yè)面、公共組件并不一定在同一個(gè)目錄下
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'
};
可以發(fā)現(xiàn),我們要打包的頁(yè)面、公共組件不一定在同一個(gè)目錄下,這時(shí)候就需要對(duì)原先的方法進(jìn)行擴(kuò)展,見代碼:
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 為數(shù)組,則進(jìn)行兩級(jí)遍歷
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;
}, {});
};
// 構(gòu)造對(duì)象
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就行了,同時(shí)支持單個(gè)或多個(gè)路徑下的文件打包:
// entryPath 可以為一個(gè)字符串 var entryPath = './fe/pages'; // entryPath 也可以設(shè)為一個(gè)數(shù)組 var entryPath = ['./fe/pages', './fe/components'];
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 詳解JS數(shù)組Reduce()方法詳解及高級(jí)技巧
- JavaScript之map reduce_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- 無(wú)循環(huán) JavaScript(map、reduce、filter和find)
- Javascript面試經(jīng)典套路reduce函數(shù)查重
- 解析JavaScript數(shù)組方法reduce
- 詳解JavaScript中數(shù)組的reduce方法
- JavaScript reduce和reduceRight詳解
- Javascript中內(nèi)建函數(shù)reduce的應(yīng)用詳解
- JavaScript中自帶的 reduce()方法使用示例詳解
- JavaScript中reduce()方法的使用詳解
- JavaScript mapreduce工作原理簡(jiǎn)析
- js數(shù)組方法reduce經(jīng)典用法代碼分享
相關(guān)文章
設(shè)置checkbox為只讀(readOnly)的兩種方式
設(shè)置checkbox為只讀的方法有很多,在本文為大家詳細(xì)介紹下兩種比較實(shí)用的方法,感興趣的朋友不要錯(cuò)過(guò)2013-10-10
js子頁(yè)面獲取父頁(yè)面數(shù)據(jù)示例
這篇文章主要介紹了js子頁(yè)面如何獲取父頁(yè)面數(shù)據(jù),需要的朋友可以參考下2014-05-05
解決webpack多頁(yè)面內(nèi)存溢出的方法示例
這篇文章主要介紹了解決webpack多頁(yè)面內(nèi)存溢出的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
javascript實(shí)現(xiàn)框架高度隨內(nèi)容改變的方法
這篇文章主要介紹了javascript實(shí)現(xiàn)框架高度隨內(nèi)容改變的方法,實(shí)例分析了通過(guò)父頁(yè)面及內(nèi)容改變框架高度兩種實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
實(shí)現(xiàn)網(wǎng)頁(yè)內(nèi)容水平或垂直滾動(dòng)的Javascript代碼
用Javascript實(shí)現(xiàn)新聞內(nèi)容的水平或垂直滾動(dòng),主要的優(yōu)點(diǎn)是我們可以實(shí)現(xiàn)自定義滾動(dòng)風(fēng)格或特效,應(yīng)用效果比起傳統(tǒng)的marquee更加具有特色,方法也比較簡(jiǎn)單2012-10-10
微信小程序?qū)崿F(xiàn)手勢(shì)滑動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)手勢(shì)滑動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08
JS交互點(diǎn)擊WKWebView中的圖片實(shí)現(xiàn)預(yù)覽效果
這篇文章主要介紹了JS交互點(diǎn)擊WKWebView中的圖片實(shí)現(xiàn)預(yù)覽效果,需要的朋友可以參考下2018-01-01

