Intereting Posts
CakePHP: вызов функции-члена функции () на не-объекте Как эффективно контролировать каталог для изменений в Linux? Как импортировать таблицу в phpmyadmin? Я получил ошибку размера файла проверьте, является ли файл аудиофайлом в PHP Ошибка «Ссылка на объект, не установленная на экземпляр объекта», ошибка подключения к SOAP-серверу из PHP Вычисление факторического ранга перестановки (N выбрать K) WORDPRESS: отображение списка подкатегорий и сообщений, которые они содержат, в пределах одной основной категории Удалить имя каталога из url WordPress кеширование заголовков из PHP Подсчитайте данные в массиве, где дата одинакова и постройте диаграмму bar morrisjs Как считать секунды в минуты, php? Черный список слов по содержимому для фильтрации сообщения PHP преобразует json в csv с дополнительным массивом Как преобразовать eregi в preg_match? Как устранить ошибку « file_get_contents (/var/www/laravel/.env): не удалось открыть поток: нет такого файла или каталога»?

Как легко минимизировать JS в PHP … Или что-то еще

Я немного осмотрелся, но я все еще немного смущен.

Я попробовал JSMin от Crockford, но Win XP не может распаковать исполняемый файл по какой-то причине.

Я действительно хочу, но это простой и простой в использовании JS-минификатор, который использует PHP для минимизации JS-кода – и возвращает результат.

Причина в том, что: у меня есть 2 файла (например), с которыми я работаю: scripts.js и scripts_template.js

scripts_template – это обычный код, который я выписываю – тогда мне нужно его минимизировать и вставить мини-скрипт в scripts.js – тот, который я фактически использую на своем веб-сайте.

Я хочу искоренить среднего человека, просто сделав что-то подобное на моей странице:

<script type="text/javascript" src="scripts.php"></script> 

А затем для содержимого scripts.php:

 <?php include("include.inc"); header("Content-type:text/javascript"); echo(minify_js(file_get_contents("scripts_template.js"))); 

Таким образом, всякий раз, когда я обновляю свой JS, мне не нужно постоянно переходить на сайт, чтобы его минимизировать и повторно вставить в scripts.js – все автоматически обновляется.

Да, я также попробовал PHP Minifier от Crockford, и я взглянул на PHP Speedy, но пока еще не понял PHP-классы … Есть ли что-нибудь, что обезьяна могла бы понять, может быть, что-то с RegExp?

Как насчет того, чтобы сделать это еще проще?

Я просто хочу удалить области вкладок – я все еще хочу, чтобы мой код был доступен для чтения.

Это не похоже на то, что сценарий заставляет мой сайт отставать эпично, это просто ничего лучше, чем ничего.

Удаление вкладок, кто-нибудь? И если это возможно, как насчет удаления полностью BLANK строк?

Я довольно долго использовал PHP- версию JSMin Дугласом Крокфордом . При конкатенации файлов может быть немного рискованно, так как в конце закрытия может отсутствовать точка с запятой.

Было бы разумной идеей кэшировать миниатюрный вывод и эхо кэшировать, если он новее исходного файла.

 require 'jsmin.php'; if(filemtime('scripts_template.js') < filemtime('scripts_template.min.js')) { read_file('scripts_template.min.js'); } else { $output = JSMin::minify(file_get_contents('scripts_template.js')); file_put_contents('scripts_template.min.js', $output); echo $output; } 

Вы также можете попробовать JShrink . Я никогда не использовал его раньше, так как раньше у меня не было проблем с JSMin, но этот код ниже должен делать трюк. Я этого не осознал, но JShrink требует PHP 5.3 и пространства имен.

 require 'JShrink/Minifier.php'; if(filemtime('scripts_template.js') < filemtime('scripts_template.min.js')) { read_file('scripts_template.min.js'); } else { $output = \JShrink\Minifier::minify(file_get_contents('scripts_template.js')); file_put_contents('scripts_template.min.js', $output); echo $output; } 

Взгляните на Assetic, отличную библиотеку управления активами на PHP. Он хорошо интегрирован с Symfony2 и широко используется.

https://github.com/kriswallsmith/assetic

