【问题标题】:Laravel minify css and js filesLaravel 缩小 css 和 js 文件
【发布时间】:2015-12-02 14:38:29
【问题描述】:

我通过 html 表单接收自定义 js 和 css 脚本作为字符串。然后将此字符串保存在文件系统上的文件中。问题是如何在每次生成/更新这些文件时缩小它们。我正在使用 gulp 和 laravel 长生不老药。 我的第一个想法是调用 exec("gulp something") 但不确定如何配置 gulp。

【问题讨论】:

标签: javascript css node.js gulp


【解决方案1】:

要求:

第一步:安装插件

minifyCssgulp-uglify 被 laravel-elixir 使用。您必须通过npm install gulp-newer --save-dev 安装gulp-newer

第二步:定义任务

你需要为 css 和 js 定义不同的任务。

CSS 任务

gulp.task('cssTask', function() {
            return gulp.src(cssSrc)
                .pipe(newer(cssDest))//compares the css source and css destination(css files)
                .pipe(minifyCss())//minify css
                .pipe(gulp.dest(cssDest));//save minified css in destination directory 
        });

Js 任务

gulp.task('jsTask', function() {
            return gulp.src(jsSrc)
                .pipe(newer(jsDest))//compares the js source and js destination(js files)
                .pipe(uglify())//minify js
                .pipe(gulp.dest(jsDest));//save minified js in destination directory 
        });

第三步:定义自定义手表

您应该有一个监视任务来监视您的源目录(cssSrcjsSrc)并调用其相关任务。

gulp.task('custom', function() {//Watch task
            gulp.watch(cssSrc, ['cssTask']);//watch your css source and call css task
            gulp.watch(jsSrc, ['jsTask']);//watch your js source and call js task
        });

第四步:运行自定义手表

最后,您必须通过gulp custom 运行自定义任务。

结论:

每次,当文件被添加到源目录时。 Gulp 将缩小文件并将其存储在目标目录中。这是在本地测试的,效果很好。

完成的 Gulp 文件

var gulp = require('gulp');
var elixir = require('laravel-elixir');
var newer = require('gulp-newer');
var minifyCss = require('gulp-minify-css');
var uglify = require('gulp-uglify');

cssSrc = 'cssSrc/*.css';//Your css source directory
cssDest = 'cssDest';//Your css destination directory

jsSrc = 'jsSrc/*.js';//Your js source directory
jsDest = 'jsDest';//Your js destination directory


gulp.task('cssTask', function() {
    return gulp.src(cssSrc)
        .pipe(newer(cssDest))//compares the css source and css destination(css files)
        .pipe(minifyCss())//minify css
        .pipe(gulp.dest(cssDest));//save minified css in destination directory 
});

gulp.task('jsTask', function() {
    return gulp.src(jsSrc)
        .pipe(newer(jsDest))//compares the js source and js destination(js files)
        .pipe(uglify())//minify js
        .pipe(gulp.dest(jsDest));//save minified js in destination directory 
});

gulp.task('custom', function() {//Watch task
    gulp.watch(cssSrc, ['cssTask']);//watch your css source and call css task
    gulp.watch(jsSrc, ['jsTask']);//watch your js source and call js task
});

评论后编辑:

我想要这样的东西:gulp custom srcFile destFile.

对于这种情况,您需要安装名为yargs 的新插件。

安装:

您可以通过npm install yargs --save-dev 安装yargs,然后在调用自定义任务时必须传递源目录和目标目录。

gulp custom  --cssSrc=cssSource --cssDest=cssDestination --jsSrc=jsSource --jsDest=jsDestination

例如:

