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

时间:2017-12-03 13:19:15

标签: css ruby-on-rails sass node-modules yarnpkg

我正在使用我的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工作正常。

4 个答案:

答案 0 :(得分:7)

链接来自我的项目,您可以将其用作参考 在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 :(得分:4)

我遇到了同样的问题。受this comment从导入中删除文件扩展名的启发,最终解决了该问题。

这不起作用:

@import "@shopify/polaris/styles.css";
@import "@uppy/core/dist/style.css";
@import "@uppy/dashboard/dist/style.css";

这样做的时候:

@import "@shopify/polaris/styles";
@import "@uppy/core/dist/style";
@import "@uppy/dashboard/dist/style";

答案 2 :(得分:2)

我终于找到了问题。这是loaded_graph = tf.Graph() with tf.Session(graph=loaded_graph) as sess: sess.run(tf.global_variables_initializer()) new_saver = tf.train.import_meta_graph(args.model_meta_filename) new_saver.restore(sess, tf.train.latest_checkpoint('./')) softmax_probabilities = loaded_graph.get_tensor_by_name('softmax_probabilities:0') data_placeholder = loaded_graph.get_tensor_by_name('data_placeholder:0') dropout_keep_proportion_placeholder = loaded_graph.get_tensor_by_name('dropout_keep_proportion_placeholder:0') p = [x[1] for x in softmax_probabilities.eval({data_placeholder: data, dropout_keep_proportion_placeholder: 1.0})] print(p) 宝石的一个非常讨厌的错误。 Rails的sass-rails组件的不幸设计。

1)sprockets

sass-rails似乎与@import不同,与其他资产一样。当这些其他资产被编译到一个文件中时,node_modules仅被引用,由浏览器作为单独的源加载,但最终不被浏览器使用。

2)node_modules

Sprockets'sprockets语句仅在文件开头处有效。或者他们把它放在documentation

  

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

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

答案 3 :(得分:1)

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

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