В зависимости от ограничений вашего сервера (например, не работает в безопасном режиме ), возможно, вы также можете заглянуть за пределы PHP для minifier и запустить его с помощью shell_exec() . Например, если вы можете запускать Java на своем сервере, поместите копию YUI Compressor на сервер и используйте ее напрямую.

Тогда scripts.php будет что-то вроде:

 <?php $cmd = "java -cp [path-to-yui-dir] -jar [path-to-yuicompressor.jar] [path-to-scripts_template.js]"; echo(shell_exec($cmd)); ?> 

Другое предложение: постройте шаг минимизации в рабочий процесс разработки, прежде чем развертывать его на сервере. Например, я настроил свои проекты Eclipse PHP для сжатия JS и CSS-файлов в папку «build». Работает как шарм.

Используя « PHPWee »: https://github.com/searchturbine/phpwee-php-minifier (который также использует JSmin ), я немного продвинул решение @Robert K.

Это решение позволяет минимизировать как CSS, так и JS-файлы. Если не-минированный файл не может быть найден, он вернет пустую строку. Если миниатюрный файл старше, чем неминифицированный, он попытается его создать. Он создаст подпапку для мини-файла, если он не существует. Если метод может успешно минимизировать файл, он возвращает его либо в <script> (javascript), либо в <link> (CSS). В противном случае метод вернет неминифицированную версию в соответствующий тег.

