【问题标题】:Cannot import stylesheets from node_modules without tilde (~)无法从没有波浪号 (~) 的 node_modules 导入样式表
【发布时间】:2019-09-19 21:02:46
【问题描述】:

我正在尝试使用 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'

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

然而,webpack 抛出一个错误,说它找不到模块。
但是,这确实有效:

@import '~normalize/normalize'

如果所有@imports 都是我写的,这不会有问题,但是因为我使用了一个第三方模块,其中包含@imports,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 &lt;name&gt;生成

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

  1. 初始化一个 vue-webpack 应用:
vue init webpack .
  1. Vue 构建:运行时 + 编译器(默认)
  2. Vue 路由器:否
  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

【问题讨论】:

  • 无法复制。请分享更多配置。
  • 具体来说,显示vue inspect --rule scss 的输出,以及这个有问题的导入的整个文件。
  • @Styx,感谢您的提问!我对 webpack 很陌生,所以如果需要任何其他信息,请询问!
  • 仍然无法重现,它对我有用。请显示整个错误文本。
  • @Styx,我把上面的步骤+错误文字贴出来了,希望对你有帮助。

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


【解决方案1】:

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

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

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

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

    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 文件。

【讨论】:

  • 嗨。这已经帮助了我很多,但我有一个后续问题:我的印象是,一旦我像你一样设置 includePaths,我的 main.js 找不到不在 node_modules 中的样式文件(通常在 src/assets )。您知道是否可以使用此方法包含多个路径?谢谢
  • @petosorus 是的,有可能:includePaths 在路径数组中,您可以在其中添加任意数量的项目。但是,这些路径不会禁用正常的路径解析,因此您仍然可以像往常一样使用正常的导入。
猜你喜欢
  • 2020-11-29
  • 2020-04-19
  • 2017-10-19
  • 1970-01-01
  • 2017-09-29
  • 2019-05-22
  • 2018-01-12
  • 1970-01-01
  • 2019-07-07
相关资源
最近更新 更多