首页 文章

Rails:预编译资产缺少节点模块

提问于
浏览
7

我正在使用我的rails 5.1 app纱线(不是webpacker,只是默认的资产管道) .

在开发环境中运行本地服务器,我的资产没有遇到任何问题 .

但是一旦我预编译我的资产(环境无关紧要)或让Heroku打包我的资产,我从 application.sass 文件中导入的所有样式表(节点模块)都不再起作用了 .

这种行为的原因是sass将所有文件编译成一个输出文件,但由于某种原因似乎错过了包含节点模块的 @import 语句并分别加载这些文件 .

所以这:

@import "components/index.sass"
@import "nodemodule/nodemodule.css"

在开发中编译到这个:

// content of "components/index.sass"
// content of "nodemodule/nodemodule.css"

在 生产环境 中:

// content of "components/index.sass"
@import "nodemodule/nodemodule.css"

虽然单独加载 node_module/nodemodule.css 作为资产,但浏览器无法解析它 . Javascript工作正常 .

3 回答

  • 1

    链接来自我的项目,您可以在asset.rb中将其用作参考,您需要在默认的load_path中包含 /node_modules 路径 .

    如果打开 rails console 并输入 Rails.application.config.assets.paths ,您应该看到添加了新路径 /yourproject/node_modules .

    然后你只需写:

    @import "nodemodule.css"
    

    在我的情况下我的application.scss中的bootstrap 4

    @import bootstrap/scss/bootstrap
    

    对应于 node_modules/bootstrap/scss/bootstrap.scss 中的文件

    enter image description here

    对于 jquery.jsbootstrap.js ,您可以查看我的application.js

  • 1

    例如,node_modules需要与 npm install 一起安装,因此它们可能没有安装在Heroku上 . 看看https://devcenter.heroku.com/articles/using-multiple-buildpacks-for-an-app

    最有可能的是,您需要设置一个Node.js buildpack来安装您的npm依赖项 .

  • 6

    我终于找到了问题 . 这是一个非常令人讨厌的 sass-rails 宝石的错误和Rails的 sprockets 组件的不幸设计 .

    1)sass-rails

    @import 似乎不适用于 node_modules ,因为它与其他资产一样 . 当这些其他资产被编译成一个文件时, node_modules 仅被引用,由浏览器作为单独的源加载,但最终不被浏览器使用 .

    2)链轮

    Sprockets的 require 语句只有在文件的开头才有效 . 或者他们把它放在他们的_1097906中:

    注意:只有在任何应用程序代码出现之前,才会处理指令 . 一旦你有一行不包含注释或空格,那么Sprockets将停止寻找指令 . 如果您在文档的“ Headers ”之外使用指令,它将不会执行任何操作,并且不会引发任何错误 .

    但是,就我而言,我从一个本身从 application.sass 导入的文件中导入指令 .

相关问题