• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/lib/page/asset.php
  • Класс: BitrixMainPageAsset
  • Вызов: Asset::prepareJs
private function prepareJs()
{
	$additional = [];
	foreach ($this->js as $js => $set)
	{
		/** @var  $assetTID - get first target where added asset */
		$assetTID = $set['ADDITIONAL'] ? 'TEMPLATE' : $set['TARGET'][0];
		/** @noinspection PhpUndefinedClassInspection */
		$jsInfo = [
			'PATH' => $js,
			'FULL_PATH' => false,
			'FILE_PATH' => false,
			'SKIP' => false,
			'TARGET' => $assetTID,
			'EXTERNAL' => CMain::IsExternalLink($js),
			'BODY' => false,
			'ADDITIONAL' => $set['ADDITIONAL']
		];

		if ($jsInfo['EXTERNAL'])
		{
			if ($set['ADDITIONAL'])
			{
				$tmpKey = 'TEMPLATE';
				$tmpPrefix = 'template';
			}
			else
			{
				$tmpKey = 'KERNEL';
				$tmpPrefix = 'kernel';
			}

			$jsInfo['MODULE_ID'] = $this->assetJSCnt;
			$jsInfo['TARGET'] = $tmpKey.'_'.$this->assetJSCnt;
			$jsInfo['PREFIX'] = $tmpPrefix.'_'.$this->assetJSCnt;
			$jsInfo['FULL_PATH'] = $jsInfo['PATH'];
			$jsInfo['SKIP'] = true;
			$this->assetJSCnt++;

			$this->targetList[$tmpKey]['JS_LIST'][$jsInfo['TARGET']] = [
				'TARGET' => $jsInfo['TARGET'],
				'PREFIX' => $jsInfo['PREFIX'],
				'MODE' => $this->targetList[$assetTID]['MODE'],
				'UNIQUE' => false,
				'WHERE_USED' => []
			];
		}
		else
		{
			if (($paths = $this->getAssetPaths($js)) !== null)
			{
				$jsInfo["PATH"] = $js;
				$jsInfo["FILE_PATH"] = $paths["FILE_PATH"];
				$jsInfo["FULL_PATH"] = $paths["FULL_PATH"];
			}
			else
			{
				unset($this->js[$js]);
				continue;
			}

			if ($moduleInfo = $this->isKernelJS($jsInfo['PATH']))
			{
				$jsInfo['TARGET'] = 'KERNEL';
				if ($this->sliceKernel() && $this->optimizeJs())
				{
					$jsInfo['MODULE_ID'] = $moduleInfo['MODULE_ID'];
					$jsInfo['TARGET'] = 'KERNEL_'.$moduleInfo['MODULE_ID'];
					$jsInfo['PREFIX'] = 'kernel_'.$moduleInfo['MODULE_ID'];
					$jsInfo['SKIP'] = $moduleInfo['SKIP'] ?? false;
					$jsInfo['BODY'] = $moduleInfo['BODY'];
				}
				else
				{
					$jsInfo['MODULE_ID'] = $this->assetJSCnt;
					$jsInfo['TARGET'] = 'KERNEL_'.$this->assetJSCnt;
					$jsInfo['PREFIX'] = 'kernel_'.$this->assetJSCnt;
					$jsInfo['SKIP'] = true;
					$this->assetJSCnt++;
				}

				if ($jsInfo['BODY'])
				{
					$this->targetList['BODY']['JS_LIST'][$jsInfo['TARGET']] = [
						'TARGET' => $jsInfo['TARGET'],
						'PREFIX' => $jsInfo['PREFIX'],
						'MODE' => $this->targetList[$assetTID]['MODE'],
						'UNIQUE' => true,
						'WHERE_USED' => []
					];
				}
				else
				{
					if (isset($this->targetList['KERNEL']['JS_LIST'][$jsInfo['TARGET']]['MODE']))
					{
						$this->targetList['KERNEL']['JS_LIST'][$jsInfo['TARGET']]['MODE'] |= $this->targetList[$assetTID]['MODE'];
					}
					else
					{
						$this->targetList['KERNEL']['JS_LIST'][$jsInfo['TARGET']] = [
							'TARGET' => $jsInfo['TARGET'],
							'PREFIX' => $jsInfo['PREFIX'],
							'MODE' => $set['ADDITIONAL'] ? $this->targetList[$set['TARGET'][0]]['MODE'] : $this->targetList[$assetTID]['MODE'],
							'UNIQUE' => true,
							'WHERE_USED' => []
						];
					}
				}

				// Add information about sets where used
				foreach ($set['TARGET'] as $setID)
				{
					$this->targetList['KERNEL']['JS_LIST'][$jsInfo['TARGET']]['WHERE_USED'][$setID] = true;
				}
			}
			elseif (strncmp($jsInfo['PATH'], '/bitrix/js/', 11) != 0)
			{
				$jsInfo['SKIP'] = !(
					strncmp($jsInfo['PATH'], '/bitrix/panel/', 14) != 0
					&& strncmp($jsInfo['PATH'], '/bitrix/themes/', 15) != 0
					&& strncmp($jsInfo['PATH'], '/bitrix/modules/', 16) != 0
				);
			}
		}

		if ($jsInfo['ADDITIONAL'])
		{
			$additional[] = $jsInfo;
		}
		else
		{
			$this->js[$jsInfo['TARGET']][] = $jsInfo;
		}
		unset($this->js[$js]);
	}

	// Clean body scripts
	foreach ($this->targetList['BODY']['JS_LIST'] as $item)
	{
		unset($this->targetList['KERNEL']['JS_LIST'][$item['TARGET']]);
	}

	foreach ($additional as $jsInfo)
	{
		$this->js[$jsInfo['TARGET']][] = $jsInfo;
	}
}