gulp custom  --cssSrc=cssSrc/*.css --cssDest=cssDest --jsSrc=jsSrc/*.js --jsDest=jsDest

完成的 Gulp 文件:

var gulp = require('gulp');
var elixir = require('laravel-elixir');
var newer = require('gulp-newer');
var minifyCss = require('gulp-minify-css');
var uglify = require('gulp-uglify');
var argv = require('yargs').argv;

cssSrc = argv.cssSrc;
cssDest = argv.cssDest;

jsSrc = argv.jsSrc;
jsDest = argv.jsDest;



gulp.task('cssTask', function() {
    return gulp.src(cssSrc)
        .pipe(newer(cssDest))
        .pipe(minifyCss())
        .pipe(gulp.dest(cssDest));
});

gulp.task('jsTask', function() {
    return gulp.src(jsSrc)
        .pipe(newer(jsDest))
        .pipe(uglify())
        .pipe(gulp.dest(jsDest));
});

gulp.task('custom', function() {
    gulp.watch(cssSrc, ['cssTask']);
    gulp.watch(jsSrc, ['jsTask']);
});

注意:每次更改源目录或目标目录时,都必须再次调用 gulp 任务。

【讨论】:

  • 看起来不错,但如果我可以将 Src 和 Dest 路径作为参数传递,那就太酷了。因为每个 Src 和 Dest 文件位于不同的位置。所以例如我想要这样的东西:gulp custom srcFile destFile
  • @izupet 我认为可以做到。明天我会检查并更新我的答案。
【解决方案2】:

使用以下 gulp 模块。

https://www.npmjs.com/package/gulp-minify-css - 缩小你所有的 css 文件。 https://www.npmjs.com/package/gulp-concat-css - 将所有 CSS 合并到一个文件中。 https://www.npmjs.com/package/gulp-uglify - 压缩你所有的 JS 文件。 https://www.npmjs.com/package/gulp-sass - SASS

参考这个答案: Gulp minify multiple js files to one

以下是 Gulp 文件片段示例。

var gulp = require('gulp'),
  sass = require('gulp-sass'),
  autoprefixer = require('gulp-autoprefixer'),
  jshint = require('gulp-jshint'),
  uglify = require('gulp-uglify'),
  imagemin = require('gulp-imagemin'),
  rename = require('gulp-rename'),
  clean = require('gulp-clean'),
  concat = require('gulp-concat'),
  notify = require('gulp-notify'),
  cache = require('gulp-cache'),
  livereload = require('gulp-livereload'),
  lr = require('tiny-lr'),
  server = lr();

// Clean
gulp.task('clean', function() {
  return gulp.src(['css', 'js', 'img'], {
      read: false
    })
    .pipe(clean());
});


gulp.task('styles', function() {
  return gulp.src('sass/styles.scss')
    .pipe(sass({
      style: 'expanded'
    }))
    .pipe(autoprefixer('last 2 version', 'safari 5', 'ie 8', 'ie 9', 'opera 12.1', 'ios 6', 'android 4'))
    .pipe(gulp.dest('css'))
    .pipe(notify({
      message: 'Styles task complete'
    }));
});

// Concatenate & Minify JS
gulp.task('scripts', function() {
  return gulp.src('js/*.js')
    .pipe(concat('all.js'))
    .pipe(gulp.dest('dist'))
    .pipe(rename('all.min.js'))
    .pipe(uglify())
    .pipe(gulp.dest('dist'));
});


// Watch
gulp.task('watch', function() {

  // Watch .scss files
  gulp.watch('sass/**/*.scss', ['styles']);

  // Watch .js files
  gulp.watch('js/**/*.js', ['scripts']);

  // Watch image files
  gulp.watch('img/**/*', ['images']);

  // Create LiveReload server
  var server = livereload();

  // Watch any files in dist/, reload on change
  gulp.watch(['sass/**', 'js/**', 'img/**', '*.html']).on('change', function(file) {
    server.changed(file.path);
  });

});


gulp.task('default', ['styles', 'scripts', 'watch']);

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
  • 我同意你的观点。让我更新 gul config sn-p。但我很好奇,问题一般。我不认为它需要有sn-p。反正
  • 如果链接发生变化,那么答案可能毫无用处。如果问题是一般性的,那么可能对链接中的要点进行“剪切和粘贴”。
【解决方案3】:

首先,您需要将内容存储在一个新文件中。一个好地方是resources/assets/js

$jsContent = $request->get('js_custom_content');
file_put_contents(base_path('resources/assets/js/custom.js'), $jsContent);

好的,一旦创建了 javascript 文件,你需要告诉 elixir 来缩小自定义脚本:

// it will look for resources/assets/js/custom.js
// and it will compress the output to public/assets/js/custom.min.js
mix.scripts(['custom.js'], 'public/assets/js/custom.min.js');

(可选)您可以对其进行版本控制。这意味着每次脚本的内容发生变化时,gulp 都会生成一个新版本以避免浏览器的缓存问题:

mix.version(['public/assets/js/custom.min.js']);

最后,在你的视图中加载脚本:

 <script type="text/javascript" src="{{ url('assets/js/custom.min.js')) }}"></script>   

或与版本:

<script type="text/javascript" src="{{ url(elixir('assets/js/custom.min.js')) }}"></script>

【讨论】:

  • 也许我的问题不够清楚,但这不是我想要的。我通过表单接收字符串,并将此内容保存到文件中。这些文件存储在文件系统上的不同位置(不在资源/资产/js 中),因为这些文件与生成它们的应用程序无关。然后将这些生成的文件用于其他事情。我想知道如何按需缩小那些传播的文件。缩小命令将由 php 脚本触发。
  • 哦!我得到了它。人们因为 laravel 的标签而感到困惑。您需要将工作委托给 nodej 的模块,以便在 lavaral 的范围之外实现此特定目的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-28
  • 2012-03-06
  • 1970-01-01
  • 1970-01-01
  • 2021-07-08
  • 2018-10-25
相关资源
最近更新 更多