• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/lib/page/asset.php
  • Класс: BitrixMainPageAsset
  • Вызов: Asset::optimizeAsset
private function optimizeAsset($files = [], $unique = false, $prefix = 'default', $setName = '', $type = 'css', $data = '')
{
	if ((!is_array($files) || empty($files)))
	{
		return ['RESULT' => '', 'FILES' => []];
	}

	$this->setTemplateID();
	$res = $comments = $contents = '';
	$prefix = trim($prefix);
	$prefix = mb_strlen($prefix) < 1 ? 'default' : $prefix;
	$add2End = (strncmp($prefix, 'kernel', 6) == 0);
	$type = ($type == 'js' ? 'js' : 'css');

	/** @var bool $noCheckOnly when we cant write files */
	$noCheckOnly = !defined('BX_HEADFILES_CACHE_CHECK_ONLY');
	$prefix = ($unique ? $prefix : $prefix.'_'.$this->getAssetChecksum($files));

	$optimPath = BX_PERSONAL_ROOT.'/cache/'.$type.'/'.SITE_ID.'/'.$this->siteTemplateID.'/'.$prefix.'/';

	$infoFile = $this->documentRoot.BX_PERSONAL_ROOT.'/managed_cache/'.$this->dbType.'/'.$type.'/'.SITE_ID.'/'.$this->siteTemplateID.'/'.$prefix.'/info_v'.self::version.'.php';

	$optimFile = $optimPath.$prefix.'_v'.self::version.($type == 'css' ? '.css' : '.js');
	$optimFName = $this->documentRoot.$optimFile;

	$tmpInfo = $this->isAssetChanged($files, $infoFile, $optimFName, $unique);
	$filesInfo = $tmpInfo['FILES_INFO'];
	$action = $tmpInfo['ACTION'];
	$files = $tmpInfo['FILE'];
	$optimFileExist = $tmpInfo['FILE_EXIST'] ?? false;

	$writeResult = ($action == 'NEW' ? false : true);
	$currentFileList = &$this->fileList[strtoupper($type)][$setName];

	if ($action != 'NO')
	{
		foreach ($tmpInfo['FILE'] as $newFile)
		{
			$currentFileList['UP_NEW_FILES'][] = $newFile['FULL_PATH'];
		}

		if ($action == 'UP')
		{
			if ($noCheckOnly)
			{
				$contents .= file_get_contents($optimFName);
			}
			else
			{
				$writeResult = false;
			}
		}

		$needWrite = false;
		if ($noCheckOnly)
		{
			$newContent = '';
			$mapNeeded = false;
			foreach ($files as $file)
			{
				$assetContent = file_get_contents($file['FILE_PATH']);
				if ($type == 'css')
				{
					$comments .= "/* ".$file['FULL_PATH']." */n";
					$assetContent = $this->fixCSSIncludes($assetContent, $file['PATH']);
					$assetContent = "n/* Start:".$file['FULL_PATH']."*/n".$assetContent."n/* End */n";
					$newContent .= "n".$assetContent;
				}
				else
				{
					$info = [
						"full" => $file['FULL_PATH'],
						"source" => $file['PATH'],
						"min" => "",
						"map" => "",
					];

					if (preg_match("/\.min\.js$/i", $file['FILE_PATH']))
					{
						$sourceMap = self::cutSourceMap($assetContent);
						if ($sourceMap <> '')
						{
							$dirPath = IOPath::getDirectory($file['PATH']);
							$info["map"] = $dirPath."/".$sourceMap;
							$info["min"] = self::getAssetPath($file['FULL_PATH']);
							$mapNeeded = true;
						}
					}

					$comments .= "; /* ".$file['FULL_PATH']."*/n";
					$newContent .= "n".self::HEADER_START_TAG.serialize($info).self::HEADER_END_TAG."n".$assetContent."n/* End */n;";
				}

				$filesInfo[$file['PATH']] = $this->getAssetTime($file['FULL_PATH']);
				$needWrite = true;
			}

			if ($needWrite)
			{
				$sourceMap = self::cutSourceMap($contents);
				$mapNeeded = $mapNeeded || $sourceMap <> '';

				// Write packed files and meta information
				$contents = ($add2End ? $comments.$contents.$newContent : $newContent.$contents.$comments);
				if ($mapNeeded)
				{
					$contents .= self::SOURCE_MAP_TAG.$prefix.".map.js";
				}

				if ($writeResult = $this->write($optimFName, $contents))
				{
					$cacheInfo = ' $hash)
					{
						$cacheInfo .= '"'.EscapePHPString($key).'" => "'.$hash.'",';
					}

					$cacheInfo .= "]; ?>";
					$this->write($infoFile, $cacheInfo, false);

					if ($mapNeeded)
					{
						$this->write($this->documentRoot.$optimPath.$prefix.".map.js", self::generateSourceMap($prefix.".js", $contents), false);
					}
				}
			}
			elseif ($optimFileExist)
			{
				$writeResult = true;
			}
			unset($contents);
		}
	}

	$label = (($type == 'css') && ($prefix == 'template' || mb_substr($prefix, 0, 9) == 'template_') ? ' data-template-style="true" ' : '');

	$bundleFile = '';
	$extendData = ($data != '' ? ' '.trim($data) : '');
	$extendData .= ($label != '' ? ' '.trim($label) : '');

	if ($writeResult || $unique && $action == 'UP')
	{
		$bundleFile = CUtil::GetAdditionalFileURL($optimFile);
		$currentFileList['FILES'][] = $bundleFile;

		if ($type == 'css')
		{
			$res .= $this->insertCss($bundleFile, $extendData);
		}
		else
		{
			$res .= $this->insertJs($bundleFile, $extendData);
		}
	}

	if (!$writeResult)
	{
		foreach ($files as $file)
		{
			$currentFileList['FILES'][] = $file['FULL_PATH'];
			if ($type == 'css')
			{
				$res .= $this->insertCss($file['FULL_PATH'], $extendData);
			}
			else
			{
				$res .= $this->insertJs($file['FULL_PATH'], $extendData);
			}
		}
	}

	$resultFiles = [];
	if (is_array($filesInfo))
	{
		foreach ($filesInfo as $key => $hash)
		{
			$resultFiles[] = $key.'?'.$hash;

		}
	}

	unset($files);

	if ($bundleFile != '')
	{
		$currentFileList['FULL_FILES'][$bundleFile] = $resultFiles;
	}
	return ['RESULT' => $res, 'FILES' => $resultFiles, 'SOURCE_FILES' => array_keys($filesInfo)];
}