没有波浪号(〜),

时间:2019-05-01 08:58:53

标签: javascript vue.js webpack vue-cli sass-loader

我正在尝试使用material-components-vue和带webpack的vue-cli创建一个简单的Web应用程序,但是我发现,如果没有前面的node_modules,我无法从~导入样式表

我尝试了几种webpack / vue-cli配置,最后在vue.config.js中通过加载程序选项进行了配置。

我的vue.config.js如下:

module.exports = {
    css: {
      loaderOptions: {
        sass: {
          includePaths: [
              './node_modules', //here I include node_modules
            ]
        },
      }
    }
  }

所以我希望能够像这样导入东西:

@import 'normalize/normalize'

(假设我的normalize中有一个名为node_modules的目录,其中包含文件normalize.scss

但是,webpack抛出错误,说找不到模块。
但是,这确实可行:

@import '~normalize/normalize'

如果所有@import都由我编写,这不会有问题,但是由于我使用的是其中包含@import的第三方模块,因此webpack无法编译。

编辑1:

@Styx要求

  

请共享更多配置

  

显示vue inspect --rule scss的输出,以及带有此有问题的导入的整个文件

这里是:

我的问题文件非常空:

<template>
  <div id="app">
    <m-button>Hello</m-button>
  </div>
</template>

<script>
import Vue from 'vue'
import Button from 'material-components-vue/dist/button'
Vue.use(Button)

export default {
  name: 'App',
  components: {
}
</script>

<style lang="scss">
@import "~material-components-vue/dist/button/styles"; //this works
@import "material-components-vue/dist/button/styles"; //but this does not
</style>

我从vue inspect --rule scss的输出位于here

所有其他配置均由vue init webpack <name>

生成

编辑2:确切的步骤来重现此问题:

  1. 初始化vue-webpack应用程序:
vue init webpack .
  1. Vue构建:运行时+编译器(默认)
  2. Vue-router:否
  3. 包裹管理器:npm

  4. 然后,安装sass-loader

npm i -D sass-loader node-sass
  1. 创建文件vue.config.js,并使用以下内容填充文件:
module.exports = {
    css: {
      loaderOptions: {
        sass: {
          includePaths: [
              './node_modules', //here I include node_modules
            ]
        },
      }
    }
  }
  1. 之后,安装包含scss / sass的模块 (例如,material-components-webnpm i material-components-web

  2. 然后,创建到node_modules中的样式表的导入,如下所示:

@import '@material/button/mdc-button'; //mdc-button comes with material-components-web
  1. 最后,启动开发服务器:
npm run dev
  1. 它将引发以下错误:
 ERROR  Failed to compile with 1 errors                                                                        11:36:35 AM

 error  in ./src/App.vue

Module build failed: 
@import '@material/button/mdc-button';
^
      File to import not found or unreadable: @material/button/mdc-button.
      in /home/maxim/projects/holiday.js/stackoverflow/src/App.vue (line 18, column 1)

 @ ./node_modules/vue-style-loader!./node_modules/css-loader?{"sourceMap":true}!./node_modules/vue-loader/lib/style-compil
er?{"vue":true,"id":"data-v-7ba5bd90","scoped":false,"hasInlineConfig":false}!./node_modules/sass-loader/lib/loader.js?{"s
ourceMap":true}!./node_modules/vue-loader/lib/selector.js?type=styles&index=0!./src/App.vue 4:14-359 13:3-17:5 14:22-367
 @ ./src/App.vue
 @ ./src/main.js
 @ multi (webpack)-dev-server/client?http://localhost:8080 webpack/hot/dev-server ./src/main.js

顺便说一句,在第一个示例中,我想导入material-components-vue/dist/foo/styles,但是在这里我导入@material/foo

1 个答案:

答案 0 :(得分:0)

在此配置中,您的vue.config.js忽略。该文件为used by @vue/cli-service,但是您使用的是webpack-dev-server。因此,您的sass-loader不会收到此includePaths选项。

您可以使用现代的vue create <app-name>命令,或者如果您想修改现有项目:

  1. 打开build/utils.js文件。

  2. return ...函数中找到exports.cssLoaders

    return {
      ...
      sass: generateLoaders('sass', { indentedSyntax: true }),
      scss: generateLoaders('sass'),
      ...
    }
    
  3. 像这样修改它:

    const includePaths = [path.resolve(__dirname, '..', 'node_modules')];
    return {
      ...
      sass: generateLoaders('sass', { indentedSyntax: true, includePaths }),
      scss: generateLoaders('sass', { includePaths }),
      ...
    }
    
  4. 删除未使用的vue.config.js文件。