91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JS中reduce方法如何實現webpack多文件入口

發布時間:2021-07-06 11:36:45 來源:億速云 閱讀:106 作者:小新 欄目:web開發

這篇文章主要介紹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'];

以上是“JS中reduce方法如何實現webpack多文件入口”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

炎陵县| 丁青县| 康乐县| 景东| 常州市| 沙坪坝区| 仙桃市| 蒙城县| 通化市| 牡丹江市| 轮台县| 平罗县| 安阳县| 江都市| 略阳县| 固镇县| 若羌县| 闻喜县| 黄冈市| 合水县| 张家口市| 新建县| 宣汉县| 静宁县| 循化| 安阳市| 长寿区| 丹棱县| 泸定县| 平江县| 常州市| 涞源县| 大方县| 进贤县| 专栏| 八宿县| 蕲春县| 锦州市| 和静县| 资溪县| 左权县|