通过相对路径包含图像的正确方法

Pav*_*kov 0 sass node-sass laravel-mix resolve-url-loader

我已经更新了laravel-mix到版本4.0.12,面对*.scss在我使用相对路径包含背景图像的线上的破坏构建

我有一个下一个文件结构

resources/
|-assets/
||-img/
|||-background.png
||-sass/
|||-footer.scss
Run Code Online (Sandbox Code Playgroud)

我在footer.scss中的代码是下一个

.footer {
  background-image: url(../img/background.png)
}
Run Code Online (Sandbox Code Playgroud)

我的webpack.mix.js是下一个

const mix = require('laravel-mix');

const resourcesAssets = 'resources/assets/';
const dest = 'public/assets/';

mix
  .copy(`${resourcesAssets}images`, `${dest}images`, false)
  .sass(`${resourcesAssets}scss/footer.scss`, `${dest}css`);
Run Code Online (Sandbox Code Playgroud)

在筹备期间,npm run prod我得到了

Module build failed (from ./node_modules/css-loader/index.js):
ModuleBuildError: Module build failed (from ./node_modules/resolve-url-loader/index.js):
Error: resolve-url-loader: CSS error
predicate must return an absolute path or the result of calling next()
at file://C:\xampp\htdocs\laravel-project\resources\assets\sass\footer.scss:2:3
at encodeError (C:\xampp\htdocs\laravel-project\node_modules\resolve-url-loader\index.js:218:12)
at onFailure (C:\xampp\htdocs\laravel-project\node_modules\resolve-url-loader\index.js:175:14)
at <anonymous>
    at runMicrotasksCallback (internal/process/next_tick.js:122:5)
    at _combinedTickCallback (internal/process/next_tick.js:132:7)
    at process._tickCallback (internal/process/next_tick.js:181:9)
    at runLoaders (C:\xampp\htdocs\laravel-project\node_modules\webpack\lib\NormalModule.js:301:20)
    at C:\xampp\htdocs\laravel-project\node_modules\loader-runner\lib\LoaderRunner.js:364:11
    at C:\xampp\htdocs\laravel-project\node_modules\loader-runner\lib\LoaderRunner.js:230:18
    at context.callback (C:\xampp\htdocs\laravel-project\node_modules\loader-runner\lib\LoaderRunner.js:111:13)
    at onFailure (C:\xampp\htdocs\laravel-project\node_modules\resolve-url-loader\index.js:175:5)
    at <anonymous>
        at runMicrotasksCallback (internal/process/next_tick.js:122:5)
        at _combinedTickCallback (internal/process/next_tick.js:132:7)
        at process._tickCallback (internal/process/next_tick.js:181:9)

        error  in ./resources/assets/sass/footer.scss
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

Pav*_*kov 6

这个问题太新了"resolve-url-loader": "^3.0.0".

"laravel-mix": "~3"不久前安装了一个中间版本后,它被添加到package.json中.

删除它并重新运行构建有助于我解决问题."resolve-url-loader": "2.3.1"运行后加入laravel-mix npm run prod.

  • 谢谢@pavlo-zhukov,从我的 **package.json** 中删除了 `resolve-url-loader` 并让 `laravel-mix` 通过其依赖项包含它需要的版本解决了我的问题。我正在使用 `laravel-mix: 4.x` 并且安装了 `resolve-url-loader: 2.3.1 显然 `laravel-mix` 目前与 `resolve-url-loader: 3.0` 不兼容。 (2认同)

Ste*_*r92 6

这是 Webpack 中的 URL 重写,因为 Laravel Mix 是构建在 Webpack 之上的。对于 CSS 编译,Webpack 会重写并优化url()样式表中的任何调用。

然而,根据Laravel 文档

任何给定的绝对路径都url()将被排除在 URL 重写之外。例如,url('/images/thing.png')url('http://example.com/images/thing.png')不会被修改。

因此,Mix 尝试将您的 CSS 重写为某种内容。喜欢:

.footer {
    background-image: url(/img/background.png?<some-hash-identifier>)
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您可以url()像这样禁用,并且 Mix 不会触及url(../img/background.png)您的footer.scss

mix.sass(`${resourcesAssets}scss/footer.scss`, `${dest}css`);
    .options({
        processCssUrls: false
    });
Run Code Online (Sandbox Code Playgroud)