class JsOptimizer
Same name in other branches
- 9 core/lib/Drupal/Core/Asset/JsOptimizer.php \Drupal\Core\Asset\JsOptimizer
- 8.9.x core/lib/Drupal/Core/Asset/JsOptimizer.php \Drupal\Core\Asset\JsOptimizer
- 10 core/lib/Drupal/Core/Asset/JsOptimizer.php \Drupal\Core\Asset\JsOptimizer
Optimizes a JavaScript asset.
Hierarchy
- class \Drupal\Core\Asset\JsOptimizer implements \Drupal\Core\Asset\AssetOptimizerInterface
Expanded class hierarchy of JsOptimizer
1 file declares its use of JsOptimizer
- JsOptimizerUnitTest.php in core/
tests/ Drupal/ Tests/ Core/ Asset/ JsOptimizerUnitTest.php
File
-
core/
lib/ Drupal/ Core/ Asset/ JsOptimizer.php, line 16
Namespace
Drupal\Core\AssetView source
class JsOptimizer implements AssetOptimizerInterface {
/**
* Constructs a new JsOptimizer object.
*
* @param \Psr\Log\LoggerInterface $logger
* The logger.
*/
public function __construct(LoggerInterface $logger) {
}
/**
* {@inheritdoc}
*/
public function optimize(array $js_asset) {
if ($js_asset['type'] !== 'file') {
throw new \Exception('Only file JavaScript assets can be optimized.');
}
if (!$js_asset['preprocess']) {
throw new \Exception('Only file JavaScript assets with preprocessing enabled can be optimized.');
}
// If a BOM is found, convert the file to UTF-8, then use substr() to
// remove the BOM from the result.
$data = file_get_contents($js_asset['data']);
if ($encoding = Unicode::encodingFromBOM($data)) {
$data = mb_substr(Unicode::convertToUtf8($data, $encoding), 1);
}
elseif (isset($js_asset['attributes']['charset'])) {
$data = Unicode::convertToUtf8($data, $js_asset['attributes']['charset']);
}
// Remove comments, whitespace, and optional braces.
try {
$ast = Peast::latest($data)->parse();
$renderer = new Renderer();
$renderer->setFormatter(new CompactFormatter());
return $renderer->render($ast);
} catch (\Exception $exception) {
if ($exception instanceof PeastSyntaxException) {
$position = $exception->getPosition();
Error::logException($this->logger, $exception, 'Syntax error: @message, File: @asset_file, Line: @asset_line, Column: @asset_column, Index: @asset_index', [
'@asset_file' => $js_asset['data'],
'@asset_line' => $position->getLine(),
'@asset_column' => $position->getColumn(),
'@asset_index' => $position->getIndex(),
]);
}
else {
Error::logException($this->logger, $exception);
}
return $data;
}
}
/**
* Processes the contents of a javascript asset for cleanup.
*
* @param string $contents
* The contents of the javascript asset.
*
* @return string
* Contents of the javascript asset.
*/
public function clean($contents) {
// Remove JS source and source mapping URLs or these may cause 404 errors.
$contents = preg_replace('/\\/\\/(#|@)\\s(sourceURL|sourceMappingURL)=\\s*(\\S*?)\\s*$/m', '', $contents);
return $contents;
}
}
Members
Title Sort descending | Modifiers | Object type | Summary | Overriden Title |
---|---|---|---|---|
JsOptimizer::clean | public | function | Processes the contents of a javascript asset for cleanup. | Overrides AssetOptimizerInterface::clean |
JsOptimizer::optimize | public | function | Optimizes an asset. | Overrides AssetOptimizerInterface::optimize |
JsOptimizer::__construct | public | function | Constructs a new JsOptimizer object. |
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.