在 Rails 上使用外部 JavaScript 库时控制台出错。我正在使用 Webpack
Error on console when using an external JavaScript library on Rails. I'm Using Webpack
我使用 yarn 将一个名为 Swing 的 npm 库添加到我在 Rails 上的项目中。
https://github.com/gajus/swing
问题是,尽管使用新库编译成功,但我在控制台上收到错误消息,似乎无法使用该库的功能。
我正在使用 webpack 版本 3.11.0 和 Rails 5.1.5.
代码如下所示:
带有模板的新 rails 项目(包括 gems:https://github.com/lewagon/rails-templates/blob/master/minimal.rb 和用于身份验证的 Devise gem):
rails new <app name> \
--webpack \
--database postgresql
-m https://raw.githubusercontent.com/lewagon/rails-templates/master/devise.rb
为 Post
生成的模型
rails g model Post title:string photo:string content:text
为 Post
生成的控制器
rails g controller posts
controllers/posts_controller.rb
def index
//generates posts to display
end
为帖子生成索引视图。
/index.html.erb
//iterate over posts and build a card for each
<div class="card"> populate card with post </div>
添加了带有 Yarn 的 Swing npm 包(安装后 package.json 中确实出现了依赖项)
yarn add swing
创建了用于实现卡片刷卡行为的 js 文件。无法走得更远,因为一开始我应该使用 Swing.Stack() 的实例(由库提供),但浏览器无法识别这一点。
js 文件看起来像这样:
javacript/deck.js
import Swing from "swing";
const card = document.querySelectorAll(".card")
const stack = Swing.Stack();
我将我的 deck.js 模块包含在 webpack 捆绑的入口文件中:
javascript/packs/application.js
import "bootstrap";
import "../deck.js";
我在控制台中遇到的错误是:
deck.js:9 Uncaught TypeError: Cannot read property 'Stack' of undefined
at Object.<anonymous> (deck.js:9)
at Object.defineProperty.value (deck.js:51)
at __webpack_require__ (bootstrap d955d73d3325972391a3:19)
at Object.<anonymous> (application.js:1)
at __webpack_require__ (bootstrap d955d73d3325972391a3:19)
at bootstrap d955d73d3325972391a3:62
at bootstrap d955d73d3325972391a3:62
非常感谢您的帮助!
您需要使用 CommonJS 语法,这意味着将您的导入语句更改为:
import Swing from "swing";
对此:
const Swing = require("swing");
使用 import
不起作用的原因在于此模块使自身可供其他代码使用的方式。
如果您在 Rails 项目中打开 node_modules/swing/package.json
,您会看到模块的入口点(main
属性)已设置到“./dist/index.js”.
如果您随后打开 dist/index.js
,您会看到该模块使用 CommonJS 语法(这意味着 ES6 语法根本不可用):
exports.Card = _Card2.default;
exports.Direction = _Direction2.default;
exports.Stack = _Stack2.default;
参考:https://nodejs.org/docs/latest/api/modules.html#modules_exports
我使用 yarn 将一个名为 Swing 的 npm 库添加到我在 Rails 上的项目中。 https://github.com/gajus/swing
问题是,尽管使用新库编译成功,但我在控制台上收到错误消息,似乎无法使用该库的功能。
我正在使用 webpack 版本 3.11.0 和 Rails 5.1.5.
代码如下所示:
带有模板的新 rails 项目(包括 gems:https://github.com/lewagon/rails-templates/blob/master/minimal.rb 和用于身份验证的 Devise gem):
rails new <app name> \
--webpack \
--database postgresql
-m https://raw.githubusercontent.com/lewagon/rails-templates/master/devise.rb
为 Post
生成的模型rails g model Post title:string photo:string content:text
为 Post
生成的控制器rails g controller posts
controllers/posts_controller.rb
def index
//generates posts to display
end
为帖子生成索引视图。
/index.html.erb
//iterate over posts and build a card for each
<div class="card"> populate card with post </div>
添加了带有 Yarn 的 Swing npm 包(安装后 package.json 中确实出现了依赖项)
yarn add swing
创建了用于实现卡片刷卡行为的 js 文件。无法走得更远,因为一开始我应该使用 Swing.Stack() 的实例(由库提供),但浏览器无法识别这一点。
js 文件看起来像这样:
javacript/deck.js
import Swing from "swing";
const card = document.querySelectorAll(".card")
const stack = Swing.Stack();
我将我的 deck.js 模块包含在 webpack 捆绑的入口文件中:
javascript/packs/application.js
import "bootstrap";
import "../deck.js";
我在控制台中遇到的错误是:
deck.js:9 Uncaught TypeError: Cannot read property 'Stack' of undefined
at Object.<anonymous> (deck.js:9)
at Object.defineProperty.value (deck.js:51)
at __webpack_require__ (bootstrap d955d73d3325972391a3:19)
at Object.<anonymous> (application.js:1)
at __webpack_require__ (bootstrap d955d73d3325972391a3:19)
at bootstrap d955d73d3325972391a3:62
at bootstrap d955d73d3325972391a3:62
非常感谢您的帮助!
您需要使用 CommonJS 语法,这意味着将您的导入语句更改为:
import Swing from "swing";
对此:
const Swing = require("swing");
使用 import
不起作用的原因在于此模块使自身可供其他代码使用的方式。
如果您在 Rails 项目中打开 node_modules/swing/package.json
,您会看到模块的入口点(main
属性)已设置到“./dist/index.js”.
如果您随后打开 dist/index.js
,您会看到该模块使用 CommonJS 语法(这意味着 ES6 语法根本不可用):
exports.Card = _Card2.default;
exports.Direction = _Direction2.default;
exports.Stack = _Stack2.default;
参考:https://nodejs.org/docs/latest/api/modules.html#modules_exports