欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

詳解小程序循環(huán)require之坑

1. 循環(huán)require

公司主營業(yè)務(wù):成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出同心免費做網(wǎng)站回饋大家。

在JavaScript中,模塊之間可能出現(xiàn)相互引用的情況,例如現(xiàn)在有三個模塊,他們之間的相互引用關(guān)系如下,大致的引用關(guān)系可以表示為 A -> B -> C -> A,要完成模塊A,它依賴于模塊C,但是模塊C反過來又依賴于模塊A,此時就出現(xiàn)了循環(huán)require。

// a.js
const B = require('./b.js');

console.log('B in A', B);
const A = {
  name: 'A',
  childName: B.name,
};
module.exports = A;

// b.js
const C = require('./c.js');

console.log('C in B', C);
const B = {
  name: 'B',
  childName: C.name,
}
module.exports = B;

// c.js
const A = require('./a.js');

console.log('A in C', A);
const C = {
  name: 'C',
  childName: A.name,
};
module.exports = C;

那JS引擎會一直循環(huán)require下去嗎?答案是不會的,如果我們以a.js為入口執(zhí)行程序,C在引用A時,a.js已經(jīng)執(zhí)行,不會再重新執(zhí)行a.js,因此c.js獲得的A對象是一個空對象(因為a.js還沒執(zhí)行完成)。

2. 小程序中的坑

在正常情況下,JS引擎是可以解析循環(huán)require的情形的。但是在一些低版本的小程序中,居然出現(xiàn)程序一直循環(huán)require的情況,最終導(dǎo)致棧溢出而報錯,實在是天坑。

那如何解決呢,很遺憾,目前并未找到完美的方法來解決,只能找到程序中的循環(huán)require的代碼,并進(jìn)行修改。為了快速定位程序中的循環(huán)引用,寫了一段NodeJs檢測代碼來檢測進(jìn)行檢測。

const fs = require('fs');
const path = require('path');
const fileCache = {};
const requireLink = [];

if (process.argv.length !== 3) {
 console.log(`please run as: node ${__filename.split(path.sep).pop()} file/to/track`);
 return;
}

const filePath = process.argv[2];
const absFilePath = getFullFilePath(filePath);
if (absFilePath) {
 resolveRequires(absFilePath, 0);
} else {
 console.error('file not exist:', filePath);
}

/**
 * 遞歸函數(shù),解析文件的依賴
 * @param {String} file 引用文件的路徑
 * @param {Number} level 文件所在的引用層級
 */
function resolveRequires(file, level) {
 requireLink[level] = file;
 for (let i = 0; i < level; i ++) {
  if (requireLink[i] === file) {
   console.log('**** require circle detected ****');
   console.log(requireLink.slice(0, level + 1));
   console.log();
   return;
  }
 }
 const requireFiles = getRequireFiles(file);
 requireFiles.forEach(file => resolveRequires(file, level + 1));
}

/**
 * 獲取文件依賴的文件
 * @param {String} filePath 引用文件的路徑
 */
function getRequireFiles(filePath) {
 if (!fileCache[filePath]) {
  try {
   const fileBuffer = fs.readFileSync(filePath);
   fileCache[filePath] = fileBuffer.toString();
  } catch(err) {
   console.log('read file failed', filePath);
   return [];
  }
 }
 const fileContent = fileCache[filePath];

 // 引入模塊的幾種形式
 const requirePattern = /require\s*\(['"](.*?)['"]\)/g;
 const importPattern1 = /import\s+.*?\s+from\s+['"](.*?)['"]/g;
 const importPattern2 = /import\s+['"](.*?)['"]/g;

 const requireFilePaths = [];
 const baseDir = path.dirname(filePath);
 let match = null;
 while ((match = requirePattern.exec(fileContent)) !== null) {
  requireFilePaths.push(match[1]);
 }
 while ((match = importPattern1.exec(fileContent)) !== null) {
  requireFilePaths.push(match[1]);
 }
 while ((match = importPattern2.exec(fileContent)) !== null) {
  requireFilePaths.push(match[1]);
 }

 return requireFilePaths.map(fp => getFullFilePath(fp, baseDir)).filter(fp => !!fp);
}

/**
 * 獲取文件的完整絕對路徑
 * @param {String} filePath 文件路徑
 * @param {String} baseDir 文件路徑的相對路徑
 */
function getFullFilePath(filePath, baseDir) {
 if (baseDir) {
  filePath = path.resolve(baseDir, filePath);
 } else {
  filePath = path.resolve(filePath);
 }

 if (fs.existsSync(filePath)) {
  const stat = fs.statSync(filePath);
  if (stat.isDirectory() && fs.existsSync(path.join(filePath, 'index.js'))) {
   return path.join(filePath, 'index.js');
  } else if (stat.isFile()){
   return filePath;
  }
 } else if (fs.existsSync(filePath + '.js')) {
  return filePath + '.js';
 }

 return '';
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

網(wǎng)站名稱:詳解小程序循環(huán)require之坑
當(dāng)前地址:http://aaarwkj.com/article36/jegcsg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、ChatGPT、手機(jī)網(wǎng)站建設(shè)、定制開發(fā)、面包屑導(dǎo)航、域名注冊

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)
国产极品美女视频福利| 欧美日韩一区二区午夜福利| 国产一级二级三级在线电影| 日本熟妇一区二区三区在线视频 | 日韩三级av在线免费观看| 森泽佳奈在线视频观看| 亚洲综合另类小说专区| 精品久久中文字幕久久av| 免费毛片一区二区三区四区| 亚洲成人免费在线一区| 国产免费不卡午夜福利在线 | 国产一区二区黑丝美女| 中文字幕日本人妻影视| 91麻豆国产福利在线| 五十路六十路美熟人妻| 丁香婷婷深情五月亚洲天堂| 男人天堂av一区二区| 欧美精品国产欧美精品国产| 欧美一区二区三区四区久久| 亚洲精品午夜久久久伊人| 上海老熟女啪啪露脸高潮| 男女做爰高清无遮挡免费| 亚洲美女高清一区二区三区| 亚洲国产中文日韩欧美在线| 日本av二区三区在线| 久久99精品久久久国产| 91欧美日韩在线观看视频| 丁香婷婷麻豆激情综合网| 欧美日韩一区二区午夜福利| 色悠悠粉嫩一区二区三区| 国产精品无卡无在线播放| 欧美日韩国产一区二区三区在线观看| 国内激情自拍偷拍视频| 午夜福利视频一区久久久| 日韩欧美国产精品加勒比| 国产毛片精品一区内射| 亚洲理论在线观看电影| 日韩精品一区二区三区四区在线视频| 国产精品精品国产一区二区| 熟妇丰满多毛的大阴户| 高清不卡日本一区二区三区久久|