【问题标题】:Correct way to include image via relative path通过相对路径包含图像的正确方法
【发布时间】:2019-05-22 05:08:09
【问题描述】:

我已将 laravel-mix 更新到版本 4.0.12 并面临在 *.scss 中使用相对路径包含背景图像的线路上的损坏构建

我得到了下一个文件结构

resources/
|-assets/
||-img/
|||-background.png
||-sass/
|||-footer.scss

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

.footer {
  background-image: url(../img/background.png)
}

我的 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`);

在编译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

我该如何解决这个问题?

【问题讨论】:

    标签: sass laravel-mix node-sass resolve-url-loader


    【解决方案1】:

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

    但是,根据Laravel Docs

    任何给定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>)
    }
    

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

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

    【讨论】:

    • 感谢引擎盖 url() 处理的精彩解释。起源问题可以通过我的回答来解决,而这是处理url()的另一种方式。
    • 欢迎您!这也应该克服回退到旧版本的resolve-url-loader
    • 感谢朋友的回答,并给出了很好的解释。
    【解决方案2】:

    问题在于太新的"resolve-url-loader": "^3.0.0"

    在前段时间安装了一个中间版本"laravel-mix": "~3"之后,它被添加到package.json中。

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

    【讨论】:

    • 谢谢 @pavlo-zhukov,从我的 package.json 中删除 resolve-url-loader 并让 laravel-mix 通过其依赖项包含它需要的版本解决了我的问题。我正在使用laravel-mix: 4.x,这个安装的resolve-url-loader: 2.3.1 Clearly laravel-mix`目前与resolve-url-loader: 3.0不兼容。
    • @SlyDave 我很高兴听到我的回答对其他人有所帮助。这是我把它放在这里的主要原因:)
    猜你喜欢
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 2020-03-05
    • 1970-01-01
    • 2012-06-19
    • 2014-03-30
    相关资源
    最近更新 更多