从 Nuxt.js 与 PhpStorm 中的节点模块解析 SCSS 中的 @import .css

Posted

技术标签:

【中文标题】从 Nuxt.js 与 PhpStorm 中的节点模块解析 SCSS 中的 @import .css【英文标题】:Resolving @import .css in SCSS from node modules in Nuxt.js vs PhpStorm 【发布时间】:2020-12-09 17:04:57 【问题描述】:

假设我想从我的主要app.scss 中的节点模块导入一些样式表:

@import '~bootstrap/scss/bootstrap';

这将由 phpStorm 正确解决,并由 Nuxt.js 构建,一切都很好。

现在,如果我想对 a scoped node module(名称格式为 @scope/module 的节点模块)做同样的事情,Nuxt.js 和 PhpStorm 会出现分歧:

@import '@fortawesome/fontawesome-svg-core/styles.css';

这在 Nuxt.js 中运行良好,构建继续没有问题,但 PhpStorm 强调整个事情说 Cannot resolve directory '@fortawesome'

@import '~@fortawesome/fontawesome-svg-core/styles.css';

这被 PhpStorm 理解并且可以很好地解决,但是会导致 Nuxt.js 构建失败:

ERROR in ./client/assets/sass/app.scss
Module build failed (from ./node_modules/extract-css-chunks-webpack-plugin/dist/loader.js):
ModuleBuildError: Module build failed (from ./node_modules/postcss-loader/src/index.js):
Error: Can't resolve '~@fortawesome/fontawesome-svg-core/styles.css'

所以我的问题是:哪种语法会被认为是正确的,是否可以同时让 PhpStorm 和 Nuxt.js 满意?

对我来说,~@ 似乎更有意义,因为~ 解析为我的node_modules 的路径,并且其中的实际文件夹名称以@ 开头。与非作用域节点模块相比,仅使用 @ 会破坏这种模式,根据 PhpStorm 和 Nuxt.js 都需要 ~ 前缀。

【问题讨论】:

【参考方案1】:

原来,问题是由.css 扩展引起的。

这适用于 PhpStorm 和 Nuxt.js: @import '~@fortawesome/fontawesome-svg-core/styles';

显然(根据this answer 和/或this issue)当.css 扩展名用于@import 语句时,sass-loader 不会真正导入给定文件,而是将其转换为@987654328 @ 语句,这确实是错误的,因为url() 无法正确解析~

所以毕竟这两条略有不同的 SASS 行之间存在显着差异:

@import '@fortawesome/fontawesome-svg-core/styles.css';

这会导致@import url('@fortawesome/fontawesome-svg-core/styles.css'),这取决于 webpack 在构建过程中稍后解决。或者如果没有被 webpack 解析,它可能会被发送到浏览器,它肯定会失败。

@import '~@fortawesome/fontawesome-svg-core/styles';

这由sass-loader 解决,node_modules/@fortawesome/fontawesome-svg-core/styles.css 被导入到主样式文件中,在构建过程中(或在浏览器中)没有任何东西需要解决。


PS:我也意识到它与给定的节点模块是否被限定无关。这一切都归结为导入.scss.css

【讨论】:

显然 Nuxt.js 在这两种情况下都将给定的styles.css 文件作为内联文件包含在最终的app.*.css 文件中。我的假设是,在第一种情况下,@import '@fortawesome/fontawesome-svg-core/styles.css'; 导致@import url('@fortawesome/fontawesome-svg-core/styles.css') 在某些时候被 webpack 内联,所以两者都从构建的角度工作,但它似乎更像是sass-loader 修复后的另一个加载器或机制搞砸了@import url() 部分,所以第二个似乎仍然是更清洁的解决方案。但这些只是假设。纠正我,如果我错了!

以上是关于从 Nuxt.js 与 PhpStorm 中的节点模块解析 SCSS 中的 @import .css的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 nuxt.js 中的“Module not found: Error: Can't resolve 'fs'”?

Vue.js 和 Nuxt.js 中的 Firebase 存储 CORS 错误

如何在 nuxt js 中使用 vuetify 作为插件?

为Nuxt.js部署云功能错误

Nuxt.js服务端渲染实践,从开发到部署

nuxt js“无法在'Node'上执行'appendChild':此节点类型不支持此方法”在移动视口上