当前位置: 首页 > 知识库问答 >
问题:

Laravel刀片、Mix和SASS资源版本控制共享

姬昀
2023-03-14

在我的项目中,我在SASS和Blade中使用了一些资源(主要是图像)。另外,我有一些资源只在SASS中使用,有些只在Blade中使用。

例如,我可以使用混合('图像/logo.png')在刀片文件,和背景:url('.../图像/logo.png')在SASS文件。

至于我的目录结构,我做了以下操作:

- resources
    - js
    - sass
    - images  // All images used by Blade, Sass, or both
    - fonts

为了编译我的资源并将它们放在public文件夹中,我使用以下网页。混合js

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

mix.js('resources/js/app.js', 'public/js')
    .js('resources/js/vendor.js', 'public/js')
    .scripts([ // Old not ES6 JS
        'resources/js/tpl/core.min.js'
    ], 'public/js/core.min.js')
    .sass('resources/sass/app.scss', 'public/css')
    .sourceMaps()
    .version();

结果,我得到的URL在app.css:

background: url(/images/logo.png?0e567ce87146d0353fe7f19f17b18aca);

当我在呈现的HTML中获得另一个时:

src="/images/logo.png?id=4d4e33eae039c367c8e9"

他们被认为是两种不同的资源,这不是我所期望的。。。

潜在的变通方法

我发现SASS生成的CSS文件使用一个版本化的URL,即使我没有在webpack中指定version()。混合js。所以我想也许我可以用一些技巧,比如:

const sass = require('sass');

// Custom SASS function to get versioned file name
// Uses Mix version md5 hash
const functions = {
    'versioned($uri)': function(uri, done) {
        uri = uri && uri.getValue() || uri;
        const version = File.find(path.join(Config.publicPath, uri)).version();
        done(new sass.types.String(`${uri}?id=${version}`));
    }
};

mix.sass('resources/sass/all.scss', 'public/css', { 
        sassOptions: {
            functions
        }
    })
    .options({ // Do not process URLs anymore
        processCssUrls: false
    });

并在SASS中使用它,如下所示:

background-image: url(versioned('/images/logo.png'));

但是这个解决方案有很多缺点,我不得不每次使用版本化的函数,我的源代码在没有webpack.mix.js函数的其他项目中不容易工作,我必须编辑每个文件我在资源文件夹中使用的函数。

其他解决方案?

我认为问题的根源可能来自我构建文件的方式,我有一个resources/images文件夹,其中包含SASS使用的图像,但Blade也使用这些图像
SASS中使用的图像将被复制到public/Images,因为这是SASS处理webpack的方式,这些图像也将被第二次复制,因为我使用了mix。copy()(因为我需要其他文件位于公用文件夹中,以便在Blade/HTML中访问)。

我很确定我在某个地方弄错了,我在互联网上寻找一种正确的方法来使用Laravel中的SASS和刀片资源,但我没有找到任何相关的东西。
也许我应该考虑另一种文件结构?但是哪一个呢?

共有1个答案

黄无尘
2023-03-14

我发现SASS生成的CSS文件使用版本化的URL,即使我没有在webpack.mix.js.中指定version()

在样式表中重写url()是一项网页包功能,它将文件的计算MD5哈希附加到url<代码>混合。version()另一方面,由于这些行,生成了不同的哈希:

/**
 * Read the file's contents.
 */
read() {
    return fs.readFileSync(this.path(), 'utf8');
}

/**
 * Calculate the proper version hash for the file.
 */
version() {
    return md5(this.read()).substr(0, 20);
}

Laravel Mix将文件读取为字符串(而不是缓冲区),对其进行散列并仅提取前20个字符。我想不出一个简单的方法来覆盖这个行为,一个快速而肮脏的解决方法是重新定义散列函数:

const mix = require('laravel-mix');
let md5 = require('md5');
let fs = require('fs-extra');

Mix.manifest.hash = function (file) {
    let f = new File(path.join(Config.publicPath, file));

    let hash = md5(fs.readFileSync(f.path()));

    let filePath = this.normalizePath(file);

    this.manifest[filePath] = filePath + '?' + hash;

    return this;
}

更好的方法是扩展Laravel Mix并定义自己的versionMD5()方法,您可以从这个扩展中复制一些代码。

 类似资料:
  • 简介 Laravel Mix 提供了简介且可读性高的 API,用于使用几个常见的 CSS 和 JavaScript 预处理器为应用定义 Webpack 构建步骤。可以通过简单链式调用来定义资源的编译。例如: mix.js('resources/assets/js/app.js', 'public/js') .sass('resources/assets/sass/app.scss', 'pu

  • 问题内容: 我最近开始了一个Django项目,并很快意识到,由于多种原因,virtualenv真的很有用。我设置了virtualenv和我的项目,但是现在我想知道应该将哪个文件添加到源代码管理(在我的情况下是Mercurial)。我应该在venv文件夹下添加所有文件吗?如何确保同事可以克隆并立即开始工作而无需再次设置环境? 问题答案: 你会生成一个与项目一起提交的“需求”文件(通常是): 然后,每

  • 我在建一个拉威尔的网站。我希望提交的表单数据运行查询,并将结果插入表格式。我正在使用oracle DB,并已将其连接到Laravel。另外,我已经创建了表单,查询结果正确。我不能做的是将结果成功地传递到表中。 我的文件如下: > Routes.php(或web.php较新的laravel版本): 搜索。刀身php(带有post方法的表单) 我的控制器(NewController.php)运行查询。

  • Introduction Laravel Mix provides a clean, fluent API for defining basic webpack build steps for your applications. Mix supports several common CSS and JavaScript pre-processors. If you've ever been c

  • 本文向大家介绍Spring Boot2.0实现静态资源版本控制详解,包括了Spring Boot2.0实现静态资源版本控制详解的使用技巧和注意事项,需要的朋友参考一下 写在最前面 犹记毕业第一年时,公司每次发布完成后,都会在一个群里通知【版本更新,各部门清理缓存,有问题及时反馈】之类的话。归根结底就是资源缓存的问题,浏览器会将请求到的静态资源,如JS、CSS等文件缓存到用户本地,当用户再次访问时就

  • 资源控制器 资源控制器可以让你轻松的创建RESTFul资源控制器,可以通过命令行生成需要的资源控制器,例如: // 生成index模块的Blog资源控制器 php think make:controller index/Blog 或者使用完整的命名空间生成 php think make:controller app\index\controller\Blog 然后你只需要为资源控制器注册一个资源路