摘要:這篇日志,在開始接觸時(shí)候就該寫了,現(xiàn)在發(fā)布也許對(duì)一些剛?cè)氪丝拥耐苄┰S幫助。。。
1. reduce 方法介紹 1.1 簡(jiǎn)單場(chǎng)景這篇日志,在開始接觸 webpack 時(shí)候就該寫了,現(xiàn)在發(fā)布也許對(duì)一些剛?cè)氪丝拥耐苄┰S幫助。。。
即使有點(diǎn) low,重要的仍是分享
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ì)算過程如下:
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ì)算過程如下:
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è)頁面的入口文件,所有頁面均在 ./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" // }
對(duì)于多頁面應(yīng)用的開發(fā)場(chǎng)景,也許會(huì)需要構(gòu)造類似于下面這樣的一個(gè)對(duì)象:
// 多個(gè)入口,頁面、公共組件并不一定在同一個(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),我們要打包的頁面、公共組件不一定在同一個(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"];
原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明作者、出處
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/82645.html
摘要:系統(tǒng)架構(gòu)介紹本項(xiàng)目開發(fā)基于框架,利用進(jìn)行模塊化構(gòu)建,前端編寫語言是,利用進(jìn)行轉(zhuǎn)換。單頁是為單頁應(yīng)用量身定做的你可以把拆成很多,這些由路由來加載。前者用來獲取的狀態(tài),后者用來修改的狀態(tài)。 系統(tǒng)架構(gòu)介紹 本項(xiàng)目開發(fā)基于 React + Redux + React-Route 框架,利用 webpack 進(jìn)行模塊化構(gòu)建,前端編寫語言是 JavaScript ES6,利用 babel進(jìn)行轉(zhuǎn)換。...
摘要:安裝配置加載器配置配置文件配置支持自定義的預(yù)設(shè)或插件只有配置了這兩個(gè)才能讓生效,單獨(dú)的安裝是無意義的。 showImg(https://segmentfault.com/img/bVbjGNY?w=2847&h=1931); 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你! 最新React全家桶實(shí)戰(zhàn)使用配置指南 這篇文檔 是呂小明老師結(jié)合以往的項(xiàng)目經(jīng)驗(yàn) 加上自己本身...
摘要:前言省略準(zhǔn)備了解微信小程序是什么微信小程序官方文檔了解應(yīng)用狀態(tài)管理方案也是架構(gòu)的具體實(shí)現(xiàn)了解打包工具了解代碼轉(zhuǎn)譯工具原理大致是借助語法分析工具之類的將代碼解析成抽象語法樹再重寫成最終的代碼測(cè)試工具等等請(qǐng)根據(jù)需要選擇微信小程序目前版本的實(shí)現(xiàn)需 前言: 省略... 準(zhǔn)備 了解微信小程序是什么? 微信小程序官方文檔 了解應(yīng)用狀態(tài)管理方案: Redux, 也是Flux架構(gòu)的具體實(shí)現(xiàn) 了解Ja...
摘要:為了提高自己的學(xué)習(xí)效率,避免做一些無用的工作,我也決定以后無論是工作還是學(xué)習(xí)一定要養(yǎng)成定時(shí)總結(jié)的習(xí)慣,而且也要用文字記錄下來,這樣可以時(shí)常復(fù)習(xí),理清邏輯,加深印象。一種解決方法是將對(duì)象作為參數(shù),傳入容器組件。 前言 最近一直在學(xué)習(xí)react技術(shù)棧,相關(guān)的理論和概念基本都了解了,之前也用reactjs寫了幾個(gè)demo,切身體會(huì)到了函數(shù)式編程和組件化開發(fā)的強(qiáng)大之處,但因各種主客觀原因,事后...
項(xiàng)目開始前,我們先聊一聊關(guān)于項(xiàng)目的一些說明。該項(xiàng)目起始于2017年初,當(dāng)時(shí)公司主要技術(shù)棧為gulp+angular,鑒于react的火熱的生態(tài),在公司決定研發(fā)bss管理系統(tǒng)時(shí)選用react開發(fā),目的也是為react native打下基礎(chǔ),以解決后期公司大前端技術(shù)棧的逐步成熟。(當(dāng)時(shí)沒有選擇vue開發(fā)的主要原因是weex生態(tài)還不夠特別成熟),既然決定換新,項(xiàng)目的構(gòu)建也跟著一起換,從gulp轉(zhuǎn)向火熱的...
閱讀 1642·2021-10-12 10:11
閱讀 3759·2021-09-03 10:35
閱讀 1444·2019-08-30 15:55
閱讀 2130·2019-08-30 15:54
閱讀 1001·2019-08-30 13:07
閱讀 1015·2019-08-30 11:09
閱讀 581·2019-08-29 13:21
閱讀 2652·2019-08-29 11:32