ruby-on-rails - 如何在没有 tilda 的情况下从 node_modules 导入 scss 文件?

标签 ruby-on-rails sass webpacker

我使用以下方法创建了一个新的 rails 应用程序:

rails new blah --webpack -T

然后我添加了primer
yarn add primer

如果我在/assets/stylesheets/application.scss 中执行此操作,我的导入将有效

@import "~primer/index.scss";

Primer 有很多模块,因此primer/index.scss 然后引用其他模块的文件。因此,即使我将 tilda 放在第一次导入中,它也不能解决问题,因为在其他文件中它没有 tilda。

但问题是,一旦 index.scss 文件加载,还有其他文件停止工作,因为它们也引用了如下文件:
// Core modules
@import "primer-base/index.scss";
@import "primer-box/index.scss";
@import "primer-breadcrumb/index.scss";
@import "primer-buttons/index.scss";
@import "primer-table-object/index.scss";
@import "primer-forms/index.scss";
@import "primer-layout/index.scss";
@import "primer-navigation/index.scss";
@import "primer-pagination/index.scss";
@import "primer-tooltips/index.scss";
@import "primer-truncate/index.scss";

所以这些进口也必须改变。我需要解决这个问题,所以我不必使用 tilda 符号作为前缀。我的 assets.rb 已经包含 node_modules 所以我不确定我还能做什么?

我的/initializers/assets.rb 有这个:
Rails.application.config.assets.paths << Rails.root.join('node_modules')

然而,在我的 application.scss 文件中,我必须包含 tilda 符号才能引用 scss 文件:
@import "primer/index.scss";
html {
  font-size: 30px;
}

应用程序.js 文件:
import "./application.scss";

console.log('Hello World from Webpacker2d');

我的布局文件:
<!DOCTYPE html>
<html>
  <head>
    <title>Blah</title>
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>

    <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>

    <%= javascript_pack_tag    'application' %>
    <%= stylesheet_pack_tag    'application' %>
  </head>

  <body>
    <%= yield %>
  </body>
</html>

最佳答案

预处理所有这些文件以添加波浪号是一个可接受的解决方案吗?如果是这样,您可以在 *nix 机器中对单个文件执行此操作:

cat some_file.scss | ruby -ne 'print $_.sub(/(@import\s*\")([^~])/) { "#{$1}~#{$2}" }' > some_file.scss.tilde
mv some_file.scss.tilde some_file.scss

对于多个文件:
for file in $(ls *.scss); do
    cat "$file" | ruby -ne 'print $_.sub(/(@import\s*\")([^~])/) { "#{$1}~#{$2}" }' > "$file.tilde"
    mv "$file".tilde "$file"
done

这会将您的 scss 文件替换为在任何 @import 中添加波浪号的版本。尚未拥有它的声明。更具体地说,它匹配 @import后跟任何空格,后跟双引号,后跟不是波浪号的东西,并在那个不是波浪号的东西之前放一个波浪号。

您可能想跳过 mv行首先测试输出。

如果您必须多次执行此操作,则可以将其写入 rake 任务或脚本中。

关于ruby-on-rails - 如何在没有 tilda 的情况下从 node_modules 导入 scss 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52731269/

相关文章:

ruby-on-rails - Ruby on Rails - 这个符号在 erb 中是什么意思 : <%- . .. -%>?

ruby-on-rails - Webpacker 未实时编译

ruby-on-rails - Rails 6 本地服务器启动 : RAILS_ENV=development environment is not defined

ruby-on-rails - 使用 Nokogiri 解析 HTML - The Ruby/Rails Way

ruby-on-rails - Rails 和 Heroku 的 Postgres : 'which psql' still/usr/local/bin/psql even after adding export PATH=. .. 到 ~/.bash_profile

ruby-on-rails - 如何按最近 20 天分组并执行聚合函数?

css - sass load mixin 有条件地基于媒体查询

css - 覆盖 CSS 媒体查询

javascript - 无法让汉堡菜单在点击时设置动画

javascript - WebPacker - 通过 ES6 Import 与 webpack.ProvidePlugin() 加载 NPM 模块