【问题标题】:use scss style module compiling in laravel-mix vue?在 laravel-mix vue 中使用 scss 样式的模块编译?
【发布时间】:2019-05-28 14:29:43
【问题描述】:

我有一个模块化模板,它使用 Sass-loader 来编译每个组件都有的 scss 文件,但是在 laravel 中使用这个和 laravel-mix 是行不通的,它什么都不做

我正在使用最新版本的 laravel (5.8) 和 php7 和 Vue JS

组件示例:

    <template>
       <div :class="$style.logo">
          <div :class="$style.logoContainer">
            <img
              v-if="!settings.isMenuCollapsed || withDrawer"
              src="resources/images/logo-inverse.png"
              alt
            >
            <img
              v-if="settings.isMenuCollapsed && !withDrawer"
              src="resources/images/logo-inverse-mobile.png"
              alt
            >
          </div>
        </div>
    </template>

    <style lang="scss" module>
    @import "./style.module.scss";
    </style>

这是一个组件,其 style.scss 文件将被编译为模块。这里的类必须保存到 $style 中。

我在 package.json 中使用这个包:

"sass": "^1.15.2",
"sass-loader": "^7.1.0"

我的 babel.config.js:

module.exports = {
  presets: ['@vue/app'],
  plugins: [
    [
      'import',
      { libraryName: 'ant-design-vue', libraryDirectory: 'es', style: true },
    ],
  ],
}

最后,我的 webpack.mix.js 文件:

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

mix.webpackConfig({
    module: {
        rules: [
            {
                test: /\.scss$/,
                use: [
                    {
                        loader: "sass-loader",
                        options: {
                            modules: true
                        }
                    }
                ]
            }
        ]
    }
});

mix.alias({
    '@': '/resources/js'
})

mix.js('resources/js/app.js', 'public/js')
    .sass('resources/sass/app.scss', 'public/css');

问题是,组件的scss文件中的类没有被编译,因此编译后的html标签不具备样式,失去了我模板的结构。

这必须是编译后的文件组件:

<div class="index_logo_hObJ1">
    <div class="index_logoContainer_1zCMH">
        <img src="resources/images/logo-inverse.png" alt="">
    </div>
</div>

这就是我得到的:

<div>
    <div>
        <img src="resources/images/logo-inverse.png" alt="">
    </div>
</div>

如你所见,没有类被注入到 div 中,我在编译时也没有出错,我做错了什么?

【问题讨论】:

  • 你找到解决办法了吗?
  • 我不能使用带有“模块”的样式,我只使用带有“范围”的样式,效果很好
  • 朋友我有同样的问题,并且完全使用相同的模板,我不能像你说的那样编译我的组件中的类,所以它们是带有模块的样式,你能给我一个你如何的例子解决了这个?我真的很感激!
  • 你好,费尔南多,我没有使用“模块”样式,我无法弄清楚,但我设法使用“范围”样式,它很接近。为此,我将其添加到我的 webpack.mix.js 文件中: [code] let mix = require('laravel-mix');要求('laravel 混合别名'); mix.alias({ '@': '/resources/js' }) mix .setPublicPath('./default/public') .js('resources/js/app.js', 'default/public/javascript/' ) .sass('resources/sass/app.scss', 'default/public/css/') .sourceMaps() .version(); ; mix.options({ extractVueStyles: true, processCssUrls: false });
  • 替代你可以使用laravel-mix-vue-css-modules

标签: vue.js sass module laravel-mix sass-loader


【解决方案1】:

我没有使用样式“模块”,我无法弄清楚,但我设法使用样式“范围”,它接近它。为此,我将其添加到我的 webpack.mix.js 文件中:

let mix = require('laravel-mix');
require('laravel-mix-alias');

mix.alias({
    '@': '/resources/js'
})

mix
    .setPublicPath('./default/public')
    .js('resources/js/app.js', 'default/public/javascript/')
    .sass('resources/sass/app.scss', 'default/public/css/')    
    .sourceMaps()
    .version();
;

mix.options({
    extractVueStyles: true,
    processCssUrls: false
});

然后你可以在你的 .vue 组件上使用它:

<style lang="scss">
    @import "./style.module.scss";
</style>

.css 文件很正常。

【讨论】:

  • 感谢您的回复,所以您刚刚在webpack.mix.js 中进行了配置更改?您的组件中的 html 元素是原样的吗?例如$style&lt;div: class = "$style.logo"&gt;中我的意思是如果html元素没有变化?
猜你喜欢
  • 1970-01-01
  • 2021-05-11
  • 2021-05-27
  • 2018-08-13
  • 2020-09-01
  • 2019-01-05
  • 1970-01-01
  • 2021-06-04
  • 1970-01-01
相关资源
最近更新 更多