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