Rails 7 和导入映射以及加载自定义 JS 文件

Jin*_*Lim 9 ruby-on-rails import-maps ruby-on-rails-7

我正在尝试加载我的自定义 js。但出现错误。

\n

错误如下。

\n

无法注册控制器:通知(controllers/notification_controller)错误:无法解析从http://localhost:3000/assets/controllers/notification_contr导入的说明符“@noty”...

\n
\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 javascript\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 application.js\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 controllers\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 application.js\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 index.js\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 notification_controller.js\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 lib\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 noty.js\n
Run Code Online (Sandbox Code Playgroud)\n

notification_controller.js

\n
import { Controller } from "@hotwired/stimulus"\nimport Noty from "@noty"\n\nexport default class extends Controller {\n  static targets = [ 'type', 'message' ]\n\n  ....// some codes.\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n

配置/导入映射.rb

\n
# Pin npm packages by running ./bin/importmap\n\npin "application", preload: true\npin "@hotwired/turbo-rails", to: "turbo.min.js", preload: true\npin "@hotwired/stimulus", to: "stimulus.min.js", preload: true\npin "@hotwired/stimulus-loading", to: "stimulus-loading.js", preload: true\npin_all_from "app/javascript/controllers", under: "controllers"\n\n## lib\npin "@noty", to: "app/javascript/lib/noty.js", preload: true\n
Run Code Online (Sandbox Code Playgroud)\n

我做错了什么?我还有其他一些问题是,“stimulus.min.js”和“turbo.min.js”文件存在于哪里?

\n

Cam*_*ron 9

您的错误是因为您需要修复路径

pin "@noty", to: "app/javascript/lib/noty.js", preload: true

pin "@noty", to: "lib/noty.js", preload: true

Noty但是,由于库导出模块的方式,您将在导入时遇到更多问题。添加库的最简单方法是通过资产管道。

去做这个

  1. 添加noty.jsapp/assets/config
  2. 添加noty.cssapp/assets/stylesheets
  3. 添加//= link noty.jsapp/assets/config/manifest.js
  4. 将其添加到app/views/layouts/application.html.erb
<%= stylesheet_link_tag "noty" %>
<%= javascript_include_tag "noty" %>
Run Code Online (Sandbox Code Playgroud)

完成此操作后,Noty应该可以在您的 js 控制器中使用。例如

import { Controller } from "@hotwired/stimulus"

export default class extends Controller {
  static targets = [ 'type', 'message' ]

  test(){
    var noty = new Noty({text: 'Hi!'});
    noty.show();
  }
}
Run Code Online (Sandbox Code Playgroud)

  • `pin "@noty", to: "lib/noty.js", preload: true` 对我不起作用。浏览器不断告诉“相对引用必须以“/”、“./”或“../”开头。” (2认同)
  • @RobertReiz Rails 开发组已知浏览器控制台错误消息,这是预期的,不会产生进一步的后果。有点红鲱鱼…… (2认同)