【问题标题】:Mix/version images in Laravel 5.4?Laravel 5.4 中的混合/版本图像?
【发布时间】:2020-04-23 04:52:43
【问题描述】:

我想在一组图像上使用 mix。首先我复制它们:

mix.copy('resources/images', 'public/images');

当时的版本:

mix.version();

以上对图像没有任何作用。

我也试过指定路径:

mix.version('public/images/*');

但是我得到一个没有这样的文件或目录的错误。

如何对图像进行版本控制?

【问题讨论】:

  • 你有没有发现如何解决这个问题?
  • @BitByBit 请参阅下面的答案。

标签: laravel laravel-5 laravel-5.4


【解决方案1】:

我知道这是一个老问题,但对于 2019 - laravel mix 4,您可以使用:

mix.copy('resources/images/*', 'public/images');
mix.version();

这将对您复制的所有文件进行版本控制。 不要使用以下其中一种:

mix.copy('resources/images/*', 'public/images/*'); 
mix.copy('resources/images/', 'public/images/*'); 
mix.copyDirectory('resources/images/*', 'public/images'); 

-> 然后它不会对文件进行版本控制。

看看结果,看看public/mix-manifest.json:

"/favicon.ico": "/favicon.ico?id=ecb5fdce0172885513c8",

要在代码中使用它,请使用 laravel mix 辅助方法:mix();

<link rel="icon" type="image/x-icon" href="{{ mix('favicon.ico') }}" />

这会产生类似这样的东西:

<link rel="icon" type="image/x-icon" href="/favicon.ico?id=ecb5fdce0172885513c8" />

【讨论】:

    【解决方案2】:

    version()(不带参数)不适用于传递给copy()copyDirectory() 的文件。

    如果您查看mix.version 的源代码,您会发现它同步扩展 glob。但所有laravel-mix 操作,如copyversion 都是异步执行的。这意味着public/images/* 为空,因为public 目录中还没有文件。

    作为一种解决方法,您可以列出源目录中的文件(从中复制文件,例如resources),将resources 路径段替换为public 并将此列表传递给version()

    在我的情况下,我在 resources 目录中有各种资产,所以目录树看起来像:

    - resources
      | - css
      | - fonts
      | - images
      | - js
      | - less
    

    我需要复制到public 和版本所有这些目录除了less 我需要预处理和版本。

    这就像我的webpack.mix.js 看起来像:

    const mix = require('laravel-mix'),
        glob = require('glob');
    
    mix.disableNotifications();
    
    const
        directoriesToCopy = ['css', 'fonts', 'images', 'js'],
        publicDir = 'public/',
        publicCssDir = publicDir + 'css/',
        resourcesDir = 'resources/',
        resourcesLessDir = resourcesDir + 'less/',
        lessFiles = glob.sync('**/*.less', {cwd: resourcesLessDir});
    
    directoriesToCopy.forEach(d => mix.copyDirectory(resourcesDir + d, publicDir + d));
    
    lessFiles.forEach(f => mix.less(resourcesLessDir + f, publicCssDir + f.slice(0, -'less'.length) + 'css'));
    
    mix.version([].concat(...directoriesToCopy.map(d => glob.sync('**/*', {cwd: resourcesDir + d}).map(f => d + '/' + f))).map(f => publicDir + f));
    

    基本上我使用glob 递归地获取每个复制目录中所有文件的列表,在它们的路径中将resources 替换为public,然后将所有此类文件的列表传递给mix.version

    【讨论】: