如何从 node_modules 文件夹导入 sass 主题模块

Posted

技术标签:

【中文标题】如何从 node_modules 文件夹导入 sass 主题模块【英文标题】:How to import a sass theming module from node_modules folder 【发布时间】:2018-08-22 14:35:27 【问题描述】:

我创建了一个使用 scss 进行样式设置的小型 vue.js 库,并将其发布为 npm 包。它适用于包中包含的默认主题。但是,如果我想从使用该 npm 包的应用程序中提供一个自定义主题,你会怎么做呢?

该库的一个非常基本版本的源代码在这里:https://github.com/gwildu/gwi-vue-components

这个想法是,您可以将样式文件夹复制粘贴到某处(例如,粘贴到您的应用程序目录或另一个 npm 包中)并配置库包以从该复制目录导入。

【问题讨论】:

【参考方案1】:

我自己做了一些调查,发现多年来一直在讨论如何在 sass 中进行动态导入。这个issue(2013 年开放)声称要添加这样的功能(他们称之为load)。不确定 sass 的开发活跃程度以及何时支持此功能。目前我看到了 3 种可能的解决方案:

    移至 LESS,因为它支持动态导入。 Semantic UI 提示您如何在 LESS 中完成 theming 可以从 SASS 中的相对路径导入。这样,您还可以从包根目录(您的应用程序目录)的父目录导入,例如 @import '../../theme/index';。你会在你的包的某个地方支持一个主题的例子,然后消费者必须复制到,例如,他的应用程序的根目录并根据他的需要进行调整。然后,在您的包中,您将从消费者应用程序文件夹中的该目录导入主题。缺点是,该软件包不能开箱即用 您的软件包中有一个默认主题,并且您在自述文件中添加了一些说明,用户可以如何在构建脚本中覆盖该主题。消费者必须将默认主题复制到他的应用程序目录,根据自己的需要对其进行调整,然后在构建脚本中,他会将node_modules/your-library-package-folder/theme/ 中的主题替换为应用程序文件夹中的主题。

这里要完整的是动态导入的方法(SASS 尚不支持):

    在库包中的主主题文件(将由组件导入)中,您将像方法 2(见上文)一样从消费者应用程序文件夹中执行某种配置文件的相对导入(但该配置文件)您将不包含主题,而仅包含主题在变量中的导入路径。然后,该变量将被包主主题文件用于导入主题。为了使库开箱即用,我想如果消费者目录中的配置文件不存在(未测试),我想有一种方法可以将默认主题作为备份。

更新: 我尝试了方法 3,但没有得到有用的东西。这种方法的问题在于,当您将库更新到更高版本时,您必须以某种方式将您的客户主题与默认主题同步,这可能会变得过于复杂而无法以合理的方式处理。然后我尝试使用此处描述的 SASS 的覆盖功能:How to overwrite SCSS variables when compiling to CSS 这导致我接近

    在您的库组件中,您首先导入一个包含可能自定义变量的文件,然后将库中的变量声明为默认变量。

这种方法的问题是 SASS 不支持可选导入。带有自定义变量的文件必须存在于某处。因此,如果库更新,您必须再次为库中更改的每个组件/文件同步自定义主题文件。显然 SASS 也不想在未来支持这样的功能:https://github.com/sass/sass/issues/779,这很可悲,因为在我看来,它是无需高度复杂的构建步骤即可进行主题化的基本功能。

总体而言,SASS 本身似乎正在尽一切努力阻止简单的主题化方法,这让我想到再次回到 LESS。在我看来,在 SASS 中没有一种简单的静态主题化方法比在 LESS 中没有一种简单的方法来定义自定义函数的缺点要重要。

【讨论】:

似乎有一种方法可以使用 SASS 进行主题化,vuematerial.io/themes/concepts,从实现方面看起来有点复杂(github.com/vuematerial/vue-material),但我喜欢使用图书馆。可能需要一些时间来挖掘它,如果有人对此尝试有经验,将不胜感激评论或回答......

以上是关于如何从 node_modules 文件夹导入 sass 主题模块的主要内容,如果未能解决你的问题,请参考以下文章

从 vue-cli 应用程序中的 node_modules 导入 js 文件

Parcel Bundler:从 node_modules 导入 scss 文件而不指定完整路径?

Snowpack 无法从 node_modules 导入 JavaScript

Angular 6 从带有资产的 node_modules 导入 SCSS

使用 Parcel 从 node_modules 导入 CSS

从 node_modules 导入时不显示离子图标