Takeaways Key
output_path: (diperlukan) jalan untuk menyimpan fail minified, (style.css -> style.min.css).
<span>cssmin 'output_path' 'file1'...'fileN' --comments --concat</span>
Untuk membuat perintah artisan, anda boleh menggunakan perintah: membuat perintah. Perintah ini menerima satu hujah:
Nama: Nama kelas untuk arahan.
-perintah: nama yang harus ditaip untuk menjalankan perintah.
<span>cssmin 'output_path' 'file1'...'fileN' --comments --concat</span>
kelas cssmincommand kami memanjangkan IlluminateConsolecommand dan mengatasi dua kaedah (getArguments, getOptions).
NOTA: Pilihan mungkin atau mungkin tidak mempunyai nilai, -Comments hanya bendera yang mengembalikan benar jika ia diserahkan kepada perintah, sedangkan --ouptput = 'awam/aset' akan mengembalikan nilai.
Apabila arahan anda dilaksanakan, kaedah api dipanggil, jadi ini adalah di mana kita perlu meletakkan logik arahan kita.mendaftarkan arahan
untuk mendaftarkan arahan, anda perlu menambahkannya ke fail artisan.php:
<span>use Illuminate<span>\Console\Command</span>; </span><span>use Symfony<span>\Component\Console\Input\InputOption</span>; </span><span>use Symfony<span>\Component\Console\Input\InputArgument</span>; </span> <span>class CssminCommand extends Command{ </span> <span>protected $name = 'cssmin'; </span> <span>protected $description = 'Command description.'; </span> <span>public function __construct(){ </span> <span><span>parent::</span>__construct(); </span> <span>} </span> <span>public function fire(){ </span> <span>// </span> <span>} </span> <span>protected function getArguments(){ </span> <span>return array( </span> <span>array('example', InputArgument<span>::</span>REQUIRED, 'An example argument.'), </span> <span>); </span> <span>} </span> <span>protected function getOptions(){ </span> <span>return array( </span> <span>array('example', null, InputOption<span>::</span>VALUE_OPTIONAL, 'An example option.', null), </span> <span>); </span> <span>} </span><span>}</span>
Argumen
Untuk menentukan hujah, kita perlu lulus pelbagai nilai:
<span>Artisan<span>::</span>add( new CssMinCommand ); </span> <span>//or through the container </span><span>Artisan<span>::</span>add( App<span>::</span>make("CssMinCommand") );</span>
Penerangan: Berguna apabila mencetak bantuan arahan.
Nota: Apabila menggunakan argumen is_array, ia harus menjadi yang terakhir pada array argumen yang dikembalikan. (jelas).
<span>array( 'name', 'mode', 'description', 'defaultValue' )</span>
Pilihan
<span>protected function getArguments(){ </span> <span>return array( </span> <span>array( </span> <span>'output', </span> <span>InputArgument<span>::</span>REQUIRED, </span> <span>'Path to output directory' </span> <span>), </span> <span>array( </span> <span>'files', </span> <span>InputArgument<span>::</span>IS_ARRAY | InputArgument<span>::</span>OPTIONAL , </span> <span>"List of css files to minify" </span> <span>), </span> <span>); </span> <span>}</span>
value_none: Menunjukkan bahawa pilihannya adalah bendera boolean (ex: --verbose).
DefaultValue: Jika nilai pilihan tidak disediakan.
<span>cssmin 'output_path' 'file1'...'fileN' --comments --concat</span>
Apabila kaedah api kita dipanggil kita perlu mengumpulkan hujah dan pilihan kita. Kita boleh membuat fungsi yang berasingan untuk melakukannya untuk kita:
<span>use Illuminate<span>\Console\Command</span>; </span><span>use Symfony<span>\Component\Console\Input\InputOption</span>; </span><span>use Symfony<span>\Component\Console\Input\InputArgument</span>; </span> <span>class CssminCommand extends Command{ </span> <span>protected $name = 'cssmin'; </span> <span>protected $description = 'Command description.'; </span> <span>public function __construct(){ </span> <span><span>parent::</span>__construct(); </span> <span>} </span> <span>public function fire(){ </span> <span>// </span> <span>} </span> <span>protected function getArguments(){ </span> <span>return array( </span> <span>array('example', InputArgument<span>::</span>REQUIRED, 'An example argument.'), </span> <span>); </span> <span>} </span> <span>protected function getOptions(){ </span> <span>return array( </span> <span>array('example', null, InputOption<span>::</span>VALUE_OPTIONAL, 'An example option.', null), </span> <span>); </span> <span>} </span><span>}</span>
Kaedah hujah dan pilihan mengambil kunci sebagai hujah dan mengembalikan nilai yang sesuai.
Untuk memastikan contoh kami bersih dan mudah kami akan menggunakan fungsi mudah ini dengan pengubahsuaian kecil untuk proses minifikasi.
<span>Artisan<span>::</span>add( new CssMinCommand ); </span> <span>//or through the container </span><span>Artisan<span>::</span>add( App<span>::</span>make("CssMinCommand") );</span>
Sekarang untuk memproses hujah -hujah kami (fail) kami akan membuat kaedah yang berasingan untuk melakukan pekerjaan.
<span>array( 'name', 'mode', 'description', 'defaultValue' )</span>
Akhirnya, kaedah kebakaran kami hanya akan memanggil kedua -dua kaedah:
<span>protected function getArguments(){ </span> <span>return array( </span> <span>array( </span> <span>'output', </span> <span>InputArgument<span>::</span>REQUIRED, </span> <span>'Path to output directory' </span> <span>), </span> <span>array( </span> <span>'files', </span> <span>InputArgument<span>::</span>IS_ARRAY | InputArgument<span>::</span>OPTIONAL , </span> <span>"List of css files to minify" </span> <span>), </span> <span>); </span> <span>}</span>
Petua: Anda juga boleh menjalankan arahan luaran menggunakan kaedah panggilan.
<span>array('name', 'shortcut', 'mode', 'description', 'defaultValue')</span>
Untuk menguji arahan kami, kami akan menyalin beberapa fail CSS ke dalam direktori awam/CSS kami, dan kemudian jalankan arahan.
<span>protected function getOptions(){ </span> <span>return array( </span> <span>array('comments', 'c', InputOption<span>::</span>VALUE_NONE, 'Don\'t strip comments' , null), </span> <span>array('concat', null, InputOption<span>::</span>VALUE_NONE, 'Concat the minified result to one file' , null), </span> <span>); </span> <span>}</span>
Perintah pertama akan membuat dua fail (style.min.css, responsif.min.css) pada direktori awam/CSS.
Kerana kami menggunakan bendera -komitmen dan -concat, kami akan mendapatkan fail yang dipanggil all.min.css yang mengandungi dua fail dengan komen yang tersisa.
Perintah kami tidak begitu deskriptif dan tidak memberikan sebarang mesej atau pemberitahuan!
Sebelum kita meneruskan, pada repositori github terakhir saya akan membuat tag baru untuk arahan kami supaya anda dapat menukar dan menguji setiap satu.
Untuk membuat arahan sedikit verbose, Laravel memberikan kami beberapa fungsi output:
<span>private function init(){ </span> <span>// retrun an array </span> <span>$this->files = $this->argument('files'); </span> <span>// return a string </span> <span>$this->output_path = $this->argument('output'); </span> <span>// return true if passed, otherwise false </span> <span>$this->comments = $this->option('comments'); </span> <span>// return true if passed, otherwise false </span> <span>$this->concat = $this->option('concat'); </span><span>}</span>
Ini akan output:
di samping hanya memaparkan mesej, anda boleh meminta pengguna untuk mendapatkan maklumat, contohnya:
Kaedah mengesahkan mengambil dua argumen, mesej soalan dan nilai lalai jika pengguna menaip sesuatu yang berbeza daripada y/n.
<span>private function minify( $css, $comments ){ </span> <span>// Normalize whitespace </span> <span>$css = preg_replace( '/\s+/', ' ', $css ); </span> <span>// Remove comment blocks, everything between /* and */, unless preserved with /*! ... */ </span> <span>if( !$comments ){ </span> <span>$css = preg_replace( '/\/\*[^\!](.*?)\*\//', '', $css ); </span> <span>}//if </span> <span>// Remove ; before } </span> <span>$css = preg_replace( '/;(?=\s*})/', '', $css ); </span> <span>// Remove space after , : ; { } */ > </span> <span>$css = preg_replace( '/(,|:|;|\{|}|\*\/|>) /', '', $css ); </span> <span>// Remove space before , ; { } ( ) > </span> <span>$css = preg_replace( '/ (,|;|\{|}|\(|\)|>)/', '', $css ); </span> <span>// Strips leading 0 on decimal values (converts 0.5px into .5px) </span> <span>$css = preg_replace( '/(:| )0\.([0-9]+)(%|em|ex|px|in|cm|mm|pt|pc)/i', '.', $css ); </span> <span>// Strips units if value is 0 (converts 0px to 0) </span> <span>$css = preg_replace( '/(:| )(\.?)0(%|em|ex|px|in|cm|mm|pt|pc)/i', '0', $css ); </span> <span>// Converts all zeros value into short-hand </span> <span>$css = preg_replace( '/0 0 0 0/', '0', $css ); </span> <span>// Shortern 6-character hex color codes to 3-character where possible </span> <span>$css = preg_replace( '/#([a-f0-9])\1([a-f0-9])\2([a-f0-9])\3/i', '#', $css ); </span> <span>return trim( $css ); </span> <span>}//minify</span>
Kaedah pilihan akan memberi pengguna senarai nombor untuk dipilih, dan jika ia dibiarkan kosong, nilai lalai dikembalikan.
Kaedah rahsia akan meminta pengguna dengan soalan dan menyembunyikan menaip, tetapi input pengguna akan dikembalikan.
Malah, Laravel hanya membuat API Konsol Symfony lebih mudah dan lebih jelas, dan terdapat lebih banyak lagi jika anda mahu menggali.
Fungsi kami kini mencetak beberapa mesej berguna untuk menjejaki apa yang sedang berlaku.
Apabila membuat aplikasi, kami digunakan untuk membuang senarai laluan yang ada (laluan Artisan PHP).
<span>private function processFiles(){ </span> <span>// array of minified css </span> <span>$css_result = []; </span> <span>foreach ( $this->files as $file ) { </span> <span>//read file content </span> <span>$file_content = file_get_contents( $file ); </span> <span>//minify CSS and add it to the result array </span> <span>$css_result[] = $this->minify( $file_content, $this->comments ); </span> <span>}//foreach </span> <span>// if the concat flag is true </span> <span>if( $this->concat ){ </span> <span>// join the array of minified css </span> <span>$css_concat = implode( PHP_EOL, $css_result ); </span> <span>// save to file </span> <span>file_put_contents($this->output_path . '/all.min.css', $css_concat); </span> <span>}//if </span> <span>else{ </span> <span>foreach ($css_result as $key => $css) { </span> <span>//remove '.css' to add '.min.css' </span> <span>$filename = basename( $this->files[$key], '.css' ) . '.min.css'; </span> <span>// save to file </span> <span>file_put_contents($this->output_path . '/' . $filename, $css); </span> <span>}//for </span> <span>}//else </span> <span>}//processFiles</span>
Symfony menyediakan fungsi yang membolehkan anda mencetak jadual sedemikian dengan mudah. Semak dokumentasi untuk contoh. Kami akan melihat seterusnya bagaimana kita boleh menggunakan beberapa pembantu konsol Symfony.
Untuk menggambarkan penggunaan beberapa pembantu Symfony, kami akan menggunakan pembantu kemajuan untuk memastikan pengguna dikemas kini mengenai kemajuan kerja.
Pada akhir kaedah init kami, kami akan memerlukan kemajuan dari Helperset, kemudian mulakan bar kemajuan kami.
<span>cssmin 'output_path' 'file1'...'fileN' --comments --concat</span>
Kaedah permulaan menerima dua argumen, $ this-> output adalah contoh konsoleouput dari konsol Symfony. Hujah kedua adalah bilangan maksimum langkah.
Setiap kali kami memproses fail dalam kaedah ProcessFiles kami, kami akan memajukan bar kemajuan dengan satu langkah, dan apabila kerja selesai, kami akan menamatkan bar kemajuan dan mencetak mesej pemberitahuan.
<span>use Illuminate<span>\Console\Command</span>; </span><span>use Symfony<span>\Component\Console\Input\InputOption</span>; </span><span>use Symfony<span>\Component\Console\Input\InputArgument</span>; </span> <span>class CssminCommand extends Command{ </span> <span>protected $name = 'cssmin'; </span> <span>protected $description = 'Command description.'; </span> <span>public function __construct(){ </span> <span><span>parent::</span>__construct(); </span> <span>} </span> <span>public function fire(){ </span> <span>// </span> <span>} </span> <span>protected function getArguments(){ </span> <span>return array( </span> <span>array('example', InputArgument<span>::</span>REQUIRED, 'An example argument.'), </span> <span>); </span> <span>} </span> <span>protected function getOptions(){ </span> <span>return array( </span> <span>array('example', null, InputOption<span>::</span>VALUE_OPTIONAL, 'An example option.', null), </span> <span>); </span> <span>} </span><span>}</span>
Nota: Versi ini akan ditandakan sebagai V3 pada repositori akhir.
Kesimpulan
Soalan Lazim (Soalan Lazim) di Laravel CSS Minify Command
Atas ialah kandungan terperinci Cara Membuat Perintah CSS-Minify Laravel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!