Примечание : проверено с помощью PHP 7.0.13

 /** * Try to minify the JS/CSS file. If we are not able to minify, * returns the path of the full file (if it exists). * * @param $matches Array * 0 = Full partial path * 1 = Path without the file * 2 = File name and extension * * @param $fileType Boolean * FALSE: css file. * TRUE: js file * * @return String */ private static function createMinifiedFile(array $matches, bool $fileType) { if (strpos($matches[1], 'shared_code') !== false) { $path = realpath(dirname(__FILE__)) . str_replace( 'shared_code', '..', $matches[1] ); } else { $path = realpath(dirname(__FILE__)) . "/../../" . $matches[1]; } if (is_file($path . $matches[2])) { $filePath = $link = $matches[0]; $min = 'min/' . str_replace( '.', '.min.', $matches[2] ); if (!is_file($path . $min) or filemtime($path . $matches[2]) > filemtime($path . $min) ) { if (!is_dir($path . 'min')) { mkdir($path . 'min'); } if ($fileType) { // JS $minified = preg_replace( array( '/(\))\R({)/', '/(})\R/' ), array( '$1$2', '$1' ), Minify::js( (string) file_get_contents( $path . $matches[2] ) ) ); } else { // CSS $minified = preg_replace( '@/\*(?:[\r\s\S](?!\*/))+\R?\*/@', //deal with multiline comments '', Minify::css( (string) file_get_contents( $path . $matches[2] ) ) ); } if (!empty($minified) and file_put_contents( $path . $min, $minified ) ) { $filePath = $matches[1] . $min; } } else { // up-to-date $filePath = $matches[1] . $min; } } else { // full file doesn't exists $filePath = ""; } return $filePath; } /** * Return the minified version of a CSS file (must end with the .css extension). * If the minified version of the file is older than the full CSS file, * the CSS file will be shrunk. * * Note: An empty string will be return if the CSS file doesn't exist. * * Note 2: If the file exists, but the minified file cannot be created, * we will return the path of the full file. * * @link https://github.com/searchturbine/phpwee-php-minifier Source * * @param $path String name or full path to reach the CSS file. * If only the file name is specified, we assume that you refer to the shared path. * * @return String */ public static function getCSSMin(String $path) { $link = ""; $matches = array(); if (preg_match( '@^(/[\w-]+/view/css/)?([\w-]+\.css)$@', $path, $matches ) ) { if (empty($matches[1])) { // use the default path $matches[1] = self::getCssPath(); $matches[0] = $matches[1] . $matches[2]; } $link = self::createMinifiedFile($matches, false); } else { $link = ""; } return (empty($link) ? '' : '<link rel="stylesheet" href="' . $link . '">' ); } /** * Return the path to fetch CSS sheets. * * @return String */ public static function getCssPath() { return '/shared_code/css/' . self::getCurrentCSS() . "/"; } /** * Return the minified version of a JS file (must end with the .css extension). * If the minified version of the file is older than the full JS file, * the JS file will be shrunk. * * Note: An empty string will be return if the JS file doesn't exist. * * Note 2: If the file exists, but the minified file cannot be created, * we will return the path of the full file. * * @link https://github.com/searchturbine/phpwee-php-minifier Source * * @param $path String name or full path to reach the js file. * * @return String */ public static function getJSMin(String $path) { $matches = array(); if (preg_match( '@^(/[\w-]+(?:/view)?/js/)([\w-]+\.js)$@', $path, $matches ) ) { $script = self::createMinifiedFile($matches, true); } else { $script = ""; } return (empty($script) ? '' : '<script src="' . $script . '"></script>' ); } 

В шаблоне (Smarty) вы можете использовать следующие методы:

 {$PageController->getCSSMin("main_frame.css")} //Output: <link rel="stylesheet" href="/shared_code/css/default/min/main_frame.min.css"> {$PageController->getCSSMin("/gem-mechanic/view/css/gem_mechanic.css")} //Output: <link rel="stylesheet" href="/gem-mechanic/view/css/min/gem_mechanic.min.css"> {$PageController->getJSMin("/shared_code/js/control_utilities.js")} //Output: <script src="/shared_code/js/min/control_utilities.min.js"></script> {$PageController->getJSMin("/PC_administration_interface/view/js/error_log.js")} //Output: <script src="/PC_administration_interface/view/js/min/error_log.min.js"></script> 

Единичные тесты:

 /** * Test that we can minify CSS files successfully. */ public function testGetCSSMin() { //invalid style $this->assertEmpty( PageController::getCSSMin('doh!!!') ); //shared style $path = realpath(dirname(__FILE__)) . '/../css/default/min/main_frame.min.css'; if (is_file($path)) { unlink ($path); } $link = PageController::getCSSMin("main_frame.css"); $this->assertNotEmpty($link); $this->assertEquals( '<link rel="stylesheet" href="/shared_code/css/default/min/main_frame.min.css">', $link ); $this->validateMinifiedFile($path); //project style $path = realpath(dirname(__FILE__)) . '/../../gem-mechanic/view/css/min/gem_mechanic.min.css'; if (is_file($path)) { unlink ($path); } $link = PageController::getCSSMin("/gem-mechanic/view/css/gem_mechanic.css"); $this->assertNotEmpty($link); $this->assertEquals( '<link rel="stylesheet" href="/gem-mechanic/view/css/min/gem_mechanic.min.css">', $link ); $this->validateMinifiedFile($path); } /** * Test that we can minify JS files successfully. */ public function testGetJSMin() { //invalid script $this->assertEmpty( PageController::getJSMin('doh!!!') ); //shared script $path = realpath(dirname(__FILE__)) . '/../js/min/control_utilities.min.js'; if (is_file($path)) { unlink ($path); } $script = PageController::getJSMin("/shared_code/js/control_utilities.js"); $this->assertNotEmpty($script); $this->assertEquals( '<script src="/shared_code/js/min/control_utilities.min.js"></script>', $script ); $this->validateMinifiedFile($path); //project script $path = realpath(dirname(__FILE__)) . '/../../PC_administration_interface/view/js/min/error_log.min.js'; if (is_file($path)) { unlink ($path); } $script = PageController::getJSMin("/PC_administration_interface/view/js/error_log.js"); $this->assertNotEmpty($script); $this->assertEquals( '<script src="/PC_administration_interface/view/js/min/error_log.min.js"></script>', $script ); $this->validateMinifiedFile($path); } /** * Make sure that the minified file exists and that its content is valid. * * @param $path String the path to reach the file */ private function validateMinifiedFile(string $path) { $this->assertFileExists($path); $content = (string) file_get_contents($path); $this->assertNotEmpty($content); $this->assertNotContains('/*', $content); $this->assertEquals( 0, preg_match( '/\R/', $content ) ); } 

Дополнительные примечания :

  1. В phpwee.php мне пришлось заменить <? посредством <?php .
  2. У меня были проблемы с пространством имен (функция class_exists() не могла найти классы, даже если они были в одном файле). Я решил эту проблему, удалив пространство имен в каждом